2016-01-15 78 views
2

我只看過,當他們使用strpos來檢查字符串是否存在開發人員使用嚴格的比較:與strpos字符串檢查存在

if (strpos($haystack,$needle) !== false) { 

} 

今天發生,我認爲一個可能使用is_numeric INS

if (is_numeric(strpos($haystack,$needle))) { 

} 

有沒有人會用一個比其他(特別是在這種使用情況下)的一個原因?

如果你仔細想想,strpos的目的是返回子字符串的位置。只有當它不存在時,它纔會返回false。該職位是號碼。因此,is_numeric相當有資格被視爲語義。

+1

is_numeric將對字符串和整數都返回true –

回答

3

我創建了一個基準。案例check by compare with false value總是比check by is_numeric快。

// Init a big string array 

for($i = 0; $i < 10000; $i++){ 
$str[] = 'a'.rand().'b'.rand(); 
} 

// Case comparing with false value 
$time1 = microtime(true); 
foreach($str as $st){ 
$res[] = strpos($st,rand(0, count(array('b', 'c')) - 1)) !== false; 
} 
$time2 = microtime(true); 

echo $time2-$time1.'<br/>'; 

// Case 'is_numeric' 
$time3 = microtime(true); 
foreach($str as $st){ 
$res[] = is_numeric(strpos($st,rand(0, count(array('b', 'c')) - 1))); 
} 
$time4 = microtime(true); 
echo $time4-$time3; 


//Time 1: 
//0.018877029418945 
//0.020556926727295 

//Time 2: 
//0.016352891921997 
//0.016934871673584 

//Time 3: 
//0.0121009349823 
//0.01330304145813 

//Time 4: 
//0.017507076263428 
//0.01904296875 
1

由於strpos返回整數或布爾值false可以使用is_numeric
的問題是:
更重要的是地道autodocumented /自我描述,使用is_numeric或比較返回值布爾? IMO,比較布爾值false更加直觀:

$string = 'new object'; 
$found = strpos($string,'new'); 

echo (is_numeric($found)) ? 'found' : 'not found'; 
echo "\n"; 
# much better 
echo ($found !== false) ? 'found' : 'not found'; 
echo "\n"; 

此外,strpos(...) !== false被過度使用,因爲它就是PHP文檔建議。因此它已成爲傳統。

0
  1. 在這種情況下使用strpos的速度要高於preg_match,在它上面使用is_numeric是通過增加更多開銷來否定這種速度優勢。
  2. 使用其它功能只是爲了休息是沒有意義的分離假的,更好的只是用!==虛假

沒有理由爲什麼會有人使用is_numeric,但它會工作,只是速度較慢。

關於strpos VS的preg_match: preg_match() vs strpos() for match finding?which is the fast process strpos()/stripos() or preg_match() in php

+0

但是它真的慢嗎? –

+0

使用兩個函數比使用兩個函數要慢。 –

+0

這與性能無關。 – felipsmartins

0

你是對的,is_numeric作品與strpos。但是這會使代碼變得棘手,從而降低代碼的可讀性。

有記住,雖然這似乎是顯而易見的給你,你這是另一個程序員,上面寫着你的代碼,想了很多事情:

  1. 是否草垛包含針?
  2. 哪個針在乾草堆中的位置?
  3. strpos返回什麼類型的值?
  4. 在這種情況下strpos的返回值是一個數字嗎?

和PHP本身可以是一個相當棘手的語言,看看這個例子:

if (strpos("needle in a haystack","needle")!==false) { 
    echo "Needle found!<br>"; 
} else { 
    echo "nothing found<br>"; 
} 

if (is_numeric(strpos("needle in a haystack","needle"))) { 
    echo "Needle found!<br>"; 
} else { 
    echo "nothing found<br>"; 
} 

if (is_int(strpos("needle in a haystack","needle"))) { 
    echo "Needle found!<br>"; 
} else { 
    echo "nothing found<br>"; 
} 

// This doesn't work since 0 == false is true 
if (strpos("needle in a haystack","needle")!=false) { 
    echo "Needle found!<br>"; 
} else { 
    echo "nothing found<br>"; 
} 

// But this works since "haystack" position is not 0 
if (strpos("needle in a haystack","haystack")!=false) { 
    echo "Haystack found!<br>"; 
} else { 
    echo "nothing found<br>"; 
} 

// This doesn't work also because "needle" is at 0, and 0 is not a truthy value 
if (strpos("needle in a haystack","needle")) { 
    echo "Needle found!<br>"; 
} else { 
    echo "nothing found<br>"; 
} 

// But this works again since "haystack" position is not 0, and any int that's not 0 is truthy 
if (strpos("needle in a haystack","haystack")) { 
    echo "Haystack found!<br>"; 
} else { 
    echo "nothing found<br>"; 
} 

恕我直言,最好的選擇是使用===false==!false比較,在the php documentation for strpos喜歡解釋:

警告 這個函數可以返回布爾FALSE,但也可能會返回一個非布爾值,其值爲FALSE。有關更多信息,請閱讀布爾部分。使用===運算符來測試此函數的返回值。

PD:對於 「truthy」 一個更好的定義看看this post