Как правильно избавляться от связей с ненужными свойствами родительского класса внутри класса-наследника? Класс А обладает приватным свойством $prop, которое инициализируется в конструкторе с помощью защищенного метода:class A { private $prop; ... public function __construct(array &$config) { if (isset($config['prop'])) { $this->setProp($config['prop']); } ... } protected function setProp($value) { $this->prop = $value; } ... } Почему именно с помощью защищенного метода? Например, я хочу, чтоб свойство $prop можно было задать извне (через конфигурационный массив) только один раз во время создания объекта класса. Если бы не protected, то метод setProp() - классический setter. Зачем он нужен? Для того, чтоб была возможность переопределить его в классе-наследнике B:class B extends A { // ... public function __construct(array &$config) { parent::__construct($config); // инициализация свойств характерных только для класса B // ... } final protected function setProp(){} // ... } Таким образом присвоение не произойдет. Казалось бы, если не передавать в конфигурационном массиве not null элемент с ключом "prop", то и никакого вызова setProp() не будет. Предположим, что этот массив требуется для инициализации нескольких объектов и создается одним способом и один раз. Такое ограничение оправдано, если получить значения для него - трудоёмкая задача (поэтому, кстати, в аргументе конструктора я передаю его по ссылке). Следовательно, каждый обьект, его использующий, должен взять от него только нужные данные. Тогда невозможность передавать в конструктор "правильный" массив становится обоснованной. Еще в качестве решения можно предложить переписать конструктор в классе-потомке без использования родительского конструктора. Но, по-моему, это приведет к откровенной копипасте. Можете ли подсказать лучшее решение, чем поставлять заглушку вместо метода в наследнике? В принципе, меня не особо волнует, что в классе В есть какое-то ненужное свойство $prop (пусть даже инициализированное), если я его не использую. Но может все таки стоит волноваться? Кто нибудь встречался с какими нибудь проблемами или неудобствами в этом плане?
Если свойство $prop является ненужным для класса-наследника и вы не хотите его использовать в нем, то лучшим решением будет переопределить конструктор класса-наследника без вызова конструктора родительского класса.
Примерно так:
class B extends A { public function __construct(array &$config) { // инициализация свойств характерных только для класса B // ... // не вызываем конструктор родительского класса } }
Это избавит вас от лишних свойств в классе-наследнике и не потребует использования заглушки для метода setProp(). В данном случае вы сможете избавиться от свойства $prop в классе-наследнике вообще и не иметь его в нем.
Относительно использования неиспользуемого свойства $prop в классе-наследнике, это зависит от конкретной ситуации. Если вы уверены, что не будете использовать это свойство в классе-наследнике и оно не повлияет на работу вашей программы, то его наличие может не вызывать проблем. Однако, если это приводит к путанице или увеличивает сложность кода, то лучше избавиться от ненужных свойств.
Если свойство $prop является ненужным для класса-наследника и вы не хотите его использовать в нем, то лучшим решением будет переопределить конструктор класса-наследника без вызова конструктора родительского класса.
Примерно так:
class B extends A{
public function __construct(array &$config)
{
// инициализация свойств характерных только для класса B
// ...
// не вызываем конструктор родительского класса
}
}
Это избавит вас от лишних свойств в классе-наследнике и не потребует использования заглушки для метода setProp(). В данном случае вы сможете избавиться от свойства $prop в классе-наследнике вообще и не иметь его в нем.
Относительно использования неиспользуемого свойства $prop в классе-наследнике, это зависит от конкретной ситуации. Если вы уверены, что не будете использовать это свойство в классе-наследнике и оно не повлияет на работу вашей программы, то его наличие может не вызывать проблем. Однако, если это приводит к путанице или увеличивает сложность кода, то лучше избавиться от ненужных свойств.