我在笨和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();
?>
在这种情况下,如果您需要在$ obj是宣称运行A类的构造函数,你需要使用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构造。 该构造方法应该以某种方式帮助你的控制器代码。 而你只希望它为你做所有的事情。
要直接从代码Iginiter文档回答你的问题:
原因此行是必要的,因为当地的构造函数将被重写一个父控制器类,所以我们需要手动调用它。
http://ellislab.com/codeigniter/user-guide/general/controllers.html#constructors
适用于所有类别的扩展。 __construct()用于您使用类。
其中有一个构造方法调用每个新创建的对象上该方法,所以它适合于该对象可能需要在使用前的任何初始化类。
我相信调用父类的构造/方法的需求是一个代码味道 ,被称为超级电话 。 除了误差灵敏度(忘记这个电话,就可以得到意想不到的效果),这是程序,而不是面向对象的。 毕竟,语句的顺序可能会导致意想不到的结果了。
在这里阅读更多: https://martinfowler.com/bliki/CallSuper.html
正在使用继承通过关键字extends
。 父类可以设置一些值,它的构造函数被调用时。 如果父类的构造不叫没有设置值和子类不会得到这些值。
例:
class Super {
protected $a;
public function __construct(){
$this->a = 'Foo';
}
}
class Child extends Super{
protected $b = 'Bar';
public function __construct() {
parent::__construct();
echo $this->a;
}
}
$x = new Child();
在这里,类Child
将回声出咱这父类的构造不叫。
因此,在笨父类可能是设置一些价值是帮助其孩子,当你调用它的构造和这些值只提供给其子如果父构造函数被调用。
文章来源: why do we still need parent constructor when controller class extends a parent controller?