考慮使用靜態構建器返回模型實例的Active Record實現。這裏是一個非常減少版本的模型構建器和模型類證明的,所有的代碼無關的問題刪除:從構建器方法調用的類型提示方法
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 {
}
爲了讓我們稱之爲FooModel類這樣一個Foo項目:
$foo = FooModel::builder()->one();
在這種情況下,智能IDE(在我的情況下PhpStorm)不知道什麼類型的對象$foo
是。每次創建對象時,我都可以鍵入提示變量/** @var $foo FooModel */
,但我更喜歡all()
和one()
方法中的正確類型提示。
什麼是適當的類型提示添加到all()
和one()
方法?請注意,static
不起作用,我相信因爲ModelBuilder不是初始調用類的祖先,並且它在builder()
方法中被明確調用。
這個特定的項目使用PHP 5.6,但也歡迎PHP 7特定的答案。
你不能。增加這一推薦是唯一可行的選擇。當然,我也會建議從活躍記錄的反模式中保持樂觀,但這只是我關於OOP和SRP的愚蠢概念。 –