Php Codeigniter,为什么我需要CI#U控制器';s构造?(代码如下)

Php Codeigniter,为什么我需要CI#U控制器';s构造?(代码如下),php,codeigniter,constructor,parent,Php,Codeigniter,Constructor,Parent,为什么我需要使用父::_构造();构造函数,它有什么我需要的 //控制器 class users_ctrl extends CI_Controller { function __construct() { parent::__construct(); //Why do I need to include it? $this->load->model('select_model'); } public function index()

为什么我需要使用父::_构造();构造函数,它有什么我需要的

//控制器

class users_ctrl extends CI_Controller {

    function __construct() {
        parent::__construct(); //Why do I need  to include it?
        $this->load->model('select_model');
}
    public function index()
    {
        $data['user_list'] = $this->select_model->get_all_users();
        $this->load->view('show_users', $data);
    }
}
//模型

class select_model extends CI_Model{
   function __construct() {
        parent::__construct();
}

  function get_all_users()
    {
        $query = $this->db->get('students');
        return $query->result();
    }
}

在给定的示例中,您正在调用基本控制器类加载的
load
类。如果没有父级的构造函数,您必须自己加载它的实例

对于您的模型,您必须手动加载db对象


除去它,您应该会调用类似于
的东西来调用未定义的propery$class::load

CodeIgniter,它实际上是面向对象编程的基本原理


如果您创建了一个扩展了另一个类的类,并且在子类中声明了一个新的构造函数,那么父构造函数将永远不会运行—因为您已经重写了它,而且因为CodeIgniter base controller(很可能)在幕后做了很多事情,如果您不运行父构造函数,您的控制器很可能不会被注入CI的容器。

调用的可能重复将引导文件(CodeIgniter.php)实例化的所有类对象分配给本地类变量,以便CI可以作为一个大型超级对象运行。。。。如果您有自己的构造函数,并且不调用父构造函数,那么这种情况就不会发生,事情很可能开始崩溃(比如发现
$this->load
没有设置,所以
$this->load->model('select_model');
不起作用)我知道子构造函数将覆盖父构造函数,但我不知道CodeIgniter在幕后做了什么,没有它我无法进行查询或其他很多事情..我将尝试以另一种方式提问,如果我提供了使查询成为可能所需的一切,那么
类用户\u ctrl extensed CI\u Controller
的构造会是什么样子?。无论如何,我不认为您试图完成的是有意义的,如果您使用CodeIgniter,为什么不想扩展基本控制器呢?它违背了框架本身的目的。@GiamPy,在CodeIgniter(CI)中扩展CI_控制器是正常的做法。CI使用控制器在文件和URL之间创建关联。一个CI场景可能有许多不同的控制器,所有这些控制器都扩展了CI_控制器。@john thomas,回答您的“询问另一种方式”问题-它看起来像是您将代码从CI_控制器类构造函数复制并粘贴到users_ctrl类构造函数中。这肯定违反了“不要重复你自己”的概念。