2012-04-03 24 views
1

同じ親を拡張する複数のクラスでオートロードすると、静的変数が互いに上書きされているように見えます。PHP兄弟クラス静的バインディング

Controllerクラスで$staticvarが定義されている場合、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が、この場合には:

012:

class Foo extends Controller { 

} 

私は出力を得ます


しかし、私はこれに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 
+0

静的変数を継承すると、インスタンスが変数値を変更した場合、変更または上書きされるすべてのインスタンスは同じ変数が共有されているためです。 – Yaniro

答えて

4

しかし自分自身をFOO場合も$ staticvar = NULLを定義します;上書きされません。どうしてこれなの?

「静的」とは、定義されているスコープ(クラス)に対して静的(バインド)されていることを意味するためです。これは、Controller::$staticvarおよびFoo::$staticvarが2つの異なるであることを意味します。

+0

意味があります。それぞれのケースでそれを定義することなく、静的変数の独自のバージョンを持つように子供に強制する方法はありませんか? –

+0

「定義していない」?それはそれを「強制」する方法です: – KingCrunch

+0

実際には、正しく継承されていないように見えますが、なぜこのようなものなのか分かります。ありがとう。 –