Почему вы можете переопределить начальное значение свойства, определенного в признаке, который используется в родительском классе? - PullRequest
0 голосов
/ 26 января 2019

В документации PHP сказано следующее о переопределении свойств черты:

Если черта определяет свойство, класс не может определить свойство с тем же именем, если оно не совместимо (такая же видимость и исходнаязначение), в противном случае выдается фатальная ошибка.

Однако, когда вы используете признак в абстрактном классе, вы можете переопределить свойства, определенные в признаке в классе, расширяющем этот абстрактный класс:

<?php

trait PropertyTrait
{
    public $prop = 'default';   
}

abstract class A
{
    use PropertyTrait;
}

class B extends A
{
    public $prop = 'overridden';

    public function write()
    {
        echo $this->prop;       
    }
}

$b = new B();

$b->write(); // outputs "overridden"

Живая демоверсия

Приведенный выше код работает, но я не могу найти какую-либо ссылку на него в документации.Это предполагаемая функция?

1 Ответ

0 голосов
/ 26 января 2019

Потому что для всех целей B не использует PropertyTrait. Используется A для создания абстрактного класса.

B не видит, какие черты A использует. Если бы вы выполнили class_uses на B, вы бы получили пустой массив. Документы и пример .

Поскольку B не использует никаких признаков, класс может переопределять любые унаследованные свойства.

Тот факт, что A является абстрактным классом, не имеет к этому никакого отношения. Такое же поведение будет происходить с любым классом, который расширяет класс, составленный с использованием признаков.

...