使用 php-cs-fixer 修复 PHP 代码文件的缩进
Fix indentation of PHP code files with php-cs-fixer
我有数百个可怕的缩进 PHP 文件,混合制表符和空格(我想甚至混合行结尾)我想用 php-cs-fixer v2+ 修复它们。
我已经根据需要配置了 php-cs-fixer,并且相应地清理了代码 - 除了缩进。我已经尝试了一个最小的配置,如下所示,来确定问题。但是我不能直接得到缩进修复器:
return PhpCsFixer\Config::create()
->setRules([
'@PSR2' => true,
'indentation_type' => true,
'braces' => ['position_after_functions_and_oop_constructs' => 'same'],
])
->setIndent("\t")
->setLineEnding("\r\n")
目前,我 运行 在我的 Windows 盒子上使用以下命令(此处为单个文件):
php-cs-fixer.bat fix new_user.php --config /full/windowspath/to/php_cs.dist
以防万一,生成的 php_cs.cache(包含 JSON 中实际应用的规则)文件如下所示:
{
"php": "5.6.31",
"version": "2.6.0:v2.6.0#5642a36a60c11cdd01488d192541a89bb44a4abf",
"rules": {
"blank_line_after_namespace": true,
"braces": {
"position_after_functions_and_oop_constructs": "same"
},
"class_definition": true,
"elseif": true,
"function_declaration": true,
"indentation_type": true,
"line_ending": true,
"lowercase_constants": true,
"lowercase_keywords": true,
"method_argument_space": {
"ensure_fully_multiline": true
},
"no_break_comment": true,
"no_closing_tag": true,
"no_spaces_after_function_name": true,
"no_spaces_inside_parenthesis": true,
"no_trailing_whitespace": true,
"no_trailing_whitespace_in_comment": true,
"single_blank_line_at_eof": true,
"single_class_element_per_statement": {
"elements": ["property"]
},
"single_import_per_statement": true,
"single_line_after_imports": true,
"switch_case_semicolon_to_colon": true,
"switch_case_space": true,
"visibility_required": true,
"encoding": true,
"full_opening_tag": true
},
"hashes": {
"new_students.org_.php": -151826318
}
}
这里是一些缩进严重的示例文件内容。
<?php
session_start();
include 'connect.php';
include 'functions.php';
$test= "abc";
$additional_studs = "";
if (date('m') == 12 and $term='SP') {
$yr_suffix = date('y') + 1;
} else {
$yr_suffix = date('y');
}
function dup_stud($id, $conn)
{//...
}
$i = 0;
我最恼火的是像 $test="abc";
和 include 'connect.php';
这样有一个或多个前导 tabs/spaces 的行没有正确缩进。
我愿意接受其他方法。其他人以前一定遇到过这样的格式问题。
我也尝试过 NetBeans,它恰好可以很好地格式化源代码,但是手动打开每个文件并通过快捷方式应用源代码格式是很乏味的。
你应该使用 braces
修正器来强制缩进。
The body of each structure MUST be enclosed by braces. Braces should be properly placed. Body of braces should be properly indented.
indentation_type
只是强制一致性。
但由于两个修复程序都已包含在 @PSR2
中,因此应该正确修复代码。
请参阅 README 中的相关部分。
使用您的代码 php-cs-fixer 2.6 生成以下代码
<?php
$test= "abc";
$additional_studs = "";
if (date('m') == 12 and $term='SP') {
$yr_suffix = date('y') + 1;
} else {
$yr_suffix = date('y');
}
function dup_stud($id, $conn)
{//...
}
$i = 0;
其中缩进只是部分固定。
我把它简化为下面的代码
<?php
echo "a";
echo "b";
echo "c";
它看起来像是 php-cs-fixer 中的错误。
OP 说
我愿意接受其他方法。其他人以前一定遇到过这样的格式问题。
我们的 PHP Formatter 会很好地缩进文件。请参阅由 PHP 格式化程序处理的 OP "badly indented" 示例:
C:\>DMSFormat PHP~v7 \temp\test.php
PHP~v7 PrettyPrinter Version 1.3.17
Copyright (C) 2004-2016 Semantic Designs, Inc; All Rights Reserved; SD Confidential
Powered by DMS (R) Software Reengineering Toolkit
DMS_PHP~v7_INPUT_ENCODING=ISO-8859-1
DMS_PHP~v7_OUTPUT_ENCODING=ISO-8859-1
Parsing \temp\test.php [encoding ISO-8859-1 +CRLF +LF +CR +NEL +1 /^I]
<?php
include 'connect.php';
include 'functions.php';
$test="abc";
$additional_studs="";
if (date('m') == 12 and $term='SP') {
$yr_suffix=date('y')+1;
}
else {
$yr_suffix=date('y');
}
function dup_stud($id,$conn) { //...
}
$i=0;
(我不得不添加
<?php
添加到文件开头以使其合法。)
此示例是 运行 从文件到控制台。您还可以对一个文件执行一个文件,或者 运行 使用项目文件的整个文件列表 [这可能是 OP 想要的]。
PHP 格式化程序使用真正的 PHP 解析器来处理源文本并构建抽象语法树,并使用特殊的 prettyprinter 将 AST 打印回格式良好的文本。 不能搞砸文件。
我将根据导致我解决的调查结果回答我自己的问题。
虽然格式基本有效,但对我来说问题在于缩进。如果有一些前导空格或制表符,修复后某些行会一直突出。
由于 php-cs-fixer 和 phpcbf 都无法正确修复缩进,我采取了绝望的措施,并在脚本中使用 sed 作为准备步骤修剪了每行中的每个前导空格像这样:
sed "s/^[ \t]*//" -i test.php
然后我再次使用 php-cs-fixer 和 phpcbf 处理了一些准备好的文件,以找出哪个在根据 PSR-2 格式化文件方面做得更好。这很可耻,但是两个修复程序都再次失败了——现在显示出一些不同的缺点(即错误)。长话短说,我终于了解到将这两个工具结合起来可以生成格式正确的代码文件。真是一团糟。
所以,在 sed 之后,我 运行 phpcbf
phpcbf --standard="PSR2" test.php
其次是
php-cs-fixer fix test.php --rules=@PSR2
突然间我有了漂亮的 PSR-2 格式 PHP 文件。不是最有效的方法,但它可以完成工作。
一些补充意见:
- 如果您想应用其他修复程序规则,我建议在第 4 步中使用不同的、更完整的 php_cs 配置来自 PSR-2 基线格式(因为,你知道,还有更多修复程序问题..)。
- 我建议按照 PSR-2 的要求使用 4 个空格作为缩进。根据我的经验,如果你坚持使用标签,事情会变得更加复杂。
- 如果 php-cs-fixer 和 phpcbf 没有那么多问题,那么描述的过程就没有必要了。我会一一汇报,希望以后也能一举成真。
关于备选方案。 Visual Studio 代码中的自动代码格式化也有问题。我尝试了一些格式化程序,但只有 phpfmt 解决了缩进和将大括号放在正确位置的问题。它也有许多自定义选项,但我没有测试它们,因为不需要它们。
我有数百个可怕的缩进 PHP 文件,混合制表符和空格(我想甚至混合行结尾)我想用 php-cs-fixer v2+ 修复它们。
我已经根据需要配置了 php-cs-fixer,并且相应地清理了代码 - 除了缩进。我已经尝试了一个最小的配置,如下所示,来确定问题。但是我不能直接得到缩进修复器:
return PhpCsFixer\Config::create()
->setRules([
'@PSR2' => true,
'indentation_type' => true,
'braces' => ['position_after_functions_and_oop_constructs' => 'same'],
])
->setIndent("\t")
->setLineEnding("\r\n")
目前,我 运行 在我的 Windows 盒子上使用以下命令(此处为单个文件):
php-cs-fixer.bat fix new_user.php --config /full/windowspath/to/php_cs.dist
以防万一,生成的 php_cs.cache(包含 JSON 中实际应用的规则)文件如下所示:
{
"php": "5.6.31",
"version": "2.6.0:v2.6.0#5642a36a60c11cdd01488d192541a89bb44a4abf",
"rules": {
"blank_line_after_namespace": true,
"braces": {
"position_after_functions_and_oop_constructs": "same"
},
"class_definition": true,
"elseif": true,
"function_declaration": true,
"indentation_type": true,
"line_ending": true,
"lowercase_constants": true,
"lowercase_keywords": true,
"method_argument_space": {
"ensure_fully_multiline": true
},
"no_break_comment": true,
"no_closing_tag": true,
"no_spaces_after_function_name": true,
"no_spaces_inside_parenthesis": true,
"no_trailing_whitespace": true,
"no_trailing_whitespace_in_comment": true,
"single_blank_line_at_eof": true,
"single_class_element_per_statement": {
"elements": ["property"]
},
"single_import_per_statement": true,
"single_line_after_imports": true,
"switch_case_semicolon_to_colon": true,
"switch_case_space": true,
"visibility_required": true,
"encoding": true,
"full_opening_tag": true
},
"hashes": {
"new_students.org_.php": -151826318
}
}
这里是一些缩进严重的示例文件内容。
<?php
session_start();
include 'connect.php';
include 'functions.php';
$test= "abc";
$additional_studs = "";
if (date('m') == 12 and $term='SP') {
$yr_suffix = date('y') + 1;
} else {
$yr_suffix = date('y');
}
function dup_stud($id, $conn)
{//...
}
$i = 0;
我最恼火的是像 $test="abc";
和 include 'connect.php';
这样有一个或多个前导 tabs/spaces 的行没有正确缩进。
我愿意接受其他方法。其他人以前一定遇到过这样的格式问题。
我也尝试过 NetBeans,它恰好可以很好地格式化源代码,但是手动打开每个文件并通过快捷方式应用源代码格式是很乏味的。
你应该使用 braces
修正器来强制缩进。
The body of each structure MUST be enclosed by braces. Braces should be properly placed. Body of braces should be properly indented.
indentation_type
只是强制一致性。
但由于两个修复程序都已包含在 @PSR2
中,因此应该正确修复代码。
请参阅 README 中的相关部分。
使用您的代码 php-cs-fixer 2.6 生成以下代码
<?php
$test= "abc";
$additional_studs = "";
if (date('m') == 12 and $term='SP') {
$yr_suffix = date('y') + 1;
} else {
$yr_suffix = date('y');
}
function dup_stud($id, $conn)
{//...
}
$i = 0;
其中缩进只是部分固定。
我把它简化为下面的代码
<?php
echo "a";
echo "b";
echo "c";
它看起来像是 php-cs-fixer 中的错误。
OP 说
我愿意接受其他方法。其他人以前一定遇到过这样的格式问题。
我们的 PHP Formatter 会很好地缩进文件。请参阅由 PHP 格式化程序处理的 OP "badly indented" 示例:
C:\>DMSFormat PHP~v7 \temp\test.php
PHP~v7 PrettyPrinter Version 1.3.17
Copyright (C) 2004-2016 Semantic Designs, Inc; All Rights Reserved; SD Confidential
Powered by DMS (R) Software Reengineering Toolkit
DMS_PHP~v7_INPUT_ENCODING=ISO-8859-1
DMS_PHP~v7_OUTPUT_ENCODING=ISO-8859-1
Parsing \temp\test.php [encoding ISO-8859-1 +CRLF +LF +CR +NEL +1 /^I]
<?php
include 'connect.php';
include 'functions.php';
$test="abc";
$additional_studs="";
if (date('m') == 12 and $term='SP') {
$yr_suffix=date('y')+1;
}
else {
$yr_suffix=date('y');
}
function dup_stud($id,$conn) { //...
}
$i=0;
(我不得不添加
<?php
添加到文件开头以使其合法。)
此示例是 运行 从文件到控制台。您还可以对一个文件执行一个文件,或者 运行 使用项目文件的整个文件列表 [这可能是 OP 想要的]。
PHP 格式化程序使用真正的 PHP 解析器来处理源文本并构建抽象语法树,并使用特殊的 prettyprinter 将 AST 打印回格式良好的文本。 不能搞砸文件。
我将根据导致我解决的调查结果回答我自己的问题。
虽然格式基本有效,但对我来说问题在于缩进。如果有一些前导空格或制表符,修复后某些行会一直突出。
由于 php-cs-fixer 和 phpcbf 都无法正确修复缩进,我采取了绝望的措施,并在脚本中使用 sed 作为准备步骤修剪了每行中的每个前导空格像这样:
sed "s/^[ \t]*//" -i test.php
然后我再次使用 php-cs-fixer 和 phpcbf 处理了一些准备好的文件,以找出哪个在根据 PSR-2 格式化文件方面做得更好。这很可耻,但是两个修复程序都再次失败了——现在显示出一些不同的缺点(即错误)。长话短说,我终于了解到将这两个工具结合起来可以生成格式正确的代码文件。真是一团糟。
所以,在 sed 之后,我 运行 phpcbf
phpcbf --standard="PSR2" test.php
其次是
php-cs-fixer fix test.php --rules=@PSR2
突然间我有了漂亮的 PSR-2 格式 PHP 文件。不是最有效的方法,但它可以完成工作。
一些补充意见:
- 如果您想应用其他修复程序规则,我建议在第 4 步中使用不同的、更完整的 php_cs 配置来自 PSR-2 基线格式(因为,你知道,还有更多修复程序问题..)。
- 我建议按照 PSR-2 的要求使用 4 个空格作为缩进。根据我的经验,如果你坚持使用标签,事情会变得更加复杂。
- 如果 php-cs-fixer 和 phpcbf 没有那么多问题,那么描述的过程就没有必要了。我会一一汇报,希望以后也能一举成真。
关于备选方案。 Visual Studio 代码中的自动代码格式化也有问题。我尝试了一些格式化程序,但只有 phpfmt 解决了缩进和将大括号放在正确位置的问题。它也有许多自定义选项,但我没有测试它们,因为不需要它们。