为什么我们还需要父类的构造时,控制器类继承父控制器?(why do we still need pa

2019-08-17 04:10发布

我在笨和OOP初学者。 我读CI教程的页面在这里 。 我发现的东西,在我的脑袋的问题。
看看下面的代码:

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

我认为,如果我们做了一个扩展是CI_Controller一类,我们假设它必须有它的父类中的所有方法和属性(虽然我们可以忽略它们)。 那么,为什么会出现parent::__construct(); 在代码?

Answer 1:

__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构造。 该构造方法应该以某种方式帮助你的控制器代码。 而你只希望它为你做所有的事情。



Answer 2:

要直接从代码Iginiter文档回答你的问题:

原因此行是必要的,因为当地的构造函数将被重写一个父控制器类,所以我们需要手动调用它。

http://ellislab.com/codeigniter/user-guide/general/controllers.html#constructors



Answer 3:

适用于所有类别的扩展。 __construct()用于您使用类。

其中有一个构造方法调用每个新创建的对象上该方法,所以它适合于该对象可能需要在使用前的任何初始化类。



Answer 4:

我相信调用父类的构造/方法的需求是一个代码味道 ,被称为超级电话 。 除了误差灵敏度(忘记这个电话,就可以得到意想不到的效果),这是程序,而不是面向对象的。 毕竟,语句的顺序可能会导致意想不到的结果了。

在这里阅读更多: https://martinfowler.com/bliki/CallSuper.html



Answer 5:

正在使用继承通过关键字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?