Beim Autoloading in mehreren Klassen, die das gleiche Elternelement erweitern, scheinen sie die jeweils anderen statischen Variablen zu überschreiben.PHP Geschwisterklassen statische Bindung
den Code unten verwenden, wenn die $staticvar
nur in der Mutter Controller
Klasse definiert wird dann Foo::$staticvar
durch die nachfolgenden genannten Klassen überschrieben, die auch Controller
erweitern.
Wenn Foo selbst auch $staticvar = null;
definiert, wird es nicht überschrieben. Warum ist das?
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();
Wenn foo.php ist dies:
class Foo extends Controller {
}
ich die Ausgabe:
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
Aber wenn ich das ändern foo.php:
class Foo extends Controller {
static $staticvar = null;
}
ich die Ausgabe:
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
Das Verhalten ist korrekt, wenn eine statische Variable geerbt wird, bedeutet dies, dass alle Instanzen der übergeordneten Klasse und der Nachkommen die tatsächliche Variable SAME gemeinsam haben. Wenn eine Instanz den Wert der Variablen ändert, wird sie scheinbar geändert oder "überschrieben" alle Instanzen, weil es die gleiche Variable ist, die geteilt wird. – Yaniro