在扩展相同父级的多个类中自动加载时,它们似乎会覆盖彼此的静态变量。
使用下面的代码,如果$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