14

简单的问题:范围是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 两次)?

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

应该 require_once "some file.php" ; 出现在文件顶部以外的任何地方?

谢谢你的帮助!

4

4 回答 4

7

require_once()基本上依靠物理文件来确定它是否被包含在内。因此,与其说是您调用的上下文,require_once()不如说是之前是否需要该物理文件。

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

但是,根据您是将其包含在内部foo()还是将其包含在顶部,您将获得不同的结果,因为范围界定将在require_once()成功时应用。

于 2010-04-21T00:37:27.283 回答
5

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

一个.php

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

b.php

<?php
f();
?>

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

于 2010-04-21T00:58:04.900 回答
3

为了更具体地回答您的问题,您第二次调用require_once该文件时,它不会做任何事情,因为它已经被包含在内。

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

于 2010-04-21T00:42:03.603 回答
0

至少在 PHP 7.3 中,require_once具有全局范围。
如果不是,两者都x.php应该z.php抛出错误y.php

一个.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]
于 2019-11-21T02:03:11.010 回答