当这MyBehavior与一个Component绑定后, 绑定的Component也就拥有了 prop1 prop2 这两个属性和方法foo()
,因为他们都是 public 的。 而 private 的 $_prop4 和 protected 的 bar 就得不到了。 至于原因么,后面讲行为注入的原理时,我们再解释。
行为的绑定
行为的绑定通常是由Component来发起。有两种方式可以将一个Behavior绑定到一个 yii\base\Component 。 一种是静态的方法,另一种是动态的。静态的方法在实践中用得比较多一些。 因为一般情况下,在你的代码没跑起来之前,一个类应当具有何种行为,是确定的。 动态绑定的方法主要是提供了更灵活的方式,但实际使用中并不多见。
静态方法绑定行为
静态绑定行为,只需要重载 yii\base\Component::behaviors()
就可以了。 这个方法用于描述类所具有的行为。如何描述呢? 使用配置来描述,可以是Behavior类名,也可以是Behavior类的配置数组:
namespace app\models; use yii\db\ActiveRecord; use app\Components\MyBehavior; class User extends ActiveRecord { public function behaviors() { return [ // 匿名的行为,仅直接给出行为的类名称 MyBehavior::className(), // 名为myBehavior2的行为,也是仅给出行为的类名称 'myBehavior2' => MyBehavior::className(), // 匿名行为,给出了MyBehavior类的配置数组 [ 'class' => MyBehavior::className(), 'prop1' => 'value1', 'prop3' => 'value3', ], // 名为myBehavior4的行为,也是给出了MyBehavior类的配置数组 'myBehavior4' => [ 'class' => MyBehavior::className(), 'prop1' => 'value1', 'prop3' => 'value3', ] ]; } }
还有一个静态的绑定办法,就是通过配置文件来绑定:
[ 'as myBehavior2' => MyBehavior::className(), 'as myBehavior3' => [ 'class' => MyBehavior::className(), 'prop1' => 'value1', 'prop3' => 'value3', ], ]
具体参见配置项(Configuration) 部分的内容。
动态方法绑定行为