ホームページ  >  記事  >  バックエンド開発  >  PHP 8 の新機能、属性アノテーションを理解する

PHP 8 の新機能、属性アノテーションを理解する

青灯夜游
青灯夜游転載
2020-07-27 17:52:264908ブラウズ

PHP 8 の新機能、属性アノテーションを理解する

PHP8 のアルファ版は数日以内にリリースされます。これには多くの新機能が含まれています。もちろん、最も重要なものは私が 2013 年に始めた JIT だと思います。数々の挫折や失敗を経験しながら、ようやく何かをリリースしたいと思っています。

ただし、今日は JIT について話すつもりはありません。PHP8 がリリースされたら、「PHP8 の JIT を徹底理解する」のような別のシリーズを書きます。

Hey, today, I want to talk about Attributes. Why? 昨日、多くのグループが「Understanding Attributes in PHP8」という記事を転送しているのを目にしました。正直に言うと、この記事は英語から直接翻訳されたものです。文章を理解するのが難しく、読んだ後、多くの生徒が混乱して何のことを言っているのか分からないと言いました。

そこで、記事を使ってこれが何なのかについて簡単に説明しようと思いました。

アノテーションについて話す前に、前のコメントについて話しましょう。PHP プロジェクトでは、次の @param と @see のようなものがよく見られます:

/**
 * @param Foo $argument
 * @see https:/xxxxxxxx/xxxx/xxx.html
 */    
 function dummy($Foo) {}

これは、以前の PHP ではコメントと呼ばれます。コメント内の @param と @see は無意味で、段落全体が関数/メソッドの doc_comment という文字列として保存されます。

このコメントの意味を分析したい場合は、@param と同様に、Lili の @ name などの特定の構文を設計し、この文字列を独自に分析して対応する情報を抽出する必要があります。

たとえば、See コメントの情報を取得したい場合、

$ref = new ReflectionFunction("dummy");
$doc = $ref->getDocComment();
$see = substr($doc, strpos($doc, "@see") + strlen("@see "));

のような文字列処理を行う必要がありますが、これは比較的面倒でエラーが発生しやすくなります。

属性に関しては、実際には「注釈」を サポート形式のコンテンツ 「注釈」にアップグレードします。

たとえば、上記の例:

<<Params("Foo", "argument")>>
<<See("https://xxxxxxxx/xxxx/xxx.html")>>
function dummy($argument) {}

Donこのように書く意味については心配する必要はありません。機能の観点から見ると、リフレクションを通じてこの書式設定されたアノテーションを取得できるようになりました。たとえば、See アノテーションを取得したいとします:

$ref = new ReflectionFunction("dummy");
 
var_dump($ref->getAttributes("See")[0]->getName());
var_dump($ref->getAttributes("See")[0]->getArguments());

が出力されます:

string(3) "See"
array(1) {
  [0]=>
  string(30) "https://xxxxxxxx/xxxx/xxx.html"
}

もちろん、もう少し高度な使用方法もあります。つまり、いわゆる「アノテーション クラス」を定義できます。:

<?php
<<phpAttribute>>
class MyAttribute {
     public function __construct($name, $value) {
          var_dump($name);
          var_dumP($value);
     }
}

次に、次のように書くことができます。その中の newInstance 呼び出しに注意してください:

<<MyAttribute("See", "https://xxxxxxxx/xxxx/xxx.html")>>
function dummy($argument) {
}
$ref = new ReflectionFunction("dummy");
 
$ref->getAttributes("MyAttribute")[0]->newInstance();

このコードを実行すると、MyAttribute の __construct メソッドが呼び出され、呼び出しで渡されるパラメーターが「See」と「https://」であることがわかります。 xxx"#​​

## わかりましたか? 注釈を「インスタンス化」すると、この機能に基づいて独自の「構成としての注釈」設計を作成できます。

<<Name>>
<<Name(Arguments)>>
<<Name(Argunment1, Arguments2, ArgumentN)>>
 
<<Name1(Argument), Name2(Argument), Name3(Argument)>>
そして、PHP の Reflection シリーズメソッドを通じて getAttributes ("Name") に従って対応するアノテーションを取得し、さらに返されたアノテーションを呼び出すことができます。 getName メソッドは名前を取得し、getArguments メソッドは括弧内の引数を取得します。

さらに、Name が phpAttriubtes アノテーションを使用して自分で定義したクラスである場合、newInstance メソッドを呼び出して、「新しい名前 (引数)」と同様の呼び出しを実装することもできます。

おそらく多くの人は、これが何の役に立つのかと疑問に思うでしょう。

正直に言うと、私はこれまで新しい機能には無関心でしたが、この属性にはまだ少しはあるはずです。

おすすめ記事:「

PHP8.0

以上がPHP 8 の新機能、属性アノテーションを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlaruencで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。