聊聊 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下载远程文件类(支持断点续传)
Nov 14 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
Jun 10 PHP
设置php页面编码的两种方法示例介绍
Mar 03 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
Nov 22 PHP
php对象在内存中的存在形式分析
Feb 03 PHP
使用PHPExcel操作Excel用法实例分析
Mar 26 PHP
最新最全PHP生成制作验证码代码详解(推荐)
Jun 12 PHP
Thinkphp5行为使用方法汇总
Dec 21 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
Apr 27 PHP
PHP实现的猴王算法(猴子选大王)示例
Apr 30 PHP
PHP 7.4 新语法之箭头函数实例详解
May 09 PHP
PHP实现随机发放扑克牌
Apr 21 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
各种战术和打法的原创者
2020/03/04 星际争霸
用PHP实现的生成静态HTML速度快类库
2007/03/31 PHP
discuz安全提问算法
2007/06/06 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
php常用数组函数实例小结
2016/12/29 PHP
JavaScript 实现??打印?理
2007/04/28 Javascript
Iframe 自适应高度并实时监控高度变化的js代码
2009/10/30 Javascript
js实时监听文本框状态的方法
2011/04/26 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
js保留两位小数方法总结
2018/01/31 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
Python随机数用法实例详解【基于random模块】
2017/04/18 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
a标签下载链接的简单实现
2016/09/13 HTML / CSS
Expedia西班牙:预订酒店、机票、旅行和廉价度假套餐
2019/04/10 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
个人贷款承诺书
2014/03/28 职场文书
担保书怎么写
2014/04/01 职场文书
民事答辩状格式范文
2015/05/21 职场文书
花田少年史观后感
2015/06/16 职场文书
网络研修随笔感言
2015/11/18 职场文书
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers
java实现面板之间切换功能
2022/06/10 Java/Android