IwamotoBlog

俺に付いて来い

可読性の高いPHPについて考えてみた

この四月から東京のWeb会社でエンジニアとして働き始めました。

最近とある案件でHTML+αみたいなWebアプリを作り、そこで選定した技術がPHPだったのですが、初めてのわりには良く書けたなぁと思いました。それはやっぱりPHPの平易さ故だと思うし、こういう+αが気楽に出来るのはPHPならではの強みですね。

しかし、それだけ簡単な為に雑に書いたPHPの恐ろしさは並では無いのだろうとも思いました。考えるだけでも背筋が凍りそうです。

この記事ではそんな悲劇を生まないよう、PHP案件をやった上で僕が気を付けた事を書いていきたいと思います。

View( <html> 内)をとにかくシンプルにする

全くそのアプリを知らない人が新しくジョインして来た時、READMEの次に読むファイルはそのアプリのエントリーポイントだと僕は考えます。

このような静的サイト+αなPHPアプリにおけるエントリーポイントとはViewを担うPHPファイル…ルートに置かれたindex.phpなど…であるはずです。つまり、Viewを担うPHPファイルの <html> 内を見て、そのアプリの構成をざっと知れるというのがベストな状態であると考えられます。

そう考えた上で可読性が高いPHPアプリとは、Viewファイルの <html> 内が読みやすく、かつそのアプリの概要について知れるものだと定義付けました。

では、<html> 内を読みやすくするために努力すべきポイントについて触れていきます。

echoではなく、ショートタグで出力する

まずこれが基本です。ぱっと見て、

<p><?php echo $name; ?></p>

このコードはノイズが多いと感じないでしょうか?ただ $name を出力したいだけなのに、 phpecho という文字列が入ることで 、どうしても冗長なものになってしまい、直感的な理解の妨げとなります。

この問題はショートタグによって解決できます。 <?= ~ ?> というショートタグは <?php echo ~?> と等価です。上のコードをショートタグで書き直したものが以下のものです。

<p><?=$name; ?></p>

とても直感的なものになりましたね。このコードなら流し見しながらでも、ここでは $name を出力しているんだという事が理解できるでしょう。

PHPでの処理を散らかさない

PHP<?php ~ ?>どこでも処理を埋め込めてしまうため、あまりにも思うがままにphpタグを書いてしまうととてもとっちらかった印象を与えるコードとなってしまいます。

例えば、生徒のテストの点数情報の連想配列に対してループを回し、その点数と、クラス平均との差を出したいとしましょう。また、平均との差には色をつけたい時、思うままに書くと以下のようになります。

<ul>
   <?php foreach ($scoreData as $key => $val): ?>
       <li>
            <p>
                <?php $score = $val['score']; ?>
                Score: <?= $score; ?>
            </p>
             <?php $gap = $gapData[$key]; ?>
            <p class ="
                <?php echo $score > $gap ? 'plus' : 'minus'; ?>
             ">
                <?= $gap; ?>
            </p>
       </li>
   <?php endforeach; ?>
</ul>

意図はわからないでもないです。出力したい箇所の直前で必要な処理をすませ、該当箇所で出力するというのは、まず考えつくものでしょう。

しかし、まとまったコードとして見た時に、どうしても取っ散らかったものに見えませんか?あちこちでPHPの処理が行われているため、結局何が出力したいのか、という事がひと目見てわかりません。

これを解決するためには、出来る限りPHPとしての処理は、(もちろん意味のある単位で)一箇所にまとめ、出力箇所はできるだけシンプルなものになるようにしましょう。

上記のコードは以下のようにまとめられます。

<ul>
   <?php foreach ($scoreData as $key => $val):  ?>
       <? php
            $score = $val['score'];
            $gap =$gapData[$key];
            $gapClass = $score > $gap ? 'plus' : 'minus'; 
        ?>
       <li>
            <p><?= $score; ?></p>
            <p class="<?= gapData; ?>"><?= gap; ?></p>
       </li>
   <?php endforeach; ?>
</ul>

とてもシンプルなものになりましたね。出力箇所ではあまり複雑な処理をせず、できるだけ何が出力されているか?という事がわかるような記述になるよう心がけましょう。

その他小さいTipsなど

大きい項目はだいたい話せたので、後は小さいTipsを軽くまとめて紹介したいと思います。

ファイル内で使いまわす関数は <html> 前にまとめる

何度も同じような処理を書くことは <html> 内の肥大化につながり コードを読むコストが上げてしまう事になります。

また、同じ処理だとは思いつつも、「わざわざ二度も書くということは何か差異があるに違いない…!」と勘ぐってしまうのがエンジニアの性です。

そういった事をさけるためにも、同じ処理が何度も出てくる場合は、関数にまとめておき <?= doSomething(); ?> などと書いてある方が直感的で良いでしょう。

また、まとめる際は何か統一したルールのもとでまとめると良いでしょう。 <html> 前にまとめておいたり、 WordPressライクに自動的に読み込まれる functipns.php を作り、その中に関数をまとめておくなどです。

そうした統一性が、「この関数がどこで定義されているか予想もつかない」といった混乱を避け、より読みやすいコードたらしめてくれます。

ちゃんとコメントは書こう

コードを読み込めばどのような変数、関数かということを察したり、することは可能です。しかし、やはり存在する関数の分だけその関数の中身を読んだり、またどうしても複雑な処理になってしまった箇所でなにが行われているかを察するのは一苦労です。

しかし、そこに少しコメントを書いてあるだけで、その関数が何をするものか、またその箇所で何が行われているのかということがすぐに理解できます。また、コメントを書いておくと読んだ人の好感度が上がります。

コードだけで理解するというのは読む側にとっては大変な作業です。できるだけ詳細にコメントは残しておきましょう。

しかし、コメントは免罪符ではありません。コメントを書いてあるからといってその中身が複雑で汚いものであってはなりません。コメントはコメントとして、その中のコードもきれいで読みやすいものであるよう常に心がけましょう。

おわりに

いかがでしたか?

なんとなく当たり前な事を書いたような気もしますが、こういった当たり前を言語化しておくことが自分のためにも初学者のためにも大事なんだと思い書き残しました。

余談ですが、僕は師匠と呼べるエンジニアが居る環境にいた事がほぼ無く、常に自らの中で正しさを問い続けなければならない状況の中にいます。

「師匠と呼べるエンジニアが居ないのは辛いよね」などとも最近言われ、うーんなるほどと思いました。

確かに師匠に付き、正しさの指針を示してもらうことは自らの成長に大きな影響を及ぼしてくれると思います。そういったアドバンテージが自分に無い分僕は辛い環境に居るのかもしれません。

しかし実は、僕は自らの中で正しさを求め、その正しさを証明するという作業が好きなんだという事に気づき、師匠がいない環境、結構好きだなと思っています。自分で沢山考えなければならない分、経験値としてドカンと積まれていってるものもあると思うし、実際困ったときの対処力はかなり高くなってきたなと自分でも思っています。

でもやっぱり、自分で考えたことが正しいかを確かめたくなる時はあり、「ああ、師匠がいてほしかったな」と思うことはあります。 そういう時は代わりにこうやって皆が見れて、色々ぶつけられる場に考えを吐き出すことにしています。なので、もしここに間違っている考えがあれば教えていただけると幸いです。

同じ境遇の方、きっとだいじょうぶです。一人でもやっていけます。自らの正しさを信じれるよう、日々考えて邁進して行きましょう。

頑張るぞ!