3

前回 (2008 年) チェックしたとき、php の注釈はそれほど広くはありませんでした。いくつかの資料を読み、「グーグル」を行った後でも、まだ少し混乱しています。誰かがphpで注釈を使用する方法を示す最小限の実用的な例を提供できますか
:このようなものを機能させたいとだけ言ってみましょう:

class ClassName
{
  /**
  * @DefaultValue("test")
  */
  public $prop;
}

// so that i can do 

$kls = new ClassName();
$kls->prop // => test

私は長い間phpをやっていなかった

更新
この質問の目的は、symfonyflow3doctrineなどのライブラリ/フレームワークがアノテーションを実装する方法を理解することです。

4

5 に答える 5

4

アノテーションは (まだ) PHP でサポートされていません。提案された実装の RFCがありますが、それが実現するかどうか、いつ実現するかはまだ不明です。

あなたが与えた特定の例は、IDEによってオートコンプリートの値として解釈される可能性があり、それ以外public $prop = 'Test';の場合は .

于 2012-12-10T15:11:19.347 に答える
2

PHP Manual -> Function Reference Variable and Type Related Extensions -> Reflectionには、いくつかのリフレクション クラス (ReflectionClass、ReflectionMethod、ReflectionFunction、ReflectionFunctionAbstract、ReflectionProperty...) にメソッド getDocComment() が存在し、ドキュメント コメント ブロックを取得できます。次に、コメントを好きなように処理します。例:

class Foo {
   private $a;
   private $b;
   ...
   /**
    * @annotation('baz')
    */
   public function bar() {
      ...
   }
}

$reflMethod = new ReflectionMethod('Foo', 'bar');

//prints 
//string(26) "/**
// * @annotation('baz')
// */"
var_dump($reflMethod->getDocComment());
于 2014-02-18T03:32:59.477 に答える
2

PHP はアノテーションをサポートすべきではありません。現時点では、アノテーションは PHP 開発者の間で災難です。それらは多くの問題を引き起こします:

  1. それらはバージョン管理を壊します。異なるプロジェクトでオブジェクトの 2 つの異なる構成のインスタンスが必要な場合、ロジックではなく構成が変更されていても、それらは異なるブランチになります。

  2. 移植性が低下します。注釈を使用する 2 つのプロジェクト間でクラスを移動すると、注釈によって 2 番目のプロジェクトが壊れることがあります。

  3. それらはカプセル化を破ります。アプリケーション コードは、外部でどのように使用されるかを気にする必要はありません。注釈は、クライアント コードに決定させるのではなく、何をすべきかをクライアント コードに伝えます。@DefaultValue の例で、アノテーションに注意を払っていない場所でクラスを使用するとどうなりますか? デフォルト値が設定されていない場合でも、クラスは機能しますか? はい?いいえ?多分?答えが何であれ、それは API では明確ではなく、一度構築されたオブジェクトがその責任を果たす準備ができているかどうかを知る方法はありません。

  4. それらは柔軟性を制限します。例として Symfony の @Inject を使用すると、注入されたパラメーターが異なるクラスの 2 つのインスタンスを作成することは不可能です。

Annotations are an abominationおよびPHP Annotations Are a Horrible Ideaを参照して、アノテーションを避けるべき理由の詳細な説明を確認してください。

于 2013-03-18T13:53:24.210 に答える
0

PHPは(まだ)アノテーションをサポートしていません。

PHPでコードフローに影響を与えるアノテーションを使用した唯一の場所はphpUnitです。これは、テストスクリプトのさまざまな側面を処理するための多数のアノテーションマーカー(@DataProviderおよび)をサポートします。@ExpectedException

これはかなりうまく機能しますが、PHPによってネイティブに処理されません。phpUnitは、スクリプトを含めてコードを通常どおり実行する前に、スクリプト自体を解析する必要があります。単体テストスクリプトには十分ですが、本番システムには理想的なソリューションではありません。

したがって、本当の答えは、PHPがアノテーションをネイティブに実装するまで待たなければならないということだと思います。提案はあると思いますが、すぐには実現しないでしょう。来年リリースされる5.5では絶対に実現しないでしょう。5.6以降の機能については決まった計画はないと思いますが、少なくとも2014年まで延長する場合は、ホスティングプロバイダーまたはサーバー管理者がすぐにアップグレードする用意があると仮定しても。

于 2012-12-10T15:44:56.760 に答える
0

はい、PHP はまだアノテーションをサポートしていませんが、代わりに Doctrine Annotations を使用できます。見てください - https://www.doctrine-project.org/projects/annotations.html

于 2021-08-15T10:36:51.327 に答える