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 相关文章推荐
防止本地用户用fsockopen DDOS攻击对策
Nov 02 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
Jun 24 PHP
php的hash算法介绍
Feb 13 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
PHP使用header()输出图片缓存实例
Dec 09 PHP
mysql查找删除重复数据并只保留一条实例详解
Sep 24 PHP
PHP实现QQ快速登录的方法
Sep 28 PHP
php中序列化与反序列化详解
Feb 13 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
php-msf源码详解
Dec 25 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
Apr 09 PHP
PHP中多字节字符串操作实例详解
Aug 23 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 array的学习笔记
2012/05/16 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
python的文件操作方法汇总
2017/11/10 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
python爬虫的一个常见简单js反爬详解
2019/07/09 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
python性能测试工具locust的使用
2020/12/28 Python
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
详解如何将 Canvas 绘制过程转为视频
2021/01/25 HTML / CSS
JPA的优势都有哪些
2013/07/04 面试题
医科大学生的自我评价
2013/12/04 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
2019年警察入党转正申请书最新范文
2019/09/03 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技