Здравствуйте. Помогите разобраться, почему интерпретатор выводит "white", когда должно быть по моей логике "black"? PHP: class Dog { static public $color = "white"; public function getColor(){ return self::$color; } } class BigDog extends Dog{ static public $color = "black"; } $oBigDog = new BigDog(); echo $oBigDog->getColor(); // white По моей логике: Метод getColor наследуется в классе BigDog и должен вызывать свойство "$color" класса BigDog, а не класса Dog. Почему происходит обращения к свойству color класса Dog? Спасибо, за внимание)
Ganzal, я так делал) И здесь работа кода мне понятна. PHP: class Dog { static public $color = "white"; public function getColor(){ return static::$color; } } class BigDog extends Dog{ static public $color = "black"; } $oBigDog = new BigDog(); echo $oBigDog->getColor(); // black и так делал))) И тут все логично. PHP: class Dog { static public $color = "white"; public function getColor(){ return self::$color; } } class BigDog extends Dog{ static public $color = "black"; public function getColor(){ return self::$color; } } $oBigDog = new BigDog(); echo $oBigDog->getColor(); // black Причем последний код, это копия должна быть первого. Но почему он так себя ведет, я не как не могу понять? --- Добавлено --- Это как? Можно чуть подробнее? Пожалуйста
PHP: class A { public static $prop = 'aaa'; public function met() { var_dump(self::$prop, static::$prop); } } class B extends A { public static $prop = 'bbb'; } $a = new A; $b = new B; $a->met(); $b->met(); Код (Text): string(3) "aaa" string(3) "aaa" string(3) "aaa" string(3) "bbb" что я делаю не так?
Ganzal, все норм) static работает по правилу: был наследован, бери свойства класса наследника. Тут вопросов нет. Все сходится с документацией по PHP. А вот self выводит всегда те свойства класса в котором он объявлен и пофиг, что он наследован в другом классе и в этом классе переопределены свойства. Почему наследование или переопределения не сработала для self, есть где-то документация, правило, такого поведения?
@Plush да я-то в курсе как работает позднее статическое связывание. Сэлф всегда будет работать в том классе, где идет объявление, сколько бы потом класс не наследовался - каждый потомок будет всё равно использовать самое первое объявление. А статик работает именно в режиме лсб - когда вызывается класс (статически или создается его экземпляр) то вся ветка наследования читается сверху-вниз и будет использовано то объявление, которое встретилось позже всего. PHP: class A { public static $prop = 'aaa'; public function met() { var_dump(self::$prop, static::$prop); } } class B extends A { public static $prop = 'bbb'; } class C extends B {} class D extends C { public static $prop = 'ddd'; } $a = new A; $b = new B; $c = new C; $d = new D; $a->met(); $b->met(); $c->met(); $d->met(); Код (Text): string(3) "aaa" string(3) "aaa" string(3) "aaa" string(3) "bbb" string(3) "aaa" string(3) "bbb" <-- в классе Ц нет переопределения проп, поэтому лсб использует последнее переопределение - в Б string(3) "aaa" string(3) "ddd" <-- а в классе Д опять есть переопределение, которое лсб и будет использовать как результирующее а сэлф везде тот же самый так как изначально был объявлен именно в классе А