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 になる感じです。あらかじめ変数の初期化を書き連ねる必要はありません。