PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)


Posted in PHP onOctober 30, 2020

PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查。可随时帮助用户对其编码进行调整,运行单元测试或者提供可视化debug功能。

PhpStorm 2020.3将附带几个开箱即用的PHP 8属性:
#[ArrayShape],#[ExpectedValues],#[NoReturn],#[Pure],#[Deprecated],#[Immutable]。继续阅读以了解有关属性的更多信息。

你可能已经听说过 PHP 8 中的属性,但也许你不知道的是它们将是取代 PHPDoc 的结构化元数据的新格式,现在将成为该语言的一部分。

PHP 8 中的属性是什么?
除了调用 ReflectionAttribute::newInstance()时的语法定义和验证之外,PHP 8 没有提供任何开箱即用的属性。对于你定义的属性,你必须自己实现它们的行为。

在 PhpStorm 2020.3 中会有哪些属性?
在PhpStorm 2020.3中,一些属性将在\JetBrains\PhpStorm\命名空间下可用。#[ExpectedValues]和#[NoReturn]是.phpstorm.meta.php函数的高级后裔。而#[ArrayShape]是PHPDoc的数组描述的一个备受期待的进化。此外,还会有#[Deprecated]、#[Pure]和#[Immutable]。

以下属性的设计仍在进行中,非常欢迎你的反馈。

#[Deprecated]
这个属性类似于@deprecated PHPDoc标签,用于标记方法、函数、类或类常量,它表示这些方法、函数、类或类常量在未来的版本中会被删除,因为它们已经过时了。

这个新属性的主要优点是,你可以指定替换函数和方法。这将帮助被废弃功能的用户进行迁移。

如果为属性指定了reason参数,那么它将在检查工具提示中显示给用户。

#[Deprecated(reason: '', replacement: '')]

让我们看一个真实的例子。

在Symfony 5.2中,/Symfony/Component/DependencyInjection/Alias::setPrivate()将被废弃。有了#[Deprecated]属性,我们可以更容易地进行迁移。

#[Deprecated(
 reason: 'since Symfony 5.2, use setPublic() instead',
 replacement: '%class%->setPublic(!%parameter0%)'
)]

PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)

#[ArrayShape]

PhpStorm要求最多的功能之一是支持更具体的数组PHPDoc注释。这在Psalm支持下得到了部分实现。

但另一部分--指定可能的键和它们对应的值类型--仍然缺失。当处理简单的数据结构或类似对象的数组时,当定义一个真正的类可能会感觉过度时,这个功能可能会很有用。

从PhpStorm 2020.3开始,可以使用#[ArrayShape]来定义这种数组的结构。

语法如下。

#[ArrayShape([
 // ‘key' => 'type',
 ‘key1' => ‘int',
 ‘key2' => ‘string',
 ‘key3' => ‘Foo',
 ‘key3' => App\PHP 8\Foo::class,
])]
function functionName(...): array

如您所见,“类型”可以指定为字符串中的标量,也可以指定为FQN字符串或::class常量形式的类引用。.

PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)

您可以将定义形状的数组提取为常量,然后在其适用的属性内重用它:

const MY_ARRAY_SHAPE = [];
#[ArrayShape(MY_ARRAY_SHAPE)]

PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)

那些不能升级到PHP 8的遗留项目呢?
幸运的是,单行属性的语法是向后兼容的。这意味着,如果将#[ArrayShape]属性添加到PHP 7. *项目的单独一行中,则PHP解释器会将其解析为一行注释,并且不会出现解析错误。但是,多行属性对于8之前的PHP版本并不安全。

与PHP解释器不同,PhpStorm仍然会分析属性!因此,即使您的项目在PHP 7.4或更低版本上运行,您仍然可以从添加#[ArrayShape]属性中受益。

请注意,在PhpStorm中使用较早的PHP版本时,您将完成代码,但是检查将仅在8级及以上的语言下进行。

#[Immutable]

不可变对象是初始化或创建后无法更改的对象。使用它们的好处如下:

  • 程序状态更可预测。
  • 调试更容易。

可以使用getter和setter或魔术方法在某种程度上模拟不可变的对象。从PhpStorm 2020.3开始,您可以简单地用#[Immutable]属性标记对象或属性。

PhpStorm将检查对象和属性的用法,并突出显示更改尝试。

PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)

你可以将写范围限制调整为只限制构造函数,或者模拟私有和保护范围。要做到这一点,请将常量CONSTRUCTOR_WRITE_SCOPE、PRIVATE_WRITE_SCOPE、PROTECTED_WRITE_SCOPE中的一个传递给#[Immutable]属性构造函数。

PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)

#[Immutable]属性即使在PHP 7.4及更低版本中也可以使用!

