Eksik {
veya }
yanlış girinti nedeniyle
Eşleşmeyen kod ayraçları, daha az iyi biçimlendirilmiş kodlar için ortaktır:
if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
Kodunuz böyle görünüyorsa, yeniden başlayın! Aksi takdirde sizin veya başka bir kişi tarafından düzeltilemez. Yardım istemek için bunu internette sergilemenin bir anlamı yok.
Bunu ancak, eğer if / else koşullarının ve {
kod bloklarının iç içe yapısını ve ilişkisini görsel olarak takip edebiliyorsanız düzeltebilirsiniz }
. Hepsinin eşleştirilmiş olup olmadığını görmek için IDE'nizi kullanın.
if (true) {
if (false) {
…
}
elseif ($whatever) {
if ($something2) {
…
}
else {
…
}
}
else {
…
}
if (false) { // a second `if` tree
…
}
else {
…
}
}
elseif (false) {
…
}
Herhangi bir çift }
}
sadece bir dalı değil, aynı zamanda önceki bir koşul yapısını da kapatacaktır. Bu nedenle bir kodlama stiline sadık kalın; iç içe eğer / else ağaçları karıştırıp eşleştirmeyin.
Buradaki tutarlılık dışında, uzun koşullardan da kaçınmak faydalıdır. Okunamayan if
ifadeleri önlemek için geçici değişkenler veya işlevler kullanın .
IF
ifadelerde kullanılamaz
Şaşırtıcı bir şekilde yeni gelen bir hata, if
bir ifadede print ifadesi gibi bir ifade kullanmaya çalışıyor :
⇓
echo "<a href='" . if ($link == "example.org") { echo …
Tabii ki geçersiz.
Üçlü bir koşullu kullanabilirsiniz , ancak okunabilirlik etkilerine dikkat edin.
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
Aksi takdirde bu tür çıkış yapılarını kesin: birden fazla if
s ve echo
s kullanın .
Daha da iyisi, geçici değişkenler kullanın ve koşullarınızı önce yerleştirin:
if ($link) { $href = "yes"; } else { $href = "no"; }
echo "<a href='$href'>Link</a>";
Bu gibi durumlar için işlevler veya yöntemler tanımlamak da genellikle mantıklıdır.
Kontrol blokları "sonuç" döndürmez
Şimdi bu daha az yaygındır, ancak birkaç kodlayıcı if
bir sonuç döndürebilirmiş gibi davranmaya çalışır :
$var = if ($x == $y) { "true" };
Hangi yapısal olarak if
bir dize birleştirme / ifade içinde kullanmakla aynıdır .
- Ancak kontrol yapılarının (if / foreach / while) bir "sonucu" yoktur .
- Değişmez "true" dizesi de geçersiz bir ifade olur.
Kod bloğunda bir ödev kullanmanız gerekir :
if ($x == $y) { $var = "true"; }
Alternatif olarak ?:
üçlü bir karşılaştırmaya başvurunuz.
Eğer Varsa
Sen yuvalayamazsınız birif
ya bir koşul içinde:
⇓
if ($x == true and (if $y != false)) { ... }
Açıkçası gereksizdir, çünkü and
(veya or
) zaten zincirleme karşılaştırmalara izin verir.
Unutulmuş ;
noktalı virgüller
Bir kez daha: Her kontrol bloğunun bir ifade olması gerekir. Önceki kod parçası noktalı virgülle sonlandırılmazsa, bu garantili bir sözdizimi hatasıdır:
⇓
$var = 1 + 2 + 3
if (true) { … }
Btw, {…}
kod bloğundaki son satırda noktalı virgül de gerekiyor.
Noktalı virgül çok erken
Şimdi, bu tuzağın göz ardı edilmesi çok kolay olduğu için belirli bir kodlama stilini suçlamak muhtemelen yanlış:
⇓
if ($x == 5);
{
$y = 7;
}
else ←
{
$x = -1;
}
Bu tahmin edebileceğinizden daha sık olur.
- Ne zaman sona
if ()
ifadenin;
bir boşluk deyimi çalıştırır. ;
Bir boş olur {}
kendi!
{…}
Blok böylece ayrılır if
ve her zaman çalışır.
- Bu yüzden
else
artık açık bir if
yapı ile ilişkisi yoktu , bu yüzden bu beklenmedik bir T_ELSE sözdizimi hatasına yol açacaktı.
Bu da bu sözdizimi hatasının benzer şekilde ince bir varyasyonunu açıklar:
if ($x) { x_is_true(); }; else { something_else(); };
Nerede ;
kodundan sonra blok {…}
bütün sonlandırır if
Severing, yapısı else
sözdizimsel dalı.
Kod bloklarını kullanmamak
Sözdizimsel kıvırcık Parantezleri yapmasına izin verdiklerine {
... }
kod blokları if
/ elseif
/ else
dallar. Ne yazık ki tersine kodlayıcılar için çok yaygın bir sözdizimi tarzıdır. (Yanlış varsayım altında bu yazı yazmak veya okumak için daha hızlıdır).
Ancak bu sözdizimini açma olasılığı yüksektir. Er ya da geç ek ifadeler if / else dallarına girecek:
if (true)
$x = 5;
elseif (false)
$x = 6;
$y = 7; ←
else
$z = 0;
Ama aslında kod bloklarını kullanmak için yazmak zorundasınız{
... }
onları böyle!
Tecrübeli programcılar bile bu acımasız sözdiziminden kaçınırlar ya da en azından kurala istisnai bir istisna olarak anlarlar.
Else / Elseif yanlış sırada
Kendinizi hatırlatmanız gereken bir şey elbette koşullu düzendir .
if ($a) { … }
else { … }
elseif ($b) { … }
↑
İstediğiniz kadar elseif
s'ye sahip olabilirsiniz , ancak else
sonuna kadar gitmek zorundasınız . İşte böyle.
Sınıf bildirimleri
Yukarıda belirtildiği gibi , bir sınıf bildiriminde kontrol ifadeleri olamaz:
class xyz {
if (true) {
function ($var) {}
}
Bir işlev tanımını unuttun ya da }
bu gibi durumlarda çok erken kapattın.
Beklenmedik T_ELSEIF / T_ELSE
PHP ve HTML karıştırılırken, a'nın kapanışı }
bir sonraki ile if/elseif
aynı PHP bloğunda olmalıdır . Bu , gereksinimlerin kapanması aşağıdakilerin bir parçası olması nedeniyle bir hata oluşturur :<?php ?>
elseif/else
}
if
elseif
<?php if ($x) { ?>
html
<?php } ?>
<?php elseif ($y) { ?>
html
<?php } ?>
Doğru form <?php } elseif
:
<?php if ($x) { ?>
html
<?php } elseif ($y) { ?>
html
<?php } ?>
Bu, aşağı yukarı yanlış girintinin bir varyasyonudur - muhtemelen sıklıkla yanlış kodlama niyetlerine dayanmaktadır.
Sen olamaz diğer ifadeleri püre İnbetween if
ve elseif
/ else
yapısal jeton:
if (true) {
}
echo "in between"; ←
elseif (false) {
}
?> text <?php ←
else {
}
Her ikisi de sadece {…}
kod bloklarında olabilir, kontrol yapısı simgeleri arasında değil.
- Bu hiç mantıklı değil. PHP arasında atlar
if
ve else
dallar olduğunda "tanımsız" bir durum söz konusu değildir .
- Basılı beyanların nereye ait olduğu / veya her iki dalda da tekrarlanması gerekip gerekmediğini kararlaştırmanız gerekir.
Ayrıca bir if / else komutunu farklı kontrol yapıları arasında paylaşamazsınız:
foreach ($array as $i) {
if ($i) { … }
}
else { … }
Hiçbir yoktur sözdizimsel ilişki arasındaki if
ve else
. foreach
En sözcük kapsam uçları }
, böylece için anlamı yok if
yapısı devam etmek.
T_ENDIF
Beklenmedik bir T_ENDIF'den şikayet edildiyse, alternatif sözdizimi stilini if:
⋯ elseif:
⋯ else:
⋯ kullanıyorsunuz endif;
. Hangi gerçekten iki kez düşünmek gerekir.
Yaygın bir tuzak, bir noktalı virgül için ürkütücü benzer :
kolonu;
karıştırmaktadır . ("Noktalı virgül çok erken" kapsamında)
Girintinin şablon dosyalarında izlenmesi daha zor olduğundan, alternatif sözdizimini kullanırken daha çok - endif;
herhangi biriyle eşleşmiyor olabilir if:
.
Kullanılması } endif;
bir olduğunu katına if
-terminatör.
Bir "beklenmedik $ son" genellikle unutulmuş bir kapanış }
kıvırcık ayracı için fiyattır .
Ödev ile karşılaştırma
Yani, bu bir sözdizimi hatası değil, bu bağlamda bahsetmeye değer:
⇓
if ($x = true) { }
else { do_false(); }
Bu bir ==
/ ===
karşılaştırma=
değil , bir ödevdir . Bu oldukça incedir ve bazı kullanıcıları kolayca tüm durum bloklarını çaresizce düzenlemeye yönlendirecektir. Öncelikle istenmeyen mantıklara dikkat edin - bir mantık hatası / yanlış kötüye kullanma ile karşılaştığınızda.