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 相关文章推荐
可以在线执行PHP代码包装修正版
Mar 15 PHP
php 获取当前访问的url文件名的方法小结
Feb 08 PHP
一个典型的PHP分页实例代码分享
Jul 28 PHP
PHP跨时区(UTC时间)应用解决方案
Jan 11 PHP
调整PHP的性能
Oct 30 PHP
php权重计算方法代码分享
Jan 09 PHP
CodeIgniter删除和设置Cookie的方法
Apr 07 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 PHP
PHP 实现从数据库导出到.csv文件方法
Jul 06 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
php压缩文件夹最新版
Jul 18 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/08/08 PHP
php metaphone()函数及php localeconv() 函数实例解析
2016/05/15 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
详解webpack+es6+angular1.x项目构建
2017/05/02 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
2019/05/05 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
浅谈function(函数)中的动态参数
2017/04/30 Python
TensorFlow高效读取数据的方法示例
2018/02/06 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
python中PS 图像调整算法原理之亮度调整
2019/06/28 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
体育系毕业生自荐信
2014/06/28 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
入党个人总结范文
2015/03/02 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
CSS 圆形进度栏
2021/04/06 HTML / CSS
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python
FFmpeg视频处理入门教程(新手必看)
2022/01/22 杂记
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB