Проблема с использованием конструкторов в PHP - PullRequest
0 голосов
/ 02 февраля 2011

Моя проблема заключается в использовании пользовательской библиотеки Codeigniter, но я думаю, что она не является специфической для этого и больше связана с использованием конструкторов в PHP.Я пытаюсь создать пользовательскую библиотеку контроллеров в Codeigniter следующим образом ...

class MY_Controller extends Controller {
    var $data = array();

    function MY_Controller() {
        parent::Controller();
        $this->data['err'] = 'no';

        $this->load->helper('utilities');
    }
}

Теперь я создаю класс контроллера codeigniter следующим образом ...

class api_controller extends MY_Controller {
    function get_data() {
        $this->data['view'] = "data";
        $this->load->view("data_view", $this->data);
    }
    function get_xml() {
        $this->data['part'] = "xml";
        $this->load->view("data_view", $this->data);
    }
}

Я хочу спроситьчто если создается экземпляр класса контроллера, расширяющего MY_Controller, когда я обращаюсь к URL-адресам, таким как api_controller/get_data и api_controller/get_xml, всегда ли вызывается конструктор родительского класса, т. е. всегда вызывается MY_Controller().* Правильно ли я вывел следующее

get_data() called
-> $data => array ('err' => 'no', 'view' => 'data')

get_xml() called
-> $data => array ('err' => 'no', 'part' => 'xml')

Ответы [ 6 ]

4 голосов
/ 02 февраля 2011

Ваш код выглядит так, как будто он использует синтаксис PHP4 для конструкторов. Вы должны переключиться на синтаксис PHP5.

PHP4:

class MyClassName {
    function MyClassName() {...}  //constructor.
}

PHP5:

class MyClassName {
    function __construct() {...}  //constructor.
}

Затем вы можете вызвать конструктор родительского класса, вызвав parent::__constructor(); из метода __constructor() дочернего класса:

class MyClassName extends SomeOtherClass {
    function __construct() {
        //...code here runs before the parent constructor.
        parent::__construct();
        //...code here runs after the parent constructor.
    }
}
2 голосов
/ 02 февраля 2011

Если вы не переопределите __construct() в MY_Controller, то Controller s __construct() будет запущено

Если вы переопределите его и затем наберете parent::__construct(), тогда он запустит ваш собственный и родительский.

Так что, если вы хотите, чтобы он управлял родителями и вашими, вы бы сделали это

class MY_Controller extends Controller 
{
    var $data = array();

    function __construct()
    {
        parent::__construct();
        // Your code here
    }
}
2 голосов
/ 02 февраля 2011

Для PHP вообще родительский конструктор не называется default, если у дочернего есть конструктор. Конструкторы . Его можно вызвать с помощью parent :: _ construct ();

Если вы используете php 5+, вы должны использовать новый рекомендуемый стиль использования функции __construct () вместо старого стиля с функцией, названной так же, как класс.

Что касается специфичных для CI вещей, я не могу вам помочь, извините!

0 голосов
/ 28 марта 2012
class Blog extends CI_Controller {

       public function __construct()
       {
            parent::__construct();
            // Your own constructor code
       }
}
0 голосов
/ 02 февраля 2011

Вы правы в своих утверждениях о содержании массива данных.В вашем коде вы написали:

function MY_Controller() {
    parent::Controller();

, поэтому вызывается конструктор класса родителей.Есть много комментариев о синтаксисе PHP4 и PHP5, но в основном все в порядке.

В своем вопросе вы написали

, что если создается экземпляр класса контроллера, расширяющего MY_Controller,

это не правильно.Экземпляр является объектом класса api_controller, вызов конструктора MY_Controller осуществляется с использованием того же объекта.Это не то же самое, что является основным для полиморфизма.

0 голосов
/ 02 февраля 2011

Да, родительский конструктор всегда вызывается (однако вы можете переписать их как __construct (), думая также о codeigniter 2.0).Если вы действительно сомневаетесь, добавьте в него echo и убедитесь сами.

Также часть $ this-> data является верной для меня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...