使用通用示例:我有一个名为“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
!?它的语义究竟应该是什么?
现在,如何解决问题本身:
显而易见的答案是尝试工厂模式,即在某处创建一个静态方法,该方法会生成
Person
的实例。 s,Artist
或Barber
视具体情况而定。如果您不想硬编码Barber
和Artist
s 实例化,you can use Reflection基于包含目标类型的变量动态实例化该类。但是,就我个人而言,我会采用不同的方法并倾向于组合而不是继承,即 make
Barber
和Artist
一个Profession
并将其注入(inject)Person
的构造函数,以便您可以创建new Person('jeff', new Barber())
。这也改善了关注点分离: whilePerson
有姓名和年龄,aBarber
例如,可能拥有相关技能。
关于php - 我可以从 PHP 中的父类(super class)构造函数将对象分配给子类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27992949/