PSR-2(コーディングスタイルガイド)の日本語訳と解説

PSR-2はコーディングスタイルについての規約になります。PSR-1はファイルの分け方や、オートローディングに伴うクラスの命名等でしたが、PSR-2はより細かく書式設定を指定したものになっています。

Coding Style Guide:コーディングスタイルガイド

[原文]

This guide extends and expands on PSR-1, the basic coding standard.

The intent of this guide is to reduce cognitive friction when scanning code from different authors. It does so by enumerating a shared set of rules and expectations about how to format PHP code.

The style rules herein are derived from commonalities among the various member projects. When various authors collaborate across multiple projects, it helps to have one set of guidelines to be used among all those projects. Thus, the benefit of this guide is not in the rules themselves, but in the sharing of those rules.

[日本語訳]

このガイドは、基本的なコーディング規約PSR-1を拡張したものです。

このガイドの目的は、別の作成者がコードを見るときに認識のズレを減らすことです。 これはPHPコードの書式設定についての共有されたルールや可能性の一式を列挙することで実現します。

ここでのスタイルルールは、様々なメンバーのプロジェクトの共通点から得られたものです。 様々な作成者が複数のプロジェクトを横断して参画する場合、それらのプロジェクトで使用される一つのガイドラインを持つことは役に立ちます。 従ってこのガイドの利点はルールそのものではなく、ルールを共有することにあります。

つまり、ここでのコーディングスタイルガイドは、0から作成したものではなく、実際にコーディングの現場のルールから策定したものだと言いたいようです。

[原文]

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in [RFC 2119].

[日本語訳]

この文書に記載されているキーワード「しなければならない(MUST)」、「してはならない(MUST NOT)」、「必須(REQUIRED)」、「するものとする(SHALL)」、「しないものとする(SHALL NOT)」、「すべきである(SHOULD)」、「すべきでない(SHOULD NOT)」、「推奨する(RECOMMENDED)」、「することができる(MAY)」、「任意(OPTIONAL)」は、RFC 2119に記載されている内容で解釈されます。

PSR-1にも同じ内容の記載があります。まあ基本的にはそういうことなのでしょう。

1. Overview:概要

[原文]
  • Code MUST follow a “coding style guide” PSR [PSR-1].
  • Code MUST use 4 spaces for indenting, not tabs.
  • There MUST NOT be a hard limit on line length; the soft limit MUST be 120 characters; lines SHOULD be 80 characters or less.
  • There MUST be one blank line after the namespace declaration, and there MUST be one blank line after the block of use declarations.
  • Opening braces for classes MUST go on the next line, and closing braces MUST go on the next line after the body.
  • Opening braces for methods MUST go on the next line, and closing braces MUST go on the next line after the body.
  • Visibility MUST be declared on all properties and methods; abstract and final MUST be declared before the visibility; static MUST be declared after the visibility.
  • Control structure keywords MUST have one space after them; method and function calls MUST NOT.
  • Opening braces for control structures MUST go on the same line, and closing braces MUST go on the next line after the body.
  • Opening parentheses for control structures MUST NOT have a space after them, and closing parentheses for control structures MUST NOT have a space before.
[日本語訳]
  • PSR:[PSR-1]「コーディングスタイルガイド」に準拠しなければなりません(MUST)。
  • インデントはタブではなく、4つのスペースを使用しなければなりません(MUST)。
  • 行の長さはハードリミットがあってはなりません(MUST NOT)。ソフトリミットは120文字でなければなりませんが(MUST)、80文字以内にするべきです(SHOULD)。
  • namespace宣言の後には空行を一行を入れなければならず(MUST)、use宣言のブロックの後にも空行を一行を入れなければなりません(MUST)。
  • クラスの開き中括弧は次の行に記載しなければならず(MUST)、閉じ中括弧は本文の次の行に記載しなければなりません(MUST)。
  • メソッドの開き中括弧は次の行に記載しなければならず(MUST)、閉じ中括弧は本文の次の行に記載しなければなりません(MUST)。
  • アクセス修飾子はすべてのプロパティとメソッドに宣言しなければなりません(MUST)。abstractfinalはアクセス修飾子の前に宣言しなければなりません(MUST)。staticはアクセス修飾子の後ろに宣言しなければなりません(MUST)。
  • 制御構造の予約語の後には1つのスペースを入れなければなりません(MUST)。メソッドや関数の呼び出しではスペースを入れてはなりません(MUST NOT)。
  • 制御構造の開き中括弧は同じ行に記載しなければならず(MUST)、閉じ中括弧は本文の次の行に記載しなければなりません(MUST)。
  • 制御構造の開き丸括弧の後ろにはスペースを入れてはならず(MUST NOT)、閉じ丸括弧の前にはスペースを入れてはなりません(MUST NOT)。

