php笔记之CComponent

1,首先定义一个组件: eg:

class Test extends CComponent{
}


2:在一个组件(CComponent或者其子类)中定义一个事件,以on开头

eg:public function onClick($event){//event为CCEvent或其子类实例,里面包含了

 $this->raiseEvent('onSubmit', $event);//发起一个时间,时间名为Submit;

}


3:绑定事件(注册事件句柄(可以注册多个事件句柄)):

  1:定义事件的对象->事件名=$callback 或者  定义事件的对象 ->attachEventHandler( '事件名',  $callback ); 

   其中:$callback指字全局函数名的字符串或一个数组,该数组包含两个元素, 第一个元素是一个对象, 第二个元素是这个对象的方法。

    eg:

  1. //方法绑定了。把$logOjbect对象中的saveLog方法绑定到$form对象(专业点叫‘组件’...)中的onSubmit事件中。  
  2.         $form ->attachEventHandler( 'onSubmit',  array($logOjbect"saveLog") );

4:触发事件并执行绑定的方法

       newCEvent('触发事件的对象,'数组为传入到么对象绑定函数中的参数数据);

eg:

  1. //触发事件并执行其绑定的方法。这里把POST过来的数据传递到$logOjbect对象中的saveLog方法中,由saveLog对数据进行处理. 
  2.         $form->onSubmit(new CEvent($formarray('data'=>$_POST) ) ); 



eg:

class TestComponentController extends CController{
    /***
     * 定义一个事件,以on开头
     * 参数为event,他是VEvent或者其子类的实例,*      /
     */
    public function onSubmit($event){
        //触发事件
        ///raiseEvent($事件名, 事件参数)
        $this->raiseEvent('onSubmit', $event);
        
    }
    
    public function one(){  
        echo "one";  
    }  
  
    /*带参数*/  
    public function Twp($data){  
       
        echo $data->params['name']  ;  
        
    }  
    
