如果我在函数中使用 requre() 的 PHP 是在调用函数之前的文件


PHP if I use requre() inside of a function is that file before calling the function?

如果函数中包含或需要文件,则在函数未调用的情况下是否加载该文件?例:

页.php

<?php
require('functions.php');
a();
?>

函数.php

<?php
function a(){
    require('a.php');
}
function b(){
    require('b.php');
}
function c(){
    include('c.php');
}
?>

是否加载了 b.php 或 c.php?

不,

除非您实际调用函数b()c(),否则不会加载它们。

b.phpc.php中的代码也将是它们所包含的函数的本地代码。 也就是说,他们定义的任何变量分别在b()c()之外不可用。

有关更多详细信息,请参阅 PHP:包含。

简单地说:没有。如果requireinclude位于函数中,则在函数未执行时不会调用它。

刚刚在我的服务器上测试了它。 任何未调用的函数都不会触发。

这如何工作比 drew010 的答案要复杂一些。 由于这是误导性的,我觉得我应该澄清这一点。 考虑以下测试用例:

主.php

<?php
require('/tmp/functions.php');
echo "exists=",function_exists('a1'),"'n";
a();
echo "exists=",function_exists('a1'),"'n";
a1();
?>

函数.php

<?php
function a(){
    require('a1.php');
}

回答 1.php

这将生成为输出:

exists=
exists=1
Hello World

换句话说,a1()在调用a()之前不存在,但它随后全局可用。 再举一个例子:

<?php
$a=false;
if( $a ){
    function x() {return 1;}
} else {
    function x() {return 2;}
}
echo x();    

这再次完全有效,并显示2 . 如果$a设置为 true,那么答案将是 1 ,如果你对这段代码进行 VLD,你可以看到为什么。 这两个函数发出您期望的操作码序列,但根据脚本文件的路径被赋予不可调用的名称(在我的例子中是%00x%2Ftmp%2Fy.php0x7fb364a1a03%00x%2Ftmp%2Fy.php0x7fb364a1a06 ) 调用代码生成一个

ZEND_DECLARE_FUNCTION    '%00x%2Ftmp%2Fy.php0x7fb364a1a033', 'x'

在进行第一个声明的路径点。 这使得函数可用作x(),类似的ZEND_DECLARE_FUNCTION使第二个函数可用作替代路径上的x()

完全相同的机制适用于类,尽管在这种情况下,调用ZEND_DECLARE_CLASS将内部类名绑定到其公共别名。