【PSR】PHPの標準コーディング規約


# PSR-0
オートローダーのためのコーディング規約
## 名前空間の命名規則
アルファベットの大文字小文字は自由

```
\<Vendor Name>\(<Namespace>\)*<Class Name>
```

### VendorName
名前空間を汚さないために、固有のベンダー名を最初に付ける。

### Namespace
自由に名前空間をつけていい。

### ClassName
クラス名にアンダースコアが含まれる場合、「DIRECTORY_SEPARATOR」に変換されファイルパスとする。「.php」を付けてファイルパスとする。

### Namespaceの区切り文字について
名前空間の区切り文字は「DIRECTORY_SEPARATOR」に変換されファイルパスとする。上記ルールで作成された、ファイルパスを元に対象ファイルを探してオートロードする。


# PSR-1
基本的なコーディング規約

## PHPタグ
* <?php か <?= のどちらかを仕様しなければならない。

## 文字コード
UTF-8のBOM無しを利用する。
※BOMについては[こちら](http://www.php-factory.net/trivia/03.php)

## 名前空間とクラス名
PSR-0に準拠する。クラスはそれぞれ単独でファイルに存在し、少なくとも1レベルの名前空間に属する。クラス名はStudlyCaps記法で記述する（各単語の先頭文字を大文字とする記法）

## クラス定数
全て大文字で、区切り文字はアンダースコアで記述する。

``` php:xxx.php
<?php
namespace Vendor\Model;

class Foo
{
    const VERSION = '1.0';
    const DATE_APPROVED = '2012-06-01';
}
``` 

## プロパティ
StudlyCaps記法、camelCase記法、under_score記法のどれで記述するかは自由。しかし、ベンダーレベル、パッケージレベル、クラスレベル、メソッドレベルでは統一が取れているべき。

## メソッド
* camelCase記法で記述する。
* 全てのメソッドにアクセス権を設定
* アンダースコアを前置してアクセス権を表現しない

## 副作用
クラスの定義と、読み込んだだけで何かしらの影響を与える事を同一ファイルに記述しない。「副作用」とは、クラス、関数、定数を宣言するのに直接関係しない処理が、単にファイルを取り込んだだけで実行されてしまう事。
ex)以下、推奨されない書き方

``` php:xxx.php
<?php
// 副作用: iniの設定を変更しています
ini_set('error_reporting', E_ALL);

// 副作用: ファイルを読み込んでいます
include "file.php";

// 副作用: 出力を生成しています
echo "<html>\n";

// 宣言
function foo()
{
    // 関数本体
}

ex)推奨される書き方
```

```php:ok.php
<?php
// 宣言
function foo()
{
    // 関数本体
}

// 条件付きの宣言は副作用では*ありません*
if (! function_exists('bar')) {
    function bar()
    {
        // 関数本体
    }
}
```

# PSR-2
コーディングスタイル規約（PSR-1準拠が前提）。複数メンバーがコードを読む際の認識のずれを抑えることが目的。


```php:xxx.php
<?php
namespace Vendor\Package;

use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class Foo extends Bar implements FooInterface
{
    public function sampleFunction($a, $b = null)
    {
        if ($a === $b) {
            bar();
        } elseif ($a > $b) {
            $foo->bar($arg1);
        } else {
            BazClass::bar($arg2, $arg3);
        }
    }

    final public static function bar()
    {
        // メソッド本文
    }
}
```






## ファイル
* 改行コードはLFを使用。
* ファイルの最後に空行を入れる。
* ?> 省略する。

## 行
* 120文字でゆるい文字数制限（絶対的な文字数制限はしない）を設ける。
* 1行は80文字以内にするべき、80文字を越える場合は複数行に改行する。
* 行末に空白文字列を記述してはいけない。
* 読みやすくしたり、関連性を示すために適度に空行を加えてかまわない。
* 1行は1ステートメントにする。

## インデント
4つのスペースを使用する（タブを使用してはいけない）

## 予約後とTrue/False/Null
* 予約語は小文字で記述する。
* PHPのコンスタント値「true」「false」「null」は小文字で記述する。

