美文网首页
性状 Trait

性状 Trait

作者: WeCat | 来源:发表于2018-08-07 11:45 被阅读0次

性状 Trait
性状(Trait)是PHP5.4.0引入的概念,既像接口,也像类,但是两者都不是。
性状有两个作用:1.表明类可以做什么(像接口);2.将代码模块化(像类)。
性状能把模块化的实现方式注入多个无关的类中(类与类之间没有业务功能相似处),而且还能促进代码重构。

性状创建:

trait MyTrait
{
    protected $trait_test_var;
    protected $trait_test_result;

    public function setVar($test_var)
    {
        $this->trait_test_var = $test_var;
        $this->trait_test_result = $this->trait_test_var + 1;
    }

    public function getVarResult()
    {
        return $this->trait_test_result;
    }
}

然后,再创建一个测试类:

// 父类(交通工具)
class Vehicle
{
    protected $driver;
    protected $drive_style;

    public function __construct($driver)
    {
        $this->driver = $driver;
    }

    public function doThing()
    {
        echo 'I am ' . $driver . ' and,i am driving';
    }

}

//子类(小汽车)
class Car extends Vehicle
{
    public function doThing()
    {
        echo 'I am ' . $this->driver . ' and,i am driving car';
    }
}

创建好之后。
在子类car中加入"use MyTrait"

class Car extends Vehicle
{

    use MyTrait;

    public function doThing()
    {
        echo 'I am ' . $this->driver . ' and,i am driving car';
    }
}

然后,使用car:

$car = new Car('jeep');
$car->setVar(1);
var_dump($car->getVarResult()); // 输出 2

如果还有另外一辆车,例如 jeep

class Jeep extends Vehicle
{
    public function doThing()
    {
        echo 'I am ' . $this->driver . ' and i am driving jeep';
    }
}

这辆 jeep也想使用 MyTrait 时,我们也可以在其中加入 "use MyTrait",像这样

class Jeep extends Vehicle
{
    use MyTrait;

    public function doThing()
    {
        echo 'I am ' . $this->driver . ' and i am driving jeep';
    }
}

然后使用:

$car = new Car('jeep');
$car->setVar(1);
var_dump($car->getVarResult()); // 输出 2

$jeep = new Jeep('jeep');
$jeep->setVar(3);
var_dump($jeep->getVarResult());  // 输出 4

但是,这样每一个子类中都使用"use MyTrait "引入,这样做不大好,可以进行优化。
可以在父类Vehicle中使用"use MyTrait"引入,像这样:

class Vehicle
{
    use MyTrait;

    protected $driver;
    protected $drive_style;

    public function __construct($driver)
    {
        $this->driver = $driver;
    }

    public function doThing()
    {
        echo 'I am ' . $driver . ' and,i am driving';
    }

}


class Car extends Vehicle
{

    #use MyTrait;

    public function doThing()
    {
        echo 'I am ' . $this->driver . ' and,i am driving car';
    }
}

class Jeep extends Vehicle
{
    #use MyTrait;

    public function doThing()
    {
        echo 'I am ' . $this->driver . ' and i am driving jeep';
    }
}

这样做,同样可以使用。

完整代码如下:

trait MyTrait
{
    protected $trait_test_var;
    protected $trait_test_result;

    public function setVar($test_var)
    {
        $this->trait_test_var = $test_var;
        $this->trait_test_result = $this->trait_test_var + 1;
    }

    public function getVarResult()
    {
        return $this->trait_test_result;
    }
}


class Vehicle
{
    use MyTrait;

    protected $driver;
    protected $drive_style;

    public function __construct($driver)
    {
        $this->driver = $driver;
    }

    public function doThing()
    {
        echo 'I am ' . $driver . ' and,i am driving';
    }

}


class Car extends Vehicle
{

    #use MyTrait;

    public function doThing()
    {
        echo 'I am ' . $this->driver . ' and,i am driving car';
    }
}

class Jeep extends Vehicle
{
    #use MyTrait;

    public function doThing()
    {
        echo 'I am ' . $this->driver . ' and i am driving jeep';
    }
}




$car = new Car('jeep');
$car->setVar(1);
var_dump($car->getVarResult()); // 输出 2

$jeep = new Jeep('jeep');
$jeep->setVar(3);
var_dump($jeep->getVarResult());

相关文章

  • trait(性状)

    trait是类的部分实现(即常量,属性,方法),可以混入一个或多个现有的php类中 trait有两个作用:表明类可...

  • 性状 Trait

    性状 Trait性状(Trait)是PHP5.4.0引入的概念,既像接口,也像类,但是两者都不是。性状有两个作用:...

  • PHP性状trait

    作用: 让两个无关的类具有集体的行为,例如RetailStore和Car是不同作用的类,并且没有共同的父类,但都有...

  • 数量性状遗传

    性状分类 质量性状(qualitative trait)表型之间截然不同,具有质的差别,用文字描述的性状,在群体中...

  • Genome-wide Complex Trait Analys

    Genome-wide Complex Trait Analysis(GCTA)-全基因组复杂性状分析 来源htt...

  • rust-trait

    什么是trait,trait相对于java就是interface。 基本的trait例子 在trait中,由sel...

  • 知识点65 :T字母开头的单词 trait-turbulen

    trait 个性特点A trait is a particular characteristic, quality...

  • Scala编程详解12:面向对象编程之Trait

    大纲1、trait基础知识1-1 将trait作为接口使用1-2 在trait中定义具体方法1-3 在trait中...

  • php中的trait机制提高代码复用

    什么是trait 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。 Trait 是...

  • Copy Trait 和clone Trait

    1. copy trait语法声明:#[lang = "copy"]pub trait Copy: Clone ...

网友评论

      本文标题:性状 Trait

      本文链接:https://www.haomeiwen.com/subject/esrovftx.html