将字符串转换为整数(int)intvalintvalprintf()()()在PHP的性能测试
早在SQL注入往年的字符串转换为整数,已被列为每个web程序的必要操作。Web程序将ID和整数当量的获得或强制转换功能后为整数,过滤危险字符和减少SQL注入系统本身的可能性。
目前,虽然SQL注入已经逐渐淡出历史舞台,为了保证Web程序的正常运行,降低错误概率,更好地保证用户的满意,还需要将不正确的用户输入转化为我们需要的。
变换方法
在PHP中,我们可以用3种方法将字符串转换成整数。
1。强制类型转换
强制类型转换的方法是在更改变量之前添加括号中包含的对象类型(摘自PHP手动类型节)。
复制代码代码如下所示:
< PHP
$=1;
$ bar = int(int)
>
对于整数,强制转换类型的名称为int或整数。
2。内置功能模式
内置的功能是使用内置函数intval PHP执行变量的变换。
复制代码代码如下所示:
< PHP
$=1;
酒吧= intval美元($ Foo); / / $酒吧是一个整数
>
intval函数的格式:
Int intval(混合为var {,}(int $基地);从PHP手册)
虽然它是明确指出在PHP手册,intval()不能用于数组和对象的转换。但经过我的测试,没有问题时,将数组转换的值是1,不是0的想象。恐怕是因为在PHP中,数组的类型的变量被认为是非零的原因。转换对象时,PHP给出如下通知:
班级XXXX对象不能转换为int xxxxx.php
转换值也为1。
三.格式化字符串模式
格式的字符串的格式是使用sprintf的%d格式指定的变量来实现类型转换的目的。
复制代码代码如下所示:
< PHP
$=1;
$吧= sprintf(%,$ Foo); / / $酒吧是一个字符串类型
>
严格意义上说,对转换结果仍sprintf字符串类型,所以它不应该是一种将字符串转换为整数,但之后他被处理的字符串值确实已经成为一个整数是被迫进入一个字符串类型。
实际测试
上面描述了3种在PHP中转换字符串为整数的方法。对于一般程序员来说,如果你在这里看到它,下面的部分是针对变态程序员的。
1。基本功能测试
设置以下数组:
复制代码代码如下所示:
< PHP
$ $ 1 ;
$;
${1a;
$ { } =1A2;
$ $ 0 ;
$ { } =阵列(一,2);
$ $ 2.3 ;
$ 1;
$ =新目录();
>
使用三种方法来转换上面数组中的元素以查看转换。程序源代码如下所示:
复制代码代码如下所示:
< PHP
$ $ 1 ;
$;
${1a;
$ { } =1A2;
$ $ 0 ;
$ { } =阵列(一,2);
$ $ 2.3 ;
$ 1;
$ =新目录();
打印(int);
foreach($ $ V)
{
var_dump(((int)$ V);
打印;
}
/ / intval
打印intval();;
foreach($ $ V)
{
var_dump(intval($ V));
打印;
}
/ / sprintf
打印sprintf();;
foreach($ $ V)
{
var_dump(sprintf(%d
打印;
}
>
程序最后运行的结果如下(当对象被移除时已被删除的通知):
(int)
Int(1)
Int(0)
Int(1)
Int(1)
Int(0)
Int(1)
Int(2)
Int(- 1)
Int(1)
Intval();
Int(1)
Int(0)
Int(1)
Int(1)
Int(0)
Int(1)
Int(2)
Int(- 1)
Int(1)
Sprintf();
字符串(1)1
字符串(1)0
字符串(1)1
字符串(1)1
字符串(1)0
字符串(1)1
字符串(1)2
字符串(2)1
字符串(1)1
从这一点可以看出,这三个转变的结果是完全相同的,所以从功能的角度来看,3种方式是转换的能力,下一个工作是看哪一个更有效。
2。性能测试
测试的字符串是我们在注入工作中可能使用的内容之一:
复制代码代码如下所示:
< PHP
$ =1;选择*…;
>
获取时间点的功能如下(用于获取测试起点和终点来计算消耗时间):
< PHP
* *
*复制PHP 5行为的简单函数
* /
microtime_float()函数
{
列表(USEC美元美元,SEC)=爆炸(
返回((浮动)$ USEC +(浮动)$秒);
}
>
(从PHP手册()函数瞬时节选部分)
测试过程是以每种方式转换变量1000000倍(100万倍),并输出每次的消耗时间,并进行三组测试以最小化错误:
复制代码代码如下所示:
< PHP
microtime_float()函数
{
列表(USEC美元美元,SEC)=爆炸(
返回((浮动)$ USEC +(浮动)$秒);
}
$ =1;选择*…;
(int)
美元microtime_float FSTART =();
($ i = 0;$ i < 1000000;$ + +)
{
$ =(int)$;
}
美元microtime_float挡=();
打印(int):。($ - $ FSTART谋生)。;
( / / intval)
美元microtime_float FSTART =();
($ i = 0;$ i < 1000000;$ + +)
{
酒吧= intval美元($ Foo);
}
美元microtime_float挡=();
打印intval()。($ - $ FSTART自生自灭)。;
( / / sprintf)
美元microtime_float FSTART =();
($ i = 0;$ i < 1000000;$ + +)
{
$吧= sprintf(%d
}
美元microtime_float挡=();
打印sprintf()。($ - $ FSTART自生自灭)。;
>
最终测试结果:
(int):0.67205619812012s
Intval():1.1603000164032s
Sprintf():2.1068270206451s
(int):0.66051411628723s
Intval():1.1493890285492s
Sprintf():2.1008238792419s
(int):0.66878795623779s
Intval():1.1613430976868s
Sprintf():2.0976209640503s
虽然这个测试是有点变态(谁将会继续把整数100W号)但正如您所看到的,使用强制类型转换将字符串转换成整数速度是最快的。
总结
将一个字符串转换成一个整数使用强制类型转换是一种转换的最直接的方式(你可以直接获得该变量的整数)。从可读性的角度来看,sprintf代码比较长,结果也可能需要重新进行强制类型转换,而intval功能是典型的导向型转换过程中,强制类型转换更是直接将我想传达给读者的转变。在效率方面,强制类型转换是转变的最快途径。因此,我推荐这种方法的程序员经常转换工作。