【问题标题】:Can I assign an object to a subclass from a superclass constructor in PHP?我可以从 PHP 中的超类构造函数将对象分配给子类吗?
【发布时间】:2015-01-16 21:22:46
【问题描述】:

使用通用示例:我有一个名为“Person”的类以及扩展 Person 的子类“Artist”和“Barber”。 'Person' 的构造函数根据键或 slug 从 SQL 数据库中提取有关此人的信息。

在大多数情况下,代码知道它正在创建的人的子类,即:

$jeff = new Barber( 'jeff' );

但有时我的代码不知道该人的子类是什么,但必须从他们的 SQL 行中获取。

我想做的是在“Person”的构造函数中放入一些东西,这样如果调用泛型,在它提取 SQL 数据后,它会检查“作业”列并将对象分配给子类。所以它看起来像:

class Person {

    public function __construct( $name ) {

        $info = get_from_sql( $name ); // function that returns this person's SQL row as an associative array

        if( ( get_class( $this ) == 'Person' ) && ( $info['job'] == 'Barber' ) ) { 
            [[[something here that will change this 'Person' to subclass 'Barber']]]
        }

    }

}

class Artist extends Person {
}

class Barber extends Person {
}

有没有办法将这个对象从超类构造函数中分配给一个子类,这样如果我调用这个......

$jeff = new Person( 'jeff' );

...'jeff' 行的 'job' DB 列表明他是理发师,$jeff 对象的类型为 Barber 而不仅仅是通用类型 Person?

(如果有一些非常简单的方法可以做到这一点,请原谅我......我基本上是自学成才的,我在这里搜索过,只找到了 Java 和 Python 的答案,这对我都没有帮助...... .)

【问题讨论】:

标签: php oop inheritance


【解决方案1】:

无法在其构造函数中更改类类型,这在技术上是不可能的。如果是这样,那将非常令人困惑:您创建了一个new Person,然后突然给自己一个Barber!?它的语义究竟应该是什么?

现在,如何解决问题本身:

  1. 显而易见的答案是尝试工厂模式,即在某处创建一个静态方法,根据具体情况生成Persons、Artists 或Barbers 的实例。如果您不想硬编码Barbers 和Artists 实例化,you can use Reflection 将基于包含目标类型的变量动态实例化类。

  2. 然而,就我个人而言,我会采用不同的方法,并倾向于组合而不是继承,即使 BarberArtist 成为 Profession 并将其注入 Person 的构造函数中,这样你可以创建new Person('jeff', new Barber())。这也改进了关注点的分离:虽然Person 有名字和年龄,但Barber 可能有,例如,相关技能。

【讨论】:

  • class Barber extends Person{}|更有意义
  • 谢谢...鉴于此,我想我将不得不重新考虑我的整体班级结构。感谢您的帮助。
【解决方案2】:

这对你有用吗? [省略]

在 cmets 之后编辑:这种方法无济于事,因为您无法从 Barber 对象的上下文中更改/获取 Person 对象的上下文,反之亦然。一个有趣的类重写可能是工厂模式。

【讨论】:

  • 我刚刚尝试过......但不幸的是,它并没有改变原始对象的类。 create() 函数确实创建了一个新的 Barber 对象,但更改并没有使它回到原始对象中的 $this$jeff = new Person( 'jeff' ); 从 Person 类之外返回的对象(并且 Jeff 在 DB 中作为理发师)仍然属于“Person”类,而不是“Barber”类。
  • @JGinDC 问题是这种方法没有解决方案(afaik)。你应该去工厂模式。 :)
猜你喜欢
  • 1970-01-01
  • 2021-11-12
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多