使用php-cs-fixer修复PHP代码文件的缩进

时间:2017-09-19 16:32:53

标签: php code-formatting 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";&amp; include 'connect.php';,其中包含一个或多个未正确缩进的前导标签/空格。

我愿意采用其他方法。其他人之前必须面对像这样的格式化问题。

我也尝试过NetBeans,它恰好可以很好地格式化源代码,但手动打开每个文件并通过快捷方式应用源格式是很繁琐的。

4 个答案:

答案 0 :(得分:4)

您应该使用braces修复程序强制缩进。

  

每个结构的主体必须用括号括起来。支架应妥善放置。 大括号的主体应正确缩进。

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中的一个错误。

答案 1 :(得分:1)

我会根据导致我解决的调查结果回答我自己的问题。

虽然格式基本上有效,但对我来说,问题就是缩进。如果有一些前导空格或制表符,那么在修复后某些行会保持不变。

由于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步中使用PSR-2基线格式化中不同的,更完整的php_cs配置执行此操作(因为,您知道,还有更多修复程序问题。 )。
  • 我建议按照PSR-2的要求使用4个空格作为缩进。根据我的经验,如果你坚持要有标签,事情会变得更加复杂。
  • 如果php-cs-fixer和phpcbf没有这么多问题,那么描述的程序就没有必要了。我会一个接一个地报告,希望将来可以一次性实现。

答案 2 :(得分:0)

关于替代选项。我在Visual Studio Code中使用自动代码格式化也遇到了问题。我尝试了一些格式化程序,但只有phpfmt解决了缩进问题并将括号放在正确位置的问题。它还具有许多自定义选项,但由于不需要它们,因此我没有对其进行测试。

答案 3 :(得分:-1)

OP说

我愿意采用其他方法。其他人之前必须面对这样的格式问题。

我们的PHP Formatter会很好地缩进文件。请参阅由PHP Formatter处理的OP“严重缩进”示例:

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打印回格式良好的文本。它无法搞砸文件。