Trait的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/u011341352/article/details/88816803
今日推荐