接口定义类中需要实现的方法,制定统一的规范
一个类可以实现多个接口
在不同层次中都可以使用trait中的方法,以弥补单继承语言的缺陷
1.接口
- 接口中定义常量和抽象方法
- 接口直接可以继承,类可以继承多个接口
- 在抽象方法中可以先只实现部分接口的中的方法,但是在继承该抽象方法的常规类中必须实现接口中的所有方法
<?php
//创建文本处理接口,有读,写功能
interface iText1
{
const FORMAT = 'Y-m-d H:i:s';//接口常量:时间格式
public function open($filename,$type);//抽象方法
}
//接口继承
interface iText2 extends iText1
{
public function read();
public function write($text);
}
//抽象类实现打开/创建文件功能:open();
abstract class aText implements iText1,iText2
{
public $file = null;//保存文件链接句柄
public function open($filename,$type){
$this->file = fopen($filename,$type);
}
}
//常规类实现其它功能
class text extends aText
{
//向文件写入内容
public function write($text){
$str = date(self::FORMAT,time()).':'.$text;
fwrite($this->file,$str);
}
//读取文件内容
public function read(){
while(!feof($this->file)){
echo fgets($this->file),'<br>';
}
}
//关闭文件链接
public function __destruct()
{
fclose($this->file);
}
}
// $text = new text();
// $text->open('text/test.txt','w+');//创建了一个txt文件,以读写方式打开
// $text->write("写入第一条1\r\n");
// $text->read();//无内容
// $text->open('text/test.txt','r');
// $text->read();//输出:2020-05-02 19:12:09:写入第一条1
2.trait
- trait与类一样,可以定义变量和方法
- 在类中通过use关键字引入trait中的变量和方法,如同复制了代码
//trait 代码复用
trait tDemo
{
//格式化数组输出
public static function myPrint(array $arr){
return sprintf("<pre>%s</pre>",print_r($arr,true));
}
public static function write(){
echo '我是trait中的write方法';
}
}
class Demo1
{
use tDemo;//使用use关键字复制trait中的代码
public static function write(){
echo '我是Demo1中的write方法';
}
}
echo Demo1::myPrint([1,4,5]);
//输出Array
// (
// [0] => 1
// [1] => 4
// [2] => 5
// )
class Demo2 extends Demo1
{
use tDemo;
// public static function write(){
// echo '我是Demo2中的write方法';
// }
}
echo Demo2::myPrint([5,5,5]);
//输出Array
// Array
// (
// [0] => 5
// [1] => 5
// [2] => 5
// )
Demo2::write();//输出:我是trait中的write方法
//在类继承中,trait中的方法相当于复制到当前类中的方法,所以覆盖父类中的同名方法