首頁 後端開發 PHP8 了解PHP 8新特性Attributes註解

了解PHP 8新特性Attributes註解

Jul 27, 2020 pm 05:52 PM

了解PHP 8新特性Attributes註解

PHP8 的Alpha 版本,過幾天就要發布了,其中包含了不少的新特性,當然我自己認為最重要的還是JIT,這個我從2013 年開始參與,中間挫折無數,失敗無數後,終於要發布的東東。

不過,今天呢,我不打算談 JIT,等 PHP8 發布了以後,我再單獨寫個類似《深入理解 PHP8 之 JIT》系列來說吧。

嘿嘿,今天呢,我想談談Attributes,為啥呢, 是昨天我看到很多群在轉發一個文章,叫做《理解PHP8 中的Attributes》,說實在的,這篇文章應該是直接從英文翻譯過來的,寫的晦澀難懂,很多同學看完以後表示,看的一頭霧水,不知道在說啥。

於是我想,就用一篇文章來簡單說說這是個啥。

說註解之前,先說說以前的註釋,我們常常會在PHP 的項目中,看到的一個東西,類似如下的@param 和@see :

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

這個叫做註釋,對於以前的PHP 來說,註釋中的@param 和@see 毫無意義,整個這段會保存為一個函數/ 方法的一個叫做doc_comment 的字串。

如果我們要分析這段註解的意義,我們需要透過設計一些特定的語法,就例如栗子中的 @ name, 類似@param 一樣, 然後自己分析這段字串,來提取對應的資訊.

例如我們要取得 See 這個註解的訊息,我們需要做類似:

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

這樣的字串處理,相對比較麻煩,也比較容易出錯。

而Attributes 呢,其實就是把「註解」 升級為支援格式化內容的 「註解」

例如上面的例子:

<<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」 和」https://xxx」

#明白了麼, 就是你可以把一個註解“實例化”, 然後,你就可以基於這個能力,來做自己的“註釋即配置” 的設計。總結下Attributes 的寫法就是如下的形式:

<<Name>>
<<Name(Arguments)>>
<<Name(Argunment1, Arguments2, ArgumentN)>>
 
<<Name1(Argument), Name2(Argument), Name3(Argument)>>
登入後複製

然後你就可以透過PHP 的Reflection 系列的方法,根據getAttributes (“Name”) 取得對應的註解, 進一步你可以透過呼叫返回的註解的getName 方法取得名字,getArguments 方法取得括號中的Arguments。

再進一步,如果 Name 是一個你自己定義的,帶有 phpAttriubtes 註解的類, 你也可以呼叫 newInstance 方法,實作類似”new Name (Arguments)” 的呼叫。

也許很多人會問,這有什麼卵用?

坦白說,我一直對新功能無感,但這個 Attributes,多少還是應該有那麼一點點吧。

推薦文章:《PHP8.0

#

以上是了解PHP 8新特性Attributes註解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24