新標準PSRに学ぶ
 きれいなPHP

  Fukuoka.php / Yusuke Ando (@yando)
Fukuoka.php / Yusuke Ando (@yando)
福岡でのボランティア急募!
  Fukuoka.php / Yusuke Ando (@yando)
Fukuoka.php / Yusuke Ando (@yando)
こんな経験はありませんか?




  Fukuoka.php / Yusuke Ando (@yando)
同僚のコードが読みづらい

  Fukuoka.php / Yusuke Ando (@yando)
タブ派とスペース派の凄惨な勢力争い

    Fukuoka.php / Yusuke Ando (@yando)
ネーミングでもめる

 Fukuoka.php / Yusuke Ando (@yando)
コーディング規約が必要!




 Fukuoka.php / Yusuke Ando (@yando)
Fukuoka.php / Yusuke Ando (@yando)
PEAR                      Zend


                俺々

Symfony                     CakePHP




   Fukuoka.php / Yusuke Ando (@yando)
たくさんあって
どれがいいかわからない



 Fukuoka.php / Yusuke Ando (@yando)
PSR




Fukuoka.php / Yusuke Ando (@yando)
PSRはPHP figが策定した
    今風なPHPの
  コーディング規約!


  Fukuoka.php / Yusuke Ando (@yando)
www.php-fig.org




Fukuoka.php / Yusuke Ando (@yando)
豪華なメンバー陣
Nate Abele: Lithium                      Robert Lemke: FLOW3
Nils Adermann: phpBB                     Larry Masters: CakePHP, CakePHP 2
Brett Bieber: PEAR, PEAR2                Ryan Parman: Amazon Web Services
Guilherme Blanco: Doctrine, Doctrine2,   SDK
et al.                                   Evert Pot: SabreDAV
Jordi Boggiano: Composer, Packagist      Fabien Potencier: Symfony, Symfony2
Karma Dordrak: Zikula                    Andre Romcke: eZ Publish
Paul Dragoonis: PPI, PPI2                Paul Scott: Chisimba, C4
William Durand: Propel, Propel 2         Phil Sturgeon: PyroCMS
Andrew Eddie: Joomla                     Kris Wallsmith: Assetic, Buzz
Cal Evans: the community at large        Matthew Weier O'Phinney: Zend
Larry Garfield: Drupal                    Framework, Zend Framework 2
Paul M. Jones: Solar Framework, Aura     David Zülke: Agavi
Project



                  Fukuoka.php / Yusuke Ando (@yando)
PSRとは?

•Proposing a Standards Recommendation
 (標準勧告提案)
•PSR-0
 オートロードの為のファイル名とクラス名の規約
•PSR-1
 共有コードの高レベルな連携性を目的にした規約
•PSR-2
 標準化されたコードを目指すスタイルガイド

      内容毎にレベル分けがされている
          Fukuoka.php / Yusuke Ando (@yando)
PSR-0
オートロードの為のファイルとクラスの規約



    Fukuoka.php / Yusuke Ando (@yando)
PSR-0

•名前空間はベンダー名から必ず始める
•名前空間の区切りはディレクトリ階層になる
•クラス名内のアンダースコアはディレクトリ階層になる
•名前空間とクラス名に.phpをつけてファイル名とする
•名前空間とクラス名の大文字小文字については不問



  PHP5.3と名前空間にスマートに対応

     Fukuoka.php / Yusuke Ando (@yando)
PSR-0の例




対象は名前空間、クラス名、ファイル名のみ

    Fukuoka.php / Yusuke Ando (@yando)
autoloadの実装例




require_once地獄とさようなら
  Fukuoka.php / Yusuke Ando (@yando)
PSR-1
相互に機能を連携させる為の規約



 Fukuoka.php / Yusuke Ando (@yando)
File

•PHPコードは長い <?php ?> タグか <?= ?> を使わなけれ
ばならない。それ以外のタグを使ってはならない
•PHPコードはBOMなしUTF-8を使う
•ファイルはクラスや関数などの定義を行いその他の副作用
があってはならない。または副作用のある処理を行うが定
義と処理を同時に行なってはならない




        Fukuoka.php / Yusuke Ando (@yando)
副作用のダメな例




Fukuoka.php / Yusuke Ando (@yando)
副作用のセーフな例




Fukuoka.php / Yusuke Ando (@yando)
名前空間とクラス

•PSR-0に準拠する
•クラス名はStudlyCapsで宣言する
•PHP5.3以降では必ず名前空間を使う



•PHP5.2以前の場合は擬似名前空間を使う



       Fukuoka.php / Yusuke Ando (@yando)
定数、プロパティ、メソッド
•定数は全て大文字記述しアンダースコアで単語を区切る




•プロパティについては敢えて言及していない
 StudlyCaps camelCase under_score など
•メソッドは camelCaseで宣言する



          Fukuoka.php / Yusuke Ando (@yando)