概要です、このガイドラインで言いたいことが纏められています。

一応、「Control structure」は制御構造、「keywords」は予約語と訳しています。

1.1. Example:例

[原文]

This example encompasses some of the rules below as a quick overview:

<?php
namespace Vendor\Package;

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

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

    final public static function bar()
    {
        // method body
    }
}
[日本語訳]

下記は概要の内容を表した例です。

<?php
namespace Vendor\Package;

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

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

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

PSR-1に準拠しているのかどうかと言うのと、ハードリミット・ソフトリミットについてはわかりませんが、その他の概要の記載内容はこの例に適用されています。

2. General:一般

2.1. Basic Coding Standard:基本的なコーディング規約

[原文]

Code MUST follow all rules outlined in PSR-1.

[日本語訳]

PSR-1に準拠していなければなりません(MUST)。

PSR-1に準拠していなければならないということで、クラス名の命名規則やファイルのエンコーディングなどはPSR−1に従いましょう。

2.2. Files:ファイル

[原文]

All PHP files MUST use the Unix LF (linefeed) line ending.

All PHP files MUST end with a single blank line.

The closing ?> tag MUST be omitted from files containing only PHP.

[日本語訳]

すべてのPHPファイルの改行コードはUnix LF(linefeed)を使用しなければなりません(MUST)。

すべてのPHPのファイルの末尾には空行を含まなければなりません(MUST)。

PHPコードのみのファイルでは、PHPの閉じタグ?>は省略しなければなりません(MUST)。

PHPの閉じタグ?>を省略するのはPHPの公式でも推奨しています。これにより「閉じタグ?>の直後の改行が出力されてしまうから」という理由で省略しなくてはいけないと思っている人もいるようですが、実はPHPは閉じタグ?>直後の改行は無視されます。
ということで、閉じタグを省略しなければならない理由としては、「閉じタグ?>の後に複数改行があった場合に無駄に空白が出力されてしまう」「閉じタグ?>の後に改行以外の文字が入力された場合に意図せぬ出力が発生してしまう」というところになるでしょう。

※ 実際私の経験として、保存のショートカット(Ctrl-s)を押し間違えて、”s”をそのまま入力してしまい、それが?>の後に紛れ込んでしまっていたので、無駄にsが出力されるバグを発生させたことがあります。そしてviewファイルばかりを調査していたので、なかなか気づくことが出来ませんでした。?>を省略しておけばPHPのエラーになるのですぐ気づくことが出来たはず。

2.3. Lines:行

[原文]

There MUST NOT be a hard limit on line length.

The soft limit on line length MUST be 120 characters; automated style checkers MUST warn but MUST NOT error at the soft limit.

Lines SHOULD NOT be longer than 80 characters; lines longer than that SHOULD be split into multiple subsequent lines of no more than 80 characters each.

There MUST NOT be trailing whitespace at the end of non-blank lines.

Blank lines MAY be added to improve readability and to indicate related blocks of code.

There MUST NOT be more than one statement per line.

[日本語訳]

行に対してハードリミットがあってはなりません(MUST NOT)。

行のソフトリミットは120文字でなければなりません(MUST)。自動スタイルチェッカーは警告をしなければなりませんが(MUST)、エラーにしてはいけません(MUST NOT)。

行は80文字より長くあるべきではありません(SHOULD NOT)。それよりも長い行は、80文字以内のそれぞれの行に分割されるべきです(SHOULD)。

空行以外の行の末尾にスペースがあってはなりません(MUST NOT)。

