聊聊 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 相关文章推荐
Zend公司全球首推PHP认证
Oct 09 PHP
用函数读出数据表内容放入二维数组
Oct 09 PHP
PHP 类商品秒杀计时实现代码
May 05 PHP
PHP管理内存函数 memory_get_usage()使用介绍
Sep 23 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
Jun 25 PHP
php时间戳格式化显示友好的时间函数分享
Oct 21 PHP
php对象和数组相互转换的方法
May 12 PHP
详解 PHP加密解密字符串函数附源码下载
Dec 18 PHP
php制作简单模版引擎
Apr 07 PHP
php微信开发接入
Aug 27 PHP
总结对比php中的多种序列化
Aug 28 PHP
php基于数组函数实现关联表的编辑操作示例
Jul 04 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使用glob函数快速查询指定目录文件的方法
2014/11/15 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
2015/11/10 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
PHP设计模式之单例模式定义与用法分析
2019/03/26 PHP
Javascript Jquery 遍历Json的实现代码
2010/03/31 Javascript
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
IE6下拉框图层问题探讨及解决
2014/01/03 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
20分钟轻松创建自己的Bootstrap站点
2016/05/12 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
2017/03/21 jQuery
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
python利用selenium进行浏览器爬虫
2019/04/25 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
Python colormap库的安装和使用详情
2020/10/06 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
Under Armour美国官网:美国知名高端功能性运动品牌
2016/09/05 全球购物
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
高三自我鉴定
2013/10/23 职场文书
公积金转移接收函
2014/01/11 职场文书
多媒体专业自我鉴定
2014/02/28 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
写给老师的感谢信
2015/01/20 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
小学生作文写作技巧100例,非常实用!
2019/07/08 职场文书
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB