Yii行为(混合) - 小例子

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




















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值