Kebenaran yang Tidak Diingini: Memahami Ketidakpadanan dalam Perbandingan strpos()
Walaupun penggunaan biasa untuk carian rentetan, fungsi PHP strpos() mempunyai tingkah laku yang tidak konvensional apabila membandingkan hasilnya dengan benar. Untuk memahami anomali ini, mari kita periksa coretan kod:
$link = 'https://google.com'; $unacceptables = ['https:','.doc','.pdf', '.jpg', '.jpeg', '.gif', '.bmp', '.png']; foreach ($unacceptables as $unacceptable) { if (strpos($link, $unacceptable) === true) { echo 'Unacceptable Found<br />'; } else { echo 'Acceptable!<br />'; } }
Anehnya, kod ini mencetak "Boleh Diterima!" untuk setiap elemen dalam tatasusunan $unacceptables, walaupun "https:" hadir dalam pembolehubah $link.
Untuk merungkai teka-teki ini, kita mesti mendalami semantik strpos(). Seperti yang dinyatakan oleh dokumentasinya, strpos() mengembalikan "kedudukan angka kejadian pertama" rentetan $unacceptable dalam $link. Dalam kes ini, strpos() mencari "https:" pada kedudukan 0 dan mengembalikan 0, yang merupakan nilai yang benar dalam PHP.
Oleh itu, syarat dalam pernyataan if (strpos($link, $unacceptable) === true) menilai kepada true setiap kali kerana strpos() sentiasa mengembalikan kedudukan angka, yang sentiasa dipaksa kepada boolean benar.
Untuk membetulkannya, kita harus menggunakan operator perbandingan yang tidak ketat (!==):
if (strpos($link, $unacceptable) !== false) {
Dengan menukar perbandingan kepada "tidak sama dengan palsu," kami memastikan bahawa pernyataan if hanya dinilai kepada benar apabila strpos() menemui padanan dan mengembalikan nilai bukan sifar (iaitu, sebarang kedudukan berangka selain daripada 0).
Atas ialah kandungan terperinci Mengapa Perbandingan strpos() dengan `=== true` Gagal dalam Carian Rentetan PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!