聊聊 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 杂谈《重构-改善既有代码的设计》之五 简化函数调用
May 07 PHP
php判断正常访问和外部访问的示例
Feb 10 PHP
php除数取整示例
Apr 24 PHP
PHP获取数组长度或某个值出现次数的方法
Feb 11 PHP
PHP批量去除BOM头内容信息代码
Mar 11 PHP
php使用pear_smtp发送邮件
Apr 15 PHP
php连接oracle数据库的方法(测试成功)
May 26 PHP
php 修改上传文件大小限制实例详解
Oct 23 PHP
php从数据库中获取数据用ajax传送到前台的方法
Aug 20 PHP
PHP中使用mpdf 导出PDF文件的实现方法
Oct 22 PHP
PHP date()格式MySQL中插入datetime方法
Jan 29 PHP
php使用event扩展的io复用测试的示例
Oct 20 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
ThinkPHP控制器间实现相互调用的方法
2014/10/31 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
AngularJS基础 ng-include 指令简单示例
2016/08/01 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
vue-cli项目无法用本机IP访问的解决方法
2018/09/20 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
python两种遍历字典(dict)的方法比较
2014/05/29 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
关于numpy数组轴的使用详解
2019/12/05 Python
Python&amp;&amp;GDAL实现NDVI的计算方式
2020/01/09 Python
vue常用指令代码实例总结
2020/03/16 Python
设置jupyter中DataFrame的显示限制方式
2020/04/12 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
python中的unittest框架实例详解
2021/02/05 Python
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
金融保险专业求职信
2014/09/03 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
大学生暑期实践报告
2015/07/13 职场文书
卖车协议书范文
2016/03/23 职场文书
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL