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

57
PSR-1 と PSR-2 と 5 とととととととととと 2016-01-13 PHP BLT #2 GMO とととと とと と Facebook: twitter: github: ととと @ wa_terada waterada

Upload: wataru-terada

Post on 09-Jan-2017

4.489 views

Category:

Technology


0 download

TRANSCRIPT

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

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

2016-01-13 PHP BLT #2

GMO リサーチ

寺田 渉

Facebook:twitter:github:

寺田渉@wa_teradawaterada

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

自己紹介(仕事)

- PHP ( CakePHP ) を主に使って開発-  継続的インテグレーション- github + git flow  で運用- PHPUnit  で カバレッジ 100%- Behat  ( Selenium Driver 経由の画面テスト) 利用- vagrant  で開発環境構築

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

自己紹介(趣味)

CakePHP 公式ドキュメント 翻訳

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

自己紹介(趣味)

ボードゲーム 翻訳

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

プログラミング & 翻訳大好き人間です

自己紹介

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

CakePHP に issue を立てて、修正を pull request してみた

という記事を Qiita で公開致しました。

コーディングスタイル違反 の指摘が結構ありまして、今一度、

PSR-1, PSR-2 を復習しておこうと思った次第です。

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

PSR-1 基本コーディング規約PSR-2 コーディングスタイル

今日、伝えたいこと!

サクッと理解してしまおう。

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

これから問題を出します。

2つの書き方が出ますので、1 番が PSR 準拠 だと思っ

たら手を挙げてください。

で、今日のルール

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

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

まずは

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

<?php$text = "abc";

どっちが準拠?

<?$text = "abc";

1. 2.

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

<?php$text = "abc";

どっちが準拠?

1.

<?php か <?= のみ可!

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

どっちが準拠?

1.

2.

PHP ファイルは ...

BOM 付き UTF-8BOM 無し UTF-8

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

どっちが準拠?

PHP ファイルは ...

BOM 無しで!

2. BOM 無し UTF-8

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

<?php$aaa = 1;

どっちが準拠?

<?php$aaa = 1;

define('AAA', 1);

1. 2.aaa_config.php

<?phpdefine('AAA', 1);

aaa_define.php

aaa.php

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

どっちが準拠?

呼んだだけで動く ( 副作用有 ) 系 と、宣言系 は一緒のファイルに書いちゃダメ。

1.

<?php$aaa = 1;

aaa_config.php

<?phpdefine('AAA', 1);

aaa_define.php

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

class xAbc extends ...

どっちが準拠?

class XAbc extends ...

1.

2.

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

どっちが準拠?

クラス は 大文字始まり!

class XAbc extends ...2.

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

public function getValue()

どっちが準拠?

public function get_value()

1.

2.

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

どっちが準拠?

メソッド は 小文字始まりのキャメル。

public function getValue()

1.

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

const MAX_VALUE = 1;

どっちが準拠?

const maxValue = 1;

1.

2.

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

どっちが準拠?

定数 は 大文字!

const MAX_VALUE = 1;1.

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

PSR-2コーディングスタイル

次に

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

$a = TRUE;

どっちが準拠?

$a = true;1. 2.

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

どっちが準拠?

予約語 は 小文字で !

$a = true;2.

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

public function getValue()

どっちが準拠?

public function getValue()

1.

2.

^^^^ スペース4つ でインデント

^^^^ TAB でインデント

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

どっちが準拠?

インデント は 半角スペース で!

1. public function getValue()^^^^ スペース4つ でインデント

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

}[EOF]

どっちが準拠?

}[EOF]

1.

2.

ファイルの末尾に改行なし

ファイルの末尾に改行あり

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

どっちが準拠?

末尾の改行 必須!

}[EOF]

2.

ファイルの末尾に改行あり

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

namespace Aaa\Bbb;

use Aaa\Ccc;

class Ddd extends ...

どっちが準拠?

namespace Aaa\Bbb;use Aaa\Ccc;

class Ddd extends ...

1.

2.

← 空白行

← 空白行

← 空白行

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

どっちが準拠?

namespace 、 use 、 class の間には空白行!

1.

namespace Aaa\Bbb;

use Aaa\Ccc;

class Ddd extends ...

← 空白行

← 空白行

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

class Foo{ public function get() {

どっちが準拠?

class Foo { public function get() {

1.

2.

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

どっちが準拠?

クラス , メソッド の { の前では 改行!

1. class Foo{ public function get() {

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

if ($aaa){

どっちが準拠?

if ($aaa) {

1.

2.

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

どっちが準拠?

if の { の前では改行 しない!

if ($aaa) {2.

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

$f = function(){

どっちが準拠?

$f = function() {

1.

2.

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

どっちが準拠?

クロージャ の { の前では改行 しない!

$f = function() {2.

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

$a = function() { return 1; };

どっちが準拠?

1.

2.$a = function() { return 1;};

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

どっちが準拠?

クロージャの { と } が 同じ行ではダメ!

2.$a = function() { return 1;};

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

public static function is()

どっちが準拠?

1.

2.

abstract public function is();

static public function is()public abstract function is();

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

どっちが準拠?

この順 で!

public static function is()

1.

abstract public function is();

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

if ($a) {

どっちが準拠?

1.

2. if($a){

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

どっちが準拠?

空白必須!

if ($a) {1.

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

for ($i = 0 ; $i < 3 ; $i++) {

どっちが準拠?

1.

2. for ($i = 0; $i < 3; $i++) {

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

どっちが準拠?

; の前 に空白 不要!

2. for ($i = 0; $i < 3; $i++) {

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

$a = function ($a, $b) use ($c) {

どっちが準拠?

1.

2.$a = function($a, $b) use($c) {

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

どっちが準拠?

クロージャの function, use の前後 に空白 必須!

$a = function ($a, $b) use ($c) {

1.

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

class A extends B implements C, D{

どっちが準拠?

1.

class A extends B implements C, D{

2.

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

どっちが準拠?

class, extends, implements は絶対に 同じ行 !interface を改行で書くなら1行1つ!(※改行せずに全てを1行にしてもいい。)

class A extends B implements C, D{

1.

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

public function abc( $a, $b){

どっちが準拠?1.

public function abc( $a, $b) {

2.

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

どっちが準拠?

public function abc( $a, $b) {

2.

複数行にするなら 1行につき1引数まで!

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

$array = array_map( function ($arg) use ($var) { // ... }, $array);

どっちが準拠?1.

$array = array_map(function ($arg) use ($var) { // ...}, $array);

2.

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

どっちが準拠?

クロージャは 必ず改行することになる ので上記のようなパターン になる!

$array = array_map( function ($arg) use ($var) { // ... }, $array);

1.

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

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;}

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

どっちが準拠?

空でない case でわざと break しない ならその旨の コメント必須 !

switch ($expr) { case 1: echo 'A'; // no break case 2: case 3: echo 'B'; break;}

1.

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

以上、ご静聴ありがとうございました。

<?php か <?= のみBOM 無し UTF-8副作用有無でファイル分ける大小文字 : クラス名大小文字 : メソッド名大小文字 : 定数名大小文字 : true/false/nullインデントファイル末尾の改行namespace 周りの空行{} の改行 : クラス / メソッド

Facebook:twitter:github:

寺田渉@wa_teradawaterada

{} の改行 : if{} の改行 : クロージャ {{} の改行 : クロージャ }static/abstract の位置前後の空白 : if前後の空白 : for前後の空白 : クロージャ複数行 : クラス複数行 : 引数複数行 : 引数でクロージャswitch でコメント必須