用php-cs-fixer规范PHP代码

php-fig组织出了一系列psr规范之后,PHPer界就出现过不少自动格式化工具,其中php-cs-fixer最有影响力。但我们团队一直在用phpfmt格式化代码,一直觉得蛮好用,但有一天作者突然删除了github上的项目,并宣布phpfmt商业化,不再开源,我们也没有办法,虽然还可以用,但是不能接受后期无人维护的风险,被迫换格式化工具。
大概花了点时间研究下php-cs-fixer,这个项目采用的是MTI协议,作者是syfony框架的作者之一,也是php-fig的成员,作者的实力没得说。php-cs-fixer支持通过一个php文件来格式化,只要把这个文件放到代码仓库里面,然后由开发人员手动执行脚本即可批量格式化php文件,这样可以把规范约束到每个项目,当然主流的编辑器都有相关插件,使用起来非常方便。

使用方法:

wget https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v1.12.3/php-cs-fixer.phar
  • 简单示例:
php php-cs-fixer fix /path/to/code --fixers=-psr0,-php_closing_tag,duplicate_semicolon,empty_return,extra_empty_lines,include,list_commas,namespace_no_leading_whitespace,no_blank_lines_after_class_opening,no_empty_lines_after_phpdocs,object_operator,operators_spaces,phpdoc_indent,phpdoc_no_access,phpdoc_no_package,phpdoc_scalar,phpdoc_to_comment,phpdoc_trim,phpdoc_type_to_var,phpdoc_var_without_name,remove_leading_slash_use,remove_lines_between_uses,self_accessor,single_array_no_trailing_comma,single_blank_line_before_namespace,single_quote,spaces_before_semicolon,spaces_cast,standardize_not_equal,concat_with_spaces,align_double_arrow,align_equals,ternary_spaces,trim_array_spaces,unary_operators_spaces,whitespacy_lines,multiline_spaces_before_semicolon,short_array_syntax
php php-cs-fixer  fix --config-file .php_cs  /path/to/code
  • 我们团队的.php_cs文件内容,大家可以参考:
<?php
$finder = Symfony\Component\Finder\Finder::create()
    ->files()
    ->name('*.php')
    ->exclude('vendor')
    ->exclude('PHPExcel')
    ->in(__DIR__)
    ->ignoreDotFiles(true)
    ->ignoreVCS(true);
$fixers = [
    '-psr0',
    '-php_closing_tag',
    'duplicate_semicolon',
    'empty_return',
    'extra_empty_lines',
    'include',
    'list_commas',
    'namespace_no_leading_whitespace',
    'no_blank_lines_after_class_opening',
    'no_empty_lines_after_phpdocs',
    'object_operator',
    'operators_spaces',
    'phpdoc_indent',
    'phpdoc_no_access',
    'phpdoc_no_package',
    'phpdoc_scalar',
    'phpdoc_to_comment',
    'phpdoc_trim',
    'phpdoc_type_to_var',
    'phpdoc_var_without_name',
    'remove_leading_slash_use',
    'remove_lines_between_uses',
    'self_accessor',
    'single_array_no_trailing_comma',
    'single_blank_line_before_namespace',
    'single_quote',
    'spaces_before_semicolon',
    'spaces_cast',
    'standardize_not_equal',
    'concat_with_spaces',
    'align_double_arrow',
    'align_equals',
    'ternary_spaces',
    'trim_array_spaces',
    'unary_operators_spaces',
    'whitespacy_lines',
    'multiline_spaces_before_semicolon',
    'short_array_syntax',
];
return Symfony\CS\Config\Config::create()
    ->level(Symfony\CS\FixerInterface::PSR2_LEVEL)
    ->fixers($fixers)
    ->finder($finder)
    ->setUsingCache(false);
  • 编辑器插件设置