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://
ソーシャルもやってます!