1

同じ親を拡張する複数のクラスで自動ロードする場合、それらは互いに静的変数を上書きしているように見えます。

以下のコードを使用して、が親クラス$staticvarでのみ定義されている場合は、も拡張する後続の呼び出されたクラスによって上書きされます。ControllerFoo::$staticvarController

ただし、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
4

1 に答える 1

4

ただし、Foo 自体も $staticvar = null; を定義している場合。上書きされません。どうしてこれなの?

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

于 2012-04-03T08:33:17.083 に答える