Java経験者がPHPでハマる10選の6「null安全性の甘さ」

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

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

6つ目「null安全性の甘さ」を掘り下げます。


null安全性の甘さ

Java経験者がPHPに来ると「これnullなのにエラーにならないの?」または「nullでアクセスしたら死んだ!」という両極端な現象に驚きます。
Javaはnullアクセスに非常に厳しく、PHPはケースによって緩かったり厳しかったりするため、慣れないと危険です。


JavaとPHPのnullアクセスの違い

項目JavaPHP
nullアクセスNullPointerException場合によってWarning、Notice、Fatal Error
安全性常に厳しいコンテキストによって変動
回避方法Optional型、nullチェックnull合体演算子(??)、null安全演算子(?->)

サンプルコード

Java(常に厳しい)

String s = null;
System.out.println(s.length()); // NullPointerException


PHP(場合による挙動)

$s = null;
echo $s; // ""(空文字に変換されて出力される)
echo $s->length; // Fatal error: Attempt to read property

  • 文字列化の場面では黙って空文字に変換
  • プロパティアクセスではFatal Error

PHPでnull安全性を高める演算子

null合体演算子(??)

$name = $_GET['name'] ?? 'default';

  • 左辺がnullまたは未定義なら右辺を返す

null安全演算子(?->)

$user = null;
echo $user?->name; // null(エラーにならない)

  • 左辺がnullならそのままnullを返す

ハマりポイント1:issetとemptyの違い

$value = null;
var_dump(isset($value)); // false
var_dump(empty($value)); // true

  • isset()は「nullか未定義ならfalse」
  • empty()は「falsy(0, "", null, falseなど)ならtrue」

ハマりポイント2:比較での型変換

var_dump(null == 0); // true(!?)
var_dump(null === 0); // false

  • ==は自動型変換するため予期せぬtrueになる

イメージで理解する

  • Javaのnull:触れた瞬間にブザーが鳴る厳格なセキュリティゲート
  • PHPのnull:触る場所によってはスルー、でも急に落とし穴

実務での推奨

  1. nullを使う前に???->で安全にアクセス
  2. 厳密比較(===)を使って型変換を避ける
  3. 配列アクセス前にarray_key_exists()isset()で存在確認

「Javaは常にセキュリティゲート、PHPは場所によって無防備」というイメージでとらえるとわかりやすいですね。

次は7つ目「標準ライブラリの名前や仕様が統一されていない」に進めれば、言語設計思想の歴史的経緯まで見えてきます。

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

投稿者プロフィール

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