DivisionByZeroError: Division by zero の原因と直し方
0で割り算をすると、PHP8ではDivisionByZeroErrorという例外が投げられ、プログラムが止まります。PHP7以前はWarningを出して結果はINFになるだけでしたが、8では致命的エラーに格上げされています。
エラーメッセージの読み方
Fatal error: Uncaught DivisionByZeroError: Division by zero in main.php:4
main.php- ファイル名
4- 行番号 — 実際にクラッシュした行
DivisionByZeroError- 例外クラス — 何が起きたか。ここを検索するのが最短です
Division by zero- 内容 — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 <?php 2 $a = 20; 3 $b = 0 ; ^ 4 echo $a / $b;
0で割り算をすると、PHP8ではDivisionByZeroErrorが投げられプログラムが止まります。PHP7時代のようにINFを返して動き続けることはありません。
直し方: 0 を 4 にします。
パターン2
1 <?php 2 function average($total, $count) { 3 return $total / $count; ^ 4 } 5 echo average(100, 0);
average(100, 0)は$countに0を渡しています。$countで割ろうとすると0除算になるため、割る対象を間違えていないか見直す必要があります。
直し方: $count を $total にします。
パターン3
1 <?php 2 $price = 500; 3 $qty = 0 ; ^ 4 echo $price / $qty;
priceを0で割ろうとしています。0にならない値を渡す必要があります。
直し方: 0 を 5 にします。
パターン4
1 <?php 2 $x = 40; 3 $y = 0 ; ^ 4 echo $x / $y;
0で割り算をするとPHP8ではDivisionByZeroErrorが投げられプログラムが止まります。
直し方: 0 を 8 にします。
パターン5
1 <?php 2 function ratio($a, $b) { 3 return $a / $b; 4 } 5 echo ratio(9, 0 ); ^
ratio(9, 0)は第2引数に0を渡しています。割る対象が0にならない値を渡す必要があります。
直し方: 0 を 3 にします。
よくある誤解
「PHPは何を割っても警告が出るだけで動き続けるはず」という古い情報は8系には通用しません。0除算は例外として扱われ、キャッチしない限りプログラムはそこで停止します。
実務での勘所
この挙動の変更はPHP 8の目玉的な破壊的変更の1つでした。/だけでなく、intdiv()や%(剰余演算子)も、除数が0のときはPHP8ではDivisionByZeroErrorを投げるようになっています。PHP7以前のコードをPHP8に移行する際は、0除算を握りつぶして処理を続けていた古いコードが、この変更によって突然停止するようになっていないか確認する必要があります。