在自定义类中运行方法时意外调用CHttpSession::close


Yii: Unexpected invocation of CHttpSession::close when running a method in custom class

奇怪的问题。使用Yii框架,我有以下类

class HtmlTableUi
{
  public function __construct(CWebModule &$module,$data,$actions) 
  {
    //...code goes here...
  }
  protected function renderTable() 
  {
    //... code goes here ...
  }
}

我可以调用HtmlTableUi::renderTable()从HtmlTableUi在SchedulerModule类的实例,这是一个单独的应用程序模块的主类。我的SchedulerModule.php文件

<?php
Yii::import('scheduler.components.HtmlTableUi');
class SchedulerModule extends CWebModule
{
    public function init()
    {
        parent::init();
    }
    public function beforeControllerAction($controller, $action)
    {
        return true;
    }

    public function printUI($data,$actions,$submitPath)
        {
        $ui = new HtmlTableUi($this,$data,$actions,$submitPath);
        $ui->renderTable();
    }
}

这里是棘手的部分-当我调用SchudulerModule::printUI从视图(index.php)以这种方式

<?php
    $this->module->printUI($casino,$actions,null);
?>

代码流经过SchudulerModule::printUI,直到到达调用renderTable的点($ui->renderTable();),而不是步进该方法体中的第一行,它违背任何逻辑和规则,令人惊讶地跳转到CHttpSession::close !

在调用renderTable 之前注意调用堆栈
protected/modules/scheduler/SchedulerModule.php.SchedulerModule->printUI:153    
protected/modules/scheduler/views/default/index.php.require:21  
/home/default/workspace/src/vlt/web/yii-1.1.12.b600af/framework/web/CBaseController.php.CBaseController->renderInternal:127 
/home/default/workspace/src/vlt/web/yii-1.1.12.b600af/framework/web/CBaseController.php.CBaseController->renderFile:96  
/home/default/workspace/src/vlt/web/yii-1.1.12.b600af/framework/web/CController.php.CController->renderPartial:870  
/home/default/workspace/src/vlt/web/yii-1.1.12.b600af/framework/web/CController.php.CController->render:783 
protected/modules/scheduler/controllers/DefaultController.php.DefaultController->actionIndex:57 

之后:

/home/default/workspace/src/vlt/web/yii-1.1.12.b600af/framework/web/CHttpSession.php.CHttpSession->close:134    
/home/default/workspace/src/vlt/web/yii-1.1.12.b600af/framework/web/CHttpSession.php.SchedulerModule->printUI:0
protected/modules/scheduler/views/default/index.php.require:21  
/home/default/workspace/src/vlt/web/yii-1.1.12.b600af/framework/web/CBaseController.php.CBaseController->renderInternal:127 
/home/default/workspace/src/vlt/web/yii-1.1.12.b600af/framework/web/CBaseController.php.CBaseController->renderFile:96  
/home/default/workspace/src/vlt/web/yii-1.1.12.b600af/framework/web/CController.php.CController->renderPartial:870  
/home/default/workspace/src/vlt/web/yii-1.1.12.b600af/framework/web/CController.php.CController->render:783 
protected/modules/scheduler/controllers/DefaultController.php.DefaultController->actionIndex:57 

有人遇到过类似的问题吗?有人能解释这种行为吗?

我找到解决方案了!!renderTable的访问修饰符应该是public,而不是protected。这个错误在Yii框架中会导致意外的运行时行为,而不是编译错误。