可読性を向上させ、コードの関連ブロックを示すために空行を加えることが出来ます(MAY)。

一行に複数の命令文があってはなりません(MUST NOT)。

ハードリミットとは物理的なリミットでそれ以上は入力出来ない状態になっていることだと思うのですが、経験上そんなエディタは見たこと無いので、まあ、ハードリミットはそんな気にしなくて大丈夫かと思います。

ソフトリミットについてはエディタの設定やプラグインでなんとかしましょう。私はVisual Studio Codeを使っており、setteings.jsonに 次の設定を記載してソフトリミットのルーラーを表示しています。

"editor.rulers": [80, 120]

「non-blank lines」は空白ではない行ということで、「空行以外の行」と訳しました。空行の末尾にはスペースが有っていいということになりますが、これはインデントを意識したものではないかと思っています。

「statement」は「命令文」と訳しています。一行に複数の命令文があるという状態は下記のようなものになると思われます。

<?php
$i = 1; $j = $i;

一行に複数の命令文があると、どれから評価されるのかが分かりづらくなってしまい、可読性が下がります。

下記は問題ないです。

<?php
$j = $i = 1;

2.4. Indenting:インデント

[原文]

Code MUST use an indent of 4 spaces, and MUST NOT use tabs for indenting.

N.b.: Using only spaces, and not mixing spaces with tabs, helps to avoid problems with diffs, patches, history, and annotations. The use of spaces also makes it easy to insert fine-grained sub-indentation for inter-line alignment.

[日本語訳]

インデントは4つのスペースを使用しなければならず(MUST)、タブを使用してはなりません(MUST NOT)。

注意:スペースのみを使用しタブと混在させないことは、差分やパッチ、履歴、注釈の表示のズレを回避するのに役に立ちます。 また、スペースを利用すると、行間の位置合わせをするために細かいサブインデントを挿入するのを容易にします。

タブだとそれぞれの環境でインデント幅が変わってくる(一般的には半角8桁、それだと横長になるのでエディタの設定で4桁にされてたりする)ので、変わりようのない半角スペース4つで統一しましょうという話ですね。ましてや混在とか言う状況になると最悪ですからね。

原文では「表示のズレ」とは書いておらずただの「problems(問題)」としておりますが、おそらく表示のズレのことだろうという事で意訳しております。

2.5. Keywords and True/False/Null:予約語とTrue/False/Null

[原文]

PHP keywords MUST be in lower case.

The PHP constants true, false, and null MUST be in lower case.

[日本語訳]

PHPの予約語は小文字で記載しなければなりません(MUST)。

PHPの定数であるtruefalsenullは小文字で記載なければなりません(MUST)。

そのままですね。予約語とtrue/false/nullはすべて小文字で記載しましょう。

3. Namespace and Use Declarations:NamespaceとUseの宣言

[原文]

When present, there MUST be one blank line after the namespace declaration.

When present, all use declarations MUST go after the namespace declaration.

There MUST be one use keyword per declaration.

There MUST be one blank line after the use block.

For example:

<?php
namespace Vendor\Package;

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

// ... additional PHP code ...

[日本語訳]

namespaceを宣言する場合は、その後に空行が一行なければなりません(MUST)。

use宣言をする場合はnamespace宣言の後に記載しなければなりません(MUST)。

宣言ごとにuseを使用しなければなりません(MUST)。

use宣言のブロックの後に空行が1一行なければなりません(MUST)。

<?php
namespace Vendor\Package;

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

// ... 何かしらのPHPコード ...

例の記載を見ればわかりやすいと思います。

この規約を見るまで知らなかったんですが、以下の様にuseってカンマ区切りで宣言できたんですね。

<?php
namespace Vendor\Package;

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

// ... 何かしらのPHPコード ...

まあ、これはやっちゃいけない例です。ちゃんと宣言ごとにuseを使用しましょう。

4. Classes, Properties, and Methods:クラス・プロパティ・メソッド

[原文]

The term “class” refers to all classes, interfaces, and traits.

[日本語訳]

「クラス」という用語はすべてのクラス、インターフェース、トレイトのことを指します。

