PHPの型の概念の曖昧さを防ぐ

$suuchi = 123; と $suuchi = '123'; との区別をつけよう!
ベテランのPHPプログラマーさんや多言語を扱うプログラマーさんには当たり前のことかもしれませんが、型の定義の重要性についてのメモです。
PHPでは条件式内で勝手に変数の型を勝手にキャストしてしまいます。
PHPは、プログラムというものを最初に学ぶにはとても適した言語です。
ですがPHPプログラマー初級者から中級者になる段階で、PHPがフワっとさせている「型」をシッカリ理解しておかないと危険です。
僕もPHPでお仕事をし始めて半年くらい経過し、初めてことの重大性に気づきました笑汗(遅いよヤバイよ)

<?php
$aaa 
'AAA';
$echo1 "$aaa";
$echo2 '$aaa';
echo 
$echo1.'<br>';
echo 
$echo2.'<br>';
?>

上記ソースコードのように $echo1 と $echo2 を echo したときにどのようになるでしょうか?
↓実行結果はこうなります↓

AAA
$aaa
ダブルクォーテーションとシングルクォーテーションの違いですね。

条件分岐で == などの演算子を使用する際にも気を付けないとなりません。
下記のサンプルソースコードをご覧ください。

<?php
$var 
"abc";

// 条件分岐 1
if ($var == 0) {
    echo 
'文字と数値を比べると・・PHP条件式内でのキャストのされ方が恐いよね。衝撃の事実。';
}else{
    echo 
'こっちの分岐に入ってほしい。';
}

// 条件分岐 2
if ($var === 0) {
    echo 
'<br>ちゃんと型まで判定する === イコール3つなら安心。';
}else{
    echo 
'<br>型の判定はしっかりしよっと。';
}

?>

↓ 実行結果 ↓

文字と数値を比べると・・PHP条件式内でのキャストのされ方が恐いよね。衝撃の事実。
型の判定はしっかりしよっと。
この結果は、ソースコードを書いた人の認識とずれている可能性がありますよね?
上記の 条件分岐 1 の様なソースコードを書く人は、おそらく「初心者プログラマー」です。
ハンター×ハンターの世界で説明すると、念を覚えたての天空闘技場の頃のゴンとキルアの状態、といったところです。

PHPは導入しやさにより世界的に普及しました。
CやJavaとは違い、変数の型をガッチガッチに定義しなくても、うまーくやってくれるのがPHPという言語の優しさです。
ですが、思わぬところで意図しない動きをしてしまうので、それを防ぐために

  • 文字列を変数に代入するときは シングルクォーテーション を用いて $mojiretsu = 'もじもじくん'; とする
  • 数値を変数に代入するときは ダブルクォーテーションもシングルクォーテーションも使わず $suuchi = 123; とする
  • 条件式での演算子は == ではなく、 === を使う
とルールを決めてプログラミング/コーディングします。

また、複数人でプログラムをコーディングする開発チーム内では、あらかじめコーディングルールとして皆で徹底するようにしたいです。
ソースコードを後から見た人(←自分を含め)が処理の意味、つまりそのプログラムでやりたい事が何なのかが分かりやすくなります。
多人数の開発チームがアジャイル開発をする場合、こういったひとりひとりの優しい心がけはプロジェクトの為になると思われます。


以下のプログラムは文字列の型や条件式で曖昧なプログラミングをしたときの挙動のメモです。

<?php

$var1 
1234;
$var2 '1234';
$var3 'abcd';
$var4 "$var3";
$var5 '$var3';
echo 
'<hr>';
echo 
'$var1 : '.$var1.'<br>';
echo 
'$var2 : '.$var2.'<br>';
echo 
'$var3 : '.$var3.'<br>';
echo 
'$var4 : '.$var4.'<br>';
echo 
'$var5 : '.$var5.'<br>';
echo 
'<hr>';
echo 
'1 : ';
var_dump($var1 == 0);
echo 
'<hr>';
echo 
'2 : ';
var_dump($var2 == 0);
echo 
'<hr>';
echo 
'3 : ';
var_dump($var3 == 0);
echo 
'<hr>';
echo 
'4 : ';
var_dump($var4 == 0);
echo 
'<hr>';
echo 
'5 : ';
var_dump($var5 == 0);
echo 
'<hr>';
echo 
'6 : ';
var_dump($var1 === 0);
echo 
'<hr>';
echo 
'7 : ';
var_dump($var2 === 0);
echo 
'<hr>';
echo 
'8 : ';
var_dump($var3 === 0);
echo 
'<hr>';
echo 
'9 : ';
var_dump($var4 === 0);
echo 
'<hr>';
echo 
'10 : ';
var_dump($var5 === 0);
echo 
'<hr>';
?>

↓ 実行結果 ↓


$var1 : 1234
$var2 : 1234
$var3 : abcd
$var4 : abcd
$var5 : $var3

1 : bool(false)
2 : bool(false)
3 : bool(true)
4 : bool(true)
5 : bool(true)
6 : bool(false)
7 : bool(false)
8 : bool(false)
9 : bool(false)
10 : bool(false)