1.接口
- 接口就是把不同的类的共同行为进行了定义,然后在不同的类里面实现了不同的功能
- 一旦某个类实现了某个接口,那么就必须实现接口定义的方法
<?php
//interface关键字用于定义接口
interface ICanEat{
//接口里面的方法不需要有方法的实现
public function eat($food);
}
//implements 关键字用于表示类实现某个接口
class Human implements ICanEat{
//实现了某个接口之后,必须提供接口定义中方法的具体实现
public function eat($food){
echo "Human eat '$food' ";
};
}
class Animal implements ICanEat{
//实现了某个接口之后,必须提供接口定义中方法的具体实现
public function eat($food){
echo "Animal eat '$food' ";
};
}
$obg=new Human();
$obg->eat('Apple');
$obg=new Animal();
$obg->eat('Banana');
$eatObg=new ICanEat();
//报错 不能对于接口进行实例化
可以用instanceof关键字来判断某个对象是否实现了某个接口
echo $obg instanceof ICanEat ; //true
//可以用extends关键字让接口继承接口
interface ICanPee extends ICanEat{
public function pee();
}
//当类实现子接口时,父接口定义的方法也需要在这个类里面具体实现
class Human1 implements ICanPee{
//
public function pee(){};
public function eat(){};
}
某个类实现了某个接口与继承了某个类的区别
- 实现接口和继承类很类似,但是接口不能直接创建自己的对象
- 继承的父类必须有该方法的具体实现,子类可以重写父类的方法,也可以不重写
- 接口里面的方法是不需要具体实现的,只要定义了方法名称和参数就可以了,具体的实现必须在实现类中定义
- 一句话概括:【类的方法必须有实现,接口的方法必须为空】
2.多态
因为接口的方法实现可以有很多,所以对于接口里面定义的方法的具体实现是多种多样的,这种特性我们成为多态。
- 比如接口A有两个实现B和C,B和C对A里面定义的方法的实现可以是不同的,这种现象就是多态。
3.抽象类
<?php
//abstract关键字用于定义抽象类
abstract class ACanEat{
//在抽象方法前面添加abstract关键字可以标明这个方法是抽象方法,不需要具体实现
abstract public function eat($food);
//抽象类中可以包含普通的方法,有方法的具体实现
public function breath(){
echo "Breath use the air ";
}
}
//类继承抽象类的关键字是extends
class Human extends ACanEat{
//继承抽象类的子类需要实现抽象类中定义的抽象方法
public function eat($food){
echo "Human eating '$food' ";
}
}
class Animal extends ACanEat{
public function eat($food){
echo "Animal eating '$food' ";
}
}
$man=new Human();
$man->eat('Apple');
$man->breath();//和Animal共用了抽象类中的breath()
$mokey=new Animal();
$mokey->eat('Banana');
$mokey->breath();
?>