- 行为是对类的功能进行了扩展,针对开闭原则,为了类的扩展而生,不去修改类原有的代码。
- yii的行为需要继承yiiaseBehavior,这就好比你要给人安装一个胳膊,这个胳膊得是人的,而不能是老虎的、大象的,要遵守这个规范。
- 而接受行为绑定的类必须得是继承了component的子类,同样是一个规范吧。
- 转 yii行为的讲解:https://blog.csdn.net/qq_24127857/article/details/79394485
- 经测试发现,如果给一个类绑定了两个行为,并且这两个行为类里面都定义了相同的属性name, 那么在调用这个name属性的时候,不会报错,而是会调用写在前面的行为类的name属性。具体见代码
class TestController extends Controller { public function actionTest() { echo 'this is test action<br>'; $this->foo(); $this->who(); echo $this->name; //这个属性是MyBehavior 和 YourBehavior 都有的属性,这里不会报错 } public function behaviors() { return [ 'mybehavior' => MyBehavior::className(), //这个在前,那么就调用MyBehavior里的name属性,而不是报错 'yourbehavior' => YourBehavior::className(), // ]; } } //第一个行为类MyBehavior class MyBehavior extends Behavior { public $name = 'me'; public $age; public function foo() { echo 'this is foo function<br>'; } public function bar() { return 'this is bar function<br>'; } } //第二个YourBehavior class YourBehavior extends Behavior { public $name = 'you'; public function who() { echo 'who are you?<br>'; } }
- 过滤器
//还是上面的TestController调用 class MyFilter extends ActionFilter { public $name; public function beforeAction($action) { echo '这个 是在test function 之前执行的beforeAction<br>'; return parent::beforeAction($action); } public function afterAction($action, $result) { echo '这个是在test function 之后执行的afterAction<br>'; $result = 'result 有什么用呢?<br>'; return parent::afterAction($action, $result); // TODO: Change the autogenerated stub } public function beforeFilter($event) { echo 'this is event? beforeFilter<br>'; return parent::beforeFilter($event); // TODO: Change the autogenerated stub } public function afterFilter($event) { echo 'this is event? afterFilter<br>'; parent::afterFilter($event); // TODO: Change the autogenerated stub } }
//output: this is event? beforeFilter 这个 是在test function 之前执行的beforeAction this is tes action this is event? afterFilter 这个是在test function 之后执行的afterAction result 有什么用呢?