При автозагрузке в нескольких классах, расширяющих одного и того же родителя, они перезаписывают статические переменные друг друга.
Используя приведенный ниже код, если $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