Tidak ada {
atau }
karena indentasi yang salah
Kawat gigi kode yang tidak cocok adalah umum untuk kode yang kurang diformat dengan baik seperti:
if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
Jika kode Anda terlihat seperti ini, mulailah dari awal! Kalau tidak, itu tidak bisa diperbaiki untuk Anda atau orang lain. Tidak ada gunanya menampilkan ini di internet untuk meminta bantuan.
Anda hanya akan dapat memperbaikinya, jika Anda dapat secara visual mengikuti struktur bersarang dan hubungan if / else conditional dan {
blok kode mereka }
. Gunakan IDE Anda untuk melihat apakah semuanya sudah berpasangan.
if (true) {
if (false) {
…
}
elseif ($whatever) {
if ($something2) {
…
}
else {
…
}
}
else {
…
}
if (false) { // a second `if` tree
…
}
else {
…
}
}
elseif (false) {
…
}
Setiap dobel }
}
tidak hanya akan menutup cabang, tetapi struktur kondisi sebelumnya. Oleh karena itu tetap dengan satu gaya pengkodean; jangan campur dan cocokkan di pohon if / else bersarang.
Terlepas dari konsistensi di sini, ternyata bermanfaat untuk menghindari kondisi yang panjang juga. Gunakan variabel atau fungsi sementara untuk menghindari ekspresi yang tidak bisa dibaca if
.
IF
tidak dapat digunakan dalam ekspresi
Kesalahan pendatang baru yang sering terjadi adalah mencoba menggunakan if
pernyataan dalam ekspresi, seperti pernyataan cetak:
⇓
echo "<a href='" . if ($link == "example.org") { echo …
Tentu saja yang tidak valid.
Anda dapat menggunakan persyaratan ternary , tetapi waspadai dampak keterbacaan.
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
Kalau tidak, hancurkan konstruksi output seperti ini: gunakan multiple if
s dan echo
s .
Lebih baik lagi, gunakan variabel sementara , dan tempatkan kondisimu sebelumnya:
if ($link) { $href = "yes"; } else { $href = "no"; }
echo "<a href='$href'>Link</a>";
Mendefinisikan fungsi atau metode untuk kasus-kasus seperti itu seringkali masuk akal juga.
Blok kontrol tidak mengembalikan "hasil"
Sekarang ini kurang umum, tetapi beberapa coders bahkan mencoba memperlakukan if
seolah-olah itu dapat mengembalikan hasil :
$var = if ($x == $y) { "true" };
Yang secara struktural identik dengan penggunaan if
dalam string / ekspresi string.
- Tetapi struktur kontrol (jika / foreach / while) tidak memiliki "hasil" .
- String literal "true" juga akan menjadi pernyataan kosong.
Anda harus menggunakan tugas dalam blok kode :
if ($x == $y) { $var = "true"; }
Atau, ?:
gunakan perbandingan terner.
If in If
Anda tidak dapat membuat sarangif
dalam kondisi:
⇓
if ($x == true and (if $y != false)) { ... }
Yang jelas berlebihan, karena and
(atau or
) sudah memungkinkan perbandingan rantai.
Tanda ;
titik koma yang terlupakan
Sekali lagi: Setiap blok kontrol harus berupa pernyataan. Jika potongan kode sebelumnya tidak diakhiri dengan tanda titik koma, maka itu adalah kesalahan sintaksis yang dijamin:
⇓
$var = 1 + 2 + 3
if (true) { … }
Btw, baris terakhir dalam {…}
blok kode juga perlu titik koma.
Titik koma terlalu dini
Sekarang mungkin salah untuk menyalahkan gaya pengkodean tertentu, karena perangkap ini terlalu mudah untuk diabaikan:
⇓
if ($x == 5);
{
$y = 7;
}
else ←
{
$x = -1;
}
Yang terjadi lebih sering daripada yang Anda bayangkan.
- Ketika Anda mengakhiri
if ()
ekspresi dengan;
itu akan menjalankan pernyataan kosong. The ;
menjadi kosong {}
sendiri!
- The
{…}
blok sehingga terlepas dari if
, dan akan selalu berjalan.
- Jadi
else
tidak lagi memiliki hubungan dengan if
konstruksi terbuka , itulah sebabnya ini akan menyebabkan kesalahan sintaks T_ELSE yang tidak terduga.
Yang juga menjelaskan variasi halus kesalahan sintaksis ini:
if ($x) { x_is_true(); }; else { something_else(); };
Di mana ;
setelah blok kode {…}
mengakhiri seluruh if
konstruksi, memutuskan else
cabang secara sintaksis.
Tidak menggunakan blok kode
Secara sintaksis diperbolehkan untuk menghilangkan kurung kurawal {
... }
untuk blok kode di if
/ elseif
/ else
cabang. Yang sayangnya adalah gaya sintaksis yang sangat umum untuk coders yang tidak berversi. (Dengan asumsi yang salah ini lebih cepat untuk mengetik atau membaca).
Namun itu sangat mungkin untuk meningkatkan sintaksis. Cepat atau lambat pernyataan tambahan akan menemukan jalan mereka ke cabang if / else:
if (true)
$x = 5;
elseif (false)
$x = 6;
$y = 7; ←
else
$z = 0;
Tetapi untuk benar-benar menggunakan blok kode, Anda harus menulis {
... }
seperti itu!
Bahkan programmer berpengalaman menghindari sintaksis tanpa gelang ini, atau setidaknya memahaminya sebagai pengecualian yang luar biasa terhadap aturan.
Else / Elseif dalam urutan yang salah
Satu hal yang perlu diingatkan adalah tatanan bersyarat , tentu saja.
if ($a) { … }
else { … }
elseif ($b) { … }
↑
Anda dapat memiliki sebanyak yang elseif
Anda inginkan, tetapi else
harus pergi terakhir . Begitulah adanya.
Deklarasi kelas
Seperti disebutkan di atas , Anda tidak dapat memiliki pernyataan kontrol dalam deklarasi kelas:
class xyz {
if (true) {
function ($var) {}
}
Anda juga lupa definisi fungsi , atau menutupnya }
terlalu awal dalam kasus tersebut.
T_ELSEIF / T_ELSE yang tidak terduga
Saat mencampur PHP dan HTML, penutup }
untuk if/elseif
harus dalam blok PHP yang sama <?php ?>
dengan yang berikutnya elseif/else
. Ini akan menghasilkan kesalahan sebagai penutup }
dari if
kebutuhan untuk menjadi bagian dari elseif
:
<?php if ($x) { ?>
html
<?php } ?>
<?php elseif ($y) { ?>
html
<?php } ?>
Bentuk yang benar <?php } elseif
:
<?php if ($x) { ?>
html
<?php } elseif ($y) { ?>
html
<?php } ?>
Ini lebih atau kurang variasi dari indentasi yang salah - mungkin sering didasarkan pada niat pengkodean yang salah.
Anda tidak dapat menumbuk pernyataan lain antara if
dan elseif
/ else
token struktural:
if (true) {
}
echo "in between"; ←
elseif (false) {
}
?> text <?php ←
else {
}
Entah hanya dapat terjadi di {…}
blok kode, bukan di antara token struktur kontrol.
- Ini tidak masuk akal. Bukannya ada kondisi "tidak terdefinisi" ketika PHP beralih
if
dan else
bercabang.
- Anda harus memutuskan di mana pernyataan cetak menjadi milik / atau jika perlu diulang di kedua cabang.
Anda juga tidak dapat memisahkan jika / selain antara struktur kontrol yang berbeda:
foreach ($array as $i) {
if ($i) { … }
}
else { … }
Tidak ada hubungan sintaksis antara if
dan else
. The foreach
leksikal lingkup berakhir pada }
, sehingga tidak ada gunanya untuk if
struktur untuk melanjutkan.
T_ENDIF
Jika T_ENDIF yang tidak terduga dikeluhkan, Anda menggunakan gaya sintaksis alternatif if:
⋯ elseif:
⋯ else:
⋯ endif;
. Yang harus Anda pikirkan dua kali.
Perangkap yang umum membingungkan usus yang mirip :
dengan ;
semicolon . (Tercakup dalam "Titik Koma terlalu dini")
Karena lekukan lebih sulit untuk dilacak dalam file templat, semakin saat menggunakan sintaks alternatif - masuk akal Anda endif;
tidak cocok dengan apa pun if:
.
Menggunakan } endif;
adalah -minator ganda if
.
Sementara "$ end yang tidak terduga" biasanya merupakan harga untuk }
kurung kurawal penutupan yang terlupakan .
Penugasan vs. perbandingan
Jadi, ini bukan kesalahan sintaksis, tetapi layak disebutkan dalam konteks ini:
⇓
if ($x = true) { }
else { do_false(); }
Itu bukan ==
/ ===
perbandingan, tetapi =
tugas . Ini agak halus, dan akan dengan mudah membuat beberapa pengguna tanpa daya mengedit seluruh blok kondisi. Berhati-hatilah dengan tugas yang tidak diinginkan terlebih dahulu - kapan saja Anda mengalami kesalahan logika / keliru.