狠狠撸

狠狠撸Share a Scribd company logo
PSR-1 と PSR-2 を
5分でざっくり理解する
2016-01-13 PHP BLT #2
GMOリサーチ 寺田 渉
Facebook:
twitter:
github:
寺田渉
@wa_terada
waterada
自己紹介(仕事)
- PHP (CakePHP) を主に使って開発
- 継続的インテグレーション
- github + git flow で運用
- PHPUnit で カバレッジ 100%
- Behat (Selenium Driver 経由の画面テスト) 利用
- vagrant で開発環境構築
自己紹介(趣味)
CakePHP 公式ドキュメント 翻訳
自己紹介(趣味)
ボードゲーム 翻訳
自己紹介(趣味)
TED 翻訳
プログラミング & 翻訳
大好き人間です
自己紹介
CakePHP に issue を立てて、
修正を pull request してみた
という記事を Qiita で公開致しました。
コーディングスタイル違反 の指摘が
結構ありまして、今一度、
PSR-1, PSR-2 を復習しておこう
と思った次第です。
PSR-1 基本コーディング規約
PSR-2 コーディングスタイル
今日、伝えたいこと!
サクッと理解してしまおう。
これから問題を出します。
2つの書き方が出ますので、
1 番が PSR 準拠 だと思ったら
手を挙げてください。
で、今日のルール
PSR-1
基本コーディング規約
まずは
<?php
$text = "abc";
どっちが準拠?
<?
$text = "abc";
1. 2.
<?php
$text = "abc";
どっちが準拠?
1.
<?php か <?= のみ可!
どっちが準拠?
1.
2.
PHP ファイルは...
BOM付き UTF-8
BOM無し UTF-8
どっちが準拠?
PHP ファイルは...
BOM無しで!
2. BOM無し UTF-8
<?php
$aaa = 1;
どっちが準拠?
<?php
$aaa = 1;
define('AAA', 1);
1. 2.
aaa_config.php
<?php
define('AAA', 1);
aaa_define.php
aaa.php
どっちが準拠?
呼んだだけで動く(副作用有)系 と、
宣言系 は一緒のファイルに書いちゃダメ。
1.
<?php
$aaa = 1;
aaa_config.php
<?php
define('AAA', 1);
aaa_define.php
class xAbc extends ...
どっちが準拠?
class XAbc extends ...
1.
2.
どっちが準拠?
クラス は 大文字始まり!
class XAbc extends ...2.
public function getValue()
どっちが準拠?
public function get_value()
1.
2.
どっちが準拠?
メソッド は 小文字始まりのキャメル。
public function getValue()1.
const MAX_VALUE = 1;
どっちが準拠?
const maxValue = 1;
1.
2.
どっちが準拠?
定数 は 大文字!
const MAX_VALUE = 1;1.
PSR-2
コーディングスタイル
次に
$a = TRUE;
どっちが準拠?
$a = true;
1. 2.
どっちが準拠?
予約語 は 小文字で !
$a = true;
2.
public function getValue()
どっちが準拠?
public function getValue()
1.
2.
^^^^ スペース4つ でインデント
^^^^ TAB でインデント
どっちが準拠?
インデント は 半角スペース で!
1. public function getValue()
^^^^ スペース4つ でインデント
}[EOF]
どっちが準拠?
}
[EOF]
1.
2.
ファイルの末尾に改行なし
ファイルの末尾に改行あり
どっちが準拠?
末尾の改行 必須!
}
[EOF]
2.
ファイルの末尾に改行あり
namespace AaaBbb;
use AaaCcc;
class Ddd extends ...
どっちが準拠?
namespace AaaBbb;
use AaaCcc;
class Ddd extends ...
1.
2.
← 空白行
← 空白行
← 空白行
どっちが準拠?
namespace、use、class の間には
空白行!
1.
namespace AaaBbb;
use AaaCcc;
class Ddd extends ...
← 空白行
← 空白行
class Foo
{
public function get()
{
どっちが準拠?
class Foo {
public function get() {
1.
2.
どっちが準拠?
クラス, メソッド の { の前では 改行!
1. class Foo
{
public function get()
{
if ($aaa)
{
どっちが準拠?
if ($aaa) {
1.
2.
どっちが準拠?
if の { の前では改行 しない!
if ($aaa) {2.
$f = function()
{
どっちが準拠?
$f = function() {
1.
2.
どっちが準拠?
クロージャ の { の前では改行 しない!
$f = function() {2.
$a = function() { return 1; };
どっちが準拠?
1.
2.
$a = function() {
return 1;
};
どっちが準拠?
クロージャの { と } が 同じ行ではダメ!
2.
$a = function() {
return 1;
};
public static function is()
どっちが準拠?
1.
2.
abstract public function is();
static public function is()
public abstract function is();
どっちが準拠?
この順 で!
public static function is()1.
abstract public function is();
if ($a) {
どっちが準拠?
1.
2. if($a){
どっちが準拠?
空白必須!
if ($a) {1.
for ($i = 0 ; $i < 3 ; $i++) {
どっちが準拠?
1.
2. for ($i = 0; $i < 3; $i++) {
どっちが準拠?
; の前 に空白 不要!
2. for ($i = 0; $i < 3; $i++) {
$a = function ($a, $b) use ($c) {
どっちが準拠?
1.
2.
$a = function($a, $b) use($c) {
どっちが準拠?
クロージャの function, use の前後 に
空白 必須!
$a = function ($a, $b) use ($c) {
1.
class A extends B implements
C,
D
{
どっちが準拠?
1.
class A
extends B
implements C, D
{
2.
どっちが準拠?
class, extends, implements は
絶対に 同じ行 !
interface を改行で書くなら1行1つ!
(※改行せずに全てを1行にしてもいい。)
class A extends B implements
C,
D
{
1.
public function abc(
$a, $b)
{
どっちが準拠?
1.
public function abc(
$a,
$b
) {
2.
どっちが準拠?
public function abc(
$a,
$b
) {
2.
複数行にするなら 1行につき1引数まで!
$array = array_map(
function ($arg) use ($var) {
// ...
},
$array
);
どっちが準拠?1.
$array = array_map(function ($arg) use ($var) {
// ...
}, $array);
2.
どっちが準拠?
クロージャは 必ず改行することになる ので
上記のようなパターン になる!
$array = array_map(
function ($arg) use ($var) {
// ...
},
$array
);
1.
switch ($expr) {
case 1:
echo 'A';
// no break
case 2:
case 3:
echo 'B';
break;
}
どっちが準拠?
1. 2.
switch ($expr) {
case 1:
echo 'A';
case 2:
case 3:
echo 'B';
break;
}
どっちが準拠?
空でないcase でわざと breakしない なら
その旨の コメント必須 !
switch ($expr) {
case 1:
echo 'A';
// no break
case 2:
case 3:
echo 'B';
break;
}
1.
以上、ご静聴ありがとうございました。
<?php か <?= のみ
BOM無し UTF-8
副作用有無でファイル分ける
大小文字: クラス名
大小文字: メソッド名
大小文字: 定数名
大小文字: true/false/null
インデント
ファイル末尾の改行
namespace 周りの空行
{}の改行: クラス/メソッド
Facebook:
twitter:
github:
寺田渉
@wa_terada
waterada
{}の改行: if
{}の改行: クロージャ {
{}の改行: クロージャ }
static/abstractの位置
前後の空白: if
前後の空白: for
前後の空白: クロージャ
複数行: クラス
複数行: 引数
複数行: 引数でクロージャ
switch でコメント必須
参考情報:
? 承諾された PSR が置いてある公式github
? PSR-1 (英語)
? PSR-2 (英語)
? 上記を翻訳してくれているサイト
(infinite loop様の技術ブログ)
? PSR-1 (日本語)
? PSR-2 (日本語)

More Related Content

PSR-1 と PSR-2 を 5分でざっくり理解する