接口
<?php
interface iStu{
const NAME= '小明';
//接口类中设计两种方法
public function getClass();
public function getAge();
}
abstract class aStu implements iStu{
public $class='三年级一班';
//抽象类中实现部分方法
public function getClass()
{
return iStu::NAME.'来自'.$this->class;
}
}
interface iStu1{
const NATION='中国';
public function from();
}
//利用接口实现多继承
class Stu extends aStu implements iStu1{
public $age;
public function __construct(int $age)
{
$this->age=$age;
}
//实现iStu另一种抽象方法
public function getAge()
{
return iStu::NAME.'今年'.$this->age.'岁';
}
//实现iStu1的方法
public function from(){
return iStu::NAME.'出生于'.iStu1::NATION;
}
}
$stu=new Stu(13);
echo $stu->getAge(),'<br>';
echo $stu->getClass(),'<br>';
echo $stu->from(),'<br>';
//运行结果
// 小明今年13岁
// 小明来自三年级一班
// 小明出生于中国
trait
<?php
trait tStu{
public function profession(){
return 'trait:'.$this->name.'是程序员';
}
}
class Stu1{
public $name='李四';
public function profession(){
return 'parent:'.$this->name.'是公务员';
}
}
class Stu2 extends Stu1{
// 直接继承父类
}
class Stu3 extends Stu1{
// 继承父类并引用trait
use tStu;
}
class Stu4 extends Stu1{
// 继承父类并引用trait
use tStu;
public function profession(){
return 'self:'.$this->name.'是医生';
}
}
$stu2=new Stu2;
$stu3=new Stu3;
$stu4=new Stu4;
echo $stu2->profession(),'<br>';
echo $stu3->profession(),'<br>';
echo $stu4->profession();
// 运行结果
// parent:李四是公务员
// trait:李四是程序员
// self:李四是医生
总结:interface 和 trait 类都很好的实现了代码的复用与类的多继承,
interface 类只能包含常量和抽象方法,trait 类可以包含变量和方法
interface 和 trait 都不能直接生成对象,前者需要 implements 到类,trait 类需要 use 到类中
trait 类中的方法在调用时具有优先级:子类方法>trait方法>父类方法