私はsymfony2での作業を始めたばかりで、コメント注釈に出くわしました。
コメント注釈はPHPの固有の部分ではありませんが、symfony2はこの機能のサポートを追加します。
コメントについての私の理解は、それによってコードが人間にとってよりわかりやすくなるということです。コンピュータはコメントの内容を気にする必要はありません。
通常のPHPコードにコマンドを入力するだけの場合と比べて、このタイプの注釈を実行することにはどのような利点がありますか?
すなわち
/**
* @Route("/{id}")
* @Method("GET")
* @ParamConverter("post", class="SensioBlogBundle:Post")
* @Template("SensioBlogBundle:Annot:post.html.twig", vars={"post"})
* @Cache(smaxage="15")
*/
public function showAction(Post $post)
{
}
コメント注釈(特にsymfony2のフォーマット)ですぐに頭に浮かぶいくつかの問題があります:
/**/
コメントはコンパイルされたCSSに送信されますが、CSS以外のコメント//
はコンパイラによって処理されます。さらに、最初の2文字を見れば、2つをかなり簡単に区別できます。そうは言っても、このようなことをすることにはその利点がないわけではありません。
言語でネイティブに利用できない機能を追加します。何よりもまず、これがSymfonyによってこのように行われる理由です。 PHPにはデコレータ/アノテーションがないため、その機能が必要な場合は、実装する方法を見つける必要があります。さらに、ユーザーがPHP拡張機能に依存しないようにしたい場合(ユーザーが環境のそのレベルを常に制御できるわけではないため)、内部でそれを行う方法を見つける必要があります。 PHPコンパイラを壊しません。コメントは当然の選択です。
特定のセグメントにさまざまな機能を追加するためのクリーンな方法を提供します。アノテーション/デコレータを最もよく見たのはPythonですが、おそらくそれを見るでしょう。あなたがそれらを使うなら、他の多くの言語で。たとえば、CherryPyはそれを使用して関数をWebページコントローラーとして公開します(つまり、PHPコントローラーの特定のパブリック関数にアクセスするのと同じ方法で、ブラウザーから特定のデコレーターを持つ関数にアクセスできます)。それらは基本的に、関数またはクラスに「拡張」機能を提供し、関数内のコードを乱雑にすることなくユーティリティ機能を提供します。
残念ながら、私はSymfonyの形式で他の人を指摘するのに十分なほどSymfonyを知りませんが、これの賛否両論については、この Hacker Newsスレッド に興味があるかもしれません。また、ネイティブアノテーションの PHPサイトでの変更のリクエスト にも関心があります。
これは確かにPHPコードに変換されてからキャッシュされるため、コストは事実上無視できます。コードを頻繁に変更しない限り、コードはPHP code(理論的には、手動で作成するコードよりも高速なコードでさえあります)
行う理由は、これがシステムにこの情報を提供するすてきでコンパクトな方法であるということです。これらの5行にPHP数行追加)が必要であり、それが関係していること。
欠点として、各抽象化はコストをもたらし、新しいバグのソースを追加します(パーサーにバグがあるか、バグのあるコードが生成された場合はどうなりますか?)
私にはそれは非常に悪い習慣のようです。上記の例のshowAction__META()のように、メタ関数がこの種のメタデータを関数に返すことで同じ結果を得ることができますが、欠点はすべて避け、それらは多数あります。ソースコードを実行するためだけにソースコードを読み取る必要性。これにより、コンパイラ/ランタイムの最適化が頭に浮かびます。また、直接テストすることもできず、構文チェックを行うときに特別な注意が必要です。これは、PHPを直接使用する代わりに、さまざまなテンプレート言語が採用しているのと同じ愚かなre-invent-the-wheelアプローチです。