PHP中的接口
php与大多数面向对象编程语言一样,不支持多重继承,也就是说每个类只能继承一个父类。为了解决这个问题,PHP引入了接口,接口的思想是指定了一个实现了该接口的类必须实现的一系列方法。
定义:
接口(interface)是抽象方法和静态常量定义的集合。
在PHP中,声明接口语法类似声明类,只不过使用关键词interface
,interface 接口名{….}
规范:
接口是一种特殊的抽象类,这种抽象类中只包含抽象方法和静态常量。
在接口中的抽象方法只能是public的,默认也是public权限。
abstract和final修饰符也不能修饰接口中的抽象方法。
<?php
interface User{
//public $name 用访问控制修饰符的属性 是报错的
const GROUP =12;
//抽象方法是不能有方法体
public function t();
//没有public修饰的方法默认为public
}
接口的实现和继承
接口的实现
使用implements
来实现以个接口。一个类可以实现多个接口。只要使用逗号(,)将多个接口连接起来就可以。
<?php
interface User{
function getName();
function setName();
}
interface Demo{
function Demo1();
}
class Person implements User{
private $name;
function getName(){
echo "My name is",$this->name,"<br/>";
}
function setName($name=''){//这里必须的有一个默认值
$this->name = $name;
}
}
//实现继承多个接口
class Stu implements User,Demo{
private $name;
function getName(){
echo "My name is",$this->name,"<br/>";
}
function setName($name=''){//这里必须的有一个默认值
$this->name = $name;
}
function Demo1(){
echo "Demo接口中的demo1方法";
}
}
$lisi= new Person();
$lisi->setName('李四');
$lisi->getName();
$zhangsan= new stu();
$zhangsan ->setName('张三');
$zhangsan->getName();
$zhangsan->demo1();
一个类可以继承类并实现接口
<?php
interface User{
function getName();
function setName();
}
class AdminUser{
public function pubNews(){
echo "管理员发布新闻功能<br>";
}
}
class CommonUser extends AdminUser implements User{
private $name;
function getName(){
echo "my name is ",$this->name,"<br/>";
}
function setName($name=""){//实现接口的方法如果传变量必须给一个默认值
$this->name=$name;
}
public function Age($age){
echo "我的年龄是:".$age;
}
}
$lisi = new CommonUser();
$lisi->setName('lisi');
$lisi->getName();
$lisi->age(25);
接口的继承
一个接口可以继承自另外的接口。要注意只有接口和接口之间使用继承关键字extends。
一个接口继承其它接口时候,直接继承父接口的静态常量属性和抽象方法。
类实现接口必须实现其抽象方法,使用实现关键字implements。
php中的类是单继承,但是接口很特殊。一个接口可以继承自多个接口。
抽象类实现接口,可以不实现其中的抽象方法,而将抽象方法的实现交付给具体能被实例化的类去处理。
<?php
interface User{
function getName();
function setName();
}
interface demo{
function demo1();
}
//接口的多重继承
interface CommonUser extends User,demo{
function text();
}
//类继承接口是必须实现方法的
class Test implements CommonUser{
function getName(){
}
function setName(){
}
function text(){
}
function demo1(){
}
}
abstract class test1 implements CommonUser{
//抽象类继承接口是可以不实现的
}