-1

私は5つの異なるモデルクラスを持っています。それぞれが異なるタイプのデータを処理しますが、それらはすべて同じ形式に従います。

それぞれの種類のモデルで、toJson、toArrayなどの関数を共有したいと思います。

これを行うにはたくさんのハック方法があり、それらを理解することはできますが、もっと良い方法が必要です。

これが私の望ましい効果です:

<?
something here{
    function toJson(){return json_encode($this->lastResult);}
}
class applications{
    function findAllFoo(){
        $this->lastResult = $this->db->foo->find();
        return $this;
    }
}

class users{
    function findAllBar(){
        $this->lastResult = $this->db->bar->find();
        return $this;
    }
}
$models = new models();

echo $models->applications->findAllFoo()->toJson();
echo $models->users->findAllBar()->toJson();

クラスのセット全体でモデルを渡すこともできますnew applications($this)が、これを行う方法は標準的な方法の中にあると確信しています。

TL; DR-いくつかのヘルパー関数を共有しているが、関数と競合しないクラスのセットを作成するにはどうすればよい__constructですか?

4

2 に答える 2

3

これは悪い考えです。親は子供のことを知ってはいけません。クラスは、それ自体で独立して動作する必要があります。子は親を拡張して使用することができます。これは、その関係が成文化され、x extends y宣言によって強制されるためです。ただし、親と子にはそのような関係はありません。実装時に子が存在するかどうかは不明であるため、クラスを見ただけでは機能するかどうかはわかりません。

自分のしていることを考え直してください。子供はすでに完全な親を拡張し、親は子供に依存しません。

于 2012-12-01T12:52:55.427 に答える
1

すべてのモデルがいくつかの機能を共有している場合は、それらの「モデル」基本クラスを用意してみませんか?

abstract class Model {
    protected $lastResult;
    protected $db;

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

    public function toJson() {
        return json_encode($this->lastResult);
    }
}

class Applications extends Model {
    public function findAllFoo() {
        $this->lastResult = $this->db->foo->find();
        return $this;
    }
}

class ModelBroker {
    public $applications;

    public function __construct() {
        $db = /* ... connection code here ... */;
        $this->applications = new Applications($db); // <-- dependency injection
    }
}

$models = new ModelBroker();
$json = $models->applications->findAllFoo()->toJson();
于 2012-12-01T13:20:04.877 に答える