2012-05-02 12 views
1

static fetchAllメソッドを持つ抽象的なModelクラスを作成しようとしています。サブクラスは、fetchAllメソッドで使用される名前/場所を指定する必要があります。しかし、私はprotected $_nameメソッドを静的メソッドと非静的メソッドの両方からアクセス可能な方法で指定する方法を理解できません。PHP:静的メソッドからクラスメンバー変数を取得するには?

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'; 
} 

答えて

2

が同じように静的変数宣言::これは私がこれまで持っているものである

protected static $_name; 

そして、それはあなたが望むかどうかに応じて、selfまたはstaticキーワードを使用してアクセスを遅延静的バインディングかどうか:

return $request->get(static::$_name); 
+0

彼は間違いなく遅い静的結合を望む質問に基づいています。 –

3

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

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

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

すべての可能な反復が値を上書きし、それが困難な現在の値が何をしたいと一致することを確認することがあり、私は、静的にModel::$_nameを設定することをお勧めしません。これは、静的でインスタンス化されたメンバーを混在させる多くの落とし穴の1つです。

- 更新 -

あなたはソートの、fetchAll呼び出しにオブジェクトを渡すことができます(と言う一種のB/I決して共同混在静的呼び出しでDI c)の依存性注入液:

// 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; 
    } 
} 
+0

サブクラスから 'fetchAll'を呼び出す必要はありません。 – Andrew

+0

代替ソリューションで更新されました。 –

+0

私は最初のオプションがより正しいと思います。 –

1

あなたは、静的メソッドから静的_name変数にアクセスしたい場合は、自己を使用する:: $ _名

しかし、それはへの静的メソッドを使用することをお勧めできません基底クラス このメソッドは静的なデータ(すべての子孫に共通)だけを処理することに気付く。 したがって、子孫のすべての名前にアクセスするには、モデル名の静的配列を追加する必要があります。また、params、classname、または子孫オブジェクトへのリンクを格納することもできます。その後、すべての子孫にアクセスするか、名前またはクラス名で、または格納されたパラメータから別のIDで選択します。

1

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

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

Entity :: fetchall()は内部的にparent :: fetchall($ name)または同様のものを内部的に呼び出すことができます。このようにして、whoを誰が使用するかの責任を分けることができます。

関連する問題