Rumah > pembangunan bahagian belakang > tutorial php > Mengapa Perbandingan Jenis Longgar PHP Membawa kepada Keputusan Yang Tidak Dijangka Apabila Membandingkan Rentetan dan Integer?

Mengapa Perbandingan Jenis Longgar PHP Membawa kepada Keputusan Yang Tidak Dijangka Apabila Membandingkan Rentetan dan Integer?

Mary-Kate Olsen
Lepaskan: 2024-12-07 13:35:13
asal
671 orang telah melayarinya

Why Does PHP's Loose Type Comparison Lead to Unexpected Results When Comparing Strings and Integers?

String to Integer Comparison Anomali

Apabila membandingkan rentetan dengan integer dalam PHP, anda mungkin menemui hasil yang tidak dijangka. Pertimbangkan kod berikut:

$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
$test2 = "3581169b064f71be1630b321d3ca318f";

if ($test1 == 0)
  echo "Test 1 is Equal!?";
if ($test2 == 0)
  echo "Test 2 is Equal!?";

// Returns: Test 1 is Equal!?
Salin selepas log masuk

Anehnya, perbandingan $test1 dinilai kepada benar, walaupun nilainya bukan angka. Anomali ini berpunca daripada peraturan penukaran jenis longgar PHP.

Penukaran Rentetan kepada Nombor

Menurut manual PHP:

"Apabila rentetan dinilai dalam konteks berangka, nilai dan jenis yang terhasil ditentukan sebagai berikut:

  • Jika rentetan mengandungi mana-mana aksara '.', 'e' atau 'E', ia akan dinilai sebagai apungan.
  • Jika tidak, ia akan dinilai sebagai integer.

Nilai diberikan oleh bahagian awal rentetan Jika rentetan bermula dengan data angka yang sah, ini akan menjadi nilai yang digunakan. Jika tidak, nilai akan menjadi 0 (sifar)."

Menjelaskan Anomali

Dalam contoh yang disediakan, $test1 tidak mengandungi sebarang titik perpuluhan , eksponen atau sifar pendahuluan. Oleh itu, ia ditafsirkan sebagai integer dengan nilai awal 0. Memandangkan 0 adalah sama dengan integer 0 dalam PHP, perbandingan dinilai kepada benar.

Mengapa $test2 Gagal

Rentetan $test2 juga mengandungi aksara bukan angka. Walau bagaimanapun, kerana ia bermula dengan digit, nilai awalnya ditafsirkan sebagai integer 3581169. Integer ini tidak sama dengan 0, menghasilkan perbandingan palsu.

Mengelakkan Anomali Jenis

Untuk mengelakkan anomali ini, sentiasa gunakan perbandingan jenis yang ketat. Dalam contoh yang diberikan, anda boleh menulis semula kod seperti berikut:

if ($test1 === "0")
  echo "Test 1 is Equal!";
if ($test2 === "0")
  echo "Test 2 is Equal!?";
Salin selepas log masuk

Dengan menggunakan operator perbandingan yang ketat ===, anda memastikan bahawa nilai adalah daripada jenis yang sama dan mengelakkan hasil yang tidak dijangka.

Atas ialah kandungan terperinci Mengapa Perbandingan Jenis Longgar PHP Membawa kepada Keputusan Yang Tidak Dijangka Apabila Membandingkan Rentetan dan Integer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan