(jp) =
<!–
–>

私は先週、ジェネリックについてこのビデオを作成しました。あなたはそれを見ることができます (気に入った場合は、「いいね!」と「チャンネル登録」を忘れずに)。 また、トピックに関する意見を共有するようにしてください。 ツイッター またはメールで!
ジェネリック。 私たちは皆、それらを望んでいますが、おそらくすぐに PHP に組み込まれることはないでしょう。 しかし、docblock を使用したジェネリックは適切にサポートされています。 どちらも PHPStan や Psalm などの静的アナライザーによるものですが、これは大きなものですが、PhpStorm によるものでもあります。
わずか数か月前に、PhpStorm は docblock を使用したジェネリックの基本的なサポートを追加しました。 実際、非常に多くのケースで機能します。PhpStorm は、コーディング中にリアルタイムで、どのようなジェネリック型を扱っているかを教えてくれます。 場合によっては、ジェネリック型を推論するほどスマートです。
私が今何について話しているのかわからない場合は、私のブログを読むことをお勧めします — 説明に役立つリンクをいくつか追加しました。 しかし、私も例を挙げたいと思います。
ここには、一種の「属性クエリ」クラスがあります。これは、属性をフィルターしてインスタンス化できるクラスです。
$routeAttributes = Attributes::new(MyController::class)
->instanceOf(Route::class)
->first();
PHP の組み込みリフレクション クラスを直接使用する場合と比較して、わずかにクリーンな API を提供します。
ここでこのクエリを実行した後、ここに Route 属性のインスタンスがあることを IDE にリアルタイムで認識させたいと思います。 そして、これはまさに PhpStorm が検出できる複雑な例であり、時間を大幅に節約できます。
クエリ自体、または少なくともその興味深い部分をお見せしましょう。
class Attributes
public function first(): mixed
ここに、ジェネリックを持つ属性クラスがあります AttributeTypeであり、それがこの例の最初のメソッドによって返される型です。 ここでの問題: そのジェネリック型を実際にどのように設定するのでしょうか? ジェネリック型の推論について知っていれば、実際にはかなり簡単です。
class Attributes
public function instanceOf(string $className): self
ここに私たちの instanceOf メソッドであり、別のジェネリック型を定義していることがわかります。 InstanceOfType. さて、PhpStorm とその他の静的アナライザー。 この関数に渡された入力の型を検出 (または推測) するのに十分なほど賢く、それがフィルター処理したい属性の名前であり、それを返すときに、その型を属性クラスのジェネリック型として使用します。 この種のジェネリック型推論は非常に強力なツールです。
取得する前にこの例を数回読む必要があるかもしれませんが、本質的には、エンド ユーザーがこのパッケージを使用している間、まだ多くの情報を利用できる、この属性クエリ クラスのようなクラスを作成することができます。
実は、これは私が今日話したかったことではありません。 それはすべてとてもクールで、私はとても興奮しています。 でも、私のことを知っている人なら、私が細かいことを考えるのが好きだということを知っているでしょう。 PHP のジェネリクスがよりアクセスしやすくなった今、私たちが話し合う必要がある詳細の 1 つです。 名前の付け方です。
使った AttributeType と InstanceOfType ジェネリック型のプレースホルダーとしてですが、それはほとんどのプログラミング言語の慣習ではありません。
私はそれらの多くを調べましたが、最も一般的な規則 (これは Java のおかげだと思います) は、ジェネリック型に 1 文字を使用することです。 つまり、T、または E、V、K、または U — これらは一般的な選択肢の一部です。 Java、Kotlin、Rust、Go、C#、Swift など、多くの言語がこの規則に従っています。
そして、あなたのことは知りませんが、これにより私のコードが非常に読みにくくなっていることがわかりました。 これらの単一文字を使用する理由は、これらがジェネリック型であり、実際の型ではないことを名前で明確にするためです。 しかし、私のスクリーンショットでわかるように、ジェネリック型に別の色を使用してそれらを区別することができます。
PhpStorm はまだサポートしていませんが、このビデオを見た後に変更されることを願っています。
特に Psalm と PHPStan のドキュメントでは、一般的な名前の前に大文字の T を付けるという慣例を目にしました。 TAttribute また AttributeType; TInstanceOf また InstanceOfType? 2番目は、人間の言葉で言うのと同じように聞こえますよね?
ええ、これらは私が考えている種類の詳細です。なぜなら、それらは私のコードの可読性や、私が作業する必要がある他のコードの可読性に本当に影響を与えると感じているからです.
それで、私が知りたいのは、あなたの意見はどうですか?
私が作った Twitterでの投票、非常に多くの人 (50% 以上) が 1 文字のアプローチを好んだことに驚きました。 これは、コードの可読性にとってひどいものです。特に、同じコンテキスト内で複数のジェネリック型を操作している場合はなおさらです。
ともかく; 私はおそらく、自分にとって最も快適で、最も読みやすいと思うものに固執するでしょう。 ただし、これを見ている場所ならどこでも、コメント、reddit、Twitter で意見を共有してください。 誰かが私の心を変えることができるかもしれません。 または多分私はあなたのものを変えましたか?
//platform.twitter.com/widgets.js