同じ親を拡張する複数のクラスで自動ロードする場合、それらは互いに静的変数を上書きしているように見えます。
以下のコードを使用して、が親クラス$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