三.面向对象的高级实战
(一)继承extends
单继承:php中子类只能继承一个类.一个类可以有多个子类
1.继承的好处
①父类里面定义的类成员可以不用在子类中重复定义,
节约了编程的时间和代价
②同一个父类的子类拥有相同的父类定义的类成员,
因此外部代码调用它们的时候可以一视同仁
③子类可以修改和调整父类定义的类成员
(二)访问控制
1.面向对象的三种访问权限
①public公有的类成员,可以在任何地方被访问
②protected受保护的类成员,可以被其自身以及其子类访问.
③private私有的类成员,只能被自身访问
(三)static静态成员
1.保存的是全局的类的公有数据,在方法中不能使用$this
不需要创建对象就能访问的
2.静态属性
定义时在访问控制关键字后面添加static即可
3静态方法定义
在类定义中使用静态成员的时候,用self关键字后面跟着::操作符,即可.
注意,在访问静态成员的时候,::后面需要跟$符号.
4.访问
在本类中 self::成员方法()
在子类中 parent::成员方法()
在类的外部 类名::成员方法()
(四)final关键字
1.子类中编写跟父类方法名完全一致的方法可以完成对父类方法的重写(overwrite)
2.对于不想被任何类继承的类可以在class之前添加final关键字
3.对于不想被子类重写(修改)的方法,可以在方法定义的前面添加final关键字
(五)数据访问
1.用parent::关键字可以访问父类中被子类重写的方法
2.用self::可以用于访问类自身的成员方法,也可以用于访问自身的静态成员和类常量;
不能用于访问类自身的属性;
使用常量的时候不需要在常量名称前面添加$符号
3.static关键字用于访问类 自身定义的静态成员,访问静态属性时需要在属性前面添加$符号
(六)对象接口
//interface 关键字用于定义接口
interface ICanEat{
//接口里面的方法不需要有方法的实现
public function eat($food);
}
//implements关键字用于表示类实现某个接口
class Human implements ICanEat(){
//实现了某个接口之后,必须提供接口中定义的方法的具体实现
public function eat($food){
echo 'Human eating'.$food.'\n';
}
}
class Animal implements ICanEat(){
//实现了某个接口之后,必须提供接口中定义的方法的具体实现
public function eat($food){
echo 'Human eating'.$food.'\n';
}
}
$obj = new Human();
$obj->eat('Apple');
$monkey = new Animal();
$monkey->eat('banana ');
//不能实例化接口
//$eatObj = new ICanEat();
//可以用instanceof关键字来判断某个对象是否实现了某个接口
var_dump($obj instanceof ICanEat);
function checkEat($obj){
if($obj instanceof ICanEat){
$obj->eat('food');
}else{
echo 'The obj can not eat';
}
}
//相同的一行代码,对于传入不同的接口的实现的对象的时候,表现是不同的,这就是多态
checkEat($obj);
checkEat($monkey);
//可以用extends让接口继承接口
interface ICanPee extends ICanEat{
public function pee();
}
//当类实现子接口时,父接口定义的方法也需要在这个类里面具体实现
class Human1 implements ICanPee{
public function pee(){}
public function eat($food){}
}
(七)多态
因为接口的方法实现可以有很多,所以对于接口里面定义的方法的具体实现是多种多样的,这种特性我们称为多态.
比如接口A有两个实现B和C,B和C对A里面定义的方法的实现可以是不同的,这种现象就是多态
(八)抽象类
//abstract关键字用于定义抽象类
abstract class ACanEat{
//在抽象方法前面添加abstract关键字可以标明这个方法是抽象方法不需要具体的实现
abstract public function eat($food);
//抽象类中可以包含普通的方法,有方法的具体实现
public function breath(){
echo 'Breach 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方法
$monkey = new Animal();
$monkey->eat('Banana');
$monkey->breath();