2

これは私が思っていたようには機能しません。ここに私のクラスがあります:

class App {
    public $db;

    public function __construct($db) {
        $this->db = $db;
    }
}

class Analysis extends App {

    public $analysis_id;

    public function __construct($analysis_id) {
        $this->analysis_id = $analysis_id;
    }
}

class Standard extends Analysis {

    public function __construct($analysis_id) {
        parent::__construct($analysis_id);
    }
}

$dbApp クラスに渡したデータベース (mysqli) オブジェクトです。

新しい標準分析を実行しようとすると、次のように開始します。

$analysis = new Standard($analysis_id);

Analysis クラスには、分析に関するメタデータを取得するメソッドが含まれ、Standard クラスには、その特定のタイプの分析の計算を取得するメソッドが含まれます。$dbオブジェクトにアクセスできると思っていましたが、Analysis または Standard クラスからアクセスできません。$dbオブジェクトを開始するときに、オブジェクトを標準クラスに渡す必要がありますか?

4

2 に答える 2

7

クラスAnalysisは、その親でコンストラクターを呼び出す必要がありますApp。これはデフォルトでは発生しません。$dbはコンストラクターのパラメーターであるためApp、サブクラスからもこれを渡して parent::__construct($db)から、Analysisコンストラクターから呼び出す必要があります。

正しいコード:

class App {
    public $db;

    public function __construct($db) {
        $this->db = $db;
    }
}

class Analysis extends App {
    public $analysis_id;

    public function __construct($analysis_id, $db) {
        $this->analysis_id = $analysis_id;
        parent::__construct($db);
    }
}

class Standard extends Analysis {
    public function __construct($analysis_id, $db) {
        parent::__construct($analysis_id, $db);
    }
}

$analysis = new Standard($analysis_id, $db);
于 2012-11-01T20:35:24.430 に答える
3

オブジェクトは、他のオブジェクトから独立しています。どこかでオブジェクトをインスタンス化したからとAppいって、クラスが関連しているかどうかに関係なく、他のオブジェクトがそのオブジェクトのデータにアクセスできるわけではありません。の$dbインスタンスに渡す引数Appは、そのオブジェクトでのみ使用できます。

継承は、データではなくオブジェクト構造を継承します。

$app1 = new App($db);
$app2 = new App($db2); // <- different app instance, different data
$app3 = new App;       // <- does not have access to $db
$std  = new Standard;  // <- also does not have access to anything in $app1
于 2012-11-01T20:38:10.570 に答える