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

直し方: 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 にします。

この問題を解いてみる →

パターン4

 1  <?php
 2  $x = 40;
 3  $y = 0 ;
          ^
 4  echo $x / $y;
Fatal error: Uncaught DivisionByZeroError: Division by zero in main.php:4

0で割り算をするとPHP8ではDivisionByZeroErrorが投げられプログラムが止まります。

直し方: 0 を 8 にします。

この問題を解いてみる →

パターン5

 1  <?php
 2  function ratio($a, $b) {
 3      return $a / $b;
 4  }
 5  echo ratio(9, 0 );
                   ^
Fatal error: Uncaught DivisionByZeroError: Division by zero in main.php:3

ratio(9, 0)は第2引数に0を渡しています。割る対象が0にならない値を渡す必要があります。

直し方: 0 を 3 にします。

この問題を解いてみる →

よくある誤解

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

実務での勘所

この挙動の変更はPHP 8の目玉的な破壊的変更の1つでした。/だけでなく、intdiv()や%(剰余演算子)も、除数が0のときはPHP8ではDivisionByZeroErrorを投げるようになっています。PHP7以前のコードをPHP8に移行する際は、0除算を握りつぶして処理を続けていた古いコードが、この変更によって突然停止するようになっていないか確認する必要があります。

演習をはじめる

関連するエラー

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