学习yii2.0——行为

学习yii框架的行为之前,需要先了解yii的事件,可以参考这篇博客:

 

 怎么理解行为

  yii框架的行为有点类似于trait,可以有个大体的概念:

  1、有一个类A,包含一些属性和方法,很普通的一个类A。

  2、现在需要在这个简单的类中使用类B和类C中的某些属性和方法,或者这两个类中为指定事件绑定的事件处理程序。

  有一种方法可以实现:可以使用组合的方式,在这个简单的类A中,创建其他类(B、C)的对象,然后进行其他的操作,比如访问他们的成员属性和方法。

  yii框架中行为的功能:

  1、在类B和类C声明为行为类,可以在这个行为类中定义属性和方法,以及某些事件对应的事件处理程序。

  2、在类A中的behavior方法中,将前面的两个行为类B、C包含进来,那么就可已使用B、C中的行为和方法了。

  注意这里并没有把B、C实例化,而是直接使用B、C类中的方法和属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php
namespace app\controllers;
 
use yii\web\Controller;
use yii\base\Behavior;
 
class Demo {
    public function Show()
    {
        echo "this is demo<br>";
    }
}
 
//自定义的行为类要继承yii\base\Behavior类
class MyHavior1 extends Behavior
{
    public $prop = "hello world 1 <br>";
 
    //自定义的方法
    public function test()
    {
        echo "this is MyHavior 1 /tetst<br>";
    }
 
    public function events()
    {
        //指定事件
        return [
            "cry" => function() {echo "don't cry 1<br>";},
            "test" => [new \app\controllers\Demo(), "Show"]
        ];
    }
}
 
//自定义的行为类要继承yii\base\Behavior类
class MyHavior2 extends Behavior
{
    public $prop = "hello world 2 <br>";
 
    //自定义的方法
    public function test()
    {
        echo "this is MyHavior 2 /tetst<br>";
    }
 
    public function events()
    {
        //指定事件
        return [
            "cry" => function() {echo "don't cry 2<br>";},
            "test" => [new \app\controllers\Demo(), "Show"]
        ];
    }
}
 
class HelloController extends Controller
{
    public function behaviors()
    {
        return [
            //返回附加行为,默认是都添加
            //加载两个行为类,demo和example类似于标签,这里的顺序是有意义的
            "demo" => MyHavior1::className(),
            "example" => MyHavior2::className()
        ];
    }
 
    public function actionIndex()
    {
        //当两个行为behavior有相同的行为的时候,默认以behaviors中先出现优先级高
        echo $this->prop;  // hello world 1
        $this->test();  //this is MyHavior/tetst 1
        $this->trigger("cry"); //don't cry 1  don't cry 2
 
        //手动从前面behaviors()中选择附加行为
        $behaviors = $this->getBehavior("example");
        echo $behaviors->prop;  // hello world 2
        $behaviors->test();     // this is MyHavior 2 /tetst
        $this->trigger("test"); // this is demo   this is demo
 
        echo "aaa";
        //手动删除附加的行为,现在只有example有意义了
        $this->detachBehavior("demo");
        echo $this->prop;  // hello world 2
        $this->test();  //this is MyHavior/tetst 2
        $this->trigger("cry"); //don't cry 1  don't cry 2
 
        //从上面的例子中可以看出,事件一旦触发,那么虽然有先后顺序,但是都会执行事件处理程序
        //但是访问属性和方法时,如果有重复时,默认是第一个为准
    }
}

  

posted @   寻觅beyond  阅读(217)  评论(0编辑  收藏  举报
返回顶部
点击右上角即可分享
微信分享提示