PHP中require_once的范围是什么?

时间:2010-04-21 00:31:39

标签: php scope server-side-includes require-once

简单问题:require_once的范围是否为全球?

例如:

<?PHP

require_once('baz.php');

// do some stuff
foo ($bar);

function foo($bar) {
    require_once('baz.php');
    // do different stuff
}

?>

当foo被调用时,是否重新解析baz.php?或者它是否依赖于主php文件中已经需要的文件(对于相同的包含文件,连续两次调用require_once是相似的)?

之前我看过这个帖子,但它没有完全回答这个问题:

Should require_once "some file.php" ; appear anywhere but the top of the file?

感谢您的帮助!

4 个答案:

答案 0 :(得分:6)

require_once()基本上依赖于物理文件来确定它是否被包含在内。因此,您调用require_once()的上下文并非如此,而是先前是否需要该物理文件。

在上面的代码中,您的foo()函数不会重新解析baz.php,因为它将与之前包含在顶部的文件相同。

但是,根据您是将其包含在foo()中还是将其包含在顶部,您将得到不同的结果,因为当require_once()成功时,范围将适用。

答案 1 :(得分:5)

没有。 require_once的跟踪适用于内部函数。 但是,以下脚本会产生错误:

a.php只会

<?php
require_once('b.php');
function f() { require_once('b.php'); echo "inside function f;"; }
?>

b.php

<?php
f();
?>

因为函数f()没有预定义为b.php

答案 2 :(得分:3)

为了更具体地回答您的问题,第二次在该文件上调用require_once时,它将不会执行任何操作,因为它已经包含在内。

如果你的include中包含函数等,那么无论如何你都会在函数内部出现问题,因此范围无关紧要。如果只是定义或处理变量,那么如果您希望再次包含变量,则可以使用require而不是require_once,从而重新定义范围中的变量。

答案 3 :(得分:0)

至少在PHP 7.3中,require_once具有全局作用域。
如果不能,x.phpz.php都应该像y.php一样抛出错误:

a.php

<?php function a() { require_once 'b.php'; b(); }

b.php

<?php function b() { debug_print_backtrace(); }

x.php

<?php
require_once 'a.php';
a();
b();

->

#0 c() called at [/var/www/b.php:2]  
#1 b() called at [/var/www/a.php:3]  
#0 c() called at [/var/www/a.php:4]  

y.php

<?php
require_once 'a.php';
b();

->致命错误:未捕获错误:在第3行的/var/www/y.php中调用未定义的函数b()

z.php

<?php
require_once 'a.php';
require_once 'b.php';
b();

->

#0 b() called at [/var/www/z.php:4]