自動目錄
今天在寫程式時,使用 substr的一個簡單的想法,但是結果卻出乎我的意料,為此還花了十多分鐘查錯和半小時打這篇文章
substr在切字串時很有用,例如官網例[1]:
$rest = substr("abcdef", -2); // "ef"
$rest = substr("abcdef", -3, 1); // "d"
今天我的想法是,如果我字串最後面是數字的話,我就怎樣怎樣…
$roma="0123456";
$last=substr($roma, -1,1); //6
if( $last>='0' and $last<='9'){
怎樣怎樣...
}
因為這個數字我把他視為字串,所以這樣的判斷沒有問題。
但是,
後來發現程式執行結果不正確,我一直找不出原因,後來發現,如果我傳入的$roma是空字串或是null,結果竟然會怎樣怎樣。
太讓我吃驚了。(PHP 5.5)
$roma=null;
$last=substr($roma, -1,1); //空的,什麼都沒印
if( $last>='0' and $last<='9'){
怎樣怎樣...竟然被執行了,你也可以試試
}
在上面的判斷中,怎樣怎樣竟然被執行了。上面的 'and'換成 '&&',或是 '0','9'換成數字 0,9結果都一樣。
我試著判斷
if( $last >= '0' && $last <='9'){ 怎樣怎樣... }
或
if( $last >= '0' && $last <='9'){ 怎樣怎樣... }
都不會成功,但是substr切出來的就會成功。
這太神奇了!解決方法請看結論。
結論
substr 遇到空字串或null,切出來的不知道是什麼?留給有興趣的人去研究。
這個BUG到了php>7.0以後就被修正。
使用mb_substr取代 substr得到的結果就是正確的。
程式隨時會有意想不到的BUG,在估時間的時候要留多一點時間。
參考資料
[1] https://www.php.net/manual/en/function.substr.php