PSR-1 と PSR-2 を5分でざっくり理解する
-
Upload
wataru-terada -
Category
Technology
-
view
4.489 -
download
0
Transcript of PSR-1 と PSR-2 を5分でざっくり理解する
PSR-1 と PSR-2 を5 分でざっくり理解する
2016-01-13 PHP BLT #2
GMO リサーチ
寺田 渉
Facebook:twitter:github:
寺田渉@wa_teradawaterada
自己紹介(仕事)
- PHP ( CakePHP ) を主に使って開発- 継続的インテグレーション- github + git flow で運用- PHPUnit で カバレッジ 100%- Behat ( Selenium Driver 経由の画面テスト) 利用- vagrant で開発環境構築
自己紹介(趣味)
CakePHP 公式ドキュメント 翻訳
自己紹介(趣味)
ボードゲーム 翻訳
プログラミング & 翻訳大好き人間です
自己紹介
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-8BOM 無し UTF-8
どっちが準拠?
PHP ファイルは ...
BOM 無しで!
2. BOM 無し UTF-8
<?php$aaa = 1;
どっちが準拠?
<?php$aaa = 1;
define('AAA', 1);
1. 2.aaa_config.php
<?phpdefine('AAA', 1);
aaa_define.php
aaa.php
どっちが準拠?
呼んだだけで動く ( 副作用有 ) 系 と、宣言系 は一緒のファイルに書いちゃダメ。
1.
<?php$aaa = 1;
aaa_config.php
<?phpdefine('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 Aaa\Bbb;
use Aaa\Ccc;
class Ddd extends ...
どっちが準拠?
namespace Aaa\Bbb;use Aaa\Ccc;
class Ddd extends ...
1.
2.
← 空白行
← 空白行
← 空白行
どっちが準拠?
namespace 、 use 、 class の間には空白行!
1.
namespace Aaa\Bbb;
use Aaa\Ccc;
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_teradawaterada
{} の改行 : if{} の改行 : クロージャ {{} の改行 : クロージャ }static/abstract の位置前後の空白 : if前後の空白 : for前後の空白 : クロージャ複数行 : クラス複数行 : 引数複数行 : 引数でクロージャswitch でコメント必須
参考情報 :
• 承諾された PSR が置いてある公式github• PSR-1 ( 英語 )• PSR-2 ( 英語 )
• 上記を翻訳してくれているサイト(infinite loop 様の技術ブログ )• PSR-1 ( 日本語 )• PSR-2 ( 日本語 )