PSR−1でも同じ記載がありました。基本的にクラスという言葉にはインターフェース、トレイトも含まれると考えておきましょう。

4.1. Extends and Implements:ExtendsとImplements

[原文]

The extends and implements keywords MUST be declared on the same line as the class name.

The opening brace for the class MUST go on its own line; the closing brace for the class MUST go on the next line after the body.

<?php
namespace Vendor\Package;

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

class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
    // constants, properties, methods
}
[日本語訳]

extendsimplementsはクラスと同じ行で宣言されなければなりません(MUST)。

クラスの開き中括弧は単独の行でなければならず(MUST)、閉じ中括弧は本文最後の次の行になければなりません(MUST)。

<?php
namespace Vendor\Package;

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

class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
    // 定数, プロパティ, メソッド
}
[原文]

Lists of implements MAY be split across multiple lines, where each subsequent line is indented once. When doing so, the first item in the list MUST be on the next line, and there MUST be only one interface per line.

<?php
namespace Vendor\Package;

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

class ClassName extends ParentClass implements
    \ArrayAccess,
    \Countable,
    \Serializable
{
    // constants, properties, methods
}
[日本語訳]

implementsのリストは複数の行に分割することができ(MAY)、それぞれ一つのインデントを入れなければなりません(MUST)。 分割した場合、リストの最初の項目は次の行に記載しなければならず(MUST)、一行ごとに一つのインターフェースを定義しなければなりません(MUST)。

<?php
namespace Vendor\Package;

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

class ClassName extends ParentClass implements
    \ArrayAccess,
    \Countable,
    \Serializable
{
    // 定数, プロパティ, メソッド
}

implementsのリストは複数行に分割できます。phpは多重継承は出来ませんので、extendsはリストにはなりません。

4.2. Properties:プロパティ

[原文]

Visibility MUST be declared on all properties.

The var keyword MUST NOT be used to declare a property.

There MUST NOT be more than one property declared per statement.

Property names SHOULD NOT be prefixed with a single underscore to indicate protected or private visibility.

A property declaration looks like the following.

<?php
namespace Vendor\Package;

class ClassName
{
    public $foo = null;
}
[日本語訳]

すべてのプロパティにアクセス修飾子を宣言しなければなりません(MUST)。

プロパティはvarをつけて宣言してはなりません(MUST NOT)。

一つの命令文で複数のプロパティを宣言してはなりません(MUST NOT)。

protectedやprivateのアクセス修飾子を示すために、一つのアンダースコアをプロパティ名の接頭語に使用するべきではありません(SHOULD NOT)。

プロパティの宣言は以下のようになります。

<?php
namespace Vendor\Package;

class ClassName
{
    public $foo = null;
}

PHP4まではプロパティの宣言にvarが必須だったっぽいですね。その互換性からPHP5以降でもvarを書いてもエラーにはならないですが、アクセス修飾子と同時に宣言することは出来ないので、varは不要ということになります。

4.3. Methods:メソッド

[原文]

Visibility MUST be declared on all methods.

Method names SHOULD NOT be prefixed with a single underscore to indicate protected or private visibility.

Method names MUST NOT be declared with a space after the method name. The opening brace MUST go on its own line, and the closing brace MUST go on the next line following the body. There MUST NOT be a space after the opening parenthesis, and there MUST NOT be a space before the closing parenthesis.

A method declaration looks like the following. Note the placement of parentheses, commas, spaces, and braces:

<?php
namespace Vendor\Package;

class ClassName
{
    public function fooBarBaz($arg1, &$arg2, $arg3 = [])
    {
        // method body
    }
}
[日本語訳]

すべてのメソッドにアクセス修飾子を宣言しなければなりません(MUST)。

protectedやprivateのアクセス修飾子を示すために、一つのアンダースコアをメソッド名の接頭語に使用するべきではありません(SHOULD NOT)。

メソッド名の後ろにスペースを入れて宣言してはなりません(MUST NOT)。 メソッドの開き中括弧は単独の行でなければならず(MUST)、閉じ中括弧は本文最後の次の行になければなりません(MUST)。 メソッドの開き丸括弧の後にはスペースを入れてはならず(MUST NOT)、閉じ丸括弧の前にもスペースを入れてはなりません(MUST NOT)。

