Java経験者がPHPでハマる10選の6「null安全性の甘さ」
こんにちは。ゆうせいです。
Javaをしっかり学んだ人がPHPに移行すると、「似てるはずなのに全然感覚が違う!」と驚くことが多いんです。
同じオブジェクト指向言語ですが、設計思想や実行環境、型の扱い方などがかなり異なります。
Java経験者がPHPを学ぶときにハマりやすいポイントを10個にまとめ、具体的な解説と回避方法をお伝えしています。
6つ目「null安全性の甘さ」を掘り下げます。
null安全性の甘さ
Java経験者がPHPに来ると「これnullなのにエラーにならないの?」または「nullでアクセスしたら死んだ!」という両極端な現象に驚きます。
Javaはnullアクセスに非常に厳しく、PHPはケースによって緩かったり厳しかったりするため、慣れないと危険です。
JavaとPHPのnullアクセスの違い
項目 | Java | PHP |
---|---|---|
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:触る場所によってはスルー、でも急に落とし穴
実務での推奨
- nullを使う前に
??
や?->
で安全にアクセス - 厳密比較(
===
)を使って型変換を避ける - 配列アクセス前に
array_key_exists()
やisset()
で存在確認
「Javaは常にセキュリティゲート、PHPは場所によって無防備」というイメージでとらえるとわかりやすいですね。
次は7つ目「標準ライブラリの名前や仕様が統一されていない」に進めれば、言語設計思想の歴史的経緯まで見えてきます。
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
山崎講師2025年8月12日Java経験者のためのPHP入門
山崎講師2025年8月12日Java経験者がPHPでハマる10選の1 「型のゆるさ(動的型付け)に戸惑う」
山崎講師2025年8月12日Java経験者がPHPでハマる10選の2 「アクセス修飾子のデフォルト挙動の違い」
山崎講師2025年8月12日Java経験者がPHPでハマる10選の3「コンストラクタの書き方の違い」