PHP OPP机制和模式简介(抽象类、接口和契约式编程)
1.抽象类
抽象类机制中总是要定义一个公共的基类,而将特定的细节留给继承者来实现。通过抽象概念,可以在开发项目中创建扩展性很好的架构。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。在类的声明中使用abstract修饰符就可以将某个类声明为抽象的。
1.1方法原型(prototype)
是指方法的定义中剔除了方法体之后的签名。它包括存取级别、函数关键字、函数名称和参数。他不包含({})或者括号内部的任何代码。例如下面的代码就是一个方法原型:
publicfunctionprototypeName($protoParam)
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。
1.2关于抽象类
某个类只要包含至少一个抽象方法就必须声明为抽象类
声明为抽象的方法,在实现的时候必须包含相同的或者更低的访问级别。
不能使用new关键字创建抽象类的实例。
被生命为抽象的方法不能包含函数体。
如果将扩展的类也声明为抽象类,在扩展抽象类时,可以不用实现所有的抽象方法。(如果某个类从抽象类继承,当它没有实现基类中所声明的所有抽象方法时,它就必须也被声明为抽象的。)
1.3使用抽象类
<?php abstractclassCar { abstractfunctiongetMaxSpeend(); }
classRoadsterextendsCar { public$Speend;
publicfunctionSetSpeend($speend=0) { $this->Speend=$speend; } publicfunctiongetMaxSpeend() { return$this->Speend; } }
classStreet { public$Cars; public$SpeendLimit;
function__construct($speendLimit=200) { $this->SpeendLimit=$speendLimit; $this->Cars=array(); } protectedfunctionIsStreetLegal($car) { if($car->getMaxSpeend()<$this->SpeendLimit) { returntrue; } else { returnfalse; } }
publicfunctionAddCar($car) { if($this->IsStreetLegal($car)) { echo'TheCarwasallowedontheroad.'; $this->Cars[]=$car; } else { echo'TheCaristoofastandwasnotallowedontheroad.'; } } }
$Porsche911=newRoadster(); $Porsche911->SetSpeend(340);
$FuWaiStreet=newStreet(80); $FuWaiStreet->AddCar($Porsche911);
/** * *@result * *TheCaristoofastandwasnotallowedontheroad.[Finishedin0.1s] * */ ?>