3

如果函数中包含或需要文件,如果未调用该函数,是否会加载该文件?例子:

页面.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?

4

4 回答 4

4

不,除非您实际调用函数b()c().

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

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

于 2012-08-10T18:30:52.047 回答
1

简单地说:不。如果requireorinclude在函数中,如果该函数未执行,则不会调用它。

于 2012-08-10T18:31:16.400 回答
1

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

于 2012-08-10T18:31:19.520 回答
0

它的工作原理比draw010的答案要复杂一些。由于这具有误导性,我觉得我应该澄清这一点。考虑这个测试用例:

主文件

<?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');
}

a1.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以将内部类名绑定到其公共别名。

于 2012-08-11T09:50:05.793 回答