1

Model静的fetchAllメソッドを持つ抽象クラスを作成しようとしています。fetchAllサブクラスは、メソッドで使用される名前/場所を指定する必要があります。protected $_nameただし、静的メソッドと非静的メソッドの両方からアクセスできる方法でメソッドを指定する方法がわかりません。これは私がこれまでに持っているものです:

abstract class Model
{
    protected $_name;

    public static function fetchAll()
    {
        $request = new ApiRequest();
        return $request->get($this->_name);
    }

    public function save()
    {
        $request = new ApiRequest();
        return $request->put($this->_name, $this->_data);
    }
}

class Email extends Model
{
    protected $_name = 'zEmailz';
}
4

4 に答える 4

3

名前を引数としてメソッドに渡すことを検討しましたfetchAll()か?

class Email extends Model
{
    protected $_name = 'zEmailz';

    public function getResults()
    {  
        $rows = parent::fetchAll($this->$_name);
    }    
}

を static に設定することはお勧めしませModel::$_nameん。可能な反復によって値がオーバーライドされ、現在の値が必要なものと一致することを確認することが難しくなる可能性があるためです。これは、静的メンバーとインスタンス化されたメンバーが混在することによる多くの落とし穴の 1 つです。

- アップデート -

オブジェクトを呼び出しに渡すことができますfetchAll(たとえば、b/c のようなもので、DI と静的呼び出しを混在させたことはありません) 依存性注入ソリューション:

// Calling code
$email = new Email();

// Do stuff with $email

$results = Model::fetchAll($email);

次に、モデル クラスは次のようになります。

abstract class Model
{
    public static function fetchAll($object)
    {
        $request = new ApiRequest();
        return $request->get($object->_name);
    }
}

-- 更新 #2 --

コメントに基づいて、データベースから行を取得し、プライマリ オブジェクトをハイドレートして、OO API 呼び出しを介して現在の値を参照できるようにする方法を探しています。私だったら、車輪を再発明するのではなく、Doctrineを見てください。Doctrine では、モデル クラスに直接関連する「テーブル」クラスと呼ばれるものがあります。たとえば、EmailTable.phpファイルがあり、このクラスにカスタム メソッドを追加して、必要なデータセットを返すとします。

これを行う独自の方法に固執したい場合は、fetchAllメソッドを各子クラスに移動することをお勧めします。そうしないと、親クラスに保持すると、厄介なスイッチ/ケースブロックになってしまいます水和したいすべてのオブジェクト。

例 (デモンストレーションのみ):

class Email extends Model
{
    protected $_name = 'zEmailz';

    public static function fetchAll()
    {
        // However you pull rows from DB

        while ($row = get_current_row) {

            $email = new Email();

            $email->setAddress($row['address']);
            ...

            $emails[] = $email;
        }

        return $emails;
    }
}
于 2012-05-02T21:43:19.823 に答える
2

変数を静的として宣言するだけです。

protected static $_name;

遅延静的バインディングが必要かどうかに応じて、 selforキーワードを使用してアクセスします。static

return $request->get(static::$_name);
于 2012-05-02T21:40:49.760 に答える
1

静的メソッドから static _name 変数にアクセスする場合は、self::$_name を使用します

ただし、基本クラスの Realize に静的メソッドを使用することはお勧めできません。このメソッドは静的データのみを処理します (すべての子孫に共通)。したがって、子孫のすべての名前にアクセスしたい場合は、モデル名の静的配列を追加する必要があります。また、params、classname、または子孫オブジェクトへのリンクを保存することもできます。次に、すべての子孫にアクセスするか、名前またはクラス名で、または保存されたパラメーターから他の ID で 1 つを選択することができます。

于 2012-05-02T21:52:59.070 に答える
1

私は間違っているかもしれませんが、モデルが抽象クラスの場合、誰がそれらを使用しているかを知る責任はありません。彼らは、彼から継承するすべてのクラスが fetchall メソッドを持ち、このメソッドは実装を持つかどうかを指定するだけですが、彼は存在しなければなりません。

抽象モデル クラスから継承するエンティティがある場合は、署名 Entity::fetchall() を使用して呼び出す必要があります。

Entity::fetchall() は、parent::fetchall($name) などを内部的に呼び出すことができます。この方法により、誰が誰を使用するかの責任を分離できます。

于 2012-05-02T22:59:08.607 に答える