天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP中將字符串轉(zhuǎn)化為整數(shù)(int) intval() printf() 性能測試

背景、概述
  早在Sql注入橫行的前幾年,字符串轉(zhuǎn)化為整數(shù)就已經(jīng)被列為每個web程序必備的操作了。web程序?qū)et或post來的id、整數(shù)等值強制經(jīng)過轉(zhuǎn)化函數(shù)轉(zhuǎn)化為整數(shù),過濾掉危險字符,盡可能降低系統(tǒng)本身被Sql注入的可能性。
  現(xiàn)如今,雖然Sql注入已經(jīng)逐漸淡出歷史舞臺,但是,為了保證web程序的正常運行,減少出錯概率,更好的保證用的滿意度,我們同樣需要將用戶的不正確輸入轉(zhuǎn)化為我們所需要的。
轉(zhuǎn)化方式
  在php中,我們可以使用3種方式將字符串轉(zhuǎn)化為整數(shù)。
1.強制類型轉(zhuǎn)換方式
  強制類型轉(zhuǎn)換方式,就是“在要轉(zhuǎn)換的變量之前加上用括號括起來的目標類型”(摘自php手冊“類型戲法”節(jié))的方式。
復(fù)制代碼 代碼如下:
<?php
$foo = "1"; // $foo 是字符串類型
$bar = (int)$foo; // $bar 是整型
?>

  對于整型來說,強制轉(zhuǎn)換類型名稱為int或者integer。
2.內(nèi)置函數(shù)方式
  內(nèi)置函數(shù)方式,就是使用php的內(nèi)置函數(shù)intval進行變量的轉(zhuǎn)換操作。
復(fù)制代碼 代碼如下:
<?php
$foo = "1"; // $foo 是字符串類型
$bar = intval($foo); // $bar 是整型
?>

  intval函數(shù)的格式為:
  int intval(mixed $var [, int $base]); (摘自php手冊)
  雖然php手冊中明確指出,intval()不能用于array和object的轉(zhuǎn)換。但是經(jīng)過我測試,轉(zhuǎn)換array的時候不會出任何問題,轉(zhuǎn)換值為1,而不是想象中的0。恐怕是因為在php內(nèi)部,array類型的變量也被認為是非零值得緣故吧。轉(zhuǎn)換object的時候,php會給出如下的 notice:
  Object of class xxxx could not be converted to int in xxxxx.php on line xx
  轉(zhuǎn)換值同樣為1。
3.格式化字符串方式
  格式化字符串方式,是利用sprintf的%d格式化指定的變量,以達到類型轉(zhuǎn)換的目的。
復(fù)制代碼 代碼如下:
<?php
$foo = "1"; // $foo 是字符串類型
$bar = sprintf("%d", $foo); // $bar 是字符串類型
?>

  嚴格意義上講sprintf的轉(zhuǎn)換結(jié)果還是string型,因此它不應(yīng)該算是字符串轉(zhuǎn)化為整數(shù)的方式。但是經(jīng)過他處理之后的字符串值確實已經(jīng)成為了“被強制轉(zhuǎn)化為字符串類型的整數(shù)”。
實際測試
  上面介紹了php中,將字符串轉(zhuǎn)化為整數(shù)的3種方式。對于一般的程序員來說,看到這里就算結(jié)束了,下面的部分是針對變態(tài)程序員的。
1.基本功能測試
  設(shè)定以下數(shù)組:
復(fù)制代碼 代碼如下:
<?php
$a[] = "1";
$a[] = "a1";
$a[] = "1a";
$a[] = "1a2";
$a[] = "0";
$a[] = array('4',2);
$a[] = "2.3";
$a[] = "-1";
$a[] = new Directory();
?>

  使用三種方式依次轉(zhuǎn)化上面給出的數(shù)組中的元素,查看轉(zhuǎn)換情況。程序源代碼如下:
復(fù)制代碼 代碼如下:
<?php
$a[] = "1";
$a[] = "a1";
$a[] = "1a";
$a[] = "1a2";
$a[] = "0";
$a[] = array('4',2);
$a[] = "2.3";
$a[] = "-1";
$a[] = new Directory();
// int
print "(int)<br />";
foreach($a as $v)
{
var_dump((int)$v);
print "<br />";
}
// intval
print "intval();<br />";
foreach($a as $v)
{
var_dump(intval($v));
print "<br />";
}
// sprintf
print "sprintf();<br />";
foreach($a as $v)
{
var_dump(sprintf("%d", $v));
print "<br />";
}
?>

  程序的最終運行結(jié)果如下(已經(jīng)去掉轉(zhuǎn)換object時出現(xiàn)的notice):
