关于在PHP中使用构造函数的问题

时间:2011-02-02 09:55:22

标签: php oop codeigniter constructor

我的问题在于使用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_Controllerapi_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 个答案:

答案 0 :(得分:4)

您的代码看起来像是使用构造函数的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.
    }
}

答案 1 :(得分:2)

对于PHP,一般情况下,如果子项具有构造函数,则不会将父构造函数称为default。 Constructors。它可以使用parent :: _ construct();

调用

如果您使用的是php 5+,则应使用新推荐的使用函数__construct()的样式,而不是使用名为与类相同的函数的旧样式。

对于CI特定的东西,我无法帮助你,抱歉!

答案 2 :(得分:2)

如果您未在__construct()中覆盖MY_Controller,则Controller的{​​{1}}将会运行。

如果你覆盖它然后调用__construct()那么它将运行你自己和父母的。

因此,如果您希望它运行父级和您自己的,那么您将执行此操作

parent::__construct()

答案 3 :(得分:0)

是的,总是调用它的父构造函数(你可能想把它们重写为__construct(),但是也要考虑在codeigniter 2.0)。 如果你真的怀疑它是echo,请亲自看看。

$ this->数据部分对我来说也是正确的

答案 4 :(得分:0)

您对数据阵列内容的肯定是正确的。你在代码中写道:

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

所以正在调用父类的构造函数。有很多关于PHP4和PHP5语法的评论,但基本上没有问题。

在你写的问题中

  

如果实例化扩展MY_Controller的控制器类

这是不正确的。该实例是类api_controller的对象,调用MY_Controller构造函数是使用相同的对象。这是不一样的,这是民族主义的基础。

答案 5 :(得分:0)

class Blog extends CI_Controller {

       public function __construct()
       {
            parent::__construct();
            // Your own constructor code
       }
}