1

在扩展相同父级的多个类中自动加载时,它们似乎会覆盖彼此的静态变量。

使用下面的代码,如果$staticvar仅在父Controller类中定义,Foo::$staticvar则被后续调用的类覆盖,这些类也扩展Controller

但是,如果 Foo 本身也定义了$staticvar = null;,则它不会被覆盖。为什么是这样?


系统.php

class System {
    static function load() {
        spl_autoload_register('System::autoload_controller');
        $classes = array('Foo', 'Bar', 'Test');
        foreach ($classes as $name) {
            $instance = new $name;
        }
    }

    static function autoload_controller($name) {
        echo $name.":\n";
        require_once strtolower($name).'.php';
        $name::$staticvar = 'static_'.$name;

        echo "Foo is: ".Foo::$staticvar."\n";
        echo $name." is: ".$name::$staticvar."\n\n";
    }
}

class Controller {
    static $staticvar = null;
}

System::load();

如果 foo.php 是这样的:

class Foo extends Controller {

}

我得到输出:

Foo:
Foo is: static_Foo
Foo is: static_Foo

Bar:
Foo is: static_Bar
Bar is: static_Bar

Test:
Foo is: static_Test
Test is: static_Test

但是,如果我将 foo.php 更改为:

class Foo extends Controller {
    static $staticvar = null;
}

我得到输出:

Foo:
Foo is: static_Foo
Foo is: static_Foo

Bar:
Foo is: static_Foo
Bar is: static_Bar

Test:
Foo is: static_Foo
Test is: static_Test
4

1 回答 1

4

但是,如果 Foo 本身也定义了 $staticvar = null; 那么它不会被覆盖。为什么是这样?

因为“静态”意味着它是静态的(绑定)到定义它的范围(类)。这意味着Controller::$staticvar并且Foo::$staticvar是两个不同的属性。

于 2012-04-03T08:33:17.083 回答