メソッドの宣言は下記のようになります。 丸括弧、カンマ、スペース、中括弧の配置に注意して下さい。

<?php
namespace Vendor\Package;

class ClassName
{
    public function fooBarBaz($arg1, &$arg2, $arg3 = [])
    {
        // メソッド本文
    }
}

privateなメソッド名の頭にアンダースコアをつけるのは結構やりがちですが、SHOULD NOTなんですね。察すると、プロパティもそうなんでしょうか。まあ、記載が無いのでわかりませんが、一応そういうことらしいです。

4.4. Method Arguments:メソッドの引数

[原文]

In the argument list, there MUST NOT be a space before each comma, and there MUST be one space after each comma.

Method arguments with default values MUST go at the end of the argument list.

<?php
namespace Vendor\Package;

class ClassName
{
    public function foo($arg1, &$arg2, $arg3 = [])
    {
        // method body
    }
}
[日本語訳]

引数のリストはそれぞれのカンマの前にスペースを入れてはならず(MUST NOT)、それぞれのカンマの後にスペースを入れなければなりません(MUST)。

初期設定値のある引数は、引数リストの最後でなければなりません(MUST)。

<?php
namespace Vendor\Package;

class ClassName
{
    public function foo($arg1, &$arg2, $arg3 = [])
    {
        // メソッド本文
    }
}
[原文]

Argument lists MAY be split across multiple lines, where each subsequent line is indented once. When doing so, the first item in the list MUST be on the next line, and there MUST be only one argument per line.

When the argument list is split across multiple lines, the closing parenthesis and opening brace MUST be placed together on their own line with one space between them.

<?php
namespace Vendor\Package;

class ClassName
{
    public function aVeryLongMethodName(
        ClassTypeHint $arg1,
        &$arg2,
        array $arg3 = []
    ) {
        // method body
    }
}
[日本語訳]

引数リストは複数の行に分割することができ(MAY)、それぞれ一つのインデントを入れなければなりません(MUST)。 分割した場合、リストの最初の項目は次の行に記載しなければならず(MUST)、一行ごとに一つの引数を記載しなければなりません(MUST)。

引数リストを複数行に分割した場合、閉じ丸括弧と開き中括弧はスペースを挟んで単独で同じ行に記載しなければなりません(MUST)。

<?php
namespace Vendor\Package;

class ClassName
{
    public function aVeryLongMethodName(
        ClassTypeHint $arg1,
        &$arg2,
        array $arg3 = []
    ) {
        // メソッド本文
    }
}

引数を複数行に分割した場合は閉じ丸括弧と開き中括弧が同じ行になることに注意です。

4.5. abstract, final, and staticabstractfinalstatic

[原文]

When present, the abstract and final declarations MUST precede the visibility declaration.

When present, the static declaration MUST come after the visibility declaration.

<?php
namespace Vendor\Package;

abstract class ClassName
{
    protected static $foo;

    abstract protected function zim();

    final public static function bar()
    {
        // method body
    }
}
[日本語訳]

abstractfinalを宣言する場合はアクセス修飾子より前に宣言しなければなりません(MUST)。

staticを宣言する場合はアクセス修飾子より後に宣言しなければなりません。

<?php
namespace Vendor\Package;

abstract class ClassName
{
    protected static $foo;

    abstract protected function zim();

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

ここはそういうものとして覚えて置きましょう。

4.6. Method and Function Calls:4.6. メソッドと関数の呼び出し

[原文]

When making a method or function call, there MUST NOT be a space between the method or function name and the opening parenthesis, there MUST NOT be a space after the opening parenthesis, and there MUST NOT be a space before the closing parenthesis. In the argument list, there MUST NOT be a space before each comma, and there MUST be one space after each comma.

<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);
[日本語訳]

メソッドもしくは関数を呼び出す場合、メソッド名・関数名と開き丸括弧の間にスペースを入れてはならず(MUST NOT)、開き丸括弧の後にもスペースを入れてはならず(MUST NOT)、閉じ丸括弧の前にもスペースを入れてはなりません(MUST NOT)。 引数リストのそれぞれのカンマの前にスペースを入れてはならず(MUST NOT)、それぞれのカンマの後にスペースを入れなければなりません(MUST)。

