使用 strstr() 並不能避免 strpos() 的型別檢查。
如果 $needle 是 $haystack 中的最後一個字元,並且將 $needle 作為布林值本身測試會評估為 false,那麼將 strstr() 作為布林值測試也會評估為 false(因為如果成功,strstr() 會返回 $needle 的第一次出現以及 $haystack 的其餘部分)。
<?php
findZero('01234'); // 找到零
findZero('43210'); // 沒找到零
findZero('0'); // 沒找到零
findZero('00'); // 找到零
findZero('000'); // 找到零
findZero('10'); // 沒找到零
findZero('100'); // 找到零
function findZero($numberString) {
if (strstr($numberString, '0')) {
echo '找到零';
} else {
echo '沒找到零';
}
}
?>
此外,strstr() 比 strpos() 消耗更多記憶體,尤其是在 $haystack 是較長字串的情況下,所以如果您不關心 strstr() 返回的子字串,則不應該使用它。
PHP 沒有僅檢查 $needle 是否出現在 $haystack 中的函式;strpos() 會透過返回 false 告訴您它_沒有_出現,但如果它_有_出現,它會以整數形式告訴您它出現的_位置_,如果 $needle 是 $haystack 的第一部分,則為 0(零),這就是為什麼測試 if (strpos($needle, $haystack)===false) 是確定 $needle 不是 $haystack 的一部分的唯一方法。
我的建議是立即開始重視型別檢查,並熟悉您正在使用的函式的返回值。
致敬。