php抽象类扩展方法参数类型或类型提示类型

时间:2018-09-24 04:21:09

标签: php oop design-patterns

考虑到这种情况,我有一个抽象类,子类采用一个蓝图并对其执行不同的操作。现在,我有多个类可以对此进行扩展,并对蓝图执行略有不同的操作,因此,我可以扩展上述蓝图的版本,我需要每个子类都可以获取。

因此,我想将抽象类中的属性或相应函数输入属性定义为/类型,将其定义为any,然后在每个子类中指定属性类型。

但是我不能这样做,因为PHP 7给我一个错误

Declaration B::setBlueprint() must be compatible with A::setBlueprint()

蓝图类

class Blueprint {
    public $id;
}

class ChildBlueprint extends ParentBlueprint {
    public $someOtherPropINeedOnlyInThisClass;
}

以及使用这些蓝图的抽象类

abstract class A {
    abstract public function setBlueprint( ParentBlueprint $_ );
}

class B extends A {
    public function setBlueprint( ChildBlueprint $_ ) {}
}

我的意思是我需要一个从所有A,B,C,...,X,Y类中派生的蓝图,因此将其排除在抽象类之外是没有意义的。

有什么好的OOP解决方案?

1 个答案:

答案 0 :(得分:1)

您可以通过实现依赖反转来克服这一点:

interface Blueprint {
}

class ParentBluePrint implements Blueprint
{
    public $id;
}

class ChildBluePrint extends ParentBlueprint
{
    public $id;
}

abstract class A
{
    abstract public function setBlueprint( Blueprint $_ );
}

class B extends A
{
    public function setBlueprint( Blueprint $_ ) {}
}

详细了解相关的SOLID原则here