(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();
string(1) "1"
string(1) "0"
string(1) "1"
string(1) "1"
string(1) "0"
string(1) "1"
string(1) "2"
string(2) "-1"
string(1) "1"
  由此可以看出,三種轉(zhuǎn)換的結(jié)果是完全一樣的。那么從功能上講,3種方式都可以勝任轉(zhuǎn)換工作,那么接下來的工作就是看哪一種效率更高了。
2.性能測試
  被測試字符串是我們在注入工作中可能會使用到的一種:
復(fù)制代碼 代碼如下:
<?php
$foo = "1';Select * ...";
?>
  獲取時間點的函數(shù)如下(用于獲取測試起始點和結(jié)束點,以計算消耗時間):

<?php
**
* Simple function to replicate php 5 behaviour
*/
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
?>

  (摘自php手冊microtime()函數(shù)節(jié))
  測試過程是使用每種方式轉(zhuǎn)換變量$foo 1000000次(100萬次),并將各自的消耗時間輸出,總共進行三組測試,盡可能降低誤差。測試程序如下:
復(fù)制代碼 代碼如下:
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$foo = "1';Select * ...";

// (int)
$fStart = microtime_float();
for($i=0;$i<1000000;$i++)
{
$bar = (int)$foo;
}
$fEnd = microtime_float();
print "(int):" . ($fEnd - $fStart) . "s<br />";
// intval()
$fStart = microtime_float();
for($i=0;$i<1000000;$i++)
{
$bar = intval($foo);
}
$fEnd = microtime_float();
print "intval():" . ($fEnd - $fStart) . "s<br />";
// sprintf()
$fStart = microtime_float();
for($i=0;$i<1000000;$i++)
{
$bar = sprintf("%d", $foo);
}
$fEnd = microtime_float();
print "sprintf():" . ($fEnd - $fStart) . "s<br />";
?>

  最終的測試結(jié)果:
(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

  雖然這個測試有點變態(tài)(誰會連續(xù)轉(zhuǎn)換100w次的整數(shù)?),但是由此可以看出,使用強制類型轉(zhuǎn)換將字符串轉(zhuǎn)化為整數(shù)速度是最快的。
總結(jié)
  使用強制類型轉(zhuǎn)換方式將字符串轉(zhuǎn)化為整數(shù)是最直接的轉(zhuǎn)化方式之一(可以直接獲得整型的變量值)。從代碼可讀性角度上講,sprintf方式代碼比較長,而且其結(jié)果有可能還需要再次進行強制類型轉(zhuǎn)換,而intval函數(shù)是典型的面向過程式轉(zhuǎn)換,強制類型轉(zhuǎn)換則比較直接的將“我要轉(zhuǎn)化”這個思想傳遞給閱讀者。從效率上講,強制類型轉(zhuǎn)換方式也是最快速的轉(zhuǎn)化方式。因此,對于經(jīng)常進行轉(zhuǎn)化工作的程序員,我推薦使用這種方式。

php技術(shù)PHP中將字符串轉(zhuǎn)化為整數(shù)(int) intval() printf() 性能測試,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 麻豆精品2021最新 | 国产一区二区三区内射高清 | 男人边吃奶边摸边做刺激情话 | 久久国产精品永久免费网站 | 国产精品久久人妻无码网站一区L | 黑人巨茎大战白人女40CMO | 亚洲人成网77777色在线播放 | 在线观看免费国产成人软件 | 国产一区二区三区内射高清 | 飘雪韩国在线观看免费高清完整版 | 大胆国模一区二区三区伊人 | 欧洲兽交另类AVXXX | 午夜DV内射一区区 | 国产成人h在线视频 | 嫩草影院在线观看精品视频 | 免费精品国产日韩热久久 | 国产久久re6免费热在线 | a三级黄色片| 国产毛片AV久久久久精品 | 久久中文电影 | 国产精品高清视频在线 | 亚洲欧美日韩国产手机在线 | 久久视频这里只精品99热在线观看 | 热99RE久久精品国产 | 男人插曲女人身体视频 | 果冻传媒在线观看网站 | 国产精品一区二区在线播放 | 免费观看成人www精品视频在线 | 在线亚洲中文字幕36页 | 在线免费视频国产 | 无限资源好看片2019免费观看 | 99在线精品免费视频 | AV福利无码亚洲网站麻豆 | 刺激性视频黄页 | 亚洲 日韩 国产 中文视频 | 日本后进式猛烈xx00动态图 | 成年人在线视频免费观看 | 99视频国产热精品视频 | 成人精品在线视频 | 野花日本大全免费高清完整版 | 国产精品JIZZ视频免费 |