在同一文件夹中创建以下文件。当您同时运行a.php
和b.php
时,您希望它们都打印Hello World
。实际发生的是a.php
打印Hello World
,但b.php
不打印任何内容。有谁知道发生了什么?
a.php只会
<?php
require_once(__DIR__ . '/globals.php');
require_once(__DIR__ . '/autoload.php');
Foo::bar();
b.php
<?php
require_once(__DIR__ . '/autoload.php');
Foo::bar();
Foo.php
<?php
require_once(__DIR__ . '/globals.php');
class Foo {
public static function bar() {
global $GLOB;
echo $GLOB;
}
}
globals.php
<?php
$GLOB = 'Hello World';
autoload.php
<?php
spl_autoload_register(function ($class) {
require __DIR__ . '/' . $class . '.php';
});
答案 0 :(得分:2)
a.php
在全局范围内包含global.php
会发生什么情况,因此global
方法中的关键字bar()
可以看到它。那时全球范围是“活着的”。
但是,在b.php
上,global.php
包含在自动加载功能中,在自动加载功能完成后立即死亡,并且在此处声明的任何变量也会死亡。 Foo
类的定义不遵循以下规则:一旦定义了类,它就适用于任何范围(只要名称空间不被更改),因此类定义不会像{ {1}}变量。
请注意,$GLOB
和include
只是扩展了该地区文件中的代码,因此在require
中,就像在b.php
内定义$GLOB
一样}。
答案 1 :(得分:1)
当自动加载器在b.php
中加载Foo类时,它还会加载全局变量。但是你没想到的是它在一个闭包中加载,因此没有添加到全局范围。
$GLOB
被加载到a.php
的全局范围中,但是当在自动加载器之前没有加载时,它只在内部加载时加载,因此全局不可用(除非你定义$GLOB
应该从自动加载器关闭内部全局化。
感觉句子变得有点长而难以理解,但希望你理解它