ホームページ  >  記事  >  バックエンド開発  >  PHP8 の新機能: 属性

PHP8 の新機能: 属性

Guanhui
Guanhui転載
2020-06-16 16:41:193590ブラウズ

PHP8 の新機能: 属性

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 "));

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

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

たとえば、上記の例:

<?php
<<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)>>

その後、PHP の Reflection シリーズのメソッドを使用して、getAttributes("Name") に基づいて対応するアノテーションを取得できます。さらに、返されたアノテーションの getName メソッドを呼び出して名前を取得し、getArguments メソッドで括弧内の引数を取得できます。

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

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

率直に言って、私はこれまで新機能には無関心でしたが、この属性にはまだ少しの価値があるはずです。


推奨チュートリアル: "

PHP

以上がPHP8 の新機能: 属性の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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