php_cs_fixerのオプションをハックする ~ 実行時のdiffつき ~ 

[ランサーズ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/lancers)第二弾、12/2は[上野](https://engineer.blog.lancers.jp/author/ueno/)が担当させてもらいます。

# はじめに

今年は[Lancers Top](https://lancerstop.jp)の開発を通じて、CakePHP1.3の世界から3.4, 3.5の世界に飛び出し、[CakePHP3.5の移行ガイド](https://book.cakephp.org/3.0/ja/appendices/3-5-migration-guide.html)の翻訳にチャレンジするなどしてみて、アクセスがめんどくさい情報をわかりやすく伝えることはOSSに機能を一つ追加することよりもむしろ価値があるのではないかと、コミュニティーに対する還元の考え方が変わった1年でした。

そこで去年度の「[githubのissue, pull request 検索をハックする！](https://engineer.blog.lancers.jp/2016/12/github_search_query_hack/)」に引き続きハックシリーズで「<b>php_cs_fixerのオプションをハックする</b>」と称してphpのコーディング規則を揃え自動修正してくれる`php_cs_fixer`でどのような修正が可能か、実行時のdiffも含めご紹介します。

## 本題の前の準備系（基本割愛しています)

### そもそもphp_cs_fixerってなに？

PHPのコーディングスタイルを揃えて自動で修正してくれるlibraryです。
- メンバーの好みや癖で同じリポジトリで記述が異なるようなことを防いでくれます。
- レビューでする側も受ける側もストレスなコーディング規約に関する指摘がなくなります
- 宗教戦争が収まり平和な世界の中でで大事なビジネスロジックに集中した開発ができます

PHPには他に`PHP CodeSniffer`があります

### インストールと実行コマンド

幾つか記事が出ているので省略します。

- [本家のインストール手順](https://github.com/FriendsOfPHP/PHP-CS-Fixer#installation)
- [PHP CS Fixer v2 でもっと快適PHPライフ](http://fivestar.hatenablog.com/entry/2017/03/30/233744)

```
## 例1) composerで導入
$ composer require friendsofphp/php-cs-fixer
$ vi .php_cs
$ ./vendor/friendsofphp/php-cs-fixer/php-cs-fixer fix --config=./.php_cs

## 例1) homebrewで導入
$ brew install homebrew/php/php-cs-fixer
$ vi .php_cs
$ php-cs-fixer fix --config=./.php_cs
```


# .php_csのオプション紹介（本題）

## .php_csの記述サンプル

対象のフォルダとルールを設定します。

```php
$finder = PhpCsFixer\Finder::create()
    ->notName('README.md')
    ->notName('.php_cs')
    ->notName('composer.*')
    ->notName('phpunit.xml*')
    ->notName('*.xml')
    ->exclude('tests')    // ここから除外フォルダー
    ->exclude('config/Seeds')
    ->exclude('vendor')
    ->exclude('plugin')
    ->exclude('tmp')
    ->in(__DIR__);

return PhpCsFixer\Config::create()
    ->setRules([
        '@PSR2' => true,
        '@PHP71Migration' => true,
        'array_syntax' => ['syntax' => 'short'],
        'ereg_to_preg' => true,
        'function_typehint_space' => true,
        'no_unused_imports' => true,
        'no_empty_comment' => true,
        'no_empty_phpdoc' => true,
        'no_whitespace_before_comma_in_array' => true, 
        // 'ordered_imports' => true,
        'return_type_declaration' => true,
        'ternary_operator_spaces' => true,
        'whitespace_after_comma_in_array' => true,
        'psr4' => true,
    ])
    ->setUsingCache(false)
    ->setFinder($finder);
```

以後は利用できるルールの各種オプションを本家よりわかりやすい説明を目指して、変換前後のdiffつきで紹介します。
お好みのコーディング規約に沿って組み合わせて使ってください。

## array_syntax

arrayの記述方法を短縮系にするか

```php
'array_syntax' => ['syntax' => 'short'],
'array_syntax' => array('syntax' => 'long'),
```

| short | long |
| --- | --- |
| <img width="298" alt="array_syntax_short.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/281b6476-0d58-39ab-bfa7-6cf1d4421673.png"> | <img width="404" alt="array_syntax_long.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/7b27c01e-49f0-763a-6a65-855b090ef0e7.png"> |

## binary_operator_spaces

= や => などの演算子を揃えるかを設定できます

```php
'binary_operator_spaces' => [
    'align_double_arrow' => true,
    'align_equals' => true,
],
```

| align_equals | align_double_arrow |
| --- | --- |
| <img width="190" alt="スクリーンショット 2017-11-29 1.33.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/1ef504a1-a263-3e26-2db8-b9c1b68b4368.png"> | <img width="326" alt="スクリーンショット 2017-11-29 1.34.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/a4361559-38f7-c32b-cccd-4b4530a3ef22.png"> |


## blank_line_after_namespace

ネームスペースの後ろに一行改行を入れます。

* `@PSR-2`, `@Symfony`でデフォルト`true`です。

```php
'blank_line_after_namespace' => true
```

<img width="317" alt="スクリーンショット 2017-11-29 1.51.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/7dc18515-8a1e-772c-42ff-ae04b95030cd.png">

## blank_line_after_opening_tag

PHPの開始タグの後に一行改行を入れます

* `@Symfony`でデフォルト`true`で指定されます

```php
'blank_line_after_opening_tag' => true,
```

<img width="335" alt="スクリーンショット 2017-11-29 1.53.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/f0c8a601-f55d-4256-f7ec-ce07e08a6ba5.png">

## blank_line_before_return

returnの前に一行改行を入れます

```php
'blank_line_before_return' => true,
```

<img width="516" alt="スクリーンショット 2017-11-29 1.56.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/0c89b11a-05ba-974d-5811-0aa23cf58c87.png">


## blank_line_before_statement

特定の記述の前に一行改行を入れる

* `@Symfony`ではデフォルトでいかが設定されている

```php
'blank_line_before_statement' => [
    'statements' => [
        'break', 
        'continue', 
        'declare', 
        'return', 
        'throw', 
        'try'
    ]
],
```

<img width="291" alt="スクリーンショット 2017-11-29 2.02.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/7f155a6a-a4c3-b120-aa02-2ab61c434a4c.png">

## braces

各構造体は、中括弧で囲んで適切にインデントさせる必要があるためフォーマットを統一する

* `@PSR-2`, `@Symfony`で以下のデフォルト指定がされている。

```php
'braces' => [
    'allow_single_line_closure' => false,
    'position_after_anonymous_constructs' => 'same'
    'position_after_control_structures' => 'same'
    'position_after_functions_and_oop_constructs' => 'next'
],
```
**allow_single_line_closure**

クロージャーを1行で書くことを許容する

```php
'braces' => [
    'allow_single_line_closure' => false,
],
```

<img width="738" alt="スクリーンショット 2017-11-29 2.08.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/7d339c78-840c-a2e4-431e-d4de1bad1fcc.png">


**position_after_anonymous_constructs**

クロージャや無名クラスの中括弧開始の位置を指定

* same: 同じ行、  next: 次の行  が指定できる

```php
'braces' => [
    'position_after_anonymous_constructs' => 'next'
],
```

<img width="348" alt="スクリーンショット 2017-11-29 2.13.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/0b1456c5-eb88-e3ca-2dcc-62a419e7b266.png">

**position_after_control_structures**

`if`,`else`,`for`,`foreach`,`try` などの制御構造の中括弧開始位置を指定

* same: 同じ行、 next: 次の行 が指定できる

```php
'braces' => [
    'position_after_control_structures' => 'next'
],
```

<img width="234" alt="スクリーンショット 2017-11-29 2.17.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/f4e316e5-fe17-cf5e-fe0b-c37aed86debc.png">


**position_after_functions_and_oop_constructs**

class, function などの宣言の後で用いる中括弧開始位置を指定

* same: 同じ行、 next: 次の行 が指定できる

```php
'braces' => [
    'position_after_functions_and_oop_constructs' => 'same'
],
```

<img width="348" alt="スクリーンショット 2017-11-29 2.13.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/4547f481-c204-8004-4ca7-b34d6d4d40f5.png">

## cast_spaces


キャストをした時に後ろにスペースを開けるか。

* `@Symfony`のときのデフォルトは`single`
* single: 半角空白を空ける 、none: 空白を入れない 

```php
'cast_spaces' => [
    'space' => 'single'
],
```

<img width="312" alt="スクリーンショット 2017-11-29 2.28.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/39023d08-5cf0-9b0f-93b2-5ec4ae8cf295.png">

## class_keyword_remove

`::class`のキーワードを絶対パスの名前に置き換える

```php
'class_keyword_remove' => true,
```

![スクリーンショット 2017-11-30 19.49.43.png](https://qiita-image-store.s3.amazonaws.com/0/61095/3f3c9e75-6175-6504-a81f-a46574a1447b.png)



## combine_consecutive_issets, combine_consecutive_unsets

`isset(X) && isset(Y) && ...`の記述を `isset(X,Y,...)` に置き換える
`unset(x)` が続く記述を `unset(x,y,...)` に置き換える


```php
'combine_consecutive_issets' => true,
'combine_consecutive_unsets' => true,
```

![スクリーンショット 2017-11-30 19.58.51.png](https://qiita-image-store.s3.amazonaws.com/0/61095/8fc99257-b79b-0a8e-a786-68ca84f392f6.png)


## compact_nullable_typehint

nullを許容する型宣言で余計な空白を削除する

```php
'compact_nullable_typehint' => true,
```
![スクリーンショット 2017-11-30 20.02.48.png](https://qiita-image-store.s3.amazonaws.com/0/61095/a84b29b8-caec-6a85-7a10-397d48c95144.png)


## concat_space

結合演算子の前後に空ける空白の指定

* Symfonyでは`none`がデフォルト指定されます

```php
'concat_space' => [
    'spacing' => 'single'
],
```

![スクリーンショット 2017-11-30 20.10.05.png](https://qiita-image-store.s3.amazonaws.com/0/61095/b1a92056-97ba-0d86-ef14-550e8d8bd629.png)

## declare_strict_types (PHP>=7.0)

型を厳密に判断する strict モードを強制する

* `@PHP70Migration:risky`, `@PHP71Migration:risky` で利用できます

```php
'declare_strict_types' => true,
```

![スクリーンショット 2017-11-30 21.06.56.png](https://qiita-image-store.s3.amazonaws.com/0/61095/cbecac71-ac57-828a-46cd-ece139dfc3cb.png)

## dir_constant 

`dirname(__FILE__)` を `__DIR__` に書き換えます。

* `dirname()`をオーバライドしているときはリスクを伴います

```php
'dir_constant' => true,
```


## elseif

空白のある`else if` の代わりに `elseif` を使うようにします

* `@PSR2`, `@Symfony`でデフォルト`true`です

```php
'elseif' => true,
```

![スクリーンショット 2017-11-30 20.30.31.png](https://qiita-image-store.s3.amazonaws.com/0/61095/f915e06c-5590-c1cd-8855-ec2fb0163656.png)


## encoding

PHPコードの文字コードをBOMでなくUTF-8にします

* `@PSR1`,`@PSR2`, `@Symfony`でデフォルト`true`です

```php
'encoding' => true,
```

## ereg_to_preg

非推奨になっている `ereg系` の処理を `preg`に変換します

* `ereg`関数をオーバーライドしている場合リスクを伴います
* `@Symfony:risky`の場合にデフォルト`ture`です

```php
'ereg_to_preg' => true,
```

![スクリーンショット 2017-11-30 20.39.54.png](https://qiita-image-store.s3.amazonaws.com/0/61095/ad82940e-5b43-b078-9568-4b04441f3475.png)


## full_opening_tag

ロングタグ(`<?php`） と `echo`を伴うショートタグ(`<?=`) 以外を使用禁止にします
`@PSR1`,`@PSR2`, `@Symfony`でデフォルト`true`です


```php
'full_opening_tag' => true,
```

## function_declaration

関数宣言後のスペース設定

* `@PSR2`,`@Symfony`でデフォルトで以下が設定されています

```php
'function_declaration' => [
    'closure_function_spacing' => 'one',  // クロージャーのfunctionの後ろのスペース
],
```

![スクリーンショット 2017-11-30 20.45.34.png](https://qiita-image-store.s3.amazonaws.com/0/61095/ecabf8cb-04ab-ccc6-fa2a-bd2b57f79b34.png)

## function_to_constant

特定の関数を定数に置き換えます。

* `@Symfony:risk`ではデフォルトで以下が設定されています。
* 各関数をオーバライドしていたときにはリスクを伴います。

```php
'function_to_constant' => [
    'functions' => ['get_class', 'php_sapi_name', 'phpversion', 'pi']
],
```

![スクリーンショット 2017-11-30 21.06.22.png](https://qiita-image-store.s3.amazonaws.com/0/61095/59ee6ec9-4cca-963b-47e6-564095adc450.png)

## function_typehint_space

関数の返り値の型宣言にスペースが抜けていると補完する

```php
'function_typehint_space' => true,
```

![スクリーンショット 2017-11-30 21.09.35.png](https://qiita-image-store.s3.amazonaws.com/0/61095/21e87763-94cb-ce2b-9b37-8aac68a4ea2b.png)


## general_phpdoc_annotation_remove

特定のアノテーションを削除します

* デフォルトは`[]`です

```php
'general_phpdoc_annotation_remove' => [
    'annotations' => [
        'todo'
    ]
],
```

![スクリーンショット 2017-11-30 21.12.46.png](https://qiita-image-store.s3.amazonaws.com/0/61095/35b64c69-1950-df4c-3e9b-3b9a63bc900a.png)


## header_comment

ヘッダーコメントを追加、削除、変更します

* デフォルトで以下が設定されています。headerは必須項目なので必ず指定が必要です

```php
'header_comment' => [
    'commentType' => 'comment',
    'header' => '', // <== デフォルト指定なし指定必須項目
    'location' => 'after_declare_strict',
    'separate' => 'both',
]
```

**commentType**

| comment(default) | PHPDoc |
| --- | --- |
| ![スクリーンショット 2017-11-30 21.18.11.png](https://qiita-image-store.s3.amazonaws.com/0/61095/256fa6db-4a9a-1c1a-4c5b-a3e31fadad5c.png) | ![スクリーンショット 2017-11-30 21.22.25.png](https://qiita-image-store.s3.amazonaws.com/0/61095/e6f9a55f-4288-7b73-8e08-8717c97103cd.png) |


**location**

| after_declare_strict(default) | after_open |
| --- | --- |
| ![スクリーンショット 2017-11-30 21.25.36.png](https://qiita-image-store.s3.amazonaws.com/0/61095/f290cc74-f2a9-9fb6-d9a2-087fbf731901.png) | ![スクリーンショット 2017-11-30 21.25.48.png](https://qiita-image-store.s3.amazonaws.com/0/61095/1c605980-f952-1e6d-8dc3-b1b62450b497.png) |

**separate**

| both(default) | bottom | none | top |
| --- | --- | --- | --- |
| ![スクリーンショット 2017-11-30 21.18.11.png](https://qiita-image-store.s3.amazonaws.com/0/61095/256fa6db-4a9a-1c1a-4c5b-a3e31fadad5c.png) | ![スクリーンショット 2017-11-30 21.28.21.png](https://qiita-image-store.s3.amazonaws.com/0/61095/5b1af4db-0ea3-14a3-9b70-8cc05adf4ee9.png) | ![スクリーンショット 2017-11-30 21.28.12.png](https://qiita-image-store.s3.amazonaws.com/0/61095/45c57518-7f24-16a8-9b8d-081a276aa291.png) | ![スクリーンショット 2017-11-30 21.27.51.png](https://qiita-image-store.s3.amazonaws.com/0/61095/ff4e3893-0a4c-0902-7018-46320d2dba40.png) |

## heredoc_to_nowdoc

`heredoc` のうち変換可能なものを `nowdoc` に変換する

```php
'heredoc_to_nowdoc' => true,
```

![スクリーンショット 2017-11-30 21.35.03.png](https://qiita-image-store.s3.amazonaws.com/0/61095/59d7c58a-767f-09ae-e6da-dab7fd9ef3d9.png)

## include

`include`, `require`, ファイルパスは、単一のスペースで区切る必要があります。ファイルパスをカッコの中に入れないでください

```php
'include' => true,
```

![スクリーンショット 2017-11-30 21.39.55.png](https://qiita-image-store.s3.amazonaws.com/0/61095/5e062e05-d6b4-8a23-fb16-c12c41c1801b.png)


## increment_style

可能であれば、インクリメントおよびデクリメント演算子は`pre`,`post`で統一してを使用する必要があります。

* `pre`, `post`を指定できます。
* デフォルトは`pre`です

```php
'increment_style' => [
    'style' => 'post'
],
```

![スクリーンショット 2017-11-30 21.48.35.png](https://qiita-image-store.s3.amazonaws.com/0/61095/91949ecf-d28b-2638-ea49-6e5e98dad75c.png)

## indentation_type

コードインデントに定められたインデントを使用しなければいけない

* `@PSR2`,`@Symfony`でデフォルトで `true` が設定されます。

```php
'indentation_type' => true,
```

## is_null

`is_null($hoge)` を `null === $hoge`に置き換える

* `is_null()`をオーバーライドしている場合リスクを伴います
* 後述する`use_yoda_style`が`true`の場合はデフォルトが `true` で設定されます


```php
'is_null' => true,
```

## line_ending

全てのPHPファイルで同じ改行コードを使わなくてはいけない

* `@PSR2`,`@Symfony`でデフォルトで `true` が設定されます。

```php
'line_ending' => true,
```

## linebreak_after_opening_tag

開始タグの後ろに改行を入れて開始タグの行には記述がないようにする

```php
'linebreak_after_opening_tag' => true,
```

![スクリーンショット 2017-11-30 22.01.24.png](https://qiita-image-store.s3.amazonaws.com/0/61095/66122aae-b6e6-be97-fc11-e6bc59ea1d48.png)


## list_syntax (PHP >= 7.1)

listで使用する構造を統一します。

* デフォルトは`long`です

```php
'list_syntax' => [
    'syntax' => 'long'
],
```

| long(default) | short |
| --- | --- |
| ![スクリーンショット 2017-11-30 22.08.55.png](https://qiita-image-store.s3.amazonaws.com/0/61095/74ac6a46-da59-29ef-7fe7-3669eeb65c10.png) | ![スクリーンショット 2017-11-30 22.09.05.png](https://qiita-image-store.s3.amazonaws.com/0/61095/78af54c6-f33a-2859-88e8-48b5a1d7f121.png)  |


## lowercase_cast, lowercase_constants, lowercase_keywords

特定の記述を小文字で記述することを強制する

```php
'lowercase_cast' => true,
'lowercase_constants' => true,
'lowercase_keywords' => true,
```

|  | lowercase_cast | lowercase_constants | lowercase_keywords | 
| --- | --- | --- | --- |
| `@PSR2` | ---| true | true |
| `@Symfony` | true | true | true |
| 画像 | ![スクリーンショット 2017-11-30 22.14.23.png](https://qiita-image-store.s3.amazonaws.com/0/61095/e91f2132-84aa-9f46-4750-2faf45680056.png) | ![スクリーンショット 2017-11-30 22.17.37.png](https://qiita-image-store.s3.amazonaws.com/0/61095/b2813fd2-1c87-c9ce-2328-bc531465d942.png) | ![スクリーンショット 2017-11-30 22.18.12.png](https://qiita-image-store.s3.amazonaws.com/0/61095/b4274947-eb5a-48fb-6c33-11ca95be4aa0.png) |

## mb_str_functions

マルチバイト非対応関数をマルチバイト対応関数(mb_xxxx）に置き換える

- 該当の関数をオーバライドしていたときにリスクを伴います

```php
'mb_str_functions' => true,
```

![スクリーンショット 2017-12-02 0.52.53.png](https://qiita-image-store.s3.amazonaws.com/0/61095/58ba6f37-ebc8-0f99-987f-888be2217447.png)


## method_argument_space


メソッドの引数とメソッド呼び出しで、各カンマの前にスペースを禁止して、各カンマの後にスペースを求めます。
- ２つのオプションを持ち`@PSR2`,`@Symfony`でデフォルトでいかが指定されています

```php
'method_argument_space' => [
    'ensure_fully_multiline' => false,
    'keep_multiple_spaces_after_comma' => false,
],
```

**標準**

| 前方にはカンマを入れない | 後方にカンマを入れる |
| --- | --- |
| ![スクリーンショット 2017-12-02 1.06.36.png](https://qiita-image-store.s3.amazonaws.com/0/61095/ac483b47-e7fd-b6b6-7014-a9fcd0e260b6.png) | ![スクリーンショット 2017-12-02 1.06.52.png](https://qiita-image-store.s3.amazonaws.com/0/61095/29da5fcd-6db4-bbed-8dfc-61c4b5e179d9.png) | 



**ensure_fully_multiline**

複数行に渡るときには1行に引数一つとする

```php
'method_argument_space' => [
    'ensure_fully_multiline' => true,
],
```

 ![スクリーンショット 2017-12-02 1.06.59.png](https://qiita-image-store.s3.amazonaws.com/0/61095/095724ba-9c32-0a00-6ace-d616effc42ce.png)


**複数のスペースを許容する(falseで複数スペースを単一にする)**

```php
'method_argument_space' => [
    'keep_multiple_spaces_after_comma' => false,
],
```

![スクリーンショット 2017-12-02 1.06.44.png](https://qiita-image-store.s3.amazonaws.com/0/61095/3e34157e-ca21-540a-3046-462af4cc32c1.png)

## method_separation

メソッドの前後の分割は一行改行を強制する

- `@Symfony`でデフォルト`true`が指定されます

```php
'method_separation' => true,
```

![スクリーンショット 2017-12-02 1.15.07.png](https://qiita-image-store.s3.amazonaws.com/0/61095/00fb6b2e-88e3-4007-839d-537d00732ebb.png)


## modernize_types_casting

`intval`,`floatval`,`doubleval`,`strval`,`boolval`の関数をキャストに置き換えます

- `@Symfony:risky`でデフォルト`true`です
- 各関数をオーバライドしていたときはリスクを伴います


```php
'modernize_types_casting' => true,
```

![スクリーンショット 2017-12-02 1.20.31.png](https://qiita-image-store.s3.amazonaws.com/0/61095/cd466cbf-c7c4-96ed-c91b-4cda3cd8219e.png)

## native_function_invocation 

名前解決の速度を上げるために内部関数の前に`\`を付与する

- あらゆる関数をオーバライドしていたときにリスクを伴います

```php
'native_function_invocation' => [
    'exclude' => [],
],
```

![スクリーンショット 2017-12-02 1.28.49.png](https://qiita-image-store.s3.amazonaws.com/0/61095/00a41647-31d0-cccf-7aa8-d3bcbeea6506.png)

## new_with_braces

newを用いて生成したインスタンスには後方に丸括弧を必要とします

```php
'new_with_braces' => true,
```

![スクリーンショット 2017-12-02 1.32.25.png](https://qiita-image-store.s3.amazonaws.com/0/61095/4ad3b61f-3ca5-fbec-e485-334ce769930d.png)

## no_alias_functions

エイリアス関数の代わりに元の関数を使うように置き換えます

- エイリアス関数をオーバライドしていたときにリスクを伴います

```php
'no_alias_functions' => true,
```

![スクリーンショット 2017-12-02 1.37.14.png](https://qiita-image-store.s3.amazonaws.com/0/61095/7daca16b-d42f-1f93-45f7-306631217b64.png)


## no_blank_xxxxxx

```php
'no_blank_lines_after_class_opening' => true,
'no_blank_lines_after_phpdoc' => true,
'no_blank_lines_before_namespace' => true,
'no_break_comment' => true,
```

| | no_blank_lines_after_class_opening |  no_blank_lines_after_phpdoc| no_blank_lines_before_namespace | no_break_comment |
| --- | --- | --- | --- | --- |
| `@Symfony` | true |   | true | true | 
| `@PSR2` | | | |  true | 
| 画像 | ![スクリーンショット 2017-12-02 1.40.50.png](https://qiita-image-store.s3.amazonaws.com/0/61095/5c4ffcfb-7f3b-4c4d-53bf-9f616bf5b7d6.png) | ![スクリーンショット 2017-12-02 1.41.51.png](https://qiita-image-store.s3.amazonaws.com/0/61095/e1177f65-9156-57af-d86c-4edd3c37d425.png) | ![スクリーンショット 2017-12-02 1.43.56.png](https://qiita-image-store.s3.amazonaws.com/0/61095/0c73f4d6-1881-ed5a-0a0f-a6eb50026c58.png) | ![スクリーンショット 2017-12-02 1.44.54.png](https://qiita-image-store.s3.amazonaws.com/0/61095/7db75f57-69ff-2176-0f10-65030e4fa835.png) |


## no_closing_tag

phpのとじタグ`?>`はファイルの最後尾から削除します

- `@PRS2`,`@Symfony`でデフォルト`true`です

![スクリーンショット 2017-12-02 1.52.06.png](https://qiita-image-store.s3.amazonaws.com/0/61095/856ce40c-5844-a34c-0b7c-f01953d9c5b0.png)


## no_empty_comment, no_empty_phpdoc, no_empty_statement

空のコメントやphpdoc、ステートメントを削除します

- `@Symfony`でデフォルト`true`です

```php
'no_empty_comment' => true,
'no_empty_phpdoc' => true,
'no_empty_statement' => true,
```

| no_empty_comment  | no_empty_phpdoc | no_empty_statement |
| --- | --- | --- |
| ![スクリーンショット 2017-12-02 1.57.15.png](https://qiita-image-store.s3.amazonaws.com/0/61095/7586e6d9-de42-d2ea-cb82-e9c90d7c0e2b.png) | ![スクリーンショット 2017-12-02 1.56.59.png](https://qiita-image-store.s3.amazonaws.com/0/61095/2d41b75b-934c-90e6-0083-a848b5c775dd.png) | ![スクリーンショット 2017-12-02 1.56.52.png](https://qiita-image-store.s3.amazonaws.com/0/61095/0f4c981a-999b-037d-9bd5-1fb83039058e.png) |

## no_extra_consecutive_blank_lines

余計な改行を削除します


- `@Symfony`でデフォルトで以下が指定されます

```php
'no_extra_consecutive_blank_lines' => [
    'tokens' => ['extra']
],
```

![スクリーンショット 2017-12-02 2.01.36.png](https://qiita-image-store.s3.amazonaws.com/0/61095/5185eb4f-c061-779a-dbdf-be43d3bed227.png)

## no_leading_import_slash

`use`宣言先頭のバックスラッシュを削除します

- `@Symfony`でデフォルト`true`です


```php
'no_leading_import_slash' => true,
```

![スクリーンショット 2017-12-02 2.06.36.png](https://qiita-image-store.s3.amazonaws.com/0/61095/697de5fe-fe48-970b-3a98-741d9e267e1b.png)


## no_leading_namespace_whitespace

namespaceの前にスペースがあったとき削除します

- `@Symfony`でデフォルト`true`です

```php
'no_leading_namespace_whitespace' => true,
```

![スクリーンショット 2017-12-02 2.08.53.png](https://qiita-image-store.s3.amazonaws.com/0/61095/7c094c52-4c54-c4b8-e92f-99e422fa71cd.png)


## no_mixed_echo_print

`echo`と``print`のどちらかに記述を統一します

- `@Symfony`でデフォルト`echo`が指定されます

```php
'no_mixed_echo_print' => [
    'use' => 'echo'
],//
```

## no_multiline_whitespace_around_double_arrow

`=>`の前後で複数行になるスペースを禁止します

- `@Symfony`でデフォルト`true`です

```php
'no_multiline_whitespace_around_double_arrow' => true,
```

![スクリーンショット 2017-12-02 2.18.59.png](https://qiita-image-store.s3.amazonaws.com/0/61095/b6cad6f4-1d6e-5077-a19c-20c7208d75dc.png)


## no_multiline_whitespace_before_semicolons, no_singleline_whitespace_before_semicolons

セミコロンの前で複数行になるスペースを禁止します
`no_singleline_whitespace_before_semicolons`は1行でもセミコロンの前にスペースを置くことを禁止します

- `@Symfony`でデフォルト`true`です

```php
'no_multiline_whitespace_before_semicolons' => true,
'no_singleline_whitespace_before_semicolons' => true,
```

| no_multiline_whitespace_before_semicolons | no_singleline_whitespace_before_semicolons | 
| --- | --- |
|![スクリーンショット 2017-12-02 2.19.16.png](https://qiita-image-store.s3.amazonaws.com/0/61095/cc4858b0-bf76-7ae0-ce14-40b99168ad24.png) | ![スクリーンショット 2017-12-02 2.29.06.png](https://qiita-image-store.s3.amazonaws.com/0/61095/f67bf2ba-d5de-5ac6-0304-ff6203bf4a39.png) |

## no_php4_constructor

PHP4での形式の`__construct`を書き換えます

```php
'no_php4_constructor' => true,
```

## no_short_bool_cast

二重感嘆符を使った`bool`キャストを禁止します

- `@Symfony`でデフォルト`true`です

![スクリーンショット 2017-12-02 2.26.10.png](https://qiita-image-store.s3.amazonaws.com/0/61095/dc3e2b66-e79a-c4bf-1eed-bf712629c324.png)


## no_short_echo_tag

`<?=`の代わりにロングタグの`<?php echo`に置き換えます

## no_spaces_after_function_name

メソッド名の宣言後にメソッド名とカッコの間にスペースを入れてることを禁止します

- `@PRS2`,`@Symfony`でデフォルト`true`です

```php
'no_spaces_after_function_name' => true
```

![スクリーンショット 2017-12-02 2.30.51.png](https://qiita-image-store.s3.amazonaws.com/0/61095/e3c2e0f9-aa46-550a-728d-35b6d01ec3bf.png)


## no_spaces_inside_parenthesis

開始カッコの後と閉じカッコの前のスペースを削除します

- `@PRS2`,`@Symfony`でデフォルトで以下が指定されます

```php
'no_spaces_inside_parenthesis' => true,
```
![スクリーンショット 2017-12-02 2.42.26.png](https://qiita-image-store.s3.amazonaws.com/0/61095/1e443ef2-cb8d-36a4-f29c-0ffc7ca3eb77.png)

## no_superfluous_elseif, 
no_useless_else

（例えばreturnしている場合など）不要な`elseif`を`if`に置き換えます
不要な`else`を削除します


```php
'no_superfluous_elseif' => true,
'no_useless_else' => true,
```

| no_superfluous_elseif | no_useless_else |
| --- | --- |
![スクリーンショット 2017-12-02 2.44.27.png](https://qiita-image-store.s3.amazonaws.com/0/61095/3de148fb-c76f-ba40-b6dd-8d09cb2ed0fb.png) | ![スクリーンショット 2017-12-02 3.12.43.png](https://qiita-image-store.s3.amazonaws.com/0/61095/38bc4caa-e263-5585-33c3-b1292d5c869a.png) |


## no_trailing_comma_in_list_call

リスト関数で余計なカンマを削除します

- `@Symfony`でデフォルト`true`です

```php
'no_superfluous_elseif' => true,
```

![スクリーンショット 2017-12-02 2.48.45.png](https://qiita-image-store.s3.amazonaws.com/0/61095/82dbdabb-dc8e-13d7-7008-f79d8bd48cbe.png)


## no_trailing_comma_in_singleline_array

単一行で記述する配列で余計なカンマを削除します

- `@Symfony`でデフォルト`true`です


```php
'no_trailing_comma_in_singleline_array' => true,
```
![スクリーンショット 2017-12-02 2.49.57.png](https://qiita-image-store.s3.amazonaws.com/0/61095/6d432fe0-a1b3-86ed-fbc5-6bdbe33323c7.png)


## no_trailing_whitespace

末尾の空白行を削除する

- `@PRS2`,`@Symfony`でデフォルト`true`です

```php
'no_trailing_whitespace' => true,
```

![スクリーンショット 2017-12-02 2.53.47.png](https://qiita-image-store.s3.amazonaws.com/0/61095/de856958-44ed-260b-e950-35dbc601ee08.png)


## no_trailing_whitespace_in_comment

コメントとphpdoc内の余計な空白を削除する

- `@PRS2`,`@Symfony`でデフォルト`true`です

```php
'no_trailing_whitespace_in_comment' => true,
```

## no_unneeded_control_parentheses

制御構造の周囲にある余計な`( )`を削除します

- `@Symfony`でデフォルトで以下が指定されます

```php
'no_unneeded_control_parentheses' => [
    'statements' => ['break', 'clone', 'continue', 'echo_print', 'return', 'switch_case', 'yield']
],
```

![スクリーンショット 2017-12-02 2.58.09.png](https://qiita-image-store.s3.amazonaws.com/0/61095/5b0ea23e-801e-996e-ad02-a3084592506b.png)



## no_unneeded_curly_braces

コントール制御以外の不要な`{ }`を削除します。

- `@Symfony`でデフォルト`true`です


```php
'no_unneeded_curly_braces' => true,
```


## no_unneeded_final_method

`final`宣言されているクラス内で`final`宣言された関数から`final`を削除します

- `@Symfony`でデフォルト`true`です

```php
'no_unneeded_curly_braces' => true,
```

![スクリーンショット 2017-12-02 3.03.52.png](https://qiita-image-store.s3.amazonaws.com/0/61095/da9f211e-e900-f8aa-1726-d45c9a0102ed.png)

## no_unreachable_default_argument_value

デフォルト値が後続の引数で指定されていない場合は引数のデフォルト値を削除する

- 関数のシグネチャを変更します。したがって、それらに依存するシステム（例えば、リフレクションを通して）を使用している場合（Symfonyの一部のコンポーネントなど）ではリスクを伴います。

```php
'no_unreachable_default_argument_value' => true,
```

![スクリーンショット 2017-12-02 3.05.47.png](https://qiita-image-store.s3.amazonaws.com/0/61095/d742c6da-5d62-edf4-6f27-d54ab8ef4ed5.png)


## no_unused_imports

使っていないuse宣言を削除します。

- `@Symfony`でデフォルト`true`です

```php
'no_unused_imports' => true,
```
![スクリーンショット 2017-12-02 3.09.47.png](https://qiita-image-store.s3.amazonaws.com/0/61095/8b005b3d-5d64-9803-0385-c26cd1fcfd0c.png)

## no_useless_return

メソッド末尾で何も返さない`return`を削除します

```php
'no_useless_return' => true,
```

![スクリーンショット 2017-12-02 3.14.35.png](https://qiita-image-store.s3.amazonaws.com/0/61095/be6e4333-694c-e4c8-5a17-512167c61452.png)

## no_whitespace_before_comma_in_array

配列内で、カンマの前にスペースを禁止します

- `@Symfony`でデフォルト`true`です

```php
'no_whitespace_before_comma_in_array' => true,
```

![スクリーンショット 2017-12-02 3.17.27.png](https://qiita-image-store.s3.amazonaws.com/0/61095/25d2728e-1d86-3e64-a412-e862cac5ec6a.png)


## no_whitespace_in_blank_line

空白行でスペースを禁止します

- `@Symfony`でデフォルト`true`です

```php
'no_whitespace_in_blank_line' => true,
```

## non_printable_character ~ yoda_style

comming soon!!!


----


始めてみたら相当な量があり、想像以上のボリュームになってしまいました。
やりだしたら徹底的にやりたい性格なので12/2までに最後まで到達できませんでしたが、一番わかり易いリファレンスになるように最後は気合と意地で随時追記をしていきます。

ランサーズのアドベントカレンダーは[エンジニアブログ](https://engineer.blog.lancers.jp)を中心に引き続き各メンバーが公開していきます。
明日の担当は平成元年生まれの同い年で、ランサーズが誇るReactおじさん @numanomanu さんです！！ お楽しみに