As the title says: is there a difference between $ str == '' and strlen ($ str) == 0 in PHP? Is there any real difference in speed and is it better to use another?
Yes, there is an important difference. The == operator does type conversion so it will not always do what you expect. For example, (0 == "") returns true. So you make the assumption that $ str is actually a string. If you are sure that it is, or if you do not care about conversions, then this is normal. Otherwise, you should use === and take steps to make sure that you are comparing strings.
The main difference is that $ str == '' will return true for anything that is equivalent to an empty string (0 and false, among others ).
=== , , , ! $str ( empty(), ), , $x == '' ( = string?.)
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
, '' , . , === , ==, ! .
, . .
$str == '' - . , PHP , , , .
, , . - . :
if (empty($str)) { ... } if (!$str) { ... }
: true, $str == '0'.
:! strlen ($ str)
strlen ($ str) == 0 strlen . $str == '' - .
$str=='' . , , $str - false (boolean) 0 (integer). . , . $str===''.
$str==''
$str
false
0
$str===''
, ( ), .
? , , . . , , , , "pi".
?
, $str .
, , -
! $
- , , , , , - , , .. (I " , BTW.) , , , -, , , $str- , , . ( , $str /, , , .)
I find it clearer "if (! $ str)" .. not sure about '==', but '!' should have the best optimization methods, since no type conversion is performed and is safe for strings, arrays, bools, numbers ...