php对象的三大特征是封装、继承和多态,抽象类和接口是“继承”必不可少的技术,抽象类和接口有那些相同和不同之处能?下面简单介绍一下。
1.abstract 关键字:
1)用abstract关键字修饰的类和方法,即为抽象类或抽象方法;
2)用abstract修饰的方法不能用private私有关键字修饰;
3)abstract属单继承,每个类只能继承一个父类;
4)abstact抽象类的继承对private、protected和public关键字的适用范围是:private只适用于本类不能被继承;protected适用于本类和子类,不适用于类的外部;public适用于本类、子类和类的外部。
示例:
<?php abstract class Person{ protected $name; protected $country; function __construct($name = "", $country = ""){ $this->name = $name; $this->country = $country; } abstract function say(); abstract function eat(); function run(){ echo "使用两务腿走路!"; } } class ChineseMan extends Person{ function say(){ echo $this->name."是".$this->country."人,讲汉语。<br>"; } function eat(){ echo $this->name."使用筷子吃饭。<br>"; } } class Americans extends Person{ function say(){ echo $this->name."是".$this->country."人,讲英语。<br>"; } function eat(){ echo $this->name."使用刀和叉子吃饭。<br>"; } } $chineseMan = new ChineseMan("高先生", "中国"); $americans = new Americans("alex", "美国"); $chineseMan->say(); //高先生是中国人,讲汉语。 $americans->say(); //alex是美国人,讲英语。 $chineseMan->eat(); //高先生使用筷子吃饭。 $americans->eat(); //alex使用刀和叉子吃饭。
2.interface关键字:
1)用interface关键字修饰的类就是接口,没有class关键字;
2)接口内的属性只能用const关键字修饰为常量;
3)接口内的方法全部都是抽象方法,不像abstract可以提取一部分为抽象方法;
4)接口内的方法只能是public,且常常省略。
5)接口属多继承,每个类可继承自多个接口,各接口名称用逗号隔开。
格式是:
class Person implements interface1, interface2,...interfaceN{ //Class contents }
示例:
<?php interface USB{ function run(); } class Computer{ function useUSB($usb){ $usb->run(); } } class Ukey implements USB{ function run(){ echo "My name is Ukey<br>"; } } class Umouse implements USB{ function run(){ echo "My name is Umouse<br>"; } } $computer = new Computer; $computer->useUSB(new Ukey()); $computer->useUSB(new Umouse());
3.一个类可以继承一个抽象类,和多个接口,且抽象类在前,接口在后。
格式是:
class ChineseMan extends Person implements interface1,interface2,...interfaceN{ //Class contents }
示例:
<?php //定义第一个接口 interface One{ //只能是常量 const CONSTANT = "CONSTANT value"; function fun1(); function fun2(); } //定义第二个接口继承自第一个接口 interface Two extends One{ function fun3(); } //定义第三个独立接口 interface Three{ function fun4(); } //定义一个抽象类和一个抽象方法 abstract class Four{ abstract function fun5(); } //定义一个类Five要先继承抽象类Four后,再继承接口Two、Three,并且实现所有的抽象方法 class Five extends Four implements Two, Three{ function fun1(){ //常量输出 echo Five::CONSTANT."<br>"; echo __METHOD__."<br>"; } function fun2(){ echo __METHOD__."<br>"; } function fun3(){ echo __METHOD__."<br>"; } function fun4(){ echo __METHOD__."<br>"; } function fun5(){ echo __METHOD__."<br>"; } } //实列化对象 $obj = new Five; $obj->fun1(); $obj->fun2(); $obj->fun3(); $obj->fun4(); $obj->fun5();