首先:我已经回顾了我能找到的关于__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核心并不是很熟悉,而且我认为当我挖掘到足够远的时间来找到控制器实例时,这里有人可能已经得到了答案。如果我自己的挖掘能够解决问题,那么当然会更新这个。
答案 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){
[...]
}
}
}