抽象类或者抽象方法前面加上abstract关键字。
- PHP5开始支持抽象类和抽象方法
- 定义为抽象的类不能实例化。但是可以被继承。
- 任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
- 被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
- 继承一个抽象类的时候,子类必须定义父类中的所有抽象方法。
- 子类的访问控制必须和父类一样,或者更加宽松,比如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
- 子类调用父类的调用方式必须匹配,就是类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。
abstract class AbstractPhone{
//子类必须定义这些方法
//抽象类后面可以不带{}
abstract protected function getValue();
abstract protected function prefixValue($prefix);
//普通方法(非抽象方法)
public function printOut(){
print $this->getValue()."\n";
}
}
class PhoneClass1 extends AbstractPhone{
protected function getValue(){
return "Phone1";
}
public function prefixValue($prefix){
return "{$prefix}Phone1";
}
}
class PhoneClass2 extends AbstractPhone{
protected function getValue(){
return "Phone2";
}
public function prefixValue($prefix){
return "{$prefix}Phone2";
}
}
$phone1 = new PhoneClass1();
$phone1->printOut();
echo $phone1->prefixValue('Meizu')."\n";
$phone2 = new PhoneClass2();
$phone2->printOut();
echo $phone2->prefixValue('Meizu')."\n";
//输出
Phone1
MeizuPhone1
Phone2
MeizuPhone2
abstract class AbstractClass{
//我们抽象的方法仅需要定义需要的参数
abstract protected function prefixName($name);
}
class Phone extends AbstractClasss{
//子类可以定义父类不存在的参数
public function prefixName($name,$separator = "."){
if ($name == "Pacman") {
$prefix = "Mr";
} elseif ($name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$prefix}{$separator} {$name}";
}
}
$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
输出
Mr. Pacman
Mrs. Pacwoman