PHP 如果我在函数内部使用 requre() 是调用函数之前的那个文件吗?

Posted

技术标签:

【中文标题】PHP 如果我在函数内部使用 requre() 是调用函数之前的那个文件吗?【英文标题】:PHP if I use requre() inside of a function is that file before calling the function? 【发布时间】:2012-08-08 02:01:00 【问题描述】:

如果函数中包含或需要一个文件,如果该函数没有被调用,它是否会被加载?示例:

page.php

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

functions.php

<?php
function a()
    require('a.php');

function b()
    require('b.php');

function c()
    include('c.php');

?>

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

【问题讨论】:

如果你在函数内部使用 require(),文件中的“全局变量”将是函数的局部变量。 另一个问题:您的测试代码已经准备就绪……您没想过运行它并立即得到答案吗? 【参考方案1】:

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

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

更多详情请见PHP: include。

【讨论】:

感谢您提供有关位置的额外信息。 @drer010,您的声明“也就是说......他们定义的函数分别在 b() 或 c() 之外不可用。”是不是真的!!请参阅User-defined functions - “PHP 中的所有函数和类都具有全局范围 - 即使它们是在函数内部定义的,它们也可以在函数外部调用,反之亦然。”也就是说,一旦执行了包含函数定义的函数或逻辑路径,该函数就可以全局使用。【参考方案2】:

简单地说:不。如果requireinclude 在函数中,如果函数没有执行,它不会被调用。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

ma​​in.php

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

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

【讨论】:

以上是关于PHP 如果我在函数内部使用 requre() 是调用函数之前的那个文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 扩展覆盖内部 Zend 函数?

PHP自动加载机制。

PHP仅从函数内部退出当前包含的脚本文件

如何使用eclipse查看php函数源代码

函数外部/内部的变量:PHP初学者

如何在函数内部触发 $.post?