码农日记

薄洪涛的个人博客

Yii2.0行为Behavior的理解

在说什么叫行为之前,觉得说下行为的作用比较好;
使用行为(behavior)可以在不修改现有类的情况下,对类的功能进行扩充通过将行为绑定到一个类,可以使得类具有行为本身所具有的属性和方法;
在设计原则中,我们应该尽量减少修改某个类,因为改变原有的代码是会带来潜在的危险;我们设计的类应该更容易扩展才是最优的
明白了行为的作用,我再解释下说明叫行为
Yii的行为就是一类对象,当其他对象想要扩展功能的且又不能修改自身类的代码时,我们只需要把行为绑定到要扩展的对象上,就可以了,说到这里,你是不是觉得这有点像继承?
千万不要那么想!!!!行为不是继承
说下区别:
1,继承会扩充类,但是会修改类,继承前后的类不一样,因为有不同的特性,继承后的类算是一个新类(我觉得用进化来形容比较好)
2,行为会扩充类,不会改变类,比如我想用电脑打字,我只需要买一个键盘就可以,前提我的电脑需要有键盘接口,行为Behavior就是这个接口
3,php的继承不支持多继承,但是Yii可以绑定多个行为

4,行为不需要修改类,继承需要


理论比较是理论,实践才是最重要的,我们尝试使用Behavior

@qpp下新建Behavior文件夹,建立myBehavior文件
namespace app\behavior;
use yii\base\Behavior;
class myBehavior extends Behavior
{
    public $prop;
    public function events()
    {
        return parent::events();
    }
    public function foo()
    {
        return "这里Behavior扩展的新功能";
    }
}

在其他类中

public function actionBind()
{
    $article = new Article();
    $article->attachBehavior('myBehavior',new myBehavior());
    $rs = $article->foo();
    var_dump($rs);
}
运行这个方法

发现这个方法已经被扩展到这个对象中$article中了

    clipboard.png


实际开发中这样的动态附加(上面的例子)用的不多,下面咱们看一种静态附加的例子
所谓的静态附加,就是把Behavior直接写入到类中
class Article extends ActiveRecord
{
    const MY_EVENT = 'my_event';
    public function behaviors()
    {
        return [
            // 匿名行为,只有行为类名
            myBehavior::className(),
            // 匿名行为,配置数组
            [
                'class' => myBehavior::className(),
                'prop' => 'value',
            ],
            // 命名行为,只有行为类名
            'myBehavior2' => myBehavior::className(),
            // 命名行为,配置数组
            'myBehavior3' => [
                'class' => myBehavior::className(),
                'prop' => 'value',
            ]
        ];
    }

测试扩充

 public function actionBind()
    {
        $article = new Article();
        $article->attachBehavior('myBehavior',new myBehavior());
        $article->attachBehavior('myBehavior2',myBehavior::className());
        $article->attachBehavior('myBehavior4', [
            'class' => MyBehavior::className(),
            'prop' => 'value',
        ]);
        $rs = $article->foo();
        var_dump($rs);
    }


上诉展示了几种不同的扩充方式,其实Behavior最大的用处还是在不修改原有代码的基础上扩展功能,实际开发中用的不是太多;主要还是理解Behavior的功能

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权所有 | 转载请标明出处