- PHP5支持抽象类和抽象方法。定义为抽象的类不能被实例化。
- 任何一个类,如果它里面至少有一个方法是被定义为抽象的,那么这个类就必须被声明为抽象的。
- 被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
- 继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更宽松)。
- 例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者共有的,而不能定义为私有的。(私有的>受保护的>供公共的)
- 此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。
- 例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两则的声明并无冲突。
- 这也适用于PHP5.4起的构造函数。在PHP5.4之前的构造函数声明可以不一样的
<?php
namespace Renzhifan\DesignPatterns\AbstractClass;
abstract class AbstractClass
{
abstract protected function getvalue();
abstract protected function prefixValue($prefix);
public function printOut()
{
print $this->getvalue()."\n";
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getvalue()
{
return "ConcreteClass1";
}
public function prefixValue($prefix)
{
return "{$prefix}ConcreteClass1";
}
}
class ConcreteClass2 extends AbstractClass
{
protected function getvalue()
{
return "ConcreteClass2";
}
public function prefixValue($prefix)
{
return "{$prefix}ConcreteClass2";
}
}
$class1=new ConcreteClass1();
$class1->printOut();
echo $class1->prefixValue("FOO_")."\n";
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";