性狀 Trait
性狀(Trait)是PHP5.4.0引入的概念,既像接口砌们,也像類,但是兩者都不是浪感。
性狀有兩個(gè)作用:1.表明類可以做什么(像接口)饼问;2.將代碼模塊化(像類)。
性狀能把模塊化的實(shí)現(xiàn)方式注入多個(gè)無關(guān)的類中(類與類之間沒有業(yè)務(wù)功能相似處)莱革,而且還能促進(jìn)代碼重構(gòu)讹开。
性狀創(chuàng)建:
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;
}
}
然后旦万,再創(chuàng)建一個(gè)測試類:
// 父類(交通工具)
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';
}
}
創(chuàng)建好之后镶蹋。
在子類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 時(shí),我們也可以在其中加入 "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
但是踱葛,這樣每一個(gè)子類中都使用"use MyTrait "引入,這樣做不大好甥材,可以進(jìn)行優(yōu)化。
可以在父類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());