PHP中的$ str ==''和strlen($ str)== 0之间有区别吗?

时间:2008-12-19 19:25:31

标签: php strlen

正如标题所说:PHP中的$ str ==''和strlen($ str)== 0之间有区别吗?是否有任何真正的速度差异,并且比另一个更好用?

11 个答案:

答案 0 :(得分:17)

我发现它更清楚 “if(!$ str)”..不确定'=='但是'!'应该能够提供更好的优化技术,因为从未进行过类型转换,并且对字符串,数组,bool,数字都是安全的......

答案 1 :(得分:11)

是的,有一个重要的区别。 ==运算符执行type conversion,因此并不总是按预期执行。例如,(0 ==“”)返回true。所以你假设$ str实际上是一个字符串。如果你确定是这种情况,或者如果你不关心转换,那就没关系。否则你应该使用===,并采取措施确保你正在比较字符串。

答案 2 :(得分:10)

主要区别在于$ str ==''对于任何等于空字符串(0和false,among others)的内容都将返回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)

答案 3 :(得分:7)

我执行了一个简单的基准测试。 (我从来没有做过,所以这可能完全无效。)它测试=='',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

正如您所看到的,与''的比较速度大约是比较字符串长度的两倍。另外,使用===比使用==略快,而且它的类型安全!好的。

答案 4 :(得分:4)

即使存在速度差异,也不应选择速度较快的速度差异。选择更清晰的一个。

答案 5 :(得分:1)

$ str ==''是更好的做法。 PHP中可能没有太大的区别,因为它知道字符串的长度,但是如果你去用较低级别的语言做一些工作,这将是一个非常糟糕的习惯。

答案 6 :(得分:1)

速度差太小而无关紧要,我敢肯定。使用的最佳方法是更易读的方法。以下是另外两种选择:

if (empty($str)) {
    ...
}

if (!$str) {
    ...
}

注意:如果$ str =='0',这些都会评估为真。

答案 7 :(得分:1)

也许吧!!strlen($ str)

答案 8 :(得分:1)

strlen($ str)== 0需要调用strlen和调用来进行比较。 $ str ==''只是一个比较。

答案 9 :(得分:1)

执行$str==''时可能会出现一些类型转换问题。例如,考虑$strfalse(布尔值)或0(整数)时的情况。他们可能也会平等。我对此并不十分肯定,所以你应该稍微捣乱一下。安全的方法是$str===''

答案 10 :(得分:1)

不,它们不一样(如上所述),但为了您的目的,它们可能是可以互换的。

更快?定性地说,很难想象这种差异无论哪种方式都是重要的,但看到其他更多的定量答案。基于速度的编码可能是我们最喜欢的pejorative的一个例子,可以缩写为“pi”。

哪个最好?

这取决于你想要确认的关于$ str的断言,以及你想要调用的结果。

您将看到的另一种常见模式是

!$ STR

通常会得到相同的结果 - 如果您只是想测试一个不可用的字符串值,无论它为什么不可用,都可能是合适的 - 这可能是缺少初始化,初始化默认,赋值等等。(I不要争论或反对这种表述,顺便说一句。)请记住,你的决定可能会产生后果,你需要了解$ str状态根据你编写代码的方式调用哪些后果。 (并注意有$ str值/状态,您可能没有明确涵盖我们的任何一个选项。)