Я хотел бы лучше понять, почему в приведенном ниже сценарии существует разница в том, как наследуются константы класса против переменных экземпляра.
<?php class ParentClass { const TEST = "ONE"; protected $test = "ONE"; public function showTest(){ echo self::TEST; echo $this->test; } } class ChildClass extends ParentClass { const TEST = "TWO"; protected $test = "TWO"; public function myTest(){ echo self::TEST; echo $this->test; } } $child = new ChildClass(); $child->myTest(); $child->showTest();
Вывод:
TWO TWO ONE TWO
В приведенном выше коде ChildClass не имеет метода showTest (), поэтому метод наследования ParentClass showTest () используется наследованием. Результаты показывают, что, поскольку метод выполняется в ParentClass, оценивается версия константы TEST в ParentClass, тогда как потому, что она оценивается в контексте ChildClass через наследование, оценивается членная переменная $ testClassClass.
Я прочитал документацию, но, похоже, не вижу упоминания об этом нюансе. Может ли кто-нибудь пролить свет на меня?
self:: Не относится к наследованию и всегда относится к классу, в котором он выполняется. Если вы используете php5.3 +, вы можете попробовать static::TEST поскольку static:: is inheritance-aware.
Разница в том, что static:: использует «позднюю статическую привязку». Более подробную информацию можно найти здесь:
http://php.net/manual/en/language.oop5.late-static-bindings.php
Вот простой тестовый сценарий, который я написал:
<?php class One { const TEST = "test1"; function test() { echo static::TEST; } } class Two extends One { const TEST = "test2"; } $c = new Two(); $c->test();
вывод
test2
В PHP self относится к классу, в котором определен вызываемый метод или свойство. Поэтому в вашем случае вы вызываете self в ChildClass , поэтому он использует переменную из этого класса. Затем вы используете self в ParentClass , поэтому он будет ссылаться на переменную этого класса.
если вы все еще хотите, чтобы дочерний класс переопределял const родительского класса, настройте следующий код в родительском классе:
public function showTest(){ echo static::TEST; echo $this->test; }
Обратите внимание на ключевое слово static . Это использует «позднюю статическую привязку». Теперь вы родительский класс вызовет const вашего дочернего класса.