Java経験者がPHPでハマる10選の1 「型のゆるさ(動的型付け)に戸惑う」

こんにちは。ゆうせいです。

Javaをしっかり学んだ人がPHPに移行すると、「似てるはずなのに全然感覚が違う!」と驚くことが多いんです。
同じオブジェクト指向言語ですが、設計思想や実行環境、型の扱い方などがかなり異なります。
Java経験者がPHPを学ぶときにハマりやすいポイントを10個にまとめ、具体的な解説と回避方法をお伝えしています。

まず「型のゆるさ(動的型付け)に戸惑う」を深掘りします。


型のゆるさ(動的型付け)を理解する

JavaからPHPに移ると最初に強く感じるのは型の管理の違いです。
Javaは「型の厳しい門番」が立っている世界。変数には必ず型があり、それが変わるとコンパイルエラーになります。

PHPはその門番がいません。代わりに「何でも屋さん」がいて、必要に応じて変数の中身を変えたり、型変換したりしてくれます。
一見便利ですが、便利すぎて事故も多いのです。


JavaとPHPの比較

項目JavaPHP
型付け静的型付け(static typing)動的型付け(dynamic typing)
宣言方法int num = 5;$num = 5;
実行時型変換原則なし(キャストが必要)自動型変換(type juggling)
比較演算厳密(型も比較)緩い(型変換後に比較)

サンプルコードと落とし穴

Javaの場合

int num = 5;
num = "hello"; // コンパイルエラー: 型不一致

PHPの場合

$num = 5;
$num = "hello"; // 実行可能。$numは文字列に変わる


自動型変換によるバグの例

var_dump(0 == "0");       // bool(true)
var_dump(0 == "abc");     // bool(true) ← !? なぜ?

なぜこうなるのか
PHPは比較時に文字列を数値に変換します。"abc"は変換すると0になり、0 == 0と判定されます。


回避策

PHP 7以降は次の方法で型の安全性を上げられます。

  1. strict_typesを有効化
<?php
declare(strict_types=1);

これにより関数の引数や戻り値の型チェックが厳格になります。

  1. 型宣言を積極的に使う
function add(int $a, int $b): int {
    return $a + $b;
}

  1. 厳密比較(===)を使う
var_dump(0 === "0"); // bool(false)


イメージで理解する

  • Javaは「学校の制服ルール」:服(型)が決まっていて違うものは着られない。
  • PHPは「私服OKの学校」:服(型)は自由だけど、ドレスコードを守らないと混乱する。

この型のゆるさは、短期開発やプロトタイプ作成では爆速のメリットになります。
しかし長期開発や大規模プロジェクトでは型宣言+strict_typesがほぼ必須です。


次は「アクセス修飾子のデフォルト挙動の違い」を掘り下げます。

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。