同じ親を拡張する複数のクラスでオートロードすると、静的変数が互いに上書きされているように見えます。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
静的変数を継承すると、インスタンスが変数値を変更した場合、変更または上書きされるすべてのインスタンスは同じ変数が共有されているためです。 – Yaniro