yii中的行爲簡單來說就是在不改變一個component子類的繼承關係的前提下爲其豐富一些屬性及方法
behavior 類
namespace app\behaviors;
use yii\base\Behavior;
//擁有行爲功能必須繼承Behavior類
class BehaviorA extends Behavior
{ //要給其他類注入name和run成員
public $name = 'i am xiaohuang<br />';
public function run(){
echo 'i love runing<br />';
}
//當被注入者觸發wake事件時 將會調用run處理器
public function events()
{
return [
'wake' => 'run',
];
}
}
被注入類
namespace app\behaviors;
use yii\base\Component;
//接收行爲注入必須爲Component子類
class Dog extends Component
{
public function behaviors()
{ //可注入多個行爲類(類路徑)
return [
BehaviorA::className(),
];
}
public function sing(){
echo 'i love sing<br />';
}
}
控制器
namespace app\controllers;
use app\behaviors\Dog;
use yii\web\Controller;
class TestController extends Controller
{
public function actionTest(){
//實例化Dog 測試dog是否擁有注入的成員
$dog = new Dog();
//dog觸發wake事件 調用run處理器
$dog->trigger('wake');//i love runing
$dog->sing();//i love sing
$dog->run();//i love runing
echo $dog->name;
}
}
怎麼實現對象級別的混合呢 -
1.刪除刪除被注入類的行爲方法
2.使用component中的attachBehavior() / detachBehavior()
namespace app\controllers;
use app\behaviors\Dog;
use app\behaviors\BehaviorA;
use yii\web\Controller;
class TestController extends Controller
{
public function actionTest(){
//實例化Dog
$dog = new Dog();
//實例化行爲類
$behaviorA = new BehaviorA();
//實現混合(對象注入)
$dog->attachBehavior('key', $behaviorA);
//刪除混合成員
$dog->detachBehavior('key');
echo $dog->name; //失效
$dog->run(); //失效
$dog->sing(); //自身的 有效
}
}