PHP如何实现字符串格式的计算公式处理

在开发当中我们会遇到有一些需要配置计算公式的需求,举个栗子

我们在后台中配置了一个倍率和一个计算公式,例如倍率为3,计算公式为:%d*%d+100,表示一个数乘以倍率再加上补充数值

那么这样的公式我们应该如何处理呢?

首先看到%d这种格式,肯定会想到sprintf()函数,先用它来替换对应的变量

$num = 10;
$double = 3;
echo sprintf("%d*%d+100", $num, $double);

执行一下会得到输出:10*3+100,虽然这样操作之后得到了我们PHP可以操作的运算公式,但是它并不是我们想要的计算结果,而是一个字符串

在PHP当中的eval()函数可以把字符串作为PHP代码执行,因此可以用来解决字符串格式的计算公式

$num = 10;
$double = 3;
$str = sprintf("%d*%d+100", $num, $double);

eval("echo $str;");

这样就会得到我们所需要的计算结果:130。如果你需要将eval处理的值返回而不是直接输出,就可以将echo修改为return即可

那么问题来了,有些同学就会说了:这个函数不是说很危险吗?不是之前说过可以作为木马吗?

确实会出现被当做后门程序,详情查看之前的文章《PHP的一句话木马代码和函数eval的简介》

但是!我这里需要说的是:虽然eval可以执行任意PHP代码,但是形成木马的这种行为是因为没有验证由用户外部输入的数据,直接传入由用户提供的任何数据,这时候就会出现问题了

像计算公式这种一般都是后台操作人员配置好的,自然不会瞎搞 😐

还需要注意的是在处理一些浮点数精度问题时,可以使用BC数学函数来保证运算精度

1 条评论

发表评论

*