$ Str =='' ve strlen ($ str) PHP == 0 arasında bir fark var mı?

10 Cevap php

Gibi başlık diyor: $ str =='' ve strlen ($ str) PHP == 0 arasında bir fark var mı? Herhangi bir gerçek hız farkı var mı ve bir diğerinden daha kullanmak daha iyidir?

10 Cevap

Evet, önemli bir fark vardır. == Operatörü type conversion yapar, bu yüzden her zaman beklediğiniz yapmak için gitmiyor. Örneğin, (0 == "") true döndürür. Yani $ str aslında bir dize olduğunu bir varsayım yapıyoruz. Eğer emin değilseniz bu durumda, ya dönüşümler umurumda değil eğer, o zaman iyi. Aksi takdirde === kullanmak ve dizeleri karşılaştırarak konum sağlamak için adımlar atmalıdır.

Temel fark $ str =='' boş dize (0 ve false, among others) eşdeğerdir şey için doğrudur dönecektir olmasıdır.

Eğer dönüştürmek ve test davranışını sakıncası yoksa sadece bağlı, hem de! $ Str (empty() düşünün kullanmak, gerçek bir boş bir dize sınamak için === işlecini kullanabilirsiniz veya gerekir Gerçek niyet), ki ben (o bir = işareti özledim aslında boş bir dize için test etmek istiyor muydunuz?).'' x == $ daha niyet net bulmak

Eğer gerçekten bir dize uzunluğu sonra sadece zaman strlen ($ str) kullanın.

Alt çizgi, doğru kod niyet dayandığı aracı yargılamak, iş için doğru aracını kullanın.

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)

Ben basit bir kriter uygulandı. (Ben bu yüzden tamamen geçersiz olabilir birini yapmadım.) Bu strlen,'' == testleri () == 0, ==='' ve 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";

Sonuçlar:

$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

Gördüğünüz gibi,'' karşılaştırarak yaklaşık iki kat daha hızlı dize uzunluğunu karşılaştırarak gibidir. Ayrıca, === kullanarak == kullanarak biraz daha hızlı olduğunu ve tip güvenli! Güzel.

Bir hız farkı var olsa bile, bir hızlı almak gerekir. Net birini seçin.

$ Str =='' daha iyi bir uygulamadır. Muhtemelen onun dizeleri uzunluğunu bilir beri PHP pek bir fark yok, ama sonra gitti ve bir alt düzey dil bazı işler yaptım eğer var gerçekten kötü bir alışkanlık olurdu.

Belki: strlen ($ str)

strlen ($ str) == 0 strlen için bir çağrı ve karşılaştırma yapmak için bir çağrı gerektirir. $ Str =='' sadece bir karşılaştırma.

$str=='' yaparken bazı tip dönüştürme sorunları olabilir. Örneğin, olgu göz önünde $str false (boolean) ya da 0 (tam sayı) olduğu zaman. Onlar sadece çok eşit dışarı gelebilir. Ben bu konuda tam olarak emin değilim, bu yüzden onunla biraz muck gerekir. Güvenli bir şekilde yapmak olacaktır $str===''.

Hız farkı, fark çok küçük eminim. Kullanmak için en iyi yöntem daha okunabilir biridir. Burada iki seçenek vardır:

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

if (!$str) {
    ...
}

Eğer $ str == '0 'Note: Bu ikisi de doğru değerlendirecek.

Hayır, (yukarıda açıklandığı gibi) aynı değil, ama amaçlar için birbirinin olabilir.

Daha Hızlı? Kalitatif, ya yol netice olacağını fark bir durumu hayal, ama diğer daha nicel yanıtları görmek zor. Burada hız dayalı Kodlama muhtemelen "pi" abbrevated olabilir bizim favori aşağılayıcı, bir örnektir.

Hangi iyi nedir?

Bu onaylamak istediğiniz $ str hakkında ne iddia bağlıdır, ve çağırmak istediğiniz sonucu.

Göreceğiniz bir diğer ortak desen

! $ Str

genellikle aynı sonucu verir - ve sadece kullanışsız bir dize değeri için test etmek istiyorsanız uygun olabilir, olursa olsun kullanılamaz neden - (ben değilim başlatma, başlatma varsayılan, atama, vb eksikliği olabilir ki BTW, bu temsil için ya da karşı savunarak.) ne karar muhtemelen sonuçları olacağını unutmayın ve size kod yazdık yol dayalı, str devletler hangi sonuçlara çağırmak $ anlamak gerekir. (Ve açıkça, bizim seçenekleri ya kaplı olmayabilir $ str değeri / devletler olduğunu fark.)