PHP 8の新しい特性について話します。


PHP 8のAlphaバージョンは数日後に発表されます。その中には多くの新しい特性が含まれています。もちろん、私自身が一番大切だと思っているのはJITです。これは2013年から参加しています。途中で挫折が多く、失敗が多くて、ついに発表されます。
でも、今日はJITについては話さないつもりです。PHP 8が発表されたら、単独で「PHP 8のJITを深く理解する」シリーズのようなものを書いてみます。
へへへ、今日はAttributesについて話したいですが、なぜですか?昨日たくさんのグループが一つの文章を転送しているのを見ました。「PHP 8の中のAttributesを理解します。」と言います。実は、この文章は直接英語から訳したはずです。書いたのは難しくて分かりにくいです。
そこで私は、文章を使って簡単にこれは何ですか?
注釈を言う前に、先に以前の注釈を話してください。私達はよくPHPのプロジェクトで見たものです。@paramと@seeのようなものです。

/**
 * @param Foo $argument
 * @see https:/xxxxxxxx/xxxx/xxx.html
 */
 function dummy($Foo) {}
これを注釈といいます。以前のPHPにとっては、コメントの@paramと@seeは意味がなく、この部分全体が一つの関数/方法として保存されています。doc_といいます。コメントの文字列。
この注釈の意味を分析するには、栗の中の@+nameなど、特定の文法を設計することによって、@paramのように、自分でこの文字列を分析して、対応する情報を抽出する必要があります。
例えば私たちはSeeという注釈の情報を得るためには、同じようなことが必要です。

$ref = new ReflectionFunction("dummy");
$doc = $ref->getDocComment();
$see = substr($doc, strpos($doc, "@see") + strlen("@see "));
このような文字列処理は、比較的面倒であり、間違えやすい。
Attributesとは、「コメント」をフォーマット対応にアップグレードした「コメント」です。
例えば上記の例:

<?php
<<Params("Foo", "argument")>>
<<See("https://xxxxxxxx/xxxx/xxx.html")>>
function dummy($argument) {}
このように書く意味は何ですか?機能的にはReflectionによってこのフォーマットの注釈を取得することができます。例えば、私達は今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」と「See」です。https://xxx」
分かりましたか?つまり、「実例化」という注釈を付けてもいいです。そして、この能力に基づいて、自分の「注釈すなわち配置」の設計をしてもいいです。
まとめてみます。Attributesの書き方は次のような形です。

<<Name>>
<<Name(Arguments)>>
<<Name(Argunment1, Arguments2, ArgumentN)>>
PHPのReflectionシリーズの方法で、getAttributes(「Name」)によって対応する注釈を取得することができます。さらに、返信された注釈を呼び出すgetName方法で名前を取得し、括弧の中のAgmentsをGETすることができます。
さらに、Nameが定義されている場合は、phpAttribtesの注釈が付いているクラスで、newInstanceメソッドを呼び出して、new Name(Argments)のような呼び方をすることもできます。
多くの人が聞きますが、これは何の卵がありますか?
正直に言うと、私はずっと新しい特性に興味がありませんが、このアタッチメントはどれぐらいありますか?
以上はPHP 8の新特性Attributesの詳細について話しました。PHP 8 Attributesに関する資料は他の関連記事に注目してください。