YII2.0框架行为(Behavior)深入详解(4)

yii\base\Behavior 从而间接地继承自 yii\base\Object 。 没错,这是我们的老朋友了。因此,这个类有一个public的成员变量 prop1 , 一个只读属性 prop2 ,一个只写属性 prop3 ,一个public的方法 foo() 。 另外,还有一个private 的成员变量 $_prop4 ,一个protected 的方法 bar() 。 如果你不清楚只读属性和只写属性,最好回头看看 属性(Property) 部分的内容。

当这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) 部分的内容。

动态方法绑定行为

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5482.html