聊聊 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中支持多种编码的中文字符串截取函数!
Mar 20 PHP
php木马攻击防御之道
Mar 24 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
Oct 24 PHP
php输入流php://input使用浅析
Sep 02 PHP
跟我学Laravel之请求与输入
Oct 15 PHP
php中get_defined_constants函数用法实例分析
May 12 PHP
Zend Framework创建自己的动作助手详解
Mar 05 PHP
完美利用Yii2微信后台开发的系列总结
Jul 18 PHP
php 读取输出其他文件的实现方法
Jul 26 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
Oct 16 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 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
什么是MVC,好东西啊
2007/05/03 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
thinkphp分页集成实例
2017/07/24 PHP
JavaScript 模拟用户单击事件
2009/12/31 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
2012/12/13 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
2015/04/06 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
Win7上搭建Cocos2d-x 3.1.1开发环境
2014/07/03 Python
Python通过解析网页实现看报程序的方法
2014/08/04 Python
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
python概率计算器实例分析
2015/03/25 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
解决python3 Pycharm上连接数据库时报错的问题
2018/12/03 Python
对python中字典keys,values,items的使用详解
2019/02/03 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
南京某公司笔试题
2013/01/27 面试题
初三政治教学反思
2014/01/30 职场文书
刘胡兰的英雄事迹材料
2014/02/11 职场文书
有关环保的标语
2014/06/13 职场文书
新教师培训心得体会
2014/09/02 职场文书
市场营销工作计划书
2014/09/15 职场文书
英语邀请函范文
2015/02/02 职场文书
圆明园观后感
2015/06/03 职场文书
分析并发编程之LongAdder原理
2021/06/29 Java/Android
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
2021/08/02 MySQL
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android