便利ツール
トップへ

PHPの型の概念の曖昧さ

PHPの型の概念の曖昧さによる思わぬ動作に気を付けよう。

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


クォーテーションの曖昧さに気を付ける

記ソースコードのように $echo1 と $echo2 を echo したときにどのようになるでしょうか?

↓ ↓実行結果はこうなります↓ ↓

ダブルクォーテーションとシングルクォーテーションの違いですね。
これはなんとなくOKです。
シングルクォーテーションで囲むと、中身は "しっかり" 文字列として扱われる といったところでしょうかね。


比較演算子の曖昧さに気を付ける

参考 条件分岐で == などの演算子を使用する場合には更に罠があり、気を付けないとなりません。
下記のサンプルソースコードをご覧ください。

↓ 実行結果 ↓

この結果は、ソースコードを書いた人の認識とずれている可能性がありますよね?
PHPの処理では、上記の 条件分岐 1 と 条件分岐 5 の式は、なんと 0 と ""(空文字) が同じですよ、と識別されています。

PHPは初心者にも扱いやすく、レンタルサーバーにも当たり前のようにインストールされていて導入のしやさにより今や世界的に最も普及しているインターネット関連のプログラム言語の一つです。
CやJavaとは違い、変数の型をガッチガッチに定義しなくても、うまーくやってくれるのがPHPという言語の優しさではあります。
ですが、思わぬところで意図しない動きをしてしまうので、それを防ぐために

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

とルールを決めてコーディングします。

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

var_dump() しまくる

以下のプログラムは文字列の型や条件式で曖昧なプログラミングをしたとき、中身はどのようになっているか確認する方法です。

↓ 実行結果 ↓

おそろしや。

結論

文字列の定義にはシングルクォーテーションを使う。
比較演算子は、== や != でなく、=== や !== を使う。
もちろん場面によっては、== などの比較演算子が便利な場合があるかもしれませんが、型のキャストによる思わぬ不具合を嫌うのであれば、型の定義と比較演算子に気をつける。
昔からよく言われますが、PHPのクセが強いんじゃ。現在の上記の実行例の稼働PHPバージョンは7.4.33でしたが、PHPはどんどん進化していくことでしょう。