PHP兄弟类静态绑定

时间:2012-04-03 08:30:04

标签: php static-binding

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

使用下面的代码,如果$staticvar仅在父Controller类中定义,则Foo::$staticvar将被后续调用的类(Controller覆盖。

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


System.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

1 个答案:

答案 0 :(得分:4)

  

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

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