Yii2.0行为Behavior的理解

薄洪涛6年前PHP1212
在说什么叫行为之前,觉得说下行为的作用比较好;
使用行为(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的功能

标签: behaviorYii2.0

相关文章

workerMan之心跳检测

workerMan之心跳检测

上次咱们说到,长连接应用必须加心跳检测,避免连接由于上时间没有通讯被断开其实心跳的作用有2个:1、客户端定时给服务器发送数据,防止连接由于长时间没有通讯被断开2、服务端可以通过心跳来判断客户端是否在线...

PHP程序猿食用RabbitMQ方法

消息队列是什么?“消息队列”是在消息的传输过程中保存消息的容器。“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。消息被发送到队列中。“消...

不同语言AES加密结果不同

不同语言AES加密结果不同

最近一直在和某保险公司的联调接口,他们的接口是AES加密过的,就是请求的报文体需要加密,返回的报文体需要解密;java实现的,然后我这边用php去调用,发现先了一件诡异的事情,两种语言的加密结果不一致...

Yii2.0框架ActiveForm总结

首先引入ActiveForm和Html这里两个是很重要的<?php     use yii\bootstrap\ActiveForm; &nbs...

Yii2.0引入Ueditor

Yii2.0 引入Ueditor流程和其他框架不同必须引入Ueditor for Yii2.0,否则不能正常使用1,composer下载 composer require ...

php高级特性之反射

何为反射?字面理解,就是根据到达找到源;在面向对象编程中的反射就是根据对象去找出它所属的类,及类的方法,详情;首先声明一点,反射在实际开发中用的很少(至少我没用过),但是在编写文档的时候,可以用于文档...

发表评论    

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