全局和spl_autoload_register

时间:2015-08-25 21:26:17

标签: php

在同一文件夹中创建以下文件。当您同时运行a.phpb.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';
});

2 个答案:

答案 0 :(得分:2)

a.php在全局范围内包含global.php会发生什么情况,因此global方法中的关键字bar()可以看到它。那时全球范围是“活着的”。

但是,在b.php上,global.php包含在自动加载功能中,在自动加载功能完成后立即死亡,并且在此处声明的任何变量也会死亡。 Foo类的定义不遵循以下规则:一旦定义了类,它就适用于任何范围(只要名称空间不被更改),因此类定义不会像{ {1}}变量。

请注意,$GLOBinclude只是扩展了该地区文件中的代码,因此在require中,就像在b.php内定义$GLOB一样}。

答案 1 :(得分:1)

当自动加载器在b.php中加载Foo类时,它还会加载全局变量。但是你没想到的是它在一个闭包中加载,因此没有添加到全局范围。

$GLOB被加载到a.php的全局范围中,但是当在自动加载器之前没有加载时,它只在内部加载时加载,因此全局不可用(除非你定义$GLOB应该从自动加载器关闭内部全局化。

感觉句子变得有点长而难以理解,但希望你理解它

相关问题