gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:59:44 25 4
gpt4 key购买 nike

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

但是有很多计算,imo,没有什么值得......

最佳答案

我不是魔术的忠实粉丝,因此我推荐直截了当的方式

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com