美文网首页
性状 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

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