PHP-为什么require_once和include_once不起作用?

PHP-为什么require_once和include_once不起作用?

想挽留 发布于 2017-07-11 字数 496 浏览 1078 回复 3

在使用require_once和include_once时,经常会遇到以下这种诡异的现象:

文件test1.php代码如下:

<?php
get_file();
//TODO
get_file();
function get_file() {
include_once('./test2.php');//require_once结果也一样
var_dump($config);
}
?>

文件test2.php代码如下:

<?php
$config = array('foo' => 'bar');
?>

运行结果为:
array(1) {
["foo"]=>
string(3) "bar"
}
NULL

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夜无邪 2017-10-28 3 楼

在PHP中,包含一个文件有4种方式:require,require_once,include,include_once,其中require_once/include_once与require/include相比,在功能上,仅仅是增加了一个是否已经加载过的检测,require_once/include_once在一次PHP执行过程中,保证一个文件只被加载一次.

require和include的区别仅仅是出错级别的不同,require引发一个E_ERROR级别的错误,而include引发一个E_WARNING级别的错误

你的程序中第二次调用get_file();的时候,include_once('./test2.php')其实是无效的。而$config又不是全局的,所以第二次结果为NULL。

你可以把错误打开,运行你的代码会出Notice: Undefined variable: config提示:

ini_set("display_errors",'on');
error_reporting(E_ALL);

晚风撩人 2017-10-20 2 楼

因为$config不是全局的,第二调用,没有执行include操作,导致$config为NULL,在函数中设定$config为全局变量即可:

 function get_file() {
global $config;//设定为全局变量
include_once('./test2.php');//只include一次
var_dump($config);
}

晚风撩人 2017-10-18 1 楼

以下摘自PHP文档:

当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。
果 include 出现于调用文件中的一个函数里,则被调用的文件中所包含的所有代码将表现得如同它们是在该函数内部定义的一样。所以它将遵循该函数的变量范围。 An exception to this rule are magic constants which are evaluated by the parser before the include occurs.

在这点上Lua的方式更好些:不论在什么位置、上下文中,不带local修饰的标识符都是全局的,因此,不论怎样组织代码结构都不影响语义;
PHP就不同了,变量作用域缺省受到所处上下文影响,除非明确标明是global。