<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);
[原文]

Argument lists MAY be split across multiple lines, where each subsequent line is indented once. When doing so, the first item in the list MUST be on the next line, and there MUST be only one argument per line.

<?php
$foo->bar(
    $longArgument,
    $longerArgument,
    $muchLongerArgument
);
[日本語訳]

引数リストは複数の行に分割することができ(MAY)、それぞれ一つのインデントを入れなければなりません(MUST)。 分割した場合、リストの最初の項目は次の行に記載しなければならず(MUST)、一行ごとに一つの引数を記載しなければなりません(MUST)。

<?php
$foo->bar(
    $longArgument,
    $longerArgument,
    $muchLongerArgument
);

特に大きな注意点は無いですね。そういうものとして覚えておきましょう。

5. Control Structures:制御構造

[原文]

The general style rules for control structures are as follows:

  • There MUST be one space after the control structure keyword
  • There MUST NOT be a space after the opening parenthesis
  • There MUST NOT be a space before the closing parenthesis
  • There MUST be one space between the closing parenthesis and the opening brace
  • The structure body MUST be indented once
  • The closing brace MUST be on the next line after the body

The body of each structure MUST be enclosed by braces. This standardizes how the structures look, and reduces the likelihood of introducing errors as new lines get added to the body.

[日本語訳]

制御構造の一般的なスタイルルールは下記の通りです。

  • 制御構造の予約語の後ろにはスペースを入れなければなりません(MUST)
  • 開き丸括弧の後ろにはスペースを入れてはなりません(MUST NOT)
  • 閉じ丸括弧の前にはスペースを入れてはなりません(MUST NOT)
  • 閉じ丸括弧と開き中括弧の間は一つのスペースでなければなりません(MUST)
  • 制御本文はインデントを一つ入れなければなりません(MUST)
  • 閉じ中括弧は本文最後の次の行になければなりません(MUST)

制御本文は中括弧で囲わなければなりません(MUST)。 この制御の見た目を揃えることで、新しい行が追加した際にエラーを引き起こす可能性を減らします。

制御構造についてはほぼ共通のルールになっています。クラス、メソッドとは違い、開き中括弧が予約語と同じ行に書かなければならないことろに注意しなければなりません。

各制御構造分の詳細については下記の説明のとおりですね。

5.1. if, elseif, elseifelseifelse

[原文]

An if structure looks like the following. Note the placement of parentheses,Bspaces, and braces; and that else and elseif are on the same line as the closing brace from the earlier body.

<?php
if ($expr1) {
    // if body
} elseif ($expr2) {
    // elseif body
} else {
    // else body;
}

The keyword elseif SHOULD be used instead of else if so that all control keywords look like single words.

[日本語訳]

if文は下記の様になります。 丸括弧・スペース・中括弧の位置、elseelseifは前の制御本文の閉じ中括弧と同じ行にあることに注意して下さい。

<?php
if ($expr1) {
    // if 本文
} elseif ($expr2) {
    // elseif 本文
} else {
    // else 本文
}

一つの制御単語の様に見せるため、else ifの代わりにelseifを使用するべきです(SHOULD)。

5.2. switch, caseswitchcase

[原文]

A switch structure looks like the following. Note the placement of parentheses, spaces, and braces. The case statement MUST be indented once from switch, and the break keyword (or other terminating keyword) MUST be indented at the same level as the case body. There MUST be a comment such as // no break when fall-through is intentional in a non-empty case body.

<?php
switch ($expr) {
    case 0:
        echo 'First case, with a break';
        break;
    case 1:
        echo 'Second case, which falls through';
        // no break
    case 2:
    case 3:
    case 4:
        echo 'Third case, return instead of break';
        return;
    default:
        echo 'Default case';
        break;
}
[日本語訳]

