2012-04-03 15 views
1

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 
+0

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

Antwort

4

Wenn sich jedoch Foo auch definiert $ staticvar = null ; dann wird es nicht überschrieben. Warum ist das?

Da "statisch" bedeutet, ist es statisch (gebunden) an den Bereich (Klasse), wo es definiert ist. Dies bedeutet Controller::$staticvar und Foo::$staticvar sind zwei verschiedene Eigenschaften.

+0

Das macht Sinn. Gibt es keine Möglichkeit, die Kinder zu einer eigenen Version der statischen Variablen zu zwingen, ohne sie jeweils definieren zu müssen? –

+0

"Ohne es zu definieren"? Das ist der Weg, um es zu "zwingen":? – KingCrunch

+0

Richtig, es scheint nur so, als würden sie nicht richtig erben, aber ich kann sehen, warum es so ist. Vielen Dank. –

Verwandte Themen