PSR-2
標準化されたPHPコードの為の規約



  Fukuoka.php / Yusuke Ando (@yando)
基本

•PSR-1に準拠
•全てのPHPファイルは改行にLFを使わなければならない
•ファイルの末尾は一行の空行で終わらなければならない
•ファイルがPHPのみの場合 ?> は省略せねばならない




      Fukuoka.php / Yusuke Ando (@yando)
Line

•ハードリミットは設けない
•ソフトリミットは120文字で、警告の対象
•行は80文字以内であるべき、越える場合は複数行に分割
•行の末尾に空白を付けてはならない
•可読性の為に空行を加えてもよい
•1行に複数のステートメントがあってはならない




      Fukuoka.php / Yusuke Ando (@yando)
インデント



•インデントはスペース4つ、タブを使ってはならない




      Fukuoka.php / Yusuke Ando (@yando)
キーワード



•キーワードは小文字で記述しなければならない
•true false null は小文字で記述しなければならない




        Fukuoka.php / Yusuke Ando (@yando)
名前空間
•名前空間の定義の後には空行を1行置く
•use宣言は名前空間宣言の後に置く
•宣言ごとに1つづつのuseを使う
•useのブロックの後に空行を1行置く




     Fukuoka.php / Yusuke Ando (@yando)
クラス
•extendsとimplementsはクラス定義と同じ行
•開きブレースは単独の行に、閉じブレースは内容の次の行




      Fukuoka.php / Yusuke Ando (@yando)
プロパティ
•全てのプロパティにアクセス権を設定
•varキーワードは使ってはならない
•1ステートメントに複数のプロパティを含めない
•アンダースコアを前置してアクセス権を表現しない




      Fukuoka.php / Yusuke Ando (@yando)
メソッド
•全てのメソッドにアクセス権を設定
•アンダースコアを前置してアクセス権を表現しない
•メソッド名宣言の後に空白を置かない、括弧の前後にス
ペースを置かない、ブレースは独立した行にする




     Fukuoka.php / Yusuke Ando (@yando)
メソッドの引数
•引数リストのカンマの前に空白を置かない
•カンマの後には空白を1つ置く
•デフォルトのある引数はリストの最後に置く




     Fukuoka.php / Yusuke Ando (@yando)
メソッドの引数2
•引数リストを複数行にしてインデントしてもよい
•その場合は閉じ括弧と開きブレースを同じ行に




      Fukuoka.php / Yusuke Ando (@yando)
abstract final static
•abstract finalアクセス権の前に置く
•staticはアクセス権の後に置く




        Fukuoka.php / Yusuke Ando (@yando)
メソッドと関数の呼出
•メソッド名と括弧の間に空白を置かない
•括弧の後に空白を置かない
•カンマの前に空白を置かない カンマの後に空白を置く
•引数リストを複数行にインデントして分割もできる




     Fukuoka.php / Yusuke Ando (@yando)
制御構造
•キーワードの後に空白を1つ置く
•開き括弧の後と閉じ括弧の前に空白を置かない
•閉じ括弧と開きブレースの間には空白を1つ置く
•メインのブロックは1レベルインデントする
•閉じブレースはメインのブロックの直後




      Fukuoka.php / Yusuke Ando (@yando)
if elseif else
•else elseif とブレースは同じ行
•else ifではなく elseif を使うべき




         Fukuoka.php / Yusuke Ando (@yando)
switch case
•caseはswitchからインデント 内容やbreakもインデント
•意図的に何もしないcaseにはコメント




       Fukuoka.php / Yusuke Ando (@yando)
while do while
•特筆事項なし




      Fukuoka.php / Yusuke Ando (@yando)
for foreach
•特筆事項なし




      Fukuoka.php / Yusuke Ando (@yando)
try catch
•特筆事項なし




      Fukuoka.php / Yusuke Ando (@yando)
クロージャ
•function の後に空白を1つ置く useの前後に空白
•開き括弧の後、閉じ括弧の前に空白を置かない
•カンマの前に空白を置かない、カンマの後に空白を置く




      Fukuoka.php / Yusuke Ando (@yando)
クロージャ2
•引数、変数のリストを複数行にしてもよい




      Fukuoka.php / Yusuke Ando (@yando)
その他
•下記の点についてはPSRー2はあえて言及していない
 •グローバル変数と定数の定義
 •関数の定義
 •演算と代入
 •間の行の配置
 •コメントとドキュメントブロック
 •クラスのプリフィクスとサフィックス
 •ベストプラクティス



      Fukuoka.php / Yusuke Ando (@yando)
おまけ
•PSR-2では著名なプロジェクトへの統計調査が行われた




      Fukuoka.php / Yusuke Ando (@yando)
質問?




Fukuoka.php / Yusuke Ando (@yando)

新標準PSRに学ぶきれいなPHP