當自動加載多個擴展同一個父類的類時,它們似乎會覆蓋其他每個靜態變量。PHP兄弟類靜態綁定
使用下面的代碼,如果$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
當繼承一個靜態變量時,它的行爲是正確的,這意味着父類和子孫的所有實例共享實際的SAME變量,因此如果實例更改變量值,它似乎被更改或「覆蓋」在所有的實例,因爲它是共享相同的變量。 – Yaniro 2012-04-03 08:38:34