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 相关文章推荐
使用 eAccelerator加速PHP代码的目的
Mar 16 PHP
php不允许用户提交空表单(php空值判断)
Nov 12 PHP
php上传中文文件名乱码问题处理方案
Feb 03 PHP
PHP实现Javascript中的escape及unescape函数代码分享
Feb 10 PHP
php实现在服务器上创建目录的方法
Mar 16 PHP
php实现编辑和保存文件的方法
Jul 20 PHP
调试WordPress中定时任务的相关PHP脚本示例
Dec 10 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
Dec 22 PHP
PHP使用SOAP扩展实现WebService的方法
Apr 01 PHP
Yii列表定义与使用分页方法小结(3种方法)
Jul 15 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
关于页面优化和伪静态
2009/10/11 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
2015/12/18 PHP
js null undefined 空区别说明
2010/06/13 Javascript
JS拖动技术 关于setCapture使用
2010/12/09 Javascript
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
js正则相关知识点专题
2018/05/10 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
关于vue组件事件属性穿透详解
2019/10/28 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
python和shell监控linux服务器的详细代码
2018/06/22 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
2020/02/17 Python
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
时尚圣经:The Fashion Bible
2019/03/03 全球购物
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
西部世纪.net笔试题面试题
2014/04/03 面试题
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
企业总经理岗位职责
2014/02/13 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
部队个人年终总结
2015/03/02 职场文书
学校推普周活动总结
2015/05/07 职场文书
党支部季度考核意见
2015/06/02 职场文书
商务信函英语问候语
2015/11/10 职场文书
Nginx防盗链与服务优化配置的全过程
2022/01/18 Servers