PHP8 新特性之 Attributes - php中文網

2020-12-13 php中文網

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呢,其實就是把「注釋」升級為支持格式化內容的「註解」

比如上面的例子:

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

大家不要糾結這麼寫的意義是啥,從功能上來說,現在你就可以通過Reflection來獲取這段格式化的註解了,比如, 我們現在要獲取See這個註解:

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"}

當然,還有稍微高級一點的用法,就是你可以定義一個所謂的「註解類」:

<<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->getAttributes("MyAttribute")[0]->newInstance();

如果你跑這段代碼,你會看到MyAttribute的__construct方法被調用了, 調用傳遞的參數就是」See」和」https://xxx」

明白了麼, 就是你可以把一個註解「實例化」, 然後,你就可以基於這個能力,來做自己的「注釋即配置」的設計。

總結下Attributes的寫法就是如下的形式:

<<Name>><<Name(Arguments)>><<Name(Argunment1, Arguments2, ArgumentN)>>

然後你就可以通過PHP的Reflection系列的方法,根據getAttributes("Name")獲取對應的註解, 進一步你可以通過調用返回的註解的getName方法獲取名字,getArguments方法獲取括號中的Arguments。

再進一步,如果Name是一個你自己定義的, 帶有phpAttriubtes註解的類, 你還可以調用newInstance方法,實現類似"new Name(Arguments)"的調用。

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

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

相關焦點

  • PHP如何刪除數組中的重複元素 - php中文網
    php$result1 = array("a" => "green", "red", "b" => "green", "blue", "red");var_dump($result1);$result2 = array_unique($result1);var_dump($result2
  • 原來PHP 8 都正式發布了
    php8的下載地址:https://www.php.net/downloads.phpPHP 8.0.0 目前是最新的主要版本,它引入了一些重大變更,以及許多新特性和性能優化,PHP 8.0 值得關注的改進包括以下:1、PHP 8.0 引入了備受期待的
  • 為什麼程式設計師都黑php? PHP中文網有話說!
    其實PHP中文網小編想說的是,哪種語言都有優缺點,最重要的還是編程的人!沒有最好的語言,只有最好的程式設計師,詳看:為什麼創立php中文網之一個程式設計師的成長故事!以下是摘取的一些專業人士對PHP語言的看法:1.
  • PHP8 新特性
    PHP 8.0 是 PHP 語言的主要更新。它包含了許多新特性和優化,包括命名參數、聯合類型、屬性、構造函數屬性提升、匹配表達式、nullsafe 操作符、JIT,以及對類型系統、錯誤處理和一致性的改進。
  • PHP 7.1 新特性一覽
    PHP 7.1 release版本發布在即,本文整理一下 7.1 中的一些新特性以供了解。所有內容均選自官方 RFC 文檔。
  • PHP7.0 的新特性
    PHP7.0 的新特性經常會被面試官問到,在平時的項目開發中運用它們也會提升一定的代碼質量和代碼運行性能,可見這個知識點的重要性。不過有很多人都沒有去系統的了解掌握,今天我剛好系統整理了一番分享出來。php declare(strict_types=1)//1:嚴格模式 0:強制模式(默認)classOrderServiceextendsBaseService{...
  • PHP 8.0正式發布:支持JIT編譯器,性能提升高達3倍
    PHP 8.0是PHP語言的最新主要版本,帶來了許多新特性和優化,包括命名參數(named arguments)、聯合類型(union types)、屬性(attributes)、構造器屬性提升(constructor property promotion)、Match表達式、nullsafe運算符、JIT,以及針對類型系統、錯誤處理和一致性的諸多改進。
  • php語言入門教程(PHP編程學習路線圖)
    php語言入門應該從哪裡開始學起呢?是先學html還是php?還是直接學習PHP框架?
  • PHP接口特性的實例講解
    PHP接口特性的實例講解 如果你對於PHP接口特性還有些模糊,那麼我們可以通過對學習JAVA接口的知識,來說明PHP接口的一些相關知識。最近在看PHP的OOP特性,發現和JAVA很像,就是語法上有不同,但是有關資料少的可憐,找到了幾個也不能充分說明PHP接口特性,自己又看了一遍孫鑫老師的JAVA視頻教程,有關接口的部分,昨天總算是理解了。真的感覺是豁然開朗。把自己寫的PHP接口部分的示例程序發上來,讓大家對PHP接口特性有一個清晰的認識。
  • 有安全研究者混入了 PHP 8.0 開發組!
    來源 | 代碼審計(ID:white-hat-note)經歷了近半年的alpha版本測試後,PHP在2020年11月26號正式發布了8.0版本:https://www.php.net/releases/8.0/en.php今天我們就來瀏覽一下PHP 8.0中出現的主要特性,以及它給我們安全研究人員帶來的挑戰。
  • 實戰jQuery和PHP CodeIgniter表單驗證
    php echo base_url();?php echo base_url();?php echo base_url();?php echo base_url();?php $attributes = array('id' => 'form');           echo form_open('form/process', $attributes); ?
  • 從PHP 5到PHP 7性能全評測(含未發布的JIT版PHP 8對比)
    導讀:PHP 是 Web 開發最常用的語言,每個大版本的更新都帶來不少新特性和性能提升。
  • PHP 5 到 PHP 7 性能評測(含 JIT 版 PHP 8 對比)
    導讀:PHP 是 Web 開發最常用的語言,每個大版本的更新都帶來不少新特性和性能提升。
  • php怎麼了,又要涼涼了嗎
    根據我們第一條的分析,按照這家大公司的數據量,用php確實是有些捉襟見肘了,隨著業務的遞增,換php為java似乎也情有可原,至於裁員的部分,咱就不在這兒討論了。但是從這件事我們也能看到,在創業之初 ,是什麼語言支撐起這上億級的數據量!是什麼語言支撐起快速發展的業務!是什麼語言讓馬蜂窩的迭代速度跟上市場發展!是什麼語言!
  • php面試題之—PHP核心技術(高級部分)
    注意,在php5.3以上版本,safe_mode被棄用,在php5.4以上版本,則將此特性完全去除了。4.抓取遠程圖片到本地,你會用什麼函數?(51.com筆試題)file_get_contents或者curl5.PHP的垃圾收集機制是怎樣的(騰訊)PHP可以自動進行內存管理,清除不再需要的對象。
  • PHP列印輸出函數匯總
    本文給大家匯總介紹了7種php常用的列印輸出函數,分別是echo,print,printf,sprintf,print_r
  • PHP 8 Beta 2 發布,修復一個內存洩漏 bug
    PHP 8 Beta 2 已經發布,自從進入 Beta 階段,PHP 8 已進入特性凍結期,不會有特性上的變更。
  • PHP基礎入門
    php$f = 88.8;$type=gettype($f);$s = '男人習慣了不說 忍不住了就抽根煙吧';$type = var_dump($s);?php//$x二進位為:$x=5;//$y二進位為:$y=8;//結果為13echo $x ^ $y;?>三元運算符合其它運算符符號信息說明$x?真代碼段:假代碼段判斷是否為真假?
  • PHP substr()函數的用法詳解
    phpfunction Substring($str){$len = strlen($str); echo substr($str, 6), "<br>"; echo substr($str, 3, $len), "<br>";
  • 利用PHP的字符串解析特性Bypass
    "; flow:established,to_server; content:"/view.php?i="; http_uri; fast_pattern:only; pcre:"//view.php?