#[Pure]

您可以将不会产生任何副作用的函数标记为pure函数。如果之后执行的结果未在代码中使用,则可以安全地删除此类函数。

PhpStorm将检测pure函数的冗余调用。

PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)

如果该函数被标记为pure函数,但您尝试在函数外部进行更改,即产生副作用,则PhpStorm将警告您并突出显示不安全的代码。

PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)

#[ExpectedValues]

使用此属性,您可以指定函数接受哪些值作为参数,以及可以返回哪些值。

这与expectedArguments()函数可以执行的操作类似.phpstorm.meta.php,不同之处在于meta版本更像是完成对手。相反,该属性假定参数或返回值没有其他可能的值。

例如,让我们看一下count函数:
count ( array|Countable $array_or_countable [, int $mode = COUNT_NORMAL ] ) : int

它接受的第二个参数是整数,但实际上,它不是整数。而是它是常数COUNT_NORMALor之一COUNT_RECURSIVE,对应于0和1。

您可以将#[ExpectedValues]属性添加到第二个参数。这就是这种情况下代码完成的方式。

没有元

PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)

在.phpstorm.meta.php中具有ExpectedArguments()

PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)

使用#[ExpectedValues]属性

PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)

如何指定可能的值或位掩码。

#[ExpectedValues]示例

让我们看一下response()Laravel中的助手。它以HTTP状态代码作为第二个参数。

这使我们缺少两个关键功能:

  • 可能状态代码的代码完成
  • 在编辑器中验证

PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)

我们可以通过添加属性 #[ExpectedValues(valuesFromClass: Response::class)]来解决此问题

PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)

#[NoReturn]

代码库中的某些功能可能会导致脚本执行停止。首先,从函数名称中并不总是很明显,例如,trigger_error()根据第二个参数可以停止执行。其次,PhpStorm不能总是检测到此类功能,因为深入分析可能会导致性能问题。

这就是为什么将这些功能标记为出口点,以通过添加#[NoReturn]属性来进行更准确的控制流分析的原因。

PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)

而且,PhpStorm将提供通过快速修复在整个层次结构中向下传播属性的功能,以进行更加明确的分析。

PhpStorm点击此处下载

到此这篇关于PhpStorm 2020.3:新增开箱即用的PHP 8属性的文章就介绍到这了,更多相关PhpStorm 2020.3新增PHP 8属性内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
文件上传程序的全部源码
Oct 09 PHP
用PHP和ACCESS写聊天室(九)
Oct 09 PHP
phpMyAdmin链接MySql错误 个人解决方案
Dec 28 PHP
php中curl和file_get_content的区别
May 10 PHP
thinkphp中html:list标签传递多个参数实例
Oct 30 PHP
PHP中使用CURL获取页面title例子
Jan 07 PHP
laravel 5 实现模板主题功能
Mar 02 PHP
PHP中实现Bloom Filter算法
Mar 30 PHP
3种方法轻松处理php开发中emoji表情的问题
Jul 18 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
php实现将二维关联数组转换成字符串的方法详解
Jul 31 PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 09 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
Oct 30 #PHP
PHP fopen中文文件名乱码问题解决方案
Oct 28 #PHP
PHP dirname功能及原理实例解析
Oct 28 #PHP
基于ThinkPHP删除目录及目录文件函数
Oct 28 #PHP
PHP tp5中使用原生sql查询代码实例
Oct 28 #PHP
PHP dirname(__FILE__)原理及用法解析
Oct 28 #PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
Oct 28 #PHP
You might like
php 文件缓存函数
2011/10/08 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
2015/11/16 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
jQuery中的pushStack实现原理和应用实例
2015/02/03 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
移动设备手势事件库Touch.js使用详解
2017/08/18 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
JS中判断字符串存在和非空的方法
2018/09/12 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
小程序websocket心跳库(websocket-heartbeat-miniprogram)
2020/02/23 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
使用python开发vim插件及心得分享
2014/11/04 Python
Python对象转JSON字符串的方法
2016/04/27 Python
Python代码实现KNN算法
2017/12/20 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
送餐员岗位职责范本
2014/02/21 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
先进事迹材料范文
2014/12/29 职场文书
教师节领导致辞
2015/07/29 职场文书
领导新年致辞2016
2015/07/29 职场文书
家长会感言
2015/08/01 职场文书
2016年中秋节寄语大全
2015/12/07 职场文书
创业计划书之家政服务
2019/09/18 职场文书
浅谈Vue的computed计算属性
2022/03/21 Vue.js
【海涛教你打DOTA】虚空假面第一视角骨弓3房29杀
2022/04/01 DOTA
教你部署vue项目到docker
2022/04/05 Vue.js