今回はコーディング規約についてちょっとおさらいをしてみたいと思います。

みなさん、それぞれ会社のコーディング規約というものがあると思いますが、PHPの代表的なコーディング規約といえば、「PEARコーディング規約」(以下PEAR規約)と「Zend Framework PHP 標準コーディング規約」(以下Zend規約)があります。

その中のいくつかを見ていきたいと思います。

まず、意外に知られていないスクリプトの最後の「?>」ですが、(ご存知の方はおさらいということでご容赦下さい。)

「Zend規約」より抜粋

A.2.1. 全般
PHP コードのみからなるファイルでは、終了タグ ("?>") は決して含めてはいけません。終了タグは、PHP には必要ありません。終了タグを省略することで、ファイルの最後にある空白文字が出力に影響することを防ぎます。

入門書等では、PHPコードを書く場合は「<?php」と「?>」で囲われた中に書きましょうというのが一般的ですが、PHPのコードのみからなるファイルでは最後の?>を省略したほうがいいとのことです。

これは、ファイルの最後に余計な改行・空白等が含まれてしまうと表示や動作に影響してしまうためです。

具体的な例としてはheader()関数が当てはまります。header()関数コール前に出力があってはいけない為です。

詳しくはマニュアルをご覧下さい。header関数 : http://www.phppro.jp/phpmanual/php/function.header.html

とはいえ、別のTipsにもなってしまうのですが、UnicodeでBOMをつけてしまうと、<?phpの前に文字が出力されてしまい、想定外のエラーが出てしまう可能性があることにも注意が必要です。Unicode(UTF-8)で記述するときは、必ずBOM無しのエンコーディング(UTF-8N)を使用しましょう。

こういった問題への対策として、出力制御関数(ob_start()など)や、php.iniの設定でoutput_bufferingをOnにする(もしくはoutput_handlerを設定する)ことで、出力をバッファリングする方法があります。BOMによる問題も避けられる為、対策としてはリーズナブルですが、そもそも目的用途が違うことや、ゴミ(改行や空白)も残るので推奨されません。ただ、php.ini-recommendedではoutput_bufferingがOn(正確には4096バイトの値指定)になっています。recommendedを設定のベースにしている際には逆に「元々対策がされている」状態になってしまうので注意が必要です。

また、イメージ関数を使う場合にも注意が必要です。

$im = imagecreatefrompng("y.png");
imagepng($im);

画像を出力する際に、出力の前に余計な改行やスペースが含まれた場合出力画像が壊れてしまい表示できなくなってしまいます。クラスを定義したファイルなどで、以下のようになっていたりしませんか?

<?php

class SampleClass {
//内容
}

?>
←この行に無駄な改行!
[EOF]

上記の場合、最後の一行に改行が入ってしまっているので出力にも改行が含まれてしまいます。こういった単純なミスを防ぐためにも、「?>」は書かないほうが良いとのことです。

※注「PEAR規約」では、「?>の下にカーソルがある状態にすること」となっています。

次に制御構造(if , else, for等)の書き方ですが、これは「PEAR規約」「Zend規約」共に、「条件を指定する括弧の前に空白をひとつ入れなければなりません。また、条件指定の括弧を閉じた後にも空白をひとつ入れなければなりません。」というルールとなっています。「Zend規約」のほうには、さらに詳細に記述してあります。

if ($a != 2) {
$a = 2;
} else if($a === 2) {
$a
}

上記だと、ifと「(」の間にスペース「)」と「{」の間に空白ひとつが必要です。また、「"elseif" を使用することは可能ですが、推奨されません。代わりに"else if" を使用してください。」とあります。

このほか、字下げについても決められており、「PEAR規約」「Zend規約」ともに「タブを使用しないで、空白4文字で行います」とあります。

これについては、賛否両論があり、私もどっちがいいとは言いがたいことではあります。

上記はほんの一例ですが、他にも、関数名・変数名の命名規約やコメントの書き方について書かれています。

「コーディング規約に従うことで、 コードの品質保持・バグの減少・保守の容易性の確保 などの助けになります。」(Zend規約より)とあります。

これらのコーディング規約を読み返し、自分のコードにあてはまることはないか、今一度見直してみてはいかがでしょう。

注)PEARコーディング規約、Zendコーディング規約には互いに違う部分があるので、両方にのっとたコーディングが難しい部分もあります。



(アシアル 中川善樹)


この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。