PHP позволяет скрывать родительские поля, если их производный уровень доступа такой же или более слабый, чем родительский уровень, как на фиг.1.
РИСУНОК 1
class A {
protected $x;
function f() {
return $this->x;
}
}
class B extends A {
protected $x = 'foo';
}
(new B)->f(); // 'foo'
Затенение используется здесь, чтобы воспользоваться преимуществами инициализации поля PHP. Тем не менее, некоторые линтеры, такие как Php Inspections (EA Extended) предупредите, что это неправильно, и вместо этого порекомендуйте использовать конструктор для инициализации поля, как показано на фиг.2.
Фиг 2
class A {
protected $x;
function f() {
return $this->x;
}
}
class B extends A {
function __construct() {
$this->x = 'foo';
}
}
(new B)->f(); // 'foo'
Переписав реализацию B
чтобы использовать инициализацию конструктора, нам вообще не нужно использовать теневое копирование.
Является ли слежка строго неправильной? Если нет, когда следует разрешать слежку?
Редактировать: онлайн документация для проверки: https://github.com/kalessil/phpinspectionsea/blob/master/docs/architecture.md#class-overrides-a-field-of-a-parent-class
Обратная связь приветствуется.
Других решений пока нет …