PHP,如何通过零捕获除法?

PHP,如何通过零捕获除法?

我有一个必须动态创建的大型数学表达式。例如,一旦我解析了“某事”,结果将是一个字符串,如:"$foo+$bar/$baz";

所以,为了计算该表达式的结果,我正在使用eval函数......这样的事情:

eval("\$result = $expresion;");echo "The result is: $result";

这里的问题是,有时我会得到错误,表示存在除零的错误,而且我不知道如何捕获该异常。我尝试过这样的事情:

eval("try{\$result = $expresion;}catch(Exception \$e){\$result = 0;}");echo "The result is: $result";

要么:

try{
    eval("\$result = $expresion;");}catch(Exception $e){
    $result = 0;}echo "The result is: $result";

但它不起作用。那么,如果存在除零值,我怎么能避免我的应用程序崩溃?

编辑:

首先,我想澄清一下:表达式是动态构建的,所以如果分母为零,我不能只评估它。那么......关于Mark Baker的评论,让我举个例子。我的解析器可以构建这样的东西:

"$foo + $bar * ( $baz / ( $foz - $bak ) )"

解析器逐步构建字符串而不用担心变量的值...所以在这种情况下如果$foz == $bak实际上除以零:$baz / ( 0 )

另一方面,正如皮特建议的那样,我尝试过:

<?php
$a = 5;$b = 0;if(@eval(" try{ \$res = $a/$b; } catch(Exception \$e){}") === FALSE)
        $res = 0;echo "$res\n";?>

但它没有打印任何东西。


慕运维8079593
浏览 642回答 3
3回答

波斯汪

if&nbsp;($baz&nbsp;==&nbsp;0.0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;'Divisor&nbsp;is&nbsp;0';}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;...}如果你在evalled表达式中使用用户输入,那么使用eval是非常危险的,而不是使用eval,为什么不在PHPClasses上使用适当的解析器,如evalmath,并且除以零之外引发一个干净的异常

喵喔喔

您只需要设置一个错误处理程序,以便在出现错误时抛出异常:set_error_handler(function&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;Exception('Ach!');});try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;4&nbsp;/&nbsp;0;}&nbsp;catch(&nbsp;Exception&nbsp;$e&nbsp;){ &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Divide&nbsp;by&nbsp;zero,&nbsp;I&nbsp;don't&nbsp;fear&nbsp;you!".PHP_EOL; &nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;0;}restore_error_handler();

慕尼黑5688855

这是另一个解决方案:<?phpfunction&nbsp;e($errno,&nbsp;$errstr,&nbsp;$errfile,&nbsp;$errline)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"caught!\n";}set_error_handler('e');eval('echo&nbsp;1/0;');看到&nbsp;set_error_handler()
打开App,查看更多内容
随时随地看视频慕课网APP