php抽象类可以重写接口的常量吗,抽象类接口类常量

## 抽象类

某个类是其他类的父类,但本身不希望实例化的父类,主要用途:提出子类的属性,让子类去继承,这样可以达到代码复用,同时利于项目设计者来设计类

安排不同的程序员写不同的子类

比如:交通工具类,动物类

~~~

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值