## 抽象类
某个类是其他类的父类,但本身不希望实例化的父类,主要用途:提出子类的属性,让子类去继承,这样可以达到代码复用,同时利于项目设计者来设计类
安排不同的程序员写不同的子类
比如:交通工具类,动物类
~~~
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)