接口interface
思考:在大型项目中,如果想要规定某些类必须有某些方法,我们可以使用丞相类来进行规范吗?
引入:抽象类的目的就是用来规范一些共性子类的结构,必须实现某些指定的方法的,在php还有一种专用来规范类内容实现方法的结构叫做接口。
接口 interface【掌握】
定义:接口,使用interface关键字定义,专门用来规范一些共性类必须实现的方法
接口定义:使用interface关键字,后跟接口名字{与类结构一样},接口不是类,不可以被实例化
<?php // 定义接口 interface show{ } new show(); //致命错误 接口不能实例化
接口实现:接口时用来规范类必须完成的事情,所以接口只能被类实现:implements
<?php // 定义接口 interface show{ } // 实现接口 class posen implements show{}
接口成员:接口中只能定义公有抽象方法和接口常量
<?php // 定义接口 interface show{ //接口成员 const NAME="杜伟"; public function add(); //在接口中声明的方法,默认都会添加abstract关键字 //其他内容,不能有成员 // public $age; 接口中不能有属性和成员 // public static $count; 接口中不能有静态属性和成员 } // 实现接口 class posen implements show{ // 实现接口方法 public function add(){ echo __LINE__; } }
echo posen::NAME; //常量输出 //抽象类实现接口中的抽象方法 abstract class wman implements show{ }
实现接口的类成员,不允许重写接口中的常量,不允许增加接口方法的控制权
<?php // 定义接口 interface show{ //接口成员 const NAME="杜伟"; public function add(); //在接口中声明的方法,默认都会添加abstract关键字 //其他内容,不能有成员 // public $age; 接口中不能有属性和成员 // public static $count; 接口中不能有静态属性和成员 } // 实现接口 class posen implements show{ // 重写接口中的常量 //const NAME="假名"; //报错 :不允许重写接口中的常量 // 实现接口方法 private function add(){ echo __LINE__; //错误:接口方法不允许使用其他访问修饰限定符,必须使用public } }
接口可以继承接口:extends,而且接口可以多继承接口
<?php interface show{ public function getname(); } interface add{ public function getage(); } // 单继承 interface line extends getname{} //多继承 interface count extends add ,show{}
总结:
接口是使用interface关键字定义,与类结构相似
接口只能被类实现implements,方法默认自带abstract关键字
接口成员只能有两种,接口常量和公有的抽象方法(没有方法体)
类实现接口的时候,必须实现接口中所有的抽象方法(或者以抽象类实现)
接口中的成员不能被实现接口类进行重写(接口常量)或权限更高(受保护或私有化接口方法)
接口可以继承接口,而且可以多继承
接口时在更大型的项目中,为了保证底层的实现而设定的规范,通常是抽象类实现接口,增加必要成员,然后让实际业务类去继承抽象类