    public function actionIndex(){
        //有两种方式对onsubmit事件进行方法的绑定( 绑定到么个对象,)
        //1 $this->onSumbit=$callback;
        //2 $this->attachEventHandler('事件名',‘处理函数’);
         /*$callback代表一个事件处理程序。 
         *    一个事件处理程序必须是一个有效的PHP回调。 
         *    如,一个指字全局函数名的字符串或一个数组,该数组包含两个元素, 第一个元素是一个对象, 第二个元素是这个对象的方法。
        */
        $this->onSubmit=array($this,"one");  
        
         /*2.绑定方式二*/  
        $this->attachEventHandler("onSubmit", array($this,twp"));  
        //newCEvent('触发事件的对象,'数组为传入到绑定函数中的参数数据);
         //触发事件,执行绑定的方法
        $this->onSubmit(new CEvent($this,array("name"=>"参数一","sex"=>"参数二")));  
    }
      
}


组件中的“行为”:行为就是一个特殊的类。

一个行为的运行示例。

1.先定义一个行为类。

[php]   view plain copy
  1. /* 
  2.  * 定义一个行为。 
  3.  */  
  4. class MyBehavior extends CBehavior {  
  5.   
  6.     public $name="行为中的name属性<br />";  
  7.   
  8.     public function test1(){  
  9.         echo "行为中的一个方法Test1<br />";  
  10.   
  11.     }  
  12.     public function test2(){  
  13.         echo "行为中的一个方法Test2<br />";  
  14.     }  
  15.   
  16.     public function test3(){  
  17.         echo "行为中的一个方法Test3<br />";  
  18.     }  
  19.   
  20.     public function events() {  
  21.         return array(  
  22.                 'onSubmit' => 'test3',  //指定调用此行为的组件的onSubmit事件发生后,自动调用行为的test2  
  23.         );  
  24.     }  
  25. }  

2.在一个类中(一个控制器组件或者其他地方,这里用控制器组件做示例)中使用上面定义的行为。

[php]   view plain copy
  1. Yii::import('application.behavior.MyBehavior');  
  2. class BehaviorTestController extends Controller  
  3. {  
  4.     //定义一个事件  
  5.     public function onSubmit($event){  
  6.         $this->raiseEvent("onSubmit"$event);  
  7.     }  
  8.   
  9.     public function test1(){  
  10.         echo "优先执行<br />";  
  11.     }  
  12.   
  13.     public function actionIndex(){  
  14.         //给组件绑定一个行为 MyBehavior(当然,这个行为的类文件也必须先引入进来了...)  
  15.         $this->attachBehavior('myapp','MyBehavior');  
  16.         /** 
  17.          *一旦把行为帮到到这个组件当中,这个时候就可以使用行为类当中的所有方法和属性了。 
  18.          *和当前组件的对象(这里是$this)调用自身属性方法一样.. 
  19.          *注意:如果当前组件中存在和行为名称一样的方法,将只会执行组件中的方法。 
  20.          *    如下:$this->test1()只会执行这个控制器组件中的test1方法 
  21.          */  
  22.   
  23.             echo $this->name;//调用行为MyBehavior中的name属性  
  24.             echo $this->test1();//这里将执行当前控制器组件的test1,而不是行为中的test1  
  25.             echo $this->test2();//调用行为中的test2方法  
  26.   
  27.             //触发当前组件的onSbumit事件的时候,将会执行行为中的test3方法。  
  28.             //因为这是在行为类MyBehavior中的events进行了事件绑定  
  29.             $this->onSubmit(new CEvent($this));  
  30.     }  
  31. }  


运行结果如下:

[html]   view plain copy
  1. 行为中的name属性  
  2. 优先执行  
  3. 行为中的一个方法Test2  
  4. 行为中的一个方法Test3 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Veins中的`ChannelAccess.h`头文件定义了`ChannelAccess`类,该类是用于控制车辆间通信信道的模块。具体内容如下: ```c++ class ChannelAccess : public cSimpleModule { public: ChannelAccess(); virtual ~ChannelAccess(); virtual void initialize(int stage) override; virtual void handleMessage(cMessage* msg) override; virtual void finish() override; virtual bool isChannelIdle() const; virtual void sendToChannel(cMessage* msg); virtual void setTxPower(double txPower_dBm); virtual double getTxPower() const; virtual double getFrequency() const; virtual void setFrequency(double frequency); virtual void setChannelNumber(int channel); virtual int getChannelNumber() const; virtual void setChannelSenseTime(double senseTime); virtual double getChannelSenseTime() const; virtual bool isChannelBusy() const; virtual void channelStateChanged(IChannelState::State newState); virtual void registerInterface(IChannelControl* interface); virtual void unregisterInterface(IChannelControl* interface); virtual void receiveSignal(cComponent* source, simsignal_t signalID, bool b, cObject* obj, cObject* details) override; virtual void receiveSignal(cComponent* source, simsignal_t signalID, double d, cObject* obj, cObject* details) override; private: void updateChannelState(); void updateChannelState(IChannelState::State newState); void changeChannelState(IChannelState::State newState); bool isChannelIdle(double senseTime) const; bool isChannelIdle(IChannelState::State newState) const; bool isChannelBusy(IChannelState::State newState) const; void handleUpperMsg(cMessage* msg); void handleLowerMsg(cMessage* msg); private: std::vector<IChannelControl*> interfaces; cMessage* channelMsg; IChannelState* channelState; double txPower_dBm; int channel; double frequency; double channelSenseTime; bool channelIdle; }; ``` 其中,`ChannelAccess`类的主要成员包括以下内容: - `initialize(int stage)`:初始化函数,用于初始化模块,包括一些参数的设置和初始化操作; - `handleMessage(cMessage* msg)`:消息处理函数,用于处理来自其他模块的消息; - `isChannelIdle()`:判断通信信道是否空闲; - `sendToChannel(cMessage* msg)`:向通信信道发送消息; - `setTxPower(double txPower_dBm)`:设置发送功率; - `getTxPower()`:获取当前发送功率; - `getFrequency()`:获取当前通信频率; - `setFrequency(double frequency)`:设置通信频率; - `setChannelNumber(int channel)`:设置通信信道号; - `getChannelNumber()`:获取当前通信信道号; - `setChannelSenseTime(double senseTime)`:设置信道感知时间; - `getChannelSenseTime()`:获取当前信道感知时间; - `isChannelBusy()`:判断通信信道是否忙碌; - `channelStateChanged(IChannelState::State newState)`:通知所有注册的接口,通信信道状态已经改变; - `registerInterface(IChannelControl* interface)`:注册通信接口; - `unregisterInterface(IChannelControl* interface)`:注销通信接口; - `receiveSignal(cComponent* source, simsignal_t signalID, bool b, cObject* obj, cObject* details)`:接收来自其他模块的信号; - `receiveSignal(cComponent* source, simsignal_t signalID, double d, cObject* obj, cObject* details)`:接收来自其他模块的信号; - `updateChannelState()`:更新通信信道状态; - `updateChannelState(IChannelState::State newState)`:更新通信信道状态; - `changeChannelState(IChannelState::State newState)`:改变通信信道状态; - `isChannelIdle(double senseTime)`:判断通信信道是否空闲; - `isChannelIdle(IChannelState::State newState)`:判断通信信道是否空闲; - `isChannelBusy(IChannelState::State newState)`:判断通信信道是否忙碌; - `handleUpperMsg(cMessage* msg)`:处理上层消息; - `handleLowerMsg(cMessage* msg)`:处理下层消息。 通过使用`ChannelAccess`类,可以实现对车辆间通信信道的精细控制,包括设置通信频率、信道号、发送功率、感知时间等参数,以及发送和接收数据等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值