Хотелось бы услышать мнение сообщества по поводу правильного оформления классов при наследовании.
Чтобы не лить воду, перейду сразу к примеру.
Есть базовый класс:
Код: Выделить всё
<?php
abstract class Animal
{
public static function classes()
{
return [
Dog::TYPE_ID => Dog::class,
Cat::TYPE_ID => Cat::class,
];
}
public function getTypeId()
{
return static::TYPE_ID;
}
public function getTypeAlias()
{
return static::TYPE_ALIAS;
}
public function getTypeTitle()
{
return static::TYPE_TITLE;
}
}
Код: Выделить всё
<?php
class Dog extends Animal
{
const TYPE_ID = 1;
const TYPE_ALIAS = 'dog';
const TYPE_TITLE =' Собака';
// Dog related methods
public function sayWoof() {}
}
class Cat extends Animal
{
const TYPE_ID = 2;
const TYPE_ALIAS = 'cat';
const TYPE_TITLE = 'Кошка';
// Cat related methos
public function sayMeow() {}
}
Так вот, собственно, что меня смутило. Я использовал константы для определения свойств в дочерних классах - вроде бы свойства классов постоянные и неизменяемые, НО:
1. В абстрактном классе Animal, PhpStorm ругается - мол, нет таких констант в данном классе. Добавление констант-пустышек, только лишь бы удовлетворить IDE, кажется не очень хорошей идеей.
2. Иногда, при использовании констант для таких целей, получается их переопределение (override) в дочерних классах, а это тоже, как я читал на StackOverflow, не очень хорошая практика. Типа константа должна быть константой).
Но есть и определенные плюсы:
1. Можно обратиться к свойствам классов без создания экземпляра. Например, чтобы получит список классов всех видов животных в БД (как в методе Animal::classes()).
2. Константы не 'висят' в самом экземпляре класса, например если сделать
Код: Выделить всё
var_dump(new Dog())
3. Для глаза как-то чище и приятнее код.
Расскажите свое мнение по этому поводу. Может лучше использовать статические свойства? Или можете предложить свои примеры решения таких ситуаций?