静的ビルダを使用してモデルのインスタンスを戻すアクティブ・レコードの実装を考えてみます。ビルダ・メソッドから呼び出されるヒント・メソッドのタイプ
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のアイテムを取得するには:削除質問に無関係なすべてのコードを、実証するのModelBuilderとモデルクラスのバージョンを軽減ここで非常にある
$foo = FooModel::builder()->one();
この場合、インテリジェントIDE(私の場合はPhpStorm)は、どのタイプのオブジェクトが$foo
であるかわかりません。オブジェクトを作成するたびに変数/** @var $foo FooModel */
をタイプヒントすることができましたが、all()
とone()
メソッドでは、適切なタイプヒントを優先します。
all()
とone()
メソッドに追加する適切なタイプのヒントは何ですか?static
が機能しないことに注意してください。私は、ModelBuilderが呼び出された初期クラスの祖先でなく、builder()
メソッドで明示的に呼び出されていると考えています。
このプロジェクトではPHP 5.6を使用していますが、PHP 7固有の回答も歓迎します。
できません。その賞を追加することは、実行可能な唯一の選択肢です。もちろん、私はアクティブなレコードのアンチパターンからもstayong avayをお勧めしますが、それはOOPとSRPに関する私のばかげた考え方です。 –