PHP学習コラム第5回『変数の命名方法』(ぺち子の目指せPHP初級試験合格!)を公開しました。

PHP学習コラム第5回『変数の命名方法』(ぺち子の目指せPHP初級試験合格!)を公開しました。
※この記事は読者によって投稿されたユーザー投稿です:
  • 編集部の見解や意向と異なる内容の場合があります
  • 編集部は内容について正確性を保証できません
  • 画像が表示されない場合、編集部では対応できません
  • 内容の追加・修正も編集部では対応できません

こんにちは~、ぺち子です!
前回はクォートとヒアドキュメントのお話でした。
今回は『変数の命名方法』について書いてみます。

変数名は先頭に「$」をつけますよね。
私は他の言語も使っている癖で、たまにこの「$」を忘れてエラーになったりします。笑

$の後ろにはアルファベットとアンダースコア(_)だけが使えます。
1文字で「$a」や「$_」でも大丈夫ですが、後者は使われているのを見たことがありません。

変数名は、他の人(未来の自分も含む)が見たときに、分かりやすい名前をつけるべきです。
なので、こういうのはよくない例です。

------------------------------------------------------------
<?php
// 入力フォームの内容
$a = $_POST["id"]; // ID
$b = $_POST["password"]; // パスワード
$c = $_POST["password2"]; // パスワード(確認用)

// ~省略~

if($b !== $c) {
print "パスワードが確認用パスワードと違います";
}
?>
------------------------------------------------------------

後からパッと見たときに、「$b と $c って何だっけ?」と、上の方まで戻って確認しなけばいけないので、とても分かりにくいですよね。
IDなら「$id」「$user_id」「$userId」、パスワードなら「$password」「$user_password」「$userPassword」とか、中身を表す名前にしましょう。

変数の場合、大文字と小文字は区別されるので、「$userId」と「$userID」は別物です。
紛らわしいので両方使わないようにしましょう。

また、開発者が日本人だけだからといって、ローマ字の名前をつけるのもあまり関心されません。
プログラミングは世界共通言語なので、英単語を使いましょう。

変数名のつけ方はいろいろありますが、こういう命名規則はだいたいコーディングルールで決まっています。
長い英単語を省略するかどうかとか(会社名→$company_name、$comp_name、$cmpnName)、訳語を何に統一するかとか(編集→edit、mod、modify)、自分のルールを作ったり、すでにあるルールに従います。

いくつか私が見たことのあるルールを紹介してみます。

先ほどのコードの続きで、入力内容をデータベースに保存することになりました。

------------------------------------------------------------
<?php
// ~省略~

// パスワードを保存
savePassword($password);
?>
------------------------------------------------------------

「savePassword」は、私が今適当に考えた関数です。
「$password」をデータベースに保存してくれるとしましょう。

さて、このコードを後で見直したときに、「$password」が安全かどうかすぐに分かるでしょうか。

ユーザのパスワードを保存するときは、復元できない方法で暗号化するのが一般的ですよね。
同じパスワードを暗号化すると毎回同じ文字列になりますが、その文字列からパスワードは復元できない仕組みです。
システムの管理者でもパスワードを知るのはよくないですし(他で使ってるかもしれないし)、データが盗まれたらそれこそ問題です。

この「$password」は暗号化前でしょうか、後でしょうか。
もちろん上の方のコードを遡れば分かります。

------------------------------------------------------------
<?php
// 入力されたパスワード
$password = $_POST["password"];

// ~省略~

// パスワードを暗号化
$password = MD5($password);

// ~省略~

// パスワードを保存
savePassword($password);
?>
------------------------------------------------------------

あぁ、暗号化されていましたね。
でも、そんな確認を毎回やるのも手間です。

なので、暗号化前の変数と、暗号化後の変数の、名前を別々にするのです。

------------------------------------------------------------
<?php
// 入力されたパスワード
$raw_password = $_POST["password"]; // raw: 生の

// ~省略~

// パスワードを暗号化
$encrypted_password = MD5($raw_password); // encrypted: 暗号化された

// ~省略~

// パスワードを保存
savePassword($encrypted_password);
?>
------------------------------------------------------------

これなら最後の一行を見ただけでも、暗号化されたパスワードを保存しているのが分かります。
少なくとも、コードを書いた人がそういうつもりなのは分かりますし、もし下のようになっていたら明らかにバグと分かるので、バグの発見も簡単です。

------------------------------------------------------------
<?php
// パスワードを保存
savePassword($raw_password); // raw~になってる!
?>
------------------------------------------------------------

こういうテクニックは他にもあります。

PHPは、変数の中にどんな種類のデータを入れようが、勝手がいいように解釈してくれます。
(それがたまに余計なお節介で、気づきにくいバグを生むんですが…)

下の例を見てください。

------------------------------------------------------------
<?php
ユーザの誕生日が7月なら
if($user_birthmonth === 7) {
// メッセージを表示
print "今月お誕生日ですね、おめでとうございます!";
}
?>
------------------------------------------------------------

このユーザは7月が誕生日だとして、「$user_birthmonth」に入っている値は、数値の「7」でしょうか、文字の「"7"」でしょうか、それとも「"July"」でしょうか?

後の章の話になっちゃいますが、「if($user_birthmonth === 7)」は、「$user_birthmonth」が数値の「7」のときしか、正しいと判断されません。
もしかしたら「$user_birthmonth」には文字が入っていて、誰にもこのメッセージが表示されないかもしれません。

でも、パッと見ただけでは中身の種類まで分かりません。

こういうときに、「$int_user_birthmonth」という変数名にしておけば、そんな不安もなくなります。
(例なのでちょっと変数名が長すぎです。笑)

そしてやっぱり、下のようなバグもすぐに発見されるでしょう。
int(数値)って書いてあるのに、「"July"」かどうか調べても無意味ですもんね。

------------------------------------------------------------
<?php
ユーザの誕生日が7月なら
if($int_user_birthmonth === "July") {
// メッセージを表示
print "今月お誕生日ですね、おめでとうございます!";
}
?>
------------------------------------------------------------

教科書的には、「変数に使える文字は何か」とか、「大文字と小文字は区別されるか、とかがよく載っていますが、それ以上の実際の使われ方は、チームに入ってコードを書いたり、他人のコードを読む機会がないとなかなか分からないものですよね。
昔は「オープンソースソフトウェアのコードを読め」とか言われましたが、量が膨大なので、私はムリでした。笑
今なら他人がGithubとかで公開しているちょっとしたソースを読ませてもらうのもいいんじゃないでしょうか。

それではまた次回~!

____________________________________________________________
************************************************************

「ぺち子の目指せPHP初級試験合格!」PHP学習コラム目次

第一回
「info.phpを作成し、ブラウザで表示させる おまけ:GUNDAM」
http://on.fb.me/K5jfiq

第二回
「開始タグと終了タグの適切な書き方」
http://on.fb.me/MwF3T4

第三回
「ホワイトスペースと大文字小文字の使い方」
http://on.fb.me/KzPf1T

第四回
「ダブル&シングルクォートと、ヒアドキュメントの使いどころ」
http://

この記事が役に立ったらシェア!
メルマガの登録はこちら Web担当者に役立つ情報をサクッとゲット!

人気記事トップ10(過去7日間)

今日の用語

NDA
Non-Disclosure Agreementの略。一般には「秘密保持契約」と ...→用語集へ

インフォメーション

RSSフィード


Web担を応援して支えてくださっている企業さま [各サービス/製品の紹介はこちらから]