Code Fix

初級

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を返して動き続けることはありません。

直し方: 04 にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン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にならない値を渡す必要があります。

直し方: 05 にします。

この問題を解いてみる →

よくある誤解

「PHPは何を割っても警告が出るだけで動き続けるはず」という古い情報は8系には通用しません。0除算は例外として扱われ、キャッチしない限りプログラムはそこで停止します。

まとめ

DivisionByZeroError: Division by zeroは初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)