php - 我可以从 PHP 中的父类(super class)构造函数将对象分配给子类吗?

标签 php oop inheritance

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

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

$jeff = new Barber( 'jeff' );

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

我想做的就是在“Person”的构造函数中添加一些内容,这样如果调用泛型,在提取 SQL 数据后,它会在“job”列上运行检查并将对象分配给子类。所以它看起来像:

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 {
}

是否有某种方法可以将此对象从父类(super class)构造函数分配给子类,这样如果我调用它...

$jeff = new Person( 'jeff' );

...行“jeff”的“job”数据库列表明他是理发师,$jeff 对象具有 Barber 类型而不仅仅是泛型类型 Person?

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

最佳答案

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

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

  1. 显而易见的答案是尝试工厂模式,即在某处创建一个静态方法,该方法会生成 Person 的实例。 s,ArtistBarber视具体情况而定。如果您不想硬编码 BarberArtist s 实例化,you can use Reflection基于包含目标类型的变量动态实例化该类。

  2. 但是,就我个人而言,我会采用不同的方法并倾向于组合而不是继承,即 make BarberArtist一个Profession并将其注入(inject) Person的构造函数,以便您可以创建 new Person('jeff', new Barber()) 。这也改善了关注点分离: while Person有姓名和年龄,a Barber例如,可能拥有相关技能。

关于php - 我可以从 PHP 中的父类(super class)构造函数将对象分配给子类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27992949/

相关文章:

php - 如何让JS函数每次调用都从数据库中获取数据?

php - 通过 Chrome 扩展使用 PHPAuth/PHPAuth 登录网站

php - 使用 Paypal php rest SDK 汇款

java - 继承与多态——理解

swift - 在 Swift 中子类化 NSLayoutConstraint

php - 如何在后续查询中使用 SQL 查询的结果?

perl - 如何使用 Moose::Exporter 导出函数?

ios - 初始化程序与默认属性值

java - 在值对象中存储常量

java - Java中的线程继承