13

我是 CodeIgniter 和 OOP 的初学者。我在这里阅读了一页 CI 教程。我发现了一些在我脑海中产生疑问的东西。
看看这段代码:

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

我认为如果我们创建了一个扩展 CI_Controller 的类,我们假设它必须在其父类中具有所有方法和属性(尽管我们可以覆盖它们)。那么,为什么parent::__construct();在代码中有呢?

4

5 回答 5

21

__construct()是类的构造方法。如果您从中声明一个新的对象实例,它就会运行。然而,如果一个类实现了它自己的__construct(),PHP 将只运行它自己的构造函数,而不是它的父类的构造函数。例如:

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

于 2013-02-25T09:44:51.397 回答
3

要直接从 Code Iginiter 文档中回答您的问题:

之所以需要这一行,是因为您的本地构造函数将覆盖父控制器类中的构造函数,因此我们需要手动调用它。

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

于 2013-07-09T17:09:25.947 回答
2

用于所有类的扩展。__construct() 用于您使用的那个类。

具有构造函数方法的类在每个新创建的对象上调用此方法,因此它适用于对象在使用之前可能需要的任何初始化。

于 2013-02-25T09:42:49.070 回答
2

我相信调用父构造函数/方法的需要是一种代码气味,称为Call super。除了错误敏感性(忘记这个调用,你可能会得到意想不到的结果),它是程序性的,而不是 OOP。毕竟,语句的顺序也会导致意想不到的结果。

在此处阅读更多信息:https ://martinfowler.com/bliki/CallSuper.html

于 2017-09-29T10:26:54.210 回答
0

通过关键字使用继承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将不会发出任何声音。

因此,在 Codeigniter 中,父类可能会在您调用其构造函数时设置一些对其子类有帮助的值,并且这些值仅在调用父构造函数时对其子类可用。

于 2018-06-06T02:07:17.637 回答