✅ サクッと結論
Ruby(3.4.1)では nil < '2025-04' はエラー(比較できない)
PHP(8.4.3)では null < '2025-04' はtrue(比較できる)
PHPはnullでも比較演算子の対象になるので、Ruby感覚で書くと意図しない動作をすることがある
💡 実例:Rubyならこうなる
irb(main):001> nil < '2025-04'
(irb):1:in `<main>': undefined method `<' for nil (NoMethodError)
nil < '2025-04'
^
→ Rubyでは、< などの比較演算子は Comparable モジュールを通じて <=> に依存しますが、nil 自体には <=>も < も定義されていないため、比較しようとすると NoMethodError になります。
nil
に比較演算子がない → メソッド未定義 → 例外(NoMethodError) です。
参考: Ruby 3.4 リファレンスマニュアル ライブラリ一覧 組み込みライブラリ Comparableモジュール → nilが比較されることを想定していない
💡 実例:PHPならこうなる
php > var_dump(null < '2025-04');
bool(true)
→ 'date' がnullでも、比較は成立して通ってしまう。
🤯 なぜこうなる?
PHPでは null は比較時に自動的に 空文字列 '' に変換され、比較できるようになる。
→ "'' < '2025-04'" の評価になるため、結果は true
✅ まとめ
比較 | Ruby | PHP |
---|---|---|
null < "文字列" |
NoMethodError (比較不可) |
true (空文字として比較される) |
✍️ 最後に
Rubyの案件を中心にやってきたのですが、初めてPHPの案件にアサインしていただいただき、
「nullが比較できるの!?」「エラーにならないの!?」と素直に驚きました。
同じようにRuby脳でPHPに挑戦している方の参考になればと思い、今回まとめてみました。
ここまで読んでいただき、ありがとうございました!
🚀 番外:RubyエンジニアがPHPでやらかしそうな罠集
- empty() が 0 も null も "" もまとめて false にする
- "0" == false が true になる
- false == null も true