• yii CComponent组件 实例说明1


    yii CComponent组件 实例说明

    yii中的module,controller都是CComponent的子类,可以说yii的架构基石就是依托在CCompnent基础上的,这里研究下CComponent。另外写一个简单的组件应用示例。希望可以帮助到大家。

    component有三个基础特性,属性(Property),事件(Event),行为(Behavior)。就从这三点阐述一下吧,个人感觉掌握了这三点,就基本掌握了component的本质

    属性:

    故名思意,该特性描述组件的一系列属性。通过 $compontent -> property_name 进行赋值和提取。系统中是通过 __get 和 __set 来实现的。

    事件:

    事件可以认为是一类特殊的属性。之所以特殊,是因为他可以把事件处理句柄和事件名关联在一起,当事件被唤起时,事件处理句柄被执行。

    事件的名字以”on”开头,在__get()和__set()里可以通过这个来区别属性和事件。事件被记录在组件的$_e[]数组中

    定义事件时,要有onEventName的方法,这样系统才可以把事件注册具体的句柄上,激发事件时,同样使用onEventName方法,里面调用raiseEvent.

    事件句柄必须定义为 function methodName($event)

    注册事件的方法:

    //添加一个全局函数到事件处理

    $component-> onBeginRequest=”logRequest”;

    //添加一个类静态方法到事件处理

    $component-> onBeginRequest=array(“CLog”,” logRequest”);

    //添加一个对象方法到事件处理

    $component-> onBeginRequest=array($mylog,” logRequest”);

    唤起事件的方法:

    $component ->raiseEvent('onBeginRequest ', $event);

    他会自动调用:

    logRequest($event), Clog:: logRequest($event)和$mylog.logRequest($event)

    行为:

    组件的行为是一种不通过继承而扩展组件功能的方法。

    行为类必须实现 IBehavior 接口,大多数行为可以从 CBehavior 基类扩展而来。

    IBehavior接口提供了4个方法。

    attach($component)将自身关联到组件,detach($component) 解除$component关联,getEnabled()和setEnabled()设置行为对象的有效性。

    行为对象存放在组件的$_m[]数组里,数组键值为行为名字符串,数组值为行为类对象。

    组件通过attachBehavior ($name,$behavior)来扩展一个行为:

    例如

    $component-> attachBehavior (‘render’,$htmlRender)

    为$component添加了一个名字为render的行为,$htmlRender 需是一个实现 IBehavior 接口的对象,或是一个数组:

    array( 'class'=>'path.to.BehaviorClass',

       'property1'=>'value1',

       'property2'=>'value2',

       * )

    会根据数组的class来创建行为对象并设置属性值。

    $htmlRender被存储到$_m[‘render’]中。

    外部调用一个组件未定义的方法时,魔术方法__call() 会 遍历所有行为对象,如果找到同名方法就调用之。

    例如 $htmlRender 有个方法 renderFromFile(),则可以直接当做组件的方法来访问:

    $component-> renderFromFile()

    编写一个组件示例,希望可以帮助大家很好的理解

    protected/components/TestCom.php

    <?php
    /*
     * author:wully_happy@163.com
     * component function test
    */
    class TestCom extends CComponent{
        
        #属性的读写操作,可以根据读写是否开放,来决定是否设置set和get方法
        #可以通过$com -> atr来调用
        private $atr = "";
            public function getAtr(){
            return $this -> atr;
        }
        
        #可以通过$com -> atr来调用
        public function setAtr($v){
            $this -> atr = $v;
        }
        public static function eventMethod1($event){
            echo "run enentMethod1!/n";
        }
        public function eventMethod2($event){
            echo "run enentMethod2!/n";
        }
        
        public function onTest($event){
            $this->raiseEvent('onTest', $event);
        }
    
        public function testEvent(){
            ##register event
            $callback = array();
            $callback = array("TestCom","eventMethod1");
            $this -> onTest = $callback;
            $callback = array($this,"eventMethod2");
            $this -> onTest = $callback;
            $this -> onTest(new CEvent());
        }
        public function testBehavior(){
            $name = "testBehavior";
            $behavior = new TestBehavior();
            $this->attachBehavior($name,$behavior);
            $this -> FunOfTestBehavior();
        }
    }
    ?>

    protected/components/TestBehavior.php

    <?php
    /*
     * author:wully_happy@163.com
     * component function test
    */
    class TestBehavior extends CBehavior{
        public function  FunOfTestBehavior(){
            echo "this function from TestBehavior class!/n";
        }
    }

    protected/controllers/TestController.php

    <?php
    /*
     * author:wully_happy@163.com
     * component function test
    */
    class TestController extends Controller{
        public function actionTestAtr(){
            $com = new testCom();
            $com -> atr = "atr";
            echo $com -> atr;
        }
        public function actionTestEvent(){
            $com = new testCom();
            $com -> testEvent();
        }
        public function actionTestBehavior(){
            $com = new testCom();
            $com -> testBehavior();
        }
    }
    ?>

    参考资料:http://www.yiiframework.com/doc/guide/1.1/en/basics.component

  • 相关阅读:
    转载Dockerfile 中 RUN, CMD, ENTRYPOINT 的区别
    在linux上通过ssh使用github
    dns服务
    centos6 free 和 centos 7的free 的差异与对比
    无重复字符的最长子串
    go get命令在go mod目录下与正常目录执行的区别
    安装git
    转载 筛子算法之golang实现求素数解析
    Go语言基础之并发
    go之无缓冲channel(通道)和有缓冲channel(通道)
  • 原文地址:https://www.cnblogs.com/achengmu/p/3943871.html
Copyright © 2020-2023  润新知