假设我有一个抽象类 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
这里的代码重复是显而易见的。我正在寻找没有重复的相同行为。我想将该方法放入实体中会很好。
你有什么想法吗?你会怎么做?
//编辑
当然,有一种方法可以将 getId 移动到 Entity 中:
abstract class Entity {
function getId () {
$class = get_called_class();
while ( __CLASS__ !== get_parent_class($class) )
$class = get_parent_class($class);
return $class;
}
}
但是有很多计算,在我看来,没有什么值(value)......
最佳答案
我不太喜欢魔法,因此我推荐直接的方式
const ID = 'Provider';
public function getId () {
return self::ID;
}
或者只是
function getId () {
return 'Provider';
}
但是有了常数就更容易比较
$x->getId() == Provider::ID;
关于php - 类继承、代码分解、php 对象模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9071210/