首页 > 编程笔记 > PHP笔记 阅读:1

PHP abstract抽象类和interface接口的用法(附带实例)

在实际开发过程中,有些类并不需要被实例化,有一些父类主要是让子类来继承,这样可以提高代码复用性。

PHP 抽象类的语法结构如下:
abstract class classname{
    property $name;
    method(){} // 方法也可以用abstract修饰符
    function方法名(){}
}

【实例】抽象类。
<?php
abstract class animal{
    public $name;
    public $age;
    //抽象方法不能有方法体,主要是为了让子类去实现
    abstract public function cry();
    //抽象类可以包含抽象方法,也可以包含实例类方法
    public function getname(){
        echo $this->name;
    }
}
class Cat{
    public function cry(){
        echo 'ok';
    }
}
?>
“动物类”实际上是一个抽象的概念,它规定了某种动物的共有属性,但各动物之间又不完全相同。此外,还有交通工具类、植物类等。

PHP 程序中使用抽象类,要注意以下事项:
1) 如果一个类使用 abstract 来修饰,则该类就是一个抽象类。如果一个方法被 abstract 修饰,那么该方法就是一个抽象方法,抽象方法不能有方法体“=> abstract function cry()”,也不可以有 {}。

2) 抽象类一定不能被实例化。抽象类可以没有抽象方法,但是如果一个类包含了任意一个抽象方法,这个类一定要被声明为 abstract 类。

3) 如果一个类继承了另一个抽象类,则该子类必须实现抽象类中的所有抽象方法(除非它自己也被声明为抽象类)。

PHP interface接口

接口就是将一些没有实现的方法封装在一起,要使用某个类的时候,再根据具体情况编写这些方法。

interface接口的语法结构如下:
interface 接口名{
    //属性、方法
    //接口中的方法都不能有方法体
}

实现接口的代码如下:
class 类名 implements 接口名{

}
接口是更加抽象的抽象类,抽象类中的方法可以有方法体,但是接口中的方法不能有方法体。接口采用了程序设计的多态和高内聚、低耦合的设计思想。

【实例】接口的应用。
<?php
interface iUsb{
    public function start();
    public function stop();
}
//编写相机类,让它去实现接口
//当一个类实现了某个接口,那么该类就必须实现接口的所有方法
class Camera implements iUsb{
    public function start(){
        echo 'Camera starts work'.'<br>';
    }
    public function stop(){
        echo 'Camera stops work';
    }
}
//编写一个手机类
class Phone implements iUsb{
    public function start(){
        echo 'Phone starts work'.'<br>';
    }
    public function stop(){
        echo 'Phone stops work';
    }
}
$c=new Camera();
$c->start();
$p=new Phone();
$p->start();
?>
运行结果为:

Phone starts work
Phone starts work


PHP 程序中使用接口,要注意以下事项:
1) 接口不能被实例化,接口中所有的方法都不能有方法体。

2) 一个类可以实现多个接口,以逗号(“,”)分隔,例如“class demo implements if1,if2,if3{}”。

3) 接口中可以有属性,但该属性必须是常量。常量不可以有修饰符(默认为 public 修饰符),例如以下代码:
interface iUsb{
    const A=90;
}
echo iUsb::A;

4) 接口中的方法必须为 public 修饰符。

5) 一个接口不能继承其他类,但是可以继承其他接口。一个接口可以继承多个其他接口,例如以下代码:
interface 接口名 extends if1,if2{}

6) 一个类可以在继承父类的同时实现其他接口,例如以下代码:
class test extends testbase implements test1,test2{}

PHP 类的继承是单一继承,即一个类只能继承一个父类,这对子类功能的扩展有一定的影响。可以把实现接口看作对继承类的补充。继承是层级的关系,不太灵活;而实现接口是平级的关系,可以在不打破继承关系的前提下对某个功能进行扩展,非常灵活。

相关文章