ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PHP-CS-Fixer `short_scalar_cast` 规则详解:将长写法类型转换统一为短写法

PHP-CS-Fixer `short_scalar_cast` 规则详解:将长写法类型转换统一为短写法 开发工具代码质量静态分析Lint格式化【免费下载链接】PHP-CS-FixerA tool to automatically fix PHP Coding Standards issues项目地址https://gitcode.com/gh_mirrors/ph/PHP-CS-Fixer点击查看免费下载short_scalar_cast是 PHP-CS-Fixer 中负责规范化类型转换cast写法的规则它会把(boolean)、(integer)等冗长的转换写法统一替换为等价的短写法(bool)、(int)、(float)、(string)。本文以官方规则文档为主体结合仓库内 Fixer 源码、测试用例 与规则集定义完整讲解该规则的行为、转换映射、实现原理、所属规则集及实际启用方式帮助你直接在项目中落地这套规范。规则概述在 PHP 中类型转换可以使用多种等价的写法例如布尔转换既可以写(boolean)也可以写(bool)整型转换可以写(integer)或(int)。这些长写法在功能上与短写法完全等价但增加了代码冗余也破坏了团队风格的统一。short_scalar_cast规则强制要求使用短写法其官方定义见 doc/rules/cast_notation/short_scalar_cast.rst为Cast(boolean)and(integer)should be written as(bool)and(int),(double)and(real)as(float),(binary)as(string).即(boolean)应写作(bool)(integer)应写作(int)(double)和(real)应写作(float)(binary)应写作(string)。转换映射表该规则的核心转换逻辑集中定义在 ShortScalarCastFixer.php 中是一张确定的键值映射表原始写法转换后写法说明(boolean)(bool)布尔转换(integer)(int)整型转换(double)(float)浮点转换(real)(float)浮点转换real为历史别名(binary)(string)二进制字符串转换统一为(string)从源码看转换时会将转换关键字先做小写化strtolower再查表因此(BOOLEAN)、(Boolean)、(INTEGER)等大小写变体同样会被识别并转换而(string)、(array)、(object)、(unset)等不在映射表中的写法则保持原样、不做任何改动。转换前后对比示例官方文档给出了完整的转换前后差异示例见 short_scalar_cast.rst--- Original New ?php -$a (boolean) $b; -$a (integer) $b; -$a (double) $b; $a (bool) $b; $a (int) $b; $a (float) $b; -$a (binary) $b; $a (string) $b;可以看到四条赋值语句中的长写法转换被统一替换为短写法语义完全不变代码却更加简洁一致。(binary)在 PHP 中本身是一个无实际操作no-op的转换统一写作(string)也更符合大多数团队的认知习惯。源码实现剖析该规则对应的 Fixer 类为PhpCsFixer\Fixer\CastNotation\ShortScalarCastFixer继承自AbstractFixer实现非常精简核心只有两个阶段。候选检测isCandidate()public function isCandidate(Tokens $tokens): bool { return $tokens-isAnyTokenKindsFound(Token::getCastTokenKinds()); }isCandidate()用于快速判断当前文件是否值得进一步处理只要文件 token 流中存在任何类型转换 tokenT_ARRAY_CAST、T_BOOL_CAST、T_DOUBLE_CAST、T_INT_CAST、T_OBJECT_CAST、T_STRING_CAST、T_UNSET_CAST以及自定义的T_VOID_CAST见 Token.php就返回true。这是一种低成本的前置过滤绝大多数不含转换操作的文件会被直接跳过保证性能。转换逻辑applyFix()protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { for ($index 0, $count $tokens-count(); $index $count; $index) { if (!$tokens[$index]-isCast()) { continue; } $castFrom trim(substr($tokens[$index]-getContent(), 1, -1)); $castFromLowered strtolower($castFrom); $castTo [ boolean bool, integer int, double float, real float, binary string, ][$castFromLowered] ?? null; if (null $castTo) { continue; } $tokens[$index] new Token([ $tokens[$index]-getId(), str_replace($castFrom, $castTo, $tokens[$index]-getContent()), ]); } }applyFix()的流程可以拆解为四步遍历 token 流逐一检查每个 token 是否为转换 tokenisCast()非转换 token 直接跳过。提取转换关键字对 token 内容(boolean)去掉首尾的括号substr(..., 1, -1)并trim得到关键字boolean再strtolower统一小写保证大小写不敏感匹配。查表映射在小写化后的关键字上执行映射表查询命中则得到目标关键字未命中如string、array、object则continue跳过。原位替换通过str_replace仅替换 token 内容中命中关键字的部分保留 token 原有的 ID 类型生成新的Token写回原位置。由于替换只作用于关键字本身转换括号内的空格等其它细节不会被破坏。这种只改关键字、不动其它内容的设计让该规则可以放心地与处理空格、大小写的其它 cast 规则组合使用。哪些写法不会被修改结合 ShortScalarCastFixerTest.php 的测试数据可以明确该规则的不干预边界已属于短写法的转换(string)、(array)、(object)等不在映射表中的写法不会被修改即使它们带有空格、首字母大写或全大写如( String )、(ARRAY)也保持原样PHP 8 之后的(real)测试中real float的用例被标注为RequiresPhp( 8.0.0)见 测试文件仅在 PHP 8.0 之前运行。这是因为 PHP 8.0 起(real)转换已被弃用不再作为独立转换 token 被解析同理(unset)的相关用例也只针对 PHP 8.0大小写不敏感但保持原空格测试覆盖了( %s )$a、(%s) $d、(%s)$d、( %s)、(%s )等多种空格布局转换后仅替换关键字括号内外的空格布局保持不变这与cast_spaces规则负责的空格规范化职责相互独立。所属规则集该规则被多个官方规则集收录依据 short_scalar_cast.rst 的 Rule sets 一节启用这些规则集即会自动应用本规则规则集说明PER-CSPSR 编码风格当前版本PER-CS1x0PER-CS 1.xPER-CS2x0PER-CS 2.xPER-CS3x0PER-CS 3.xPHP7x4MigrationPHP 7.4 迁移PHP8x0MigrationPHP 8.0 迁移PHP8x1MigrationPHP 8.1 迁移PHP8x2MigrationPHP 8.2 迁移PHP8x3MigrationPHP 8.3 迁移PHP8x4MigrationPHP 8.4 迁移PHP8x5MigrationPHP 8.5 迁移PhpCsFixerPHP-CS-Fixer 自身代码风格PSR12PSR-12 编码风格SymfonySymfony 编码风格其中以x替代次版本号的1x0/2x0/3x0、8x08x5命名的为当前生效的规则集而旧式带完整版本号的 PER、PER-CS1.0、PER-CS2.0、PER-CS3.0 以及 PHP74MigrationPHP85Migration 在官方文档中均标注为deprecated已弃用建议新项目直接使用对应x命名的替代版本。从规则集源码也可以直接印证该规则的收录情况例如 PHP7x4MigrationSet.php 中声明了short_scalar_cast truePSR12Set.php 同样将其纳入 PSR-12 规则集。也就是说只要你的项目遵循 PSR-12 或任何上述迁移规则集这类长写法转换会自动被修正。如何启用与使用方式一配置文件推荐在项目根目录的.php-cs-fixer.php中单独启用该规则?php return (new PhpCsFixer\Config()) -setRules([ short_scalar_cast true, ]) -setFinder( PhpCsFixer\Finder::in(__DIR__) -exclude(vendor) );更常见的做法是直接启用包含它的规则集例如PSR12或Symfony?php return (new PhpCsFixer\Config()) -setRules([ PSR12 true, ]) -setFinder(PhpCsFixer\Finder::in(__DIR__));方式二命令行临时指定不修改配置文件在命令行中直接指定规则执行修复php php-cs-fixer fix path/to/file.php --rulesshort_scalar_cast执行后可用--dry-run --diff先预览改动确认无误再实际写入。官方测试与向后兼容承诺该规则的官方测试类为PhpCsFixer\Tests\Fixer\CastNotation\ShortScalarCastFixerTest见 ShortScalarCastFixerTest.php其测试数据覆盖了boolean/integer/double/binary四组基础转换含首字母大写、全大写输入(real)在 PHP 8.0 下的转换(string)/(array)/(object)等不转换写法的回归保护防止误改多种空格布局下仅替换关键字、不破坏其它格式。正如官方文档所强调的该测试类定义的行为即官方支持的行为每个测试用例都是向后兼容承诺backward compatibility promise的一部分。这意味着在后续版本中该规则的转换映射和边界行为不会发生破坏性变化你可以放心将它纳入团队规范长期使用。小结short_scalar_cast是一条小而稳的规范化规则通过一张确定的映射表把(boolean)、(integer)、(double)、(real)、(binary)五种长写法统一为(bool)、(int)、(float)、(string)短写法并保证大小写不敏感、不触碰空格等其它格式。它同时被 PSR-12、PER-CS、Symfony 及多代 PHP 迁移规则集收录配合cast_spaces规范转换括号内空格和lowercase_cast统一转换关键字大小写等 cast_notation 目录下的相邻规则可以完整建立起一套统一、简洁、可预测的类型转换书写规范。赞分享开发工具代码质量静态分析Lint格式化【免费下载链接】PHP-CS-FixerA tool to automatically fix PHP Coding Standards issues项目地址https://gitcode.com/gh_mirrors/ph/PHP-CS-Fixer点击查看免费下载相关推荐PHP-CS-Fixer no_alternative_syntax 规则把 PHP 替代语法统一重写为花括号写法PHP CS Fixer no_alternative_syntax 规则把 PHP 替代语法统一重写为花括号写法 本指南围绕 PHP CS Fixer 内置开发工具代码质量静态分析Lint格式化PHP-CS-Fixer 的 simple_to_complex_string_variable 规则将 ${var} 统一转换为 {$var} 插值语法PHP CS Fixer 的 simple_to_complex_string_variable 规则将 ${var} 统一转换为 {$var} 插值语法 s开发工具代码质量静态分析Lint格式化PHP-CS-Fixer modernize_types_casting 规则详解将 intval/strval 等函数调用统一转换为类型强制转换PHP CS Fixer modernize_types_casting 规则详解将 intval/strval 等函数调用统一转换为类型强制转换 导读 mo开发工具代码质量静态分析Lint格式化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表