Я новичок в CodeIgniter и OOP. Здесь я читал страницу учебника CI. Я нашел что-то, что поставило под вопрос.
Посмотрите на этот код:
<?php class News extends CI_Controller { public function __construct() { parent::__construct(); $this->load->model('news_model'); }
Я думаю, что если бы мы создали класс, который расширяет CI_Controller, мы предполагаем, что он должен иметь все методы и свойства в своем родительском классе (хотя мы можем переопределить их). Итак, почему существует parent::__construct();
в коде?
__construct()
– метод конструктора класса. Он запускается, если вы объявляете из него новый экземпляр объекта. Однако он запускает только сам конструктор, а не его родительский элемент. Например:
<?php class A { public function __construct() { echo "run A's constructor\n"; } } class B extends A { public function __construct() { echo "run B's constructor\n"; } } // only B's constructor is invoked // show "run B's constructor\n" only $obj = new B(); ?>
В этом случае, если вам нужно запустить конструктор класса A при объявлении $ obj, вам нужно будет использовать parent::__construct()
:
<?php class A { public function __construct() { echo "run A's constructor\n"; } } class B extends A { public function __construct() { parent::__construct(); echo "run B's constructor\n"; } } // both constructors of A and B are invoked // 1. show "run A's constructor\n" // 2. show "run B's constructor\n" $obj = new B(); ?>
В случае CodeIgniter эта строка запускает конструктор в CI_Controller. Этот метод конструктора должен каким-то образом помочь вашим кодам контроллеров. И вы просто хотите, чтобы он делал все для вас.
Чтобы ответить на ваш вопрос непосредственно из документации Code Iginiter:
Причина, по которой эта строка необходима, состоит в том, что ваш локальный конструктор будет переопределять один из классов родительского контроллера, поэтому нам нужно его вручную вызвать.
http://ellislab.com/codeigniter/user-guide/general/controllers.html#constructors
Расширение используется для всех классов. __construct (), используемый для этого класса, который вы используете.
Классы, которые имеют метод конструктора, вызывают этот метод для каждого вновь созданного объекта, поэтому он подходит для любой инициализации, которая может понадобиться объекту до его использования.
Я считаю, что необходимость вызова родительского конструктора / метода – это запах кода , известный как Call super . Помимо чувствительности к ошибкам (забыв этот вызов, вы можете получить неожиданные результаты), это процедурный, а не ООП. В конце концов, порядок высказываний также может привести к неожиданным результатам.
Подробнее здесь: https://martinfowler.com/bliki/CallSuper.html