在扩展同一父级的多个类中自动加载时,它们似乎会覆盖彼此的静态变量。
使用下面的代码,如果$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
答案 0 :(得分:4)
但是,如果Foo本身也定义了$ staticvar = null;然后它不会被覆盖。这是为什么?
因为“static”意味着它是静态的(绑定)到定义它的范围(类)。这意味着Controller::$staticvar
和Foo::$staticvar
是两个不同的属性。