タイトルが言うように: PHP で $str == '' と strlen($str) == 0 の間に違いはありますか? 実際の速度の違いはありますか? また、どちらが使いやすいですか?
11 に答える
「if(!$ str)」を実行する方が明確だと思います..「==」についてはわかりませんが、「!」型キャストが行われることはなく、文字列、配列、ブール、数値に対して安全であるため、より優れた最適化手法を使用できるはずです。
はい、重要な違いがあります。== 演算子は型変換を行うため、期待どおりに動作するとは限りません。たとえば、(0 == "") は true を返します。したがって、 $str が実際には文字列であると仮定しています。これが当てはまると確信している場合、または変換を気にしない場合は、問題ありません。それ以外の場合は、=== を使用し、文字列を比較していることを確認するための手順を実行する必要があります。
主な違いは、 $str == '' は空の文字列 (0 と falseなど)に相当するものに対して true を返すことです。
=== 演算子を使用して実際の空の文字列をテストするか、変換とテストの動作を気にしない場合は !$str (実際の意図に応じてempty()も検討してください) を使用する必要があります。これは $x == '' よりも意図が明確です (彼は = 記号を見逃して、実際に空の文字列をテストしたいのですか?)
strlen($str) は、文字列の長さが本当に必要な場合にのみ使用してください。
要するに、コードの意図に基づいてどのツールが適切であるかを判断して、ジョブに適切なツールを使用してください。
vinko@parrot:~$ cat emptytest.php
<?php
$a = "";
$b = 0;
$c = false;
$d = "Hi!";
function is_empty1($x) { return $x == ''; }
function is_empty2($x) { return strlen($x) == 0; }
function is_empty3($x) { return $x === ''; }
function check_empty($arr) {
foreach ($arr as $v) {
echo "value is ";
var_dump($v);
echo " \$x == '' ";
var_dump(is_empty1($v));
echo " strlen($x) == 0 ";
var_dump(is_empty2($v));
echo " \$x === '' ";
var_dump(is_empty3($v));
}
}
check_empty(array($a,$b,$c,$d));
?>
vinko@parrot:~$ php emptytest.php
value is string(0) ""
$x == '' bool(true)
strlen() == 0 bool(true)
$x === '' bool(true)
value is int(0)
$x == '' bool(true)
strlen() == 0 bool(false)
$x === '' bool(false)
value is bool(false)
$x == '' bool(true)
strlen() == 0 bool(true)
$x === '' bool(false)
value is string(3) "Hi!"
$x == '' bool(false)
strlen() == 0 bool(false)
$x === '' bool(false)
簡単なベンチマークを実行しました。(私は一度もやったことがないので、これは完全に無効かもしれません。) == ''、strlen() == 0、=== ''、および strlen() === 0 をテストします。
header('Content-type: text/plain');
// -- Testing == '';
$string = '';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
$string == '';
$endTime = microtime(true);
echo "\$string = ''; \$string == ''; took " . ($endTime - $startTime) . " seconds\n";
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
$string == '';
$endTime = microtime(true);
echo "\$string = '$string'; \$string == ''; took " . ($endTime - $startTime) . " seconds\n";
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
'' == '';
$endTime = microtime(true);
echo "'' == ''; took " . ($endTime - $startTime) . " seconds\n";
// -- Testing strlen() == 0;
$string = '';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen($string) == 0;
$endTime = microtime(true);
echo "\$string = ''; strlen(\$string) == 0; took " . ($endTime - $startTime) . " seconds\n";
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen($string) == 0;
$endTime = microtime(true);
echo "\$string = '$string'; strlen(\$string) == 0; took " . ($endTime - $startTime) . " seconds\n";
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen('') == 0;
$endTime = microtime(true);
echo "strlen('') == ''; took " . ($endTime - $startTime) . " seconds\n";
// -- Testing === '';
$string = '';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
$string === '';
$endTime = microtime(true);
echo "\$string = ''; \$string === ''; took " . ($endTime - $startTime) . " seconds\n";
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
$string === '';
$endTime = microtime(true);
echo "\$string = '$string'; \$string === ''; took " . ($endTime - $startTime) . " seconds\n";
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
'' === '';
$endTime = microtime(true);
echo "'' === ''; took " . ($endTime - $startTime) . " seconds\n";
// -- Testing strlen() === 0;
$string = '';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen($string) === 0;
$endTime = microtime(true);
echo "\$string = ''; strlen(\$string) === 0; took " . ($endTime - $startTime) . " seconds\n";
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen($string) === 0;
$endTime = microtime(true);
echo "\$string = '$string'; strlen(\$string) === 0; took " . ($endTime - $startTime) . " seconds\n";
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen('') === 0;
$endTime = microtime(true);
echo "strlen('') === ''; took " . ($endTime - $startTime) . " seconds\n";
結果:
$string = ''; $string == ''; took 1.01983308792 seconds
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; $string == ''; took 1.04193401337 seconds
'' == ''; took 1.06608295441 seconds
$string = ''; strlen($string) == 0; took 2.1510848999 seconds
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; strlen($string) == 0; took 2.27101397514 seconds
strlen('') == ''; took 2.5775551796 seconds
$string = ''; $string === ''; took 0.854554176331 seconds
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; $string === ''; took 0.714010000229 seconds
'' === ''; took 0.749495983124 seconds
$string = ''; strlen($string) === 0; took 1.9263010025 seconds
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; strlen($string) === 0; took 1.95309996605 seconds
strlen('') === ''; took 2.40874910355 seconds
ご覧のとおり、'' と比較すると、文字列の長さを比較するよりも約 2 倍高速です。また、=== を使用すると、== を使用するよりもわずかに高速で、タイプセーフです! 良い。
速度に差があったとしても、速い方を選ぶべきではありません。より鮮明なものを選択してください。
$str == '' の方が良い方法です。PHP は文字列の長さを認識しているため、おそらく大きな違いはありませんが、低レベル言語で何らかの作業を行った場合、PHP を使用するのは非常に悪い習慣になります。
速度の差は小さすぎて問題にはなりません。使用する最善の方法は、読みやすい方法です。他の 2 つの方法を次に示します。
if (empty($str)) {
...
}
if (!$str) {
...
}
注: $str == '0' の場合、これらは両方とも true と評価されます。
たぶん: !strlen($str)
strlen($str) == 0 には、strlen の呼び出しと比較を行うための呼び出しが必要です。$str == '' は単なる比較です。
を実行すると、型変換の問題が発生する可能性があります$str==''
。たとえば、(ブール値) または(整数)の場合$str
を考えてみましょう。彼らも同じように出てくるかもしれません。これについてはよくわからないので、少しいじる必要があります。安全な方法は.false
0
$str===''
いいえ、(上記で説明したように) 同じではありませんが、目的によっては交換可能かもしれません。
もっと早く?定性的には、どちらの方法でも違いが結果的に生じる状況を想像するのは困難ですが、他のより定量的な回答を参照してください。ここでの速度に基づくコーディングは、おそらく「pi」と略される、私たちのお気に入りの軽蔑的な例です。
どれが最高ですか?
それは、確認したい $str に関するアサーションと、呼び出したい結果によって異なります。
もう 1 つの一般的なパターンは次のとおりです。
!$str
これは一般的に同じ結果をもたらします-そして、使用できない理由に関係なく、単に使用できない文字列値をテストしたい場合に適切かもしれません-初期化、初期化のデフォルト、割り当てなどの欠如である可能性があります.ところで、この表現に賛成か反対かを議論してください。)あなたが決定したことはおそらく結果をもたらすことを覚えておいてください。コードを書いた方法に基づいて、どの $str 状態がどの結果を引き起こすかを理解する必要があります。(そして、オプションのいずれかで明示的にカバーされていない可能性のある $str 値/状態があることに注意してください。)