简单的问题: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文件中已经需要的文件(类似于对于相同的include文件连续两次调用require_once)?
我之前看过这个线程,但并没有完全回答问题:
Should require_once "some file.php" ; appear anywhere but the top of the file?
感谢您的帮助!
require_once()
主要依靠物理文件来确定是否包含该文件。因此,您要调用的不是require_once()
上下文,而是先前是否需要该物理文件。
在上面的代码中,您的foo()
函数将不会重新解析baz.php
,因为它将与先前包含在顶部的文件相同。
但是,根据您将其包含在foo()
中还是将其包含在顶部,您将获得不同的结果,因为在require_once()
成功时将应用作用域。
没有。 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
。
为了更明确地回答您的问题,第二次在该文件上调用require_once
时,它不会做任何事情,因为它已经包含在内。
如果您的include包含函数等,那么无论如何您都会在函数内部包含问题,因此范围是无关紧要的。如果只是要定义或处理的变量,那么如果希望再次包含它,则可以使用require
而不是require_once
,从而在您的作用域中重新定义变量。
至少在PHP 7.3中,require_once
具有全局范围。如果不是这样,则x.php
和z.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]