【发布时间】:2017-10-23 02:50:05
【问题描述】:
考虑一个使用静态构建器返回模型实例的 Active Record 实现。这是要演示的 ModelBuilder 和 Model 类的非常简化版本,所有与问题无关的代码都已删除:
class ModelBuilder {
public function __construct($class) {
$this->class = $class
}
private function _execute() {
$result = $pdo->query("SELECT * FROM {$this->class}");
return $result->fetchAll(PDO::FETCH_CLASS, $this->class);
}
public function all() {
return $this->_execute();
}
public function one() {
return $this->_execute()[0];
}
}
class Model {
public static function builder() {
return new ModelBuilder(get_called_class());
}
}
class FooModel extends Model {
}
为了得到一个 Foo 项目,我们这样调用 FooModel 类:
$foo = FooModel::builder()->one();
在这种情况下,智能 IDE(在我的情况下为 PhpStorm)不知道 $foo 是什么类型的对象。我可以在每次创建对象时对变量 /** @var $foo FooModel */ 进行类型提示,但我更喜欢在 all() 和 one() 方法上进行适当的类型提示。
添加到all() 和one() 方法的正确类型提示是什么? 请注意,static 不起作用,我相信因为 ModelBuilder 不是初始调用的祖先类,它在builder() 方法中被显式调用。
这个特定项目使用的是 PHP 5.6,但也欢迎使用 PHP 7 特定的答案。
【问题讨论】:
-
你不能。添加该表扬是唯一可行的选择。当然,我也建议不要使用活动记录反模式,但这只是我对 OOP 和 SRP 的愚蠢想法。
-
@tereško:我很高兴听到你反对 ActiveRecord 模式的论点,因为我经常使用它。我想学习更好的方法。
-
使用更好的持久化模式称为“data mapper”,但也有“表数据网关”之类的东西(有些人习惯将其描述为“存储库”,尽管这并不是说)。避免 AR 的主要原因是性能。
标签: php oop phpstorm type-hinting