在开发当中我们会遇到有一些需要配置计算公式的需求,举个栗子
我们在后台中配置了一个倍率和一个计算公式,例如倍率为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数学函数来保证运算精度
兄弟,谷歌广告怎么申请通过的,我的一直不通过。 🙂