Переопределение констант класса vs свойства
Я хотел бы лучше понять, почему в приведенном ниже сценарии существует разница в том, как константы класса наследуются по сравнению с переменными экземпляра.
<?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, версия ParentClass тестовой константы оценивается, тогда как поскольку он вычисляется в контексте ChildClass через наследование, вычисляется переменная-член ChildClass $test.
Я читал документацию, но, похоже, не вижу никакого упоминания об этом нюансе. Может кто-нибудь пролить свет на меня?
2 ответов:
self::не учитывает наследование и всегда ссылается на класс, в котором он выполняется. Если вы используете php5. 3+ Вы можете попробоватьstatic::TESTкакstatic::наследование-в курсе.разница в том, что
static::использует "позднюю статическую привязку". Дополнительную информацию можно найти здесь:http://php.net/manual/en/language.oop5.late-static-bindings.php
вот простой тестовый скрипт I написал:
<?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 относится к классу, в котором определен вызываемый метод или свойство. Так что в вашем случае вы называете
selfinChildClass, поэтому он использует переменную из этого класса. Тогда вы используетеselfinParentClass, поэтому он будет ссылаться на переменную в этом классе.если вы все еще хотите, чтобы дочерний класс переопределил
constродительского класса, а затем настроить следующий код в родительском классе к этому:public function showTest(){ echo static::TEST; echo $this->test; }Примечание
staticключевое слово. Это использует "позднюю статическую привязку". Теперь вы родительский класс будет вызывать const вашего дочернего класса.
Comments