在说什么叫行为之前,觉得说下行为的作用比较好;
使用行为(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中了
实际开发中这样的动态附加(上面的例子)用的不多,下面咱们看一种静态附加的例子
所谓的静态附加,就是把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的功能