switch文は下記の様になります。 丸括弧、スペース、中括弧の配置に注意して下さい。 case文はswitchよりも一つインデントを下げなければならず(MUST)、break(もしくはその他の終了キーワード)はcase内本文と同じインデントでなければなりません(MUST)。 空ではないcase内本文で意図的にフォールスルーする場合、// no breakのようにコメントを記載しなければなりません(MUST)。

<?php
switch ($expr) {
    case 0:
        echo 'First case, with a break';
        break;
    case 1:
        echo 'Second case, which falls through';
        // no break
    case 2:
    case 3:
    case 4:
        echo 'Third case, return instead of break';
        return;
    default:
        echo 'Default case';
        break;
}

5.3. while, do whilewhiledo while

[原文]

A while statement looks like the following. Note the placement of parentheses, spaces, and braces.

<?php
while ($expr) {
    // structure body
}
[日本語訳]

while文は下記の様になります。 丸括弧、スペース、中括弧の配置に注意して下さい。

<?php
while ($expr) {
    // while 本文
}
[原文]

Similarly, a do while statement looks like the following. Note the placement of parentheses, spaces, and braces.

do {
    // structure body;
} while ($expr);
[日本語訳]

同じ様に、do while文は下記の様になります。 丸括弧、スペース、中括弧の配置に注意して下さい。

<?php
do {
    // do while 本文
} while ($expr);

5.4. forfor

[原文]

A for statement looks like the following. Note the placement of parentheses, spaces, and braces.

<?php
for ($i = 0; $i < 10; $i++) {
    // for body
}
[日本語訳]

for文は下記の様になります。 丸括弧、スペース、中括弧の配置に注意して下さい。

<?php
for ($i = 0; $i < 10; $i++) {
    // for 本文
}

5.5. foreachforeach

[原文]

A foreach statement looks like the following. Note the placement of parentheses, spaces, and braces.

<?php
foreach ($iterable as $key => $value) {
    // foreach body
}
[日本語訳]

foreach文は下記の様になります。 丸括弧、スペース、中括弧の配置に注意して下さい。

<?php
foreach ($iterable as $key => $value) {
    // foreach 本文
}

5.6. try, catchtrycatch

[原文]

A try catch block looks like the following. Note the placement of parentheses, spaces, and braces.

<?php
try {
    // try body
} catch (FirstExceptionType $e) {
    // catch body
} catch (OtherExceptionType $e) {
    // catch body
}
[日本語訳]

try catch節は下記の様になります。 丸括弧、スペース、中括弧の配置に注意して下さい。

<?php
try {
    // try 本文
} catch (FirstExceptionType $e) {
    // catch 本文
} catch (OtherExceptionType $e) {
    // catch 本文
}

6. Closures:無名関数

[原文]

Closures MUST be declared with a space after the function keyword, and a space before and after the use keyword.

The opening brace MUST go on the same line, and the closing brace MUST go on the next line following the body.

There MUST NOT be a space after the opening parenthesis of the argument list or variable list, and there MUST NOT be a space before the closing parenthesis of the argument list or variable list.

In the argument list and variable list, there MUST NOT be a space before each comma, and there MUST be one space after each comma.

Closure arguments with default values MUST go at the end of the argument list.

A closure declaration looks like the following. Note the placement of parentheses, commas, spaces, and braces:

<?php
$closureWithArgs = function ($arg1, $arg2) {
    // body
};

$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
    // body
};
[日本語訳]

無名関数の宣言はfunctionの後にスペースを入れなければならず(MUST)、useの前後にもスペースを入れなければなりません(MUST)。

開き中括弧は同じ行に記載しなければならず(MUST)、閉じ中括弧は本文最後の次の行に記載しなければなりません(MUST)。

引数リストまたは変数リストの開き丸括弧の後にスペースを入れてはならず(MUST NOT)、引数リストまたは変数リストの閉じ丸括弧の前にもスペースを入れてはなりません(MUST NOT)。

引数リストもしくは変数リストのそれぞれのカンマの前にスペースを入れてはならず(MUST NOT)、それぞれのカンマの後にスペースを入れなければなりません(MUST)。

初期設定値のある引数は、引数リストの最後でなければなりません(MUST)。

クロージャの宣言は下記の様になります。 丸括弧、カンマ、スペース、中括弧の位置に注意して下さい。

