【PHP】PHP9からは未定義変数を参照するとエラーになると決定

  • 2022年3月31日
  • 2022年4月1日
  • PHP

 PHP は元々雑に書いてもなんやかんやよしなに動いてくれる言語でしたが、型の拡張をはじめとして徐々に誤りを起こさない様に言語仕様を変化させてきました。この方針に従ってか PHP9.0 からは未定義変数を参照するとエラーが発生するようになると次の RFC で決定されました。

PHP: rfc:undefined_variable_error_promotion

 これまでは次の様な未定義変数の中身を知る必要のある参照を書いた場合、通知や警告が発生していましたが PHP9.0 からはエラーになります。

<?php

echo $hoge;
// PHP 8.0~8.1 ならば
// Warning: Undefined variable $hoge 
// PHP 8 より前ならば
// Notice: Undefined variable: hoge 

 RFC 内であげられているこの警告が起きるがプログラムの作成者が意図的に作ったコードとして次が挙げられています。

  while ($item = $itr->next()) { 
     /* do something */
     $counter++; /* potential undefined variable read #1 */
  }
 
  /* potential undefined variable read #2 which is the same as the 
   * first mechanism (variable undefined due to branching logic) */
  echo 'You scanned ' . $counter . ' items'; 

 また RFC の例1に近いですが結果的に期待通り動くコードとして次があります。

<?php
if('処理Aを実行する必要があるならば true'){
    $a = '処理Aの結果';// 失敗なら false、成功なら true 的な値が入る
}

if($a){
    // 処理Aの結果が true っぽい結果ならば if 内の処理を実行
    // それ以外の時(処理Aを失敗した場合と処理Aをしていない場合)は実行しない
}

 ありがたいことにこの RFC の適用は PHP9 からであり、PHP9 はまだまだ先の話です。今のうちから徐々に直しておくべきでしょう。直す際には IDE の機能を使用して値が未定義の可能性がある警告を一つ一つ摘み取るのがよさそうです。

追記:未定義状態の変数を読み取った場合に起きるエラーが現在の E_WARNING レベルのエラーから E_ERROR になる感じです。あらかじめ変数の初期化を書き連ねる必要はありません。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG