您是否考虑将名称作为参数传递给fetchAll()
方法?
class Email extends Model
{
protected $_name = 'zEmailz';
public function getResults()
{
$rows = parent::fetchAll($this->$_name);
}
}
我不建议将其设置Model::$_name
为静态,因为任何可能的迭代都可能覆盖该值并难以确保当前值与您想要的匹配。这是混合静态成员和实例化成员的众多陷阱之一。
- 更新 -
您可以将对象传递给fetchAll
调用,有点像(比如我从未将 DI 与静态调用混合在一起的 b/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
方法移动到每个子类中,否则如果您将其保留在父类中,您最终会得到一个讨厌的 switch/case 块所有你想要水合的物体。
示例(仅用于演示):
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;
}
}