抽象方法与抽象类
当类里面有一个方法是没有方法体,也就是没有花括号{},直接以分号结束。这样的方法叫做抽象方法,必须用关键字 abstract 来定义。
例如:public abstract function fn();
包含这种方法的类必须是抽象类,也要使用关键字 abstract 来声明。
抽象类的特点:
- 不能实例化,不能通过new来生成对象。- 要想使用抽象类,必须定义一个类去继承这个抽象类。并定义覆盖父类的抽象方法(实现抽象方法)
接口技术
PHP与大多编程语言一样,不支持多重继承。一个子类只能继承一个父类,为了解决这个问题。PHP引入了接口技术。接口的思想是指定了一个实现了该接口的类必须实现的一系列函数。
定义格式
interface 接口名称 {
// 常量成员(const关键字定义)
// 抽象方法(不需要使用abstract)
}
使用格式
class 类名 implements 接口名1,接口名2…
{
// code
}
接口与抽象类的区别
关注事物本质用抽象类;关注一个操作用接口。
接口是对动作的抽象,表示这个对象能做什么,对类的局部行为进行抽象。
抽象类是对根源的抽象,表示这个类是什么,对类的整体进行抽象,对一类事物的描述抽象。
比如,男人、女人这两个类,他们的抽象就是人类。人类是可以吃东西的,可以把吃东西定义成一个接口,然后让这些类去实现它。
在高级语言中,一个类只能继承一个类(抽象类)。就像人不能是生物,又是非生物。但是可以实现多个动作(接口),比如吃饭动作,走路动作等。这些动作就是接口。
- 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
- 接口可以多继承,抽象类不行。
- 接口定义方法,不能实现,而抽象类可以实现部分方法。
- 接口中基本数据类型为 static(静态的),而抽象类不是。
- 接口中不能含有静态代码块及静态方法,而抽象类可以含有静态方法及静态代码块。
也就是说接口比较纯粹,什么都不干。抽象类呢就是把一些公有的、抽象度非常高的东西放到对应的抽象里。
抽象类
<?php/*** 1.含有抽象方法的类必须是抽象类* 2.抽象类不一定非得含有抽象方法* 3.抽象类可以存在普通方法* 4.抽象类不能被实例化 必须由一个子类去继承,并且把抽象类的抽象方法都实现了*/abstract class Person{// 抽象方法abstract public function eat();}class Man extends Person{public function eat(){echo "eat food";}}$man = new Man();$man->eat();
上面代码会输出 eat food。
接口
<?php/*** 1.接口声明的关键字 interface* 2.接口可以声明常量也可以抽象方法* 3.接口中的方法都是抽象方法 必须实现 不需要abstract定义* 4.接口也不能被实例化,需要一个类去实现它* 5.一个类不多继承多个类,但是一个类可以实现多个接口*/interface Person{const NAME = "人";public function run();public function eat();}interface Study{public function study();}class Student implements Person, Study{public function run(){echo "runing";}public function eat(){echo "eat food";}public function study(){echo "study english";}public function test(){echo self::data;}public static function sti(){echo "我是静态的方法";}}$son = new Student();$son->eat();echo $son::NAME;$son->test(); // 或者 echo Student::data;echo Student::sti();
上面代码就会输出 eat food、人、3.14、我是静态的方法。通过双冒号访问静态的属性和方法。在类里面用self访问自己。
