Garip php if deyimi sorun

7 Cevap php
if($country == 224 || $country == 223 || $country == 39 && $zip == '' ){
    $_SESSION['sess_msg'] = "Please enter a Valid zipcode";
    header("location: $SITE_PATH?p=account.profile.name");
    exit;
}
variable   value
--------   -----
$country     224
$zip       11111

I $zip boş değil biliyorum, ama öyle gibi kodu yürütür. Ben bile bir değere sahip olduğunu doğrulamak için bir hata ayıklama açıklamada tarayıcıya çıktı.

Ne $zip bir değeri yok sanki benim program hareket etmek neden?

7 Cevap

&& operatörü daha yüksek bir precedence 'den || operatörü sahiptir. Yani ifade eşittir:

$country == 224 || $country == 223 || ($country == 39 && $zip == '')

Çözüm:

($country == 224 || $country == 223 || $country == 39) && $zip == ''

Eğer operasyonlar için sipariş vermek için parantez kullanarak denediniz mi?

($country == 22 || $country == 223 || $country == 39) && ($zip == '')

Sorun order in which PHP checks your boolean operators olduğunu. Önce, bir durum görür daha sonra bir OR, ve düşünür: Heck, evet! Koşul karşılanmaktadır. Neden bu malzeme geri kalanını okumak ve yürütme rahatsız gerekir?

Aslında, bu bir özelliktir. Bu takımyıldızı düşünün:

if (something_probable () OR something_very_expensive_to_compute ())

Ilki zaten testini geçerse o zaman, ikinci bir değerlendirmek değil PHP güzel.

Parantez kullanmayı deneyin:

if (($country == 224 || $country == 223 || $country == 39) && $zip == '' ){

Alkış,

&& | daha yüksek operatör precendence vardır | Bu nedenle, etkili diyorsun:

if($country == 224 || $country == 223 || ($country == 39 && $zip == '' ))

Ben ilk cevap gibi ama yine de olur daha okunabilir değil:

<?php

$need_zip_code = array(224, 222, 332, 222/* etc....*/);

if (in_array($country, $need_zip_code) &&  $zip === '') {
 // do your stuff....
}


?>

Bu onu değiştirmek eğer ne yapar?

if($country === 224 || $country === 223 || $country === 39 && $zip === '' ){
    $_SESSION['sess_msg'] = "Please enter a Valid zipcode";
    header("location: $SITE_PATH?p=account.profile.name");
    exit;
}

types değişkenlerin burada bir soruna neden olup olmadığını ben === değerini değişken and tipi hem karşılaştırmak olacak, merak ediyorum.

Evet ... ama doğru değerler birine ayarlanır? Ülke 224 veya 223 veya 39 ve zip boş bir dize? Ben vurgulamak istiyorum, zip "boş" bir dize'' == olduğunu.