1. 接口使用场景:接口的多继承
<?php
// 接口的使用场景2 :多接口继承
// 接口可以突破php类的继承限制,允许多继承,实现多层级的接口
// 创建第一个接口
interface api_1
{
const NAME = 'michael';
}
// 第二个继承第一个
interface api_2 extends api_1{
const AGE = 25;
}
// 第三个继承前两个
interface api_3 extends api_1 ,api_2{
// 接口抽象方法
public function user();
}
// 实现接口类
// 因为上面的接口api_3已经继承了前两个,所以这里只写api_3即可,当然也支持加上 ’api_1,api_2‘
class Name implements api_3
{
// 先实现抽象方法
public function user(){
return '姓名:'.api_3::NAME;
}
}
echo (new Name)->user();
2. trait
//trait 功能与语法 PHP5.4+ 实现代码的复用
//trait 与抽象类,接口 一样不能被实例化,只能嵌入到宿主类中使用
//trait 是一个特殊类:只能使用 常规 静态 抽象 不能用类常量
trait tDemo
{
// 常规属性
protected $name = 'michael';
//常规方法
public function getName()
{
return $this->name;
}
// 静态属性
public static $sex = '男';
//静态方法
public function getSex()
{
return self::$sex;
}
// 抽象属性
public static $age;
// 抽象方法
abstract public static function setAge();
}
//创建工作类引用
class Demo
{
use tDemo;
public static function setAge()
{
return self::$age;
}
}
//访问
Demo::$age = 30;
echo Demo::setAge();
echo '<hr>';
$demo = new Demo();
echo '姓名'.$demo->getName().'年龄:'.Demo::setAge().'性别'.Demo::getSex();
<?php
//trait 功能1 代码复用
//创建一个公共方法库
trait Means{
// 乘法
public function Way_1($a,$b){
return $a*$b;
}
// 除法
public function Way_2($a,$b){
return $a/$b;
}
// 加法
public function Way_3($a,$b){
return $a+$b;
}
// 减法
public function Way_4($a,$b){
return $a-$b;
}
}
//实现类
class White
{
use Means;
}
//创建类示例
$white = new White;
//乘法
echo $white->Way_1(2,8).'<hr>';
//除法
echo $white->Way_2(8,2).'<hr>';
//加法
echo $white->Way_3(2,8).'<hr>';
//减法
echo $white->Way_4(8,2).'<hr>';
//输出 16 4 10 6
总结
trait 在继承上下文环境中,具有优先级,通过优先设置,降低单继承的影响
优先级比较 当前类 > trait > 当前类的父类
trait 中只写方法不要写属性,否则会跟宿主类中的同名属性发生冲突产生致命错误