Intereting Posts
Шаблон WordPress – «Ловкая фатальная ошибка: объект класса __PHP_Incomplete_Class не может быть преобразован в строку» Почему session_start вызывает таймаут, когда один скрипт вызывает другой скрипт с использованием curl Как отличить красноречивые параметры? Настройка настраиваемого обработчика ошибок значительно увеличивает время выполнения скрипта PHP preg_split удаляет запятые и завершающий пробел Объедините png ontop из jpg и сохраните прозрачность с помощью php Как получить разницу в времени для чтения человеком с помощью Laravel 5 Это хорошая идея использовать $ _SERVER в составе? Получить идентификатор заказа Opencart в платежном модуле COD для переадресации Расширение DOMDocument и DOMNode: проблема с объектом возврата Получить данные Youtube VideoID в массиве Обнаружение цветов для изображения с помощью PHP График потока приложений PHP (или график вызовов функций) zf2 form: заполнить поле select с данными, поступающими из базы данных Пользовательская электронная почта не отправляется по заказу в WooCommerce

почему нам все еще нужен родительский конструктор, когда класс контроллера расширяет родительский контроллер?

Я новичок в CodeIgniter и OOP. Здесь я читал страницу учебника CI. Я нашел что-то, что поставило под вопрос.
Посмотрите на этот код:

<?php class News extends CI_Controller { public function __construct() { parent::__construct(); $this->load->model('news_model'); } 

Я думаю, что если бы мы создали класс, который расширяет CI_Controller, мы предполагаем, что он должен иметь все методы и свойства в своем родительском классе (хотя мы можем переопределить их). Итак, почему существует parent::__construct(); в коде?

Solutions Collecting From Web of "почему нам все еще нужен родительский конструктор, когда класс контроллера расширяет родительский контроллер?"

__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