php - 类继承、代码分解、php 对象模型

标签 php inheritance object

假设我有一个抽象类 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/

相关文章:

javascript - 不明白为什么不应在语句开头使用对象文字

php - 根据url中的word加载css

php - NodeJS 推送队列,由 Laravel worker 使用

java - 实现不兼容的接口(interface)

java - 了解方法继承

java - 如何正确编译 tostring 方法

Java - 在 Arraylist 中排列 Arraylist 中的对象

javascript - 当服务器上的数据更改时刷新客户端网页(php 或 javascript)

php - 在 Woocommerce 3 中对购物车商品使用条件 has_term() 函数

pythons 'print' 语句不调用 .write() 方法?