PHP родственные классы статическое связывание - PullRequest
1 голос
/ 03 апреля 2012

При автозагрузке в нескольких классах, расширяющих одного и того же родителя, они перезаписывают статические переменные друг друга.

Используя приведенный ниже код, если $staticvar определен только в родительском классе Controller, тогда 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 это:

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

1 Ответ

4 голосов
/ 03 апреля 2012

Если, однако, сам Foo также определяет $ staticvar = null;тогда это не перезаписывается.Почему это так?

Поскольку «статический» означает, что он является статическим (связанным) с областью (классом), в которой он определен.Это означает, что Controller::$staticvar и Foo::$staticvar - это два разных свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...