エンジニアのスキルを試すコードパズル ─この問題、あなたは解けますか?

第9回大塚弘記からの挑戦(第2回)解説編

最も正解率が低かったのは「実際のPHPプロジェクトに対して統計調査を行っている」という問題

今回、解答者37人中7人の方が全問正解しています。8個解答するところを平均5.7問正解しているので、半分以上正解されている方がほとんどでした。

一方、問題の中で特出して正解率が低かったのは、問6(3)⁠実際のPHPプロジェクトに対して統計調査を行っている」の○×です。

PSRについて誤解をしている方も多いと思うので、前提知識を含めて解説していきます。

PSRの成り立ちと内容をおさらいする

各問題の解説に入る前に、PSRができた背景をご存じでしょうか?

数年前までは、PHPのコーディング規約は以下のような主要なフレームワークだけでも細かいレベルですべて異なっており、乱立していた状況でした。

  • PEAR
  • Zend
  • CakePHP
  • Symfony

タブ派とスペース派の戦いなど、さまざまな揉めごとが起こることも。問題を予防するためにも、モダンなPHPのコーディング規約が必要でした。

そこでPHPの各種フレームワークやOSSプロダクトの開発者がメンバーとなって作られたのが、php-fig(PHP Framework Interop Group)という団体です。

そして、PSR-0、PSR-1、PSR-2、PSR-3と4段階に分けられたコーディング規約が誕生しました。それぞれの内容は以下のとおりです。

PSR-0
オートロードのためのクラス名やファイル名に関する内容
PSR-1
高レベルで機能を連携させるコーディングスタイルに関する内容
PSR-2
標準化されたコードが目指すべきスタイルガイド
PSR-3
ロガーのインターフェースに関する内容

PSR自体は、PHPを利用するOSSプロダクトのコーディング差違をできる限り埋めるために、実際に多くのプロダクトを調査して、論議されています。よって、あらゆるコーディングの細かいレベルまで突っ込んだ勧告はしていません。ごく一部ですが、勧告していない部分に関しては、開発者間で別途定める必要があります。

namespaceは<?phpの後ろに空行を入れずに記述─⁠─問1

問1.は、PSR-2で触れられているnamespaceの書き方についての問題です。

PHP5.3から名前空間が導入されたため、PHP5.3対応のフレームワークやソフトウェアでは基本的に名前空間を定義して開発しています。以下のように、<?phpの後ろに空行を入れずに記述します。

<?php
namespace Vendor\Package;

useは1つ1つに記述─⁠─問2

問2.はuseの書き方。これもPSR-2で触れられている内容です。

useは、以下のように、1つ1つに記述してください。

use FooClass;
use BarClass;

余談ですが、namespaceとuseの間には、以下のように1行空行を入れます。

<?php
namespace Vendor\Package;

use FooClass;
use BarClass;

プロパティはvarで定義しない─⁠─問3

問3.のプロパティも、PSR-2で触れられている内容です。

クラスのプロパティは、varで定義しないこととされています。よって、以下のようにpublicやprivateを明示的に利用して定義してください。

class ClassName
{

  public $foo = null;

}

functionでは明示的にアクセス権を定義─⁠─問4

問4.はfunctionに関するものです。これもPSR-2で触れられています。

functionでは以下のように、明示的にアクセス権を定義してください。

public function fooBar()
{
    // ...メソッドの内容...
}

publicなどを省略しても同様の定義となりますが、省略しないでください。

functionにはprivateを意味するようなプレフィックスは付けない─⁠─問5

続く問5.もfunctionに関する問題です。

PHPでは、private functionを定義する場合、明示的にprivateと記述する必要があります。よって、privateを意味するようなプレフィックス(アンダースコアなど)は付けません。以下のように、通常どおりの名前を付けてください。

private function fooBar()
{
    // ...メソッドの内容...
}

PSRはPHP公式のものではないが、準拠したほうがいい─⁠─問6

最後の問6.は、PSR自体の知識に関する問題です。正解は以下のとおりです。

(1) ⇒ ×
今後、従わなくてはいけないコーディング規約である
(2) ⇒ ○
(PHPで開発されているフレームワークやCMSのプロジェクト、それらに関わる開発者の意見や意図が反映されている)
(3) ⇒ ○
(実際のPHPプロジェクトに対して統計調査を行っている)

1点覚えておかなければいけないことは、PSRはPHP公式のコーディング規約ではないということです。強制されるものではなく、各種OSSプロダクトのメンバーによって、あくまでも標準として⁠勧告⁠されたものです。

ですが、PSRに則ってコーディングしていった方が、今後PHPを書くプログラマ間でのコミュニケーションはとりやすくなることでしょう。

PSRは、実際にPHPが使われているOSSからコーディングスタンダードを調査して、各種プロダクトの開発者が参加して検討されています。PSR-2までのレベルをプロジェクトとして採用していれば、モダンなPHPを利用したコーディングに迷うことが圧倒的に少なくなり、製品本来の品質を求めることに集中できるようになります。

PSRのその他の詳しい内容については、php-figのサイトに書かれています。一度目を通しておくことをオススメします。

おすすめ記事

記事・ニュース一覧