Я хотел бы лучше понять, почему в приведенном ниже сценарии существует разница в том, как наследуются константы класса против переменных экземпляра.
<?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 вашего дочернего класса.