【问题标题】:How to build a subclass using an inherited factory method defined in the superclass in PHP?如何使用 PHP 超类中定义的继承工厂方法构建子类?
【发布时间】:2019-12-25 21:09:49
【问题描述】:

我是 PHP 新手。我有三个类,比如ABC,其中BC 直接继承自A。我的问题是,我需要一个静态工厂,比如 createInstance(),它为 A 类定义一次,并且适用于其后代。所以当有人调用A::createInstance()时,它返回一个A类型的对象,而调用B::createInstance()返回一个B的实例,C::createInstance()返回一个C的实例。我将以下代码放入类A 中的createInstance() 定义中:

public static function createInstance() {
    return new self();
}

但这不能满足我的需求,因为self 总是指A 类,无论它被调用什么类。换句话说,调用B::createInstance()C::createInstance 总是返回A 类型的对象。如何创建这样一个返回适当类的对象的工厂方法?

【问题讨论】:

    标签: php inheritance static-methods factory-pattern self


    【解决方案1】:

    PHP 有一个可以使用的 static 关键字:

    public static function createInstance() {
        return new static();
    }
    

    【讨论】:

    • 亲爱的匿名用户,我通过 Deitel 的“Java 如何编程”一书学习了 Java。它非常有用,因为它几乎教授了 Java 的每一个细节。它仔细检查一切(也许太多了)。不幸的是,Deitel 还没有写过这样一本关于 PHP 的书。我真的需要一本这样的书,但还没有找到。你知道这样一本解释语言工作原理的书吗?
    • @HedayatMahdipour 我没有什么比阅读the PHP documentation 更好的了。您不必阅读所有内容,但其中包含最新信息和大量示例。
    • 在一个非常相似的线程上,评分最高的答案说应该避免这种模式。我不想过度索引该用户的意见,所以如果您认为这是一个很好的使用模式,我会很好奇@Anonymous...这是另一个问题:stackoverflow.com/questions/8583989/…
    • @gen 我从来不需要这种模式,但是当所有子类都知道时可能没问题。通常有更好的方法。例如,在链接的问题中,我不明白为什么 User 也需要该方法。我会改用特征
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多