CController::runAction代码的一点疑问

public function runAction($action)

{

$priorAction=$this->_action;


$this->_action=$action;


if($this->beforeAction($action))


{


    if($action->runWithParams($this->getActionParams())===false)


        $this->invalidActionParams($action);


    else


        $this->afterAction($action);


}


[b]$this->_action=$priorAction;[/b]

}

为什么需要最后那句$this->_action=$priorAction;?这样当前的action岂不是没有更新?还是说_action只有在执行过程中才有意义?

必须要这个 这是恢复当前上下文的

方法的调用跟栈原理差不多 你要在当前方法中调用其他方法 那么必须将当前上下文先保存 跳去执行其他方法 在其他方法执行完毕后 恢复当前上下文 不知道我这么说你能否理解







 function a()

{

   $priorContest =$this->_context;

    

   ...  b();


   $this->_context=$priorContest ;

}

 



懂! :lol:

如果没有最后一句话 当前上下文 可能会再b方法中被修改 我这是从抽象角度帮你理解这个问题

每个actionXXX()方法在执行时 可以通过$this->action->id 获取到当前action的id号 当没有最后一句时 你可能获取到错误的actionId(比如在 actionA 中调用了 actionB(同一个控制器) 当你runAction后 你再调用$this->action->id 你得到的是“b” :lol: