PHP 版本7.2.14中,一个数除以0会发生什么

PHP版本:

1
2
3
4
5
~/codeDir/phpCode/test # php -v
PHP 7.2.14 (cli) (built: Jan 11 2019 01:35:56) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.14, Copyright (c) 1999-2018, by Zend Technologies

代码:

1
2
3
4
5
6
<?php

$a = 10;
$b = 0;

echo $a / $b;

执行结果:

1
2
3
4
~/codeDir/phpCode/test # php test.php 

Warning: Division by zero in /root/codeDir/phpCode/test/test.php on line 6
INF~/codeDir/phpCode/test #

我们发现,报了Warning问题,这是PHP错误的一种等级。说明,就7.2.14版本的PHP而言:

1
一个数除以0,PHP会当作错误来看待

自然,我们就不可以通过捕获异常的方式来处理除0问题了:

1
2
3
4
5
6
7
8
9
10
<?php

$a = 10;
$b = 0;

try {
echo $a / $b;
} catch (\Exception $e) {
echo $e->getMessage() . PHP_EOL;
}

结果:

1
2
3
4
~/codeDir/phpCode/test # php test.php 

Warning: Division by zero in /root/codeDir/phpCode/test/test.php on line 7
INF~/codeDir/phpCode/test #

捕获异常失败了对吧。

所以,对于这种情况,我们还是需要单独去判断$b是否为0。

(注意,这是在目前的PHP版本中,除以0是当作错误来处理,在其他语言例如Java中,是当作异常来处理的)

如果可以的话,能够使用set_error_handler来接管PHP错误处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

function customError($errno, $errstr)
{
throw new Exception($errno . '|' . $errstr);
}

set_error_handler('customError', E_WARNING | E_STRICT);

$a = 10;
$b = 0;

try {
echo $a / $b;
} catch (\Exception $e) {
echo $e->getMessage() . PHP_EOL;
}

执行结果:

1
2
~/codeDir/phpCode/test # php test.php 
2|Division by zero