Yii2.0行为Behavior的理解

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

相关文章

Yii2.0引入Ueditor

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

Yii2.0框架ActiveForm总结

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

Yii2.0搭建接口模块教程

Yii2.0搭建接口模块教程

最近我需要做一个大项目中的一个模块,考虑用前后端分离,所以想自己搭建一套基于Yii2.0的restful接口出来,本来的时候老大想让我用spring boot,无奈我太菜只会php.....教程开始:...

Yii2.0中事件的使用及理解

Yii2.0中事件的使用及理解

    Yii 三大特性:属性,事件,行为;这篇文章咱们讲讲Yii事件;    事件是代码解耦的一种方式,设计业务流程的...

Elasticsearch第三篇之全文搜索及在Yii2.0中的使用

Elasticsearch第三篇之全文搜索及在Yii2.0中的使用

前几天做了一个模块,大数据的搜索,其实也不是特别大,组合起来差不多800万左右,用的是mysql数据库,需求有这么变态的两点;需要按照地址去搜索按照起止时间去搜索别的不说,就这两条,mysql也就只能...

YII2独立开发遇到的坑

    之前开发的时候,遇到图片上传什么的都是直接用前辈们配好的插件等等,换了家公司以后,要自己独立开发项目,顿时遇到了问题,开始是项目的配置,然后在添加的时候遇到了图片上传的问题...

发表评论    

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