版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011341352/article/details/88816803
php版本要求
PHP >= 5.4.0
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。如果说:继承可以纵向扩展一个类,那么trait就是横向扩展一个类功能。
注意:
1. trait类中可以有属性,方法。
2. trait可以互相嵌套,一个trait类中可以用use导入另一个trait类,理解成代码复制就可以了,访问被use trait的属性,语法与普通类是一样的.
传统方法,通过继承一个父类来解决,但是这种方法有点不合理,比如:人和猫都有吃的功能,同样继承了同个父类,这就有点不太合理了。
Trait 方法
Eat Trait:
<?php
trait Eat {
public function eat () {
echo '我有吃的技能';
}
}
<?php
class A {
use Eat;
public function ha () {
//...
}
}
class B {
use Eat;
public function hi () {
//...
}
}
将一些公用的方法定义在 Trait 文件中,在需要使用的时候 use traitName 就可以,既解决了代码复用的问题,也避免了勉强的父类继承问题。
定义 Trait
和定义类基本相同,只是将 class 换成了 trait
<?php
trait TraitName {
public function demo () {
//...
}
}
使用 Trait
Trait 的使用也非常简单,通过 use 语句引入就可以啦,如下:
<?php
trait DemoTrait {
public function demo () {
echo 'demo';
}
}
class A {
use DemoTrait;
public function printer () {
echo __METHOD__;
}
}
$a = new A();
$a->demo();
多个 Trait 使用
use Trait1,Trait2;
优先级
从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
Trait 方法名冲突了,解决方法有insteadof:
class A {
use ta,tb {
tb::demo insteadof ta;
}
}
Thinkphp5 提供的 success() 和 error() 方法都写在这个 Trait 文件中,那么我们就可以不通过继承 think\Controller 来获取这两个方法,直接 use \traits\controller\Jump; 就可以啦。
<?php
/**
* 用法:
* load_trait('controller/Jump');
* class index
* {
* use \traits\controller\Jump;
* public function index(){
* $this->error();
* $this->redirect();
* }
* }
*/
namespace traits\controller;
use think\Config;
use think\exception\HttpResponseException;
use think\Request;
use think\Response;
use think\response\Redirect;
use think\Url;
use think\View as ViewTemplate;
trait Jump
{
/**
* 操作成功跳转的快捷方法
* @access protected
* @param mixed $msg 提示信息
* @param string $url 跳转的URL地址
* @param mixed $data 返回的数据
* @param integer $wait 跳转等待时间
* @param array $header 发送的Header信息
* @return void
*/
protected function success($msg = '', $url = null, $data = '', $wait = 3, array $header = [])
{
//... 省略代码
}
/**
* 操作错误跳转的快捷方法
* @access protected
* @param mixed $msg 提示信息
* @param string $url 跳转的URL地址
* @param mixed $data 返回的数据
* @param integer $wait 跳转等待时间
* @param array $header 发送的Header信息
* @return void
*/
protected function error($msg = '', $url = null, $data = '', $wait = 3, array $header = [])
{
//... 省略代码
}
// ...
}
php官网对Trait介绍
https://www.php.net/manual/zh/language.oop5.traits.php