2009-04-10 27 views
0

私は、このクラスを使用している場合:スーパークラスのコンストラクタはPHPの子コンストラクタ内で実行されますか?

<?php 
class Model 
{ 
    var $db; 

    function Model() 
    { 
     $this->db=new Db_Class(); 
    } 
} 
?> 

と親クラスを拡張番目のクラス:

<?php 
class LessonModel extends Model 
{ 

    public function LessonModel() 
    { 
     //code here 
    } 

    public function getTitle($id) 
    { 
     $this->db->setTable('myTable'); 
     return $this->db->get('title',$id); 
    } 
} 
?> 

$LessonModel->dbフィールドは親Modelクラスのことでインスタンス化されていたであろうと仮定することは安全ですコンストラクタ、またはparent::Model();のようなものを使用して手動で実行する必要がありますか?

答えて

10

サブクラスでこれをオーバーライドしているため、親コンストラクタが呼び出されたと見なすことはできません。お勧めの通りparent::Model()に電話する必要があります。継承しているクラスを変更する場合は、明らかにこれを変更する必要があります。

PHP5を使用している場合は、コンストラクタの名前を__construct()にすることができます。親クラス名を指定せずに派生クラス内でparent::__construct()を実行すると、親コンストラクターを簡単に呼び出すことができます。クラスの継承を簡単に、不明瞭なバグを導入する危険性を少なくして並べ替えることができます。

0

この例では、それを仮定できます。

しかし、子クラスがコンストラクタを定義している場合、PHPは親コンストラクタを暗黙的に呼び出すことはありません。そうするために

、呼び出し:

parent::__construct(); 
+1

彼の子クラスは、古い命名規則を使用してコンストラクタを定義しています。Classname() –

+1

真剣にPHPのプログラムが多いほど、私はそれが嫌いです!なんてこったい!私は与えられた例とほぼ同じクラス構造を持っています。私はデータベース接続のコードを使用しています。私がここで見たことによると、私はクエリを実行するたびに新しい接続を初期化する必要があります。私は完全にJavaに変わると思っています! @Click Upvoteうん...:/ – tftd

0

親のコンストラクタを呼び出すために持っ周りを取得するための安価な方法があります。

ベースクラスに空のinit()メソッドを作成します。ベースクラスのコンストラクタで$ this-> init()を呼び出します。

すべてのサブクラスは、クラスの作成時にコードを実行する場合は、init()を実装できます。

関連する問題