我的问题在于使用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
和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')
答案 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
}
}