具有继承和类型提示的静态工厂模式

时间:2019-03-25 14:00:33

标签: php inheritance type-hinting static-factory named-constructor

我正在尝试创建Developer的子类Person
我希望他们两个都使用静态工厂模式(或“命名构造函数”)。

我已经看到了这种模式的一些示例,但是没有一个使用继承。

问题1
在示例中,它们使构造方法始终为私有。
可以对其进行保护以便从子构造方法中调用吗?
还是应该解决使构造函数始终私有的问题,并尝试从子项的create方法调用父项的create方法来构建继承的问题?

问题2
当我尝试实例化类Person或Developer时,出现以下错误。为什么?

PHP Fatal error:  Declaration of Developer::create(string $name, string $surname, ?int $yearsOfExperience = NULL, ?string $preferredLanguage = NULL): Developer must be compatible with Person::create(string $name, string $surname): Person in InheritanceTest.php on line 57

当我同时删除两个: self方法中的create类型提示时,它可以工作,但是如果Developer是{{1的子类, }}。

谢谢。

Person

1 个答案:

答案 0 :(得分:0)

问题1:

  

在示例中,它们使构造方法始终为私有。   可以对其进行保护以便从子构造方法中调用吗?

您必须对其进行保护。否则,将不允许子级调用父级的方法。

问题2:

  

当我在两个create方法中都删除:self类型提示时,此方法有效,但是如果Developer是Person的子类,我不明白为什么它们不兼容。

尝试使用static代替self。它可能有效,但我不确定。但是您仍然会注意到(或警告,不记得了),因为Developer中的工厂方法具有与Person不同的参数。在PHP中允许这样做,但不建议这样做。