ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 抽象类 某个类是其他类的父类,但本身不希望实例化的父类,主要用途:提出子类的属性,让子类去继承,这样可以达到代码复用,同时利于项目设计者来设计类 安排不同的程序员写不同的子类 比如:交通工具类,动物类 ~~~ abstract class Animal{ abstract public function cry();//让子类去实现它 } $animal=new Animal();//我们并不希望实例化动物这个类 ~~~ ## 定义: abstract 类名 抽象类 abstract 方法 抽象方法,就不能实现它,不能有方法体。 ## 特点: 抽象类不能被实例化。 抽象类可以没有abstract, 抽象类可以没有抽象方法,可以有正常方法——即可以确定的方法先定下来 抽象方法不能有方法体,方法体在子类实现 一旦一个类有abstract方法,这个类必须声明为abstract类 继承的类,需要实现父抽象类的所有抽象方法 ~~~ abstract class A{ public $name="abc"; public function getName(){ return $this->name; } abstract function test(); abstract function test1(); } class B extends A{ function test(){ echo "我实现A:test()"; } //必须全部实现A中的抽象方法 function test1(){ echo "我实现A:test()"; } echo "hello"; } ~~~ ## 接口 interface 类名{ } **实现接口:class 子类 inplements 接口1,接口2,接口3{ }** 什么情况下使用接口: 1. 项目经理定规范 2. 定规范,让别的程序员实现 3. 有多个类之间是平级的,都要实现某个功能,只是实现的方式不一样 注意: 1. 接口中可以有属性,但必须是public ,必须是常量 const A=90; echo iusb::A; ![](https://box.kancloud.cn/f10e7902110202f65f1560b242e361af_363x217.png) 2. 接口中的方法必须都是public默认 3. 一个类可以实现多个接口,逗号隔开 4. 一个接口不能继承其他的类,但是可以继承别的接口 5. 继承的同时,再去实现接口 class A extends B inplements C{.....} interface iusb{ //定义一些方法,供其他类来实现,接口里面都不能有方法体 public function start(); public function stop(); } //编写相机类,让他去实现接口,改类必须实现这个接口的所有方法 class camera inplements iusb{ public function start(){ echo "相机开始工作"; } public function stop(){ echo "相机停止工作"; } } ~~~ interface stumanageinterface{ public function add($stu); public function del($id); public function update($stu); } class stumanage inplements stumanageinterface{ public function add($stu){ echo "增加学生"; } public function del($id){ echo "删除学生"; } public function update($stu){ echo "修改学生"; } } ~~~ ## 继承与实现的比较 ![](https://box.kancloud.cn/b5190d14dff773903286dc4fd70cc8b1_487x240.png) 1. 继承保证功能的纯洁性,接口是对单一继承类功能的一种补充 2. 多层继承不灵活,一层出问题,都会出问题; 接口没有层级问题,可以在不打破继承关系的前提下,对某个类功能扩展 ![](https://box.kancloud.cn/5087a9dbb272fc4bc4676c1eb85c5b72_789x363.png) ## final关键字 1. 如果一个类为final,只希望自己用(安全性考虑),任何类无法继承 final class A{ } 2. 如果某个方法,(如个人所得税),不希望被重写,这个方法前final——可以继承,但不能修改 3. final关键字不能修饰属性 ~~~ class A{ final public function getRate($salary){ return $salary*0.08; } } class B extends A{ //以下无法实现重写 public function getRate($sal){ return $salary*0.01; } } $b=new B(); echo $b->getRate(1000); ~~~ ## const常量定义 不希望成员变量被修改,就用const,const不能有修饰符 const 常量名=值; 访问: 外部:**类名::常量名;或 接口名::常量** 内部:类名::常量名 或self::常量名 常量属于类的,不属于对象的 ![](https://box.kancloud.cn/bb9d6acf290a6d672291d95f0369b71c_626x309.png)