名前を引数としてメソッドに渡すことを検討しました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;
}
}