聊聊 PHP 8 新特性 Attributes


Posted in PHP onAugust 19, 2020

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这个注解:

$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)>>

然后你就可以通过PHP的Reflection系列的方法,根据getAttributes(“Name”)获取对应的注解, 进一步你可以通过调用返回的注解的getName方法获取名字,getArguments方法获取括号中的Arguments。

再进一步,如果Name是一个你自己定义的, 带有phpAttriubtes注解的类, 你还可以调用newInstance方法,实现类似”new Name(Arguments)”的调用。

也许很多人会问,这有什么卵用?

坦白说,我一直对新特性无感,但这个Attributes,多少还是应该有那么一点点吧 ????

以上就是聊聊 PHP 8 新特性 Attributes的详细内容,更多关于PHP 8 Attributes的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
PHP新手上路(四)
Oct 09 PHP
默默小谈PHP&amp;MYSQL分页原理及实现
Jan 02 PHP
UCenter Home二次开发指南
May 28 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
php json与xml序列化/反序列化
Oct 28 PHP
PHP5.5在windows安装使用memcached服务端的方法
Apr 16 PHP
PHP独立Session数据库存储操作类分享
Jun 11 PHP
PHP中使用addslashes函数转义的安全性原理分析
Nov 03 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
php中final关键字用法分析
Dec 07 PHP
PHP Primary script unknown 解决方法总结
Aug 22 PHP
php提高脚本性能的4个技巧
Aug 18 #PHP
php判断IP地址是否在多个IP段内
Aug 18 #PHP
PHP 8新特性简介
Aug 18 #PHP
PHP大文件及断点续传下载实现代码
Aug 18 #PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
Aug 17 #PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
Aug 17 #PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
Aug 17 #PHP
You might like
PHP简洁函数小结
2011/08/12 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
jqPlot jquery的页面图表绘制工具
2009/07/25 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
JavaScript 语言基础知识点总结(思维导图)
2013/11/10 Javascript
浅析jquery的作用与优势
2013/12/02 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
微信小程序实现上拉加载功能
2019/11/20 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
解析Python中的二进制位运算符
2015/05/13 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
Python实现word2Vec model过程解析
2019/12/16 Python
五种Python转义表示法
2020/11/27 Python
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
非功能性需求都包括哪些方面
2013/10/29 面试题
DELPHI面试题研发笔试试卷
2015/11/08 面试题
毕业生就业自荐信
2013/12/04 职场文书
学党史心得体会
2014/09/05 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
2015年小学生自我评价范文
2015/03/03 职场文书
个人年终总结怎么写
2015/03/09 职场文书
爱岗敬业先进典型事迹材料(2016推荐版)
2016/02/26 职场文书
优秀党员先进事迹材料2016
2016/02/29 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS