Скажем, у меня есть абстрактный класс Entity, у меня также есть несколько абстрактных классов Provider, Model, Service, ... все это расширяет непосредственно Entity.Наконец, у меня есть последний набор конкретных классов ConcreteProvider, ConcreteModel, ..., который расширяет соответственно Provider, Model, ...
На каждом экземпляре Concrete * я хочу метод getId (), который при вызовеэкземпляр класса, который расширяет Provider (например, ConcreteProvider), он возвращает строку «Provider» и т. д. для Model и ...
Единственный способ, который я нашел для достижения этой цели:
abstract class Entity {
abstract function getId ();
}
abstract class Provider extends Entity {
function getId () {
return __CLASS__;
}
}
abstract class Model extends Entity {
function getId () {
return __CLASS__;
}
}
class ConcreteProvider extends Provider {
}
class ConcreteModel extends Model {
}
$cp = new ConcreteProvider();
echo $cp->getId() . "\n"; // returns the string Provider
$cm = new ConcreteModel();
echo $cm->getId(); // returns the string Model
Дублирование кода здесь очевидно.Я ищу то же самое поведение без дубликатов.Думаю, было бы неплохо поместить метод в Entity.
У вас есть идея?Как бы вы это сделали?
// Edit
Конечно, есть способ переместить getId в Entity:
abstract class Entity {
function getId () {
$class = get_called_class();
while ( __CLASS__ !== get_parent_class($class) )
$class = get_parent_class($class);
return $class;
}
}
Но есть много вычисленийИбо, ничего, ничего не стоит ...