PSR indent

インデントについて良く理解しておらず、見づらいコードになっていないか。
初心者にありがちなのが、括弧の始まりと終わりが一目でわからないコード。
そこで何か決まりがあるのか気になったわけだ。

PSR

どの世界にでも常識はあるらしい。色んな人間がいれば規則を統一させるのは至極ごもっともだ。PSR(PHP Standards Recommendations : PHP標準勧告)は、PHP-FIG(PHP Framework Interop Group : PHPフレームワーク相互運用性グループ)が策定しているPHPコーディング規約のことらしい。このうち承認されているステータスは10程度あるようだが、PSR-1、PSR-12(※PSR2は2019/8で非推奨)については基本のようなので、とりあえず押さえておいた方が良さそうだ。この二つについて、GitHubで確認する。

cf, PSR-1コーディングガイド
cf, PSR-12 コーディングガイド(最終閲覧2020/05/23)

PSR-12はPSR-1に準拠すると書いてある。

PSR-12

インデントについては以下のように規定されている。

Code MUST use an indent of 4 spaces for each indent level, and MUST NOT use tabs for indenting.
(コードは、インデントレベルごとに4つのスペースのインデントを使用する必要があり、インデントにタブを使用してはなりません。)

https://www.php-fig.org/psr/psr-12/(最終閲覧 2020/05/23)

実際にタブを使って書いた経験がある…。むしろ、スペースは使わないようにしてた。コーディングを考えるなら、こういうことも知っとかなきゃいけないが、あくまで規約だ。例外もあろう。開発現場のチームで運用しやすいコーディング、決まりが一番のように思えてきた。しかし、IT業界では転職するなど普通のことなので、前任が書いていたコードを引き継ぐこともあると思う。その時に独自のルールで書いていたら、理解に苦しむ状況に遭遇することもあるかもしれない。その点では基本的に規約に沿ったコーディングを心がけておいた方が良い。
見たことはある人は多いだろうが、一応以下がその例のようだ。

<?php

declare(strict_types=1);

namespace Vendor\Package;

use Vendor\Package\{ClassA as A, ClassB, ClassC as C};
use Vendor\Package\SomeNamespace\ClassD as D;

use function Vendor\Package\{functionA, functionB, functionC};

use const Vendor\Package\{ConstantA, ConstantB, ConstantC};

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

    final public static function bar()
    {
        // method body
    }
}

functionの波括弧は意識しておこうと思う。その他、関数やらメソッドやら、制御構造やら色々と決まりがあるようなので、興味があったらこの機会に一度ざっと目を通しておいた方が良いだろう。

cf, PSR-12:拡張コーディングスタイル(最終閲覧2020/05/23)

良く使う条件分岐はこんな感じ。

<?php

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

改行コードはLFでないといけないと書いてあるようだが、これも運用によって変わるのだろうなと思った。CRLFを使っているので、OSとか何をするかによっても使い分けないと。

結論

運用によって使い分ける。

basic, php

Posted by himajinn