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;
Fatal error: Uncaught DivisionByZeroError: Division by zero in main.php:4
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);
Fatal error: Uncaught DivisionByZeroError: Division by zero in main.php:3
average(100, 0)は$countに0を渡しています。$countで割ろうとすると0除算になるため、割る対象を間違えていないか見直す必要があります。
直し方: $count を $total にします。
パターン3
1 <?php 2 $price = 500; 3 $qty = 0 ; ^ 4 echo $price / $qty;
Fatal error: Uncaught DivisionByZeroError: Division by zero in main.php:4
priceを0で割ろうとしています。0にならない値を渡す必要があります。
直し方: 0 を 5 にします。
よくある誤解
「PHPは何を割っても警告が出るだけで動き続けるはず」という古い情報は8系には通用しません。0除算は例外として扱われ、キャッチしない限りプログラムはそこで停止します。
まとめ
DivisionByZeroError: Division by zeroは初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。