ホームページ  >  記事  >  php教程  >  文字列を整数 (int) に変換する intval() printf() PHP のパフォーマンス テスト

文字列を整数 (int) に変換する intval() printf() PHP のパフォーマンス テスト

WBOY
WBOYオリジナル
2016-06-13 12:01:591021ブラウズ

背景と概要
SQL インジェクションが蔓延する数年前には、文字列を整数に変換することは、すべての Web プログラムで必要な操作としてすでにリストされていました。 Web プログラムは、get または post からの ID、整数、その​​他の値を変換関数を通じて強制的に整数に変換し、危険な文字を除外し、システム自体が SQL によって挿入される可能性を最小限に抑えます。
現在、SQL インジェクションは徐々に歴史の舞台から消えていきましたが、Web プログラムの正常な動作を保証し、エラーの可能性を減らし、ユーザーの満足度を高めるためには、ユーザーからの誤った入力も変換する必要があります。私たちの必須のものに。
変換メソッド
PHP では、文字列を整数に変換するために 3 つのメソッドを使用できます。
1. 強制型変換方法
強制型変換方法は「変換対象の変数の前に括弧で囲った対象の型を追加する」です(「型のコツ」より抜粋) PHPマニュアル)の方法です。

コードをコピー コードは次のとおりです。


$foo = "1" / / $foo は文字列型です
$bar = (int)$foo; // $bar は整数型です
?> 整数型の場合はキャスト型名ですint または整数です。

2. 組み込み関数メソッド

組み込み関数メソッドは、PHP の組み込み関数 intval を使用して変数を変換します。

コードをコピー

コードは次のとおりです。 $foo = "1" / / $foo は文字列型です

$bar = intval($foo); // $bar は整数型です
?>



関数は:


int intval(mixed $var [, int $base]); (PHPマニュアルより抜粋) PHPマニュアルには配列の変換にはintval()を使用できないと明記されていますが、そして反対します。しかし、テストした結果、配列の変換時に問題は発生しません。変換された値は予想どおり 0 ではなく 1 です。 PHP 内では、配列型変数もゼロ以外の値を持つとみなされるためだと思います。オブジェクトを変換するとき、PHP は次の通知を出します:
クラス xxxx のオブジェクトは xxxxx.php の xx 行目で int に変換できません
変換値も 1 です。

3. フォーマット文字列メソッド

フォーマット文字列メソッドは、sprintf の %d を使用して、型変換の目的を達成するために指定された変数をフォーマットします。

コードをコピー

コードは次のとおりです。 $foo = "1" / / $foo は文字列型です

$bar = sprintf("%d", $foo); // $bar は文字列型です
?> 厳密には、 sprintf 変換結果は依然として文字列型であるため、文字列を整数に変換する方法とみなされるべきではありません。しかし、彼の処理後の文字列値は確かに「強制的に文字列型に変換された整数」になっています。
実際のテスト
上記では、PHP で文字列を整数に変換する 3 つの方法を紹介しました。普通のプログラマの場合はここまでです。次の部分は異常なプログラマの場合です。

1. 基本関数テスト


次の配列を設定します:


コードをコピーします
コードは次のとおりです:

$a[] = "1"; $a[] = "1a"; >$a[ ] = "1a2"; $a[] = "0";

$a[] = "2.3" ;

$a[] = "-1";
$a[] = new Directory();


シーケンス要素に上記で指定された配列を使用して、変換ステータスを確認します。プログラムのソース コードは次のとおりです。



コードをコピー

コードは次のとおりです。

$a[] = " 1";
$a[] = "1a"; [] = "0" ;

$a[] = 配列('4',2); $a[] = "-1"; 🎜>$a[] = new Directory(); // int print "(int)
";
foreach($a as $v)

{

var_dump((int )$v);
print "
";
// intval
print "intval();
"; ;
foreach( $a as $v)
{
var_dump(intval($v));
print "
"; sprintf
print " sprintf();
";
foreach($a as $v)
{
var_dump(sprintf("%d", $v));
print "< ;br />"
}
?>


プログラムの最終的な実行結果は次のとおりです (オブジェクトの変換時に表示される通知は削除されています):
(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"
3 つの変換の結果はまったく同じであることがわかります。したがって、機能の観点から見ると、3 つのメソッドはすべて変換作業が可能であるため、次のステップはどれがより効率的であるかを確認することです。
2. パフォーマンス テスト
テストされた文字列は、注入作業で使用できるものです:

コードをコピーコードは次のとおりです:


$foo = "1';Select * ...";
?>
タイムポイントを取得します。は次のとおりです (消費時間を計算するためにテストの開始点と終了点を取得するために使用されます):

**
* PHP 5 の動作を複製する単純な関数
*/
function microtime_float()
{
list($usec, $sec) =explode(" ", microtime());
return ((float)$usec (float)$sec );
}
?>


(PHP マニュアルの microtime() 関数のセクションより抜粋)
テストプロセスは、各メソッドを使用して変数を変換します。 $foo を 1,000,000 回 (100 万回) 実行し、それぞれの消費時間を出力し、誤差をできるだけ減らすために合計 3 セットのテストを実行します。テスト プログラムは次のとおりです。

コードをコピー コードは次のとおりです。


function microtime_float()
{
list($usec, $sec) =explode(" ", microtime());
return ((float)$usec (float)$sec);
$foo = "1';Select * ...";

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


最終テスト結果:
(int):0.67205619812012s

intval():1.1603000164032s
sprintf() :2.1068270206451s
(int):0.66051411628723s
intval():1.1493890285492s
sprintf():2.1008238792419s
(int):0.6687879562 3779s
intval():1.161343 0976868s
sprintf(): 2.0976209640503s

このテストは少し異常ですが (整数を 100 万回連続して変換する人がいるでしょうか?) ) ですが、キャストを使用して文字列を整数に変換するのが最も速いことがわかります。
概要
強制型変換を使用して文字列を整数に変換することは、最も直接的な変換方法の 1 つです (整数変数の値を直接取得できます)。コードの可読性の観点から見ると、sprintf メソッドのコードは比較的長く、結果として再度強制型変換が必要になる場合があります。intval 関数は典型的なプロセス指向の変換であり、強制型変換の考え方はより直接的です。 「変容」が読者に伝わります。効率の観点から言えば、強制型変換は最速の変換方法でもあります。したがって、変換作業を頻繁に行うプログラマーにはこの方法をお勧めします。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。