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

親コンストラクター/メソッドを呼び出す必要があるのは、Callsuperとして知られるコードの臭いだと思います。エラーの影響を受けやすい(この呼び出しを忘れると、予期しない結果が生じる可能性があります)ことに加えて、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 に答える