## 名前空間とuseによる定義
* 名前空間の定義の後に空行を1行設ける。
* useは、名前空間宣言の後に記述する。
* 宣言1つずつuse を記述する。
* useブロックの後に空行を1行設ける。

## クラス、extends、Implements
* extendsとimplementsは、クラス名と同じ行で記述する。
* 開きカッコ { は次の行に記述。
* 閉じカッコ } は内容を記述した次の行に記述する。
* 開きカッコの後、閉じカッコの前にスペースは記述しない。


```php:xxx.php

<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
    // constants, properties, methods
}


```



## メソッドの引数
* 引数は、それぞれのカンマの前にスペースを記述しない。
* また、カンマの後ろには1つスペースを記述する。
* デフォルト値は、引数リストの最後に記述する。
* 引数は、インデントで揃えて複数行にまたがるように記述してもよい。その場合は、最初の記述も次の行からはじめて1行に1つの引数を記述する。
* 引数を複数行に記述した場合は、引数のとじカッコ ) とメソッドの開きカッコ { はスペースを挟んで同じ行に記述する。
* デフォルト値のある引数はリストの最後に記述する。


## abstruct, final, static
* abstruct, finalはアクセス修飾子の前に記述する。
* staticはアクセス修飾子の後ろに記述する。

## メソッド、関数呼び出し
* メソッド、関数呼び出し時は、開きカッコ ( の前にスペースを記述してはいけない。
* 開きカッコ ( の後ろ、閉じカッコ ) の前にもスペースを記述してはいけない。
* 引数の前にスペースｗ記述をしてはいけない。
* 各カンマの後ろにスペースを1つ記述する。
* 引数は、インデントにより揃える事で複数行に記述してもよい。その場合は、最初の記述も次の行からはじめて1行に1つの引数を記述する。

## if, elseif, else 
* ifの後ろにスペースを記述する。
* elseif, elseの前後にスペースを記述する。
* 開きカッコ { , 閉じカッコ } は、if, elseif, elseと同じ行に記述する。
* 最後のとじカッコは本文の最後の次の行に記述する。

## switch case
* switch, caseの後ろにスペースを1つあける。
* case文はswitch文からインデントする。
* breakはcase文の中の本文と同じインデントで記述する。
* 意図的にbreakを記述せずに処理をスルーさせる場合は、「//no break」のようにコメントを記述する。
* 最後の閉じカッコは本文の最後の次の行に記述する。


## while, do while
* whileの後ろにスペースを1つ記述。
* 開きカッコはwhileと同じ行に記述。
* doの後ろにスペースを1つ記述。
* do-whileの場合、whileの前後にスペースを1つ記述。
* 最後のとじカッコは本文の次の行に記述。

## for, foreach
* for, foreachの後ろに1つスペースを記述。
* (forの場合)セミコロンの後ろは1つスペースを記述。
* 開きカッコ { はforと同じ行に記述。
* 最後の閉じカッコは本文の最後の次の行に記述。

## try, catch
* tryの後ろに1つスペースを記述。
* catchの前後に1つスペースを記述。
* try,catchと同じ行に開きカッコ、閉じカッコは記述。
* 最後の閉じカッコは本文の最後の行に記述。

## Closure
* functionの後ろにスペースを1つ記述する。
* useの前後にスペースを1つ記述する。
* 開きカッコはfunctionと同じ行に記述する。
* 最後の閉じカッコは本文の最後の次の行に記述する。
* 引数の開きカッコの後ろにスペースを記述してはいけない。
* 引数の閉じカッコの前にスペースを記述してはいけない。
* 引数の前にスペースは記述してはいけない。
* 引数の各カンマの後はスペースを記述する。
* デフォルトの値を持つ引数は最後に記述する。
* 引数は、インデントにより揃えて複数行に記述してもよい。その場合は、最初の記述も次の行からはじめて1行に1つの引数を記述する。
引数を複数行に記述する場合、開きカッコ「{」は引数の閉じカッコ「)」と同じ行に記述する。
* クロージャが引数に直接記述された場合も同様のルールとなる。


参考
http://www.infiniteloop.co.jp/docs/psr/psr-1-basic-coding-standard.html
http://www.slideshare.net/yandod/psrphp