__destruct在CodeIgniter中调用了两次

时间:2015-01-14 07:05:32

标签: php codeigniter destructor

首先:我已经回顾了我能找到的关于__destruct()和CodeIgniter的所有问题,似乎没有人能解决我所看到的同样问题。

右。除此之外。我将首先显示代码,因为阅读后问题会更有意义。 ( N.B。:一些代码被编辑,但对问题没什么重要的。Billing::index函数只包含生产中的一个空格字符以及此处


应用/核心/ MY_Controller.php

class MY_Controller extends CI_Controller{
    public $view = '';
    public $data = array();
    public $template = '';

    function __destruct(){
        if(!is_null($this->template) && ($this->template == '')){
            $this->template = 'public';
        }

        if($this->view == ''){
            $this->view = $this->uri->segment(1,'index').'/'.$this->uri->segment(2,'index');
        }

        if(!is_null($this->template)){
            echo $this->load->view('templates/'.$this->template.'/top',$this->data,true);
        }
        echo $this->load->view('views/'.$this->view,$this->data,true);
        if(!is_null($this->template)){
            echo $this->load->view('templates/'.$this->template.'/bottom',$this->data,true);
        }
    }
}

class MY_ProtectedController extends MY_Controller{
    function __destruct(){
        parent::__destruct();
    }
}

应用/控制器/ billing.php

class Billing extends MY_ProtectedController{
    public function index(){ }
}

这样,完美地加载。主“结算”页面只是HTML,因此析构函数会激活正确的模板和视图。

但是,我很想删除多余的public function index(){ },因为它实际上什么也没做。

因此,如果我从application/controllers/billing.php删除它,那么它只是

class Billing extends MY_ProtectedController{ }

并访问/billing,我得到了我想要的输出,但是,我得到它两次

如果我做一些测试回声,MY_ProtectedController::__destruct()会被调用一次,但MY_Controller::__destruct被调用两次。

我的问题是:为什么会这样,是否可以停止?

我对CI核心并不是很熟悉,而且我认为当我挖掘到足够远的时间来找到控制器实例时,这里有人可能已经得到了答案。如果我自己的挖掘能够解决问题,那么当然会更新这个。

1 个答案:

答案 0 :(得分:1)

解决方案最终变得相当简单 - 但是发现这个问题归功于我们其他程序员之一。

如果我在404路由中放置一些代码以防止自动析构函数运行,我只得到一组输出。

class Index extends MY_PublicController {
    public function not_found(){
        $this->cancel_destruct = TRUE;
    }
}

class MY_Controller extends CI_Controller{
    $this->cancel_destruct = FALSE;
    function __destruct(){
        if(!$this->cancel_destruct){
            [...]
        }
    }
}