final类
概念:在继承链上的末尾,
其下不能出现出现子类,也就是不能被继承
final类
格式如下,就是在类前面加一个final关键字
final class Goods {
public $goods_name;
public $goods_price;
}
final,并没有增加额外的功能!意义是,在语法上限制某个类不能被继承!从而保证数据的完整性!
final方法
final关键字还可以限制方法,表示该方法不能被重写
class Goods {
public $goods_name;
public $goods_price;
final public function in_C(){
return $this->goods_price;
}
}
class Book extends Goods{
public $anthor;
public $publisher;
public function in_C(){
return $this->author;
}
}
像上面写的那样就是会报错的
抽象类 abstract
抽象类:指的是包含抽象方法的类叫做抽象类,不能用于实例化对象,只能用户继承。
抽象类是不完整类因为包含不完整方法
不完整的方法,也叫抽象方法,指的是没有方法体的方法,称之为只有方法的声明,而没有方法的实现的方法称之为抽象方法。也就是不完整的方法!
abstract class Goods {
public $goods_name;
public $goods_price;
public function in_j(){}//这样是对的
public function in_C(); //这样是错误的
abstract public function in_C();//这样就是对的,如果类前不加关键字也是错的
//抽象类中可以没有不完整函数
}
注意:抽象类是可以包含其他任何正常的成员的,在此基础上,增加了内部的抽象方法!
(并不是抽象类中只能包含抽象方法)
也就是说只能被继承abstract class Goods {
public $goods_name;
public $goods_price;
public function in_j(){}//这样是对的
public function in_C(); //这样是错误的
abstract public function in_C();//这样就是对的,如果类前不加关键字也是错的
//抽象类中可以没有不完整函数
}
class Book extends Goods{
public $anthor;
public $publisher;
public function in_C(){
return $this->author;
}
}
使用意义
可见,抽象类,可以规定其非抽象子类,必须要存在的相应成员方法!
可以规定,子类中都必须存在,但是可以不同的方法!
abstract class Goods {
public $goods_name;
public $goods_price;
public function in_j(){}//这样是对的
//public function in_C(); //这样是错误的
abstract public function in_C();//这样就是对的,如果类前不加关键字也是错的
//抽象类中可以没有不完整函数
}
final class Book extends Goods{
public $anthor;
public $publisher;
public function in_C(){
return $this->author;
}
}
final class Phone extends Goods{
public function in_C(){
return $this->goods_price;
}
}
几个概念:
抽象:abstract,不完整的意思!
实现:implement。将方法完整化!
接口结构,interface
接口指的是对象的公共方法。
也有一种结构技术,定义一个接口结构用于限制一个类(对象)应该具备的共有方法。
声明:关键字interface声明
interface i_Goods{
public function sayName();
public function sayPrice();
}
注意,接口内只能包含公共的抽象方法(不完整的方法)!
接口定义的函数不能有函数体,只能有函数名和参数列表
使用方法:
是定义一个类来实现接口内所定义的所有接口方法(公共方法)
abstract class Goods implements i_Goods{
public $goods_name;
public $goods_price;
}
interface i_Goods{
public function sayName();
public function sayPrice();
}
abstract class Goods implements i_Goods{
public $goods_name;
public $goods_price;
}
class Book implements i_Goods{
public $anthor;
public $publisher;
}
实现接口的类,有两种选择,1是抽象类实现(不能缺少)2、实现接口方法
抽象类和借口的区别:
1、抽象类与普通类之间的关系是继承
普通类继承了抽象类既可以得到抽象类的常规成员,又可以实现抽象方法(不一定是public)
2、抽象类与普通类之间是实现的关系
普通类实现了接口,只是将其没有实现的公共方法实现。
3、接口值用于定义抽象方法,而抽象类什么都可以
多实现
abstract class Goods implements i_Goods,i_Good{
public $goods_name;
public $goods_price;
}
接口也可以定义常量
interface i_Goods{
const PAI = 3.4;
public function sayName();
public function sayPrice();
}
abstract class Goods implements i_Goods{
public $goods_name;
public $goods_price;
}
class Book implements i_Goods{
public $anthor;
public $publisher;
public function sayPrice(){}
public function sayName(){}
}
echo Book::PAI;
辨析:
1、接口是不是类,
接口不是类,接口是限制类的一种结构,是独立的,可以理解为“接口定义的所有的方法都是公共的不完整(抽象)方法,而且没有其他成员的抽象类”,但是和类完全是两个概念
2、PHP是单继承,能不能实现多继承?
“可以通过接口实现多继承?”
不能实现多继承