<?php
$closureWithArgs = function ($arg1, $arg2) {
    // 本文
};

$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
    // 本文
};

メソッドとは違い、無名関数の場合は開き中括弧は同じ行に書きます。通常の関数の場合はどうかっていうのは「7.最後に」で記載がありますがあえて指定はしないそうなので、どっちで良いっぽいです。

[原文]

Argument lists and variable lists MAY be split across multiple lines, where each subsequent line is indented once. When doing so, the first item in the list MUST be on the next line, and there MUST be only one argument or variable per line.

When the ending list (whether of arguments or variables) is split across multiple lines, the closing parenthesis and opening brace MUST be placed together on their own line with one space between them.

The following are examples of closures with and without argument lists and variable lists split across multiple lines.

<?php
$longArgs_noVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) {
    // body
};

$noArgs_longVars = function () use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
    // body
};

$longArgs_longVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
    // body
};

$longArgs_shortVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) use ($var1) {
    // body
};

$shortArgs_longVars = function ($arg) use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
    // body
};
[日本語訳]

引数リストと変数リストは複数の行に分割することができ(MAY)、それぞれ一つのインデントを入れなければなりません(MUST)。 分割した場合、リストの最初の項目は次の行に記載しなければならず(MUST)、一行ごとに一つの引数を記載しなければなりません(MUST)。

引数リストもしくは変数リストが複数行に分割された場合、閉じ丸括弧と開き中括弧はスペースを挟んで単独で同じ行に記載しなければなりません(MUST)。

下記は、引数リストと変数リストの有無や、複数行に分割された場合の、無名関数の例になります。

<?php
$longArgs_noVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) {
    // 本文
};

$noArgs_longVars = function () use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
    // 本文
};

$longArgs_longVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
    // 本文
};

$longArgs_shortVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) use ($var1) {
    // 本文
};

$shortArgs_longVars = function ($arg) use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
    // 本文
};
[原文]

Note that the formatting rules also apply when the closure is used directly in a function or method call as an argument.

<?php
$foo->bar(
    $arg1,
    function ($arg2) use ($var1) {
        // body
    },
    $arg3
);
[日本語訳]

このルールは無名関数がメソッドの呼び出しの引数として直接使用される場合にも適用されることに注意して下さい。

<?php
$foo->bar(
    $arg1,
    function ($arg2) use ($var1) {
        // 本文
    },
    $arg3
);

7. Conclusion:最後に

[原文]

There are many elements of style and practice intentionally omitted by this guide. These include but are not limited to:

  • Declaration of global variables and global constants
  • Declaration of functions
  • Operators and assignment
  • Inter-line alignment
  • Comments and documentation blocks
  • Class name prefixes and suffixes
  • Best practices

Future recommendations MAY revise and extend this guide to address those or other elements of style and practice.

[日本語訳]

このガイドでは意図的に省略された多くのスタイルや慣習があります。 これらが含むものは、次のものについては制限していません。

  • グローバル変数と、グローバル定数の宣言について
  • 関数の宣言について
  • 演算子と代入について
  • 行間の配置について
  • コメントと、ドキュメントブロックに付いて
  • クラス名の接頭語と接尾語について
  • ベスト・プラクティスについて

将来他の推奨されるスタイルや慣習によって、このガイドは修正・拡張することができます(MAY)。

関数の宣言について特に指定してないのは、オブジェクト指向であれば特に必要ないからって感じなのかと思われます。

クラス名の接頭語・接尾語についての指定もありませんが、個人的には抽象化クラスには「Abstract」、インターフェースには「Interface」とつけたほうがわかりやすいなぁと思っていますし、そのルールを採用しているプロジェクトも多いですね(ZendFrameworkとか)。

Appendix A. Survey:付録A. 調査

[原文]

In writing this style guide, the group took a survey of member projects to determine common practices. The survey is retained herein for posterity.

[日本語訳]

このスタイルガイドを書く際に、プロジェクトのメンバーを調査し、一般的な慣習を定めました。 その調査をここに残します。

これ以降は単なる調査データですので特に日本語訳はないです。

コメントを残す