1、抽象类
声明抽象类使用关键字abstract。
抽象类,不能直接被实例化,只能被继承。必须先继承该抽象类,然后再实例化子类。
抽象方法,不能包括具体的功能实现。继承抽象类的子类必须实现抽象类中的所有抽象方法,具体实现根据业务需求有所不同。抽象类中至少要包含一个抽象方法。
如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不能定义为private。
(1)goods.class.php
<?php
/**
* 定义商品类,使用abstract声明为抽象类
* 该类提供基础属性$name、$price、构造方法
*/
abstract class goods
{
public $name;//商品名称
public $price;//商品价格
//构造方法,初始化对象的$name和$price属性
public function __construct($name,$price){
$this->name=$name;
$this->price=$price;
}
//限制非抽象子类都要实现getName的方法,但是可以不同
abstract protected function getName();
/*
final类,不能被继承,只能被实例化。
final方法,不能被子类重写。
*/
//要求每个子类都必须要有相同的返回原始价格的方法
final public function getPrice(){
return $this->price;
}
}
(2)book.class.php
<?php
header('content-type:text/html;charset=utf-8');
//载入goods类文件
require './goods.class.php';
//定义book类,继承goods类
class book extends goods
{
//由于父类getName方法是抽象方法,因此在这里必须实现
public function getName(){
return '书名:《'.$this->name.'》';
}
}
//实例化book类,book类继承了goods类,具有构造方法,需要传递相关参数
$book=new book('挪威的森林',45);
echo $book->getName();
echo '<hr>';
//父类goods类中getPrice是final方法,无法被重写
echo $book->getPrice();
(3)phone.class.php
<?php
header('content-type:text/html;charset=utf-8');
//载入goods类文件
require './goods.class.php';
//定义phone类,继承goods类
class phone extends goods
{
//由于父类getName方法是抽象方法,因此在这里必须实现
public function getName(){
return '手机型号:'.$this->name;//实现与book类不同
}
}
//实例化phone类,phone类继承了goods类,具有构造方法,需要传递相关参数
$phone=new phone('meizu',2018);
echo $phone->getName();
echo '<hr>';
//父类goods类中getPrice是final方法,无法被重写
echo $phone->getPrice();
2、接口
声明接口使用关键字interface。
接口中定义的所有方法都必须是抽象的(没有具体的功能实现)公共(public)方法,这是接口的特性。
实现接口使用implements操作符。
类中必须实现接口中定义的所有方法,否则会报一个fatal错误。
如果要实现多个接口,可以用逗号来分隔多个接口的名称。
//使用implements关键字实现usb接口、player接口
class mp3 implements usb,player
{
//需要实现usb接口、player接口的所有方法
}
(1)定义接口interface.php
<?php
//定义usb接口
interface usb{
public function connect();//连接
public function transfer();//传输数据
public function disconnect();//断开连接
}
(2)实现接口mp3.class.php
<?php
header('content-type:text/html;charset=utf-8');
//载入interface.php文件
require './interface.php';
//使用implements关键字实现usb接口
class mp3 implements usb
{
public function connect(){
echo '开始连接<br>';
}
public function transfer(){
echo '开始传输......传输结束<br>';
}
public function disconnect(){
echo '断开连接<br>';
}
}
//实例化mp3对象
$mp3=new mp3;
//调用接口方法connect()
$mp3->connect();