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(); //自身的 有效
}
}