Переопределение констант класса 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.



Я читал документацию, но, похоже, не вижу никакого упоминания об этом нюансе. Может кто-нибудь пролить свет на меня?

749   2  

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 относится к классу, в котором определен вызываемый метод или свойство. Так что в вашем случае вы называете self in ChildClass, поэтому он использует переменную из этого класса. Тогда вы используете self in ParentClass, поэтому он будет ссылаться на переменную в этом классе.

если вы все еще хотите, чтобы дочерний класс переопределил const родительского класса, а затем настроить следующий код в родительском классе к этому:

public function showTest(){
    echo static::TEST;
    echo $this->test;
}

Примечание static ключевое слово. Это использует "позднюю статическую привязку". Теперь вы родительский класс будет вызывать const вашего дочернего класса.

Comments

    Ничего не найдено.