PHPスキルアップガイド

プログラム
date 2013.04.07 tag 未設定
最終更新日 2013年10月5日
概要 Webプログラマーとしての1年を振り返って、自分のステップアップになったと思うことをいくつか紹介したいと思います。PHP初心者さんなどに少しでも参考になってくれたら嬉しいです。

目次

  • 1.PHPの細かい挙動を知る
  • 2.適切なネーミングをする
  • 3.一貫性のあるコードを書く
  • 4.最後に

PHPの細かい挙動を知る

20130407_01
PHPでプログラムを書いていると知らない間に”とりあえず動く”と思うことがあります。
これは内部での細かい仕様に基づく処理が行われているために起こっています。
僕自身全部網羅できませんが、注意するべき点をいくつか紹介したいと思います。

文字列を定義する 「”」と「’」

文字列を定義するときの「”」と「’」には違いがあります。
「”」で文字を囲った場合、変数やエスケープシーケンスを認識して展開しますが、「’」では全て文字だと認識して展開は行われません。

変数とエスケープシーケンスの展開

[php]
$break_fast = ‘抹茶パン’; $double_quote = “朝食 : $break_fast \n”;
$single_quote = ‘朝食 : $break_fast’; //朝食 : 抹茶パン
echo $double_quote; //朝食 : $break_fast\n
echo $single_quote;
[/php]
echoすると「”」で囲った文字列は$break_fastを展開して表示しています。逆に「’」はそのまま$break_fastと表示します。
ただ「”」内で変数を展開させるには変数のあとにスペースを入れる、または{$break_fast}と記述する必要があります。

比較演算子 「==」と「===」

if文の比較で使う比較演算子「==」には注意が必要です。
「==」は緩やかな比較をしてしまうので、適当に使っていると思わぬバグが生まれるかも知れません。厳密な判定をするには「===」を使いましょう。
次のコードでそれぞれの違いについて確認してみます。

比較演算子「==」

[php]
$code = ‘3abc’; if ($code == 3) {
echo ‘true’;
} else {
echo ‘false’;
}
[/php]

‘3abc’と3が違うことは明らかですが、判定はtrueとなってしまいます。
「==」で比較する場合、PHP内部では自動的に形式が異なる変数の変換が行われているのです。
この場合だと$codeが文字列→整数に変換された結果、「3 == 3」として比較されてしまうので、正しいと判定されています。

比較演算子「===」

[php]
$integer = 1;
$bool = true; if ($integer === $bool) {
echo ‘true’;
} else {
echo ‘false’;
}
[/php]

1とtrueを型まで見て(整数とbool)比較しているので、判定はfalseとなります。
セキュリティの面からも”唯一の値”しか判定で通したくない場合には比較演算子「===」を使うのが良いです。厳密な否定には「!==」を使います。

備考:変数の型変換

プログラム内で変数の型を明示的に変更することができます。
字列から整数型に明示的に変換したい場合にはintval関数や、キャストと呼ばれる記述を用います。どちらを使用するのでも大丈夫です。

変数の型変換

[php]
$text_number = ’10’; //intval関数
$integer_by_intval = intval($text_number); //キャスト
$integer_by_cast = (int)$text_number;
[/php]

型の変換には他にも方法があるので興味があれば調べるのが良いと思います。

empty関数

変数が空かどうかを判定してtrueまたはfalseを返すempty関数。
一見単純そうに見える関数ですが、この”空”というの条件は緩やかなもので、PHPマニュアルの説明にはこのように明記してあります。
次のコードでempty関数の判定を確認してみましょう。
変数が空であるとみなされるのは、変数が存在しない場合や 変数の値が FALSE に等しい場合です。

empty関数の挙動

[php]
//true
$test;
$test_int = 0;
$test_str_int = ‘0’;
$test_bool = false;
$test_null = NULL;
$test_array = array(); //false
$test_array_str = array(”);
$test_str_bool = ‘false’;
$test_str_null = ‘NULL’;
[/php]
falseや0も空(true)として判定されています。
empty関数は名前から単純に”空であるばtrue”ということを考えてしまいがちなので注意した方がいいです。
またempty関数以外にもis_null関数、isset関数などの判定関数の挙動には注意が必要です。

適切なネーミングをする

20130407_02
”変数や関数の名前”を付けることを命名あるいはネーミングと言います。
このネーミングというのは最初の頃に思っている以上に重要なものです。
詳しいことは本などで勉強してもらうことにして、ここでは入門編として紹介したいと思います。

ネーミングはなぜ大切か

自分一人だけで小規模なコードを書く上ではネーミングの重要性は低いかもしれません。
しかし複数人で開発するような中規模以上のコードではどうでしょう。コードの量が多く、複数ファイルに及ぶ場合には、要点を掴んで何をしているのかを把握することが重要です。 そのようなコードを読んでいるときに、次のようなコードが出てきたらどうでしょう。
何を足すのか、数値なのか文字列なのか、それとも配列を結合するのか…。これだけの情報では何をするか明確にはなりませんよね。

目的が明確に分からないコード

[php]
//sum関数の呼び出し
$result = sum($one, $two);
if ($result === false) {
echo ‘パラメータが不正です。’;
}
[/php]
結局、このようなコードはsum関数が記載してる場所を探してその中身を読む必要が出てきます。
※sum関数はユーザ定義関数。

具体的にする

少ない情報だけで何をしているか理解するためにはネーミングを具体的にしてあげます。
さっきのは変数・関数の名前が抽象的なため、コードを全て読まないと明確にならなかったのです。
それでは先ほどのコードのネーミングを具体的にしてみます。

目的を具体的にしたコード

[php]
//「m月d日」の日付を取得
$date = createDateByString($month, $day);
if ($date === false) {
echo ‘パラメータが不正です。’;
}
[/php]

処理の内容自体はそのままで、何をしているのかがグッと分かりやすくなりました。
「月」と「日」の文字列を関数に渡してやることで日付を生成する、変数名と関数名を具体的にしたことで多くの情報を持たせることができました。
またコメントにはこのように、補足的な情報を書いてあげるとステキですよ。

備考:説明変数

このように変数・関数名などに適切な名前を付け、その名前自体が何をしているかを主張するものを説明変数って言ったりします。キレイなコードを書くための鉄則です。

一貫性のあるコードを書く

20130407_03
ある程度コードを書くことに慣れてきたら、コーディングの作法を学んでみるのが良いです。
そこで登場するのがコーディング規約。フレームワークや企業で採用している、コーディングの標準規格みたいなものです。

PHPのコーディング規約

PHPでは代表的なものにこれらのコーディング規約があります。 これらを参考にして、統一され一貫性のあるコードを書けるようになるのが良いでしょう。
個人的にコードを書く際はZendコーディング規約に基づいてこのようなものを心がけています。
  • タブを使わず、代わりに半角スペース4つを使う
  • 1行の長さは80文字程度にする
  • 変数の命名は「_」で単語を区切る
  • 関数・メソッドの命名はcamelCaseで行う
  • カンマで区切った後には半角スペースを1つ入れる
  • ()と演算子の前後に半角スペースを1つ入れる
このエントリー内のコードはこれを守っているので、気になった方は見てください。(バタッ)

最後に

いかがでしたでしょうか。
PHP初心者だった自分が成長できたなあ、これは是非知っておいてほしいなと思ったことを書いてみました。
この次の段階としてオブジェクト指向、そしてより実践的なことを理解するために「CakePHP」「ZendFramework」などのフレームワークを勉強するもの良いと思います!
道のりは結構かかるので、ゆっくり、行きましょう。