(jp) =
属性は、2 年前に PHP 8.0 で最初に導入されました。 昨日、Exakat から興味深い投稿を見つけました。彼らは 535 のオープン ソース パッケージを分析して、どの属性が最も頻繁に使用されているかを調べました。
ただし、彼らは生データや絶対数を共有しておらず、どのパッケージがどのように分析されたかについても言及していません.
私たちはもっとうまくやれると思います。 それでは、PHP オープン ソース コミュニティで属性がどのように使用されているかを詳しく見てみましょう。
# 設定
私は Nikita の Popular Package Analyser を使用しました。Packagist から上位 1000 個のパッケージをダウンロードし、単純な PHP スクリプトを作成することでそれらのパッケージを分析できます。
この場合、すべての PHP ファイルをループし、属性が含まれているかどうかをスキャンしました。 ここで完全なスクリプトを確認できます。
いくつかのコメント:
- これは簡単で汚いスクリプトですが、仕事を終わらせるだけで十分です。
- JetBrains パッケージには IDE で使用するためのスタブしか含まれていないため、除外しました。JetBrains のパッケージだけでも、属性の使用量全体の ±65% を占めています。
- マッチングは単純な正規表現で行われます。バックスラッシュの有無にかかわらず名前、複数行および単一行の属性など、すべてのエッジ ケースを考慮したと思います。 何か不足していると思われる場合は、遠慮なくお知らせください。
- 生データはこちらから閲覧できます。
- このデータ セットの限界を認識する必要があります。クライアント プロジェクトは、再利用可能なパッケージと比較して、おそらくより多くの属性を使用します。 たとえば、Symfony のルート属性について考えてみてください。実際のプロジェクトではかなり多く使用されていると仮定するのが合理的ですが、この分析ではそれらは非常に小さな割合しか表していません。
# 最もポピュラーな属性
最初に際立った指標は、 #[\ReturnTypeWillChange]
他のすべてをはるかに上回っています: うち 合計 2786 属性、1668 はいずれか #[\ReturnTypeWillChange]
また #[ReturnTypeWillChange]
、それは ほぼ60% ReturnTypeWillChange
属性.
この属性は、PHP 8.1 で導入された PHP の最初の組み込み属性であり、新しく追加された廃止通知に対処するためのものです。 ユーザーランド コードが情報を PHP のインタープリターに伝達する必要がある場合に、これらの属性を使用することが、元の属性 RFC の設計目標でした。 この場合: 非推奨通知を抑制するため。
2つのバリアント(先頭の有無にかかわらず)について言えば \
): 属性をインポートする開発者もいれば、完全修飾クラス名を使用する開発者もいます: 後者のオプションが圧倒的に優先されます: out of 1668年 ReturnTypeWillChange
用途、 それだけ 524 輸入 属性 — それだけです 31%. ほとんどの開発者は、FQCN バリアントを使用することを好むようです。
# 最もアクティブなパッケージ
997個のパッケージのうち、 200 個のパッケージのみが属性を使用しています. この 200 のうち、Symfony、Drupal、および Laravel がパイの大部分を占めています。 Symfony はここでのリーダーです 9.6%: Symfony が何年にもわたって docblock アノテーションを使用してきたという事実が原因である可能性は低いです。
# カスタム属性
もう1つの興味深い点は、の使用です #[Attribute]
と #[\Attribute]
: パッケージ自体によって提供されるカスタム属性を表します。 合計で 561 個のカスタム属性 これらのパッケージによって提供されます。
パッケージごとに見る: symfony は 88 個のカスタム属性を提供します、PHPUnit は 49 を提供し、doctrine の mongodb 実装は 42 を提供します。ここでも、Symfony が何年にもわたって docblock アノテーションに使用されてきたおかげで、アーリー アダプターであることが明確に示されています。 興味深いことに、 Laravel はカスタム属性を提供しません.
# 複数行属性
複数行の属性を使用するベンダーが存在しないことは注目に値します。
It makes sense that vendors opt for the single-line notation, since it's compatible with older PHP versions because these lines are treated like comments before PHP 8.0:
# 結論
- それだけ 20% 最も人気のある上位 1000 個のパッケージのうち、属性を使用している
- それだけ 23% トップ 1000 の最も人気のあるパッケージのうち、最低限必要なバージョンとして PHP 8.0 以降が含まれています
- の
ReturnTypeWillChange
属性は最もよく使われる属性です - symfony は明らかに最有力候補です、過去のdocblock注釈の経験のおかげで属性を受け入れる
-
Laravel はカスタム属性を提供しません ユーザーのために、彼らは内部的にいくつかを使用しますが、主に
AsCommand
Symfony が提供する属性
個人的には、改善の余地があると思います。 Laravel はカスタム属性を採用し始めるべきだと思います。特に、最小バージョンとして PHP 8.0 が必要になっているためです。
あなたの意見は何ですか? 経由でお知らせください ツイッター またはメールで!