PHP is_numeric与〜(〜(float)$ value)性能和功能

时间:2019-04-01 09:30:32

标签: php floating-point bitwise-operators

最近,我想在数组中搜索数值(整数,双精度数和带指数符号的数字)。

我最初使用'is_numeric()'是因为我们经常将其用作检查的goto,但是我想看看是否可以更快地放入东西。

我注意到,如果我将其强制转换为浮点数,则只要该值是数字,PHP就会产生一个非零的值。因此,使用按位运算符,我可以在围绕搜索的if语句中执行逻辑非零运算。

if (~(~(float)$value)) {
// add to result array
}

经过初步测试,我发现使用大小适中的数字和非数字数组似乎可以使速度提高2整秒。但是,这只不过是一个简单的单元测试。

有人对将float转换为is_numeric有经验吗?我知道它们在功能上可能不是100%等价的(我认为浮点转换将转换为十六进制),但出于我的目的,我只打算用指数表示法转换整数,双精度数和数字。这是对is_numeric()的性能提升吗?还是我想像这样?

1 个答案:

答案 0 :(得分:1)

警告! isnumeric()不只是一时兴起,我附加了一小段代码,向您显示转换类型造成的错误。在许多对php的攻击中,字符串可能既是数字又是吱吱声,攻击者会在其中注入错误的代码。

代码:

<?php
$a="1809809808908099878758765<?php echo \"I powned you\"; ?>";
echo is_numeric($a)?"yes":"no";   // out no
echo "\n";
echo (~(~(float)$a))?"Yes":"No";  // out Yes 

如果以这种方式进行操作,则可以提高性能,但是根据您需要执行的操作,可能会打开安全漏洞!