Semua orang berlari ke kesalahan sintaks. Bahkan programmer berpengalaman membuat kesalahan ketik. Untuk pendatang baru, it's hanya bagian dari proses pembelajaran. Namun, hal's sering mudah untuk menafsirkan pesan-pesan kesalahan seperti:
PHP Parse error: syntax error, unexpected '{' di index.php pada baris 20 Tak terduga simbol isn't selalu sesungguhnya. Tapi nomor baris yang memberikan gambaran kasar dari mana untuk mulai mencari. Selalu melihat kode konteks. Sintaks kesalahan yang sering bersembunyi di sebutkan or di sebelumnya baris kode. Bandingkan kode anda terhadap sintaks contoh dari manual. Sementara tidak setiap kasus pertandingan yang lain. Namun ada beberapa umum langkah-langkah untuk memecahkan kesalahan sintaks. Ini referensi diringkas perangkap umum:
- Unexpected T_STRING
- Unexpected T_VARIABLE
tak Terduga '$varname' (T_VARIABLE)- Yang tak terduga T_CONSTANT_ENCAPSED_STRING
tak Terduga T_ENCAPSED_AND_WHITESPACE- Yang tak terduga $end
- Yang tak terduga T_FUNCTION...
- Yang tak terduga
{
Unexpected}
tak Terduga(
tak Terduga)
- Yang tak terduga
[
tak Terduga]
- Yang tak terduga T_IF
tak Terduga T_FOREACH
tak Terduga T_FOR
tak Terduga T_WHILE
tak Terduga T_DO
tak Terduga T_PRINT
Unexpected T_ECHO- Yang tak terduga T_LNUMBER
- Yang tak terduga ?
- Yang tak terduga melanjutkan (T_CONTINUE)
tak Terduga melanjutkan (T_BREAK)
tak Terduga melanjutkan (T_RETURN)- Yang tak terduga '='
- Yang tak terduga T_INLINE_HTML...
- Yang tak terduga T_PAAMAYIM_NEKUDOTAYIM...
- Yang tak terduga T_OBJECT_OPERATOR...
- Yang tak terduga T_DOUBLE_ARROW...
- Yang tak terduga T_SL...
- Yang tak terduga T_BOOLEAN_OR...
Tak terduga T_BOOLEAN_AND...- Yang tak terduga T_IS_EQUAL
Tak terduga T_IS_GREATER_OR_EQUAL
Tak terduga T_IS_IDENTICAL
Tak terduga T_IS_NOT_EQUAL
Tak terduga T_IS_NOT_IDENTICAL
Tak terduga T_IS_SMALLER_OR_EQUAL
Tak terduga<
Tak terduga>
- Yang tak terduga T_NS_SEPARATOR...
- Yang tak terduga karakter yang di input: '
\
' (ASCII=92) state=1- Yang tak terduga 'umum' (T_PUBLIC)
tak Terduga 'swasta' (T_PRIVATE)
tak Terduga 'dilindungi' (T_PROTECTED)
tak Terduga 'akhir' (T_FINAL)...- Yang tak terduga T_STATIC...
- Yang tak terduga T_CLASS...
- Yang tak terduga T_DNUMBER
- Yang tak terduga
,
(koma)- Unpexected
.
(periode)- Yang tak terduga
;
(titik koma)- Yang tak terduga
*
(tanda bintang)- Yang tak terduga
:
(usus besar) Terkait erat referensi:- Apa ini berarti kesalahan dalam PHP? (runtime error)
- Parse error: syntax error, unexpected T_XXX
- Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE
- Parse error: syntax error, unexpected T_VARIABLE
- Apa arti simbol ini di PHP? (bahasa token)
- Mereka
""
smart `" quotes berarti apa-apa untuk PHP Dan:
- PHP manual php.net dan berbagai bahasa token
- Atau Wikipedia's sintaks pendahuluan pada PHP.
- Dan terakhir kami php tag-wiki tentu saja. Sementara Stack Overflow juga menyambut rookie coders, it's sebagian besar ditargetkan pada profesional pemrograman pertanyaan.
- Menjawab semua orang's coding kesalahan dan sempit typos dianggap sebagian besar off-topic.
- Jadi silahkan mengambil waktu untuk mengikuti langkah dasar, sebelum posting sintaks memperbaiki permintaan.
Jika anda masih memiliki, silakan lihat sendiri memecahkan inisiatif, diupayakan perbaikan, dan proses berpikir anda pada apa yang terlihat atau mungkin salah. Jika anda browser menampilkan pesan kesalahan seperti "SyntaxError: karakter ilegal", maka's tidak benar-benar [tag:php]-terkait, tetapi [tag:javascript]-syntax error.
Kesalahan sintaks dibesarkan di kode vendor: Akhirnya, mempertimbangkan bahwa jika kesalahan sintaks tidak diangkat oleh mengedit kode, tapi setelah vendor eksternal paket menginstal atau meng-upgrade, bisa juga karena versi PHP ketidakcocokan, jadi memeriksa vendor's kebutuhan terhadap platform anda setup.
PHP termasuk C-style penting bahasa pemrograman. Itu telah kaku aturan tata bahasa, yang tidak dapat pulih dari ketika menghadapi salah simbol-simbol atau pengenal. Hal ini dapat't kira coding anda niat.
Ada beberapa tindakan pencegahan dasar anda selalu dapat mengambil:
Khas sintaks pesan kesalahan yang berbunyi:
Parse error: syntax error, unexpected T_STRING, mengharapkan '
;
' di file.php pada baris 217 Yang berisi daftar mungkin lokasi kesalahan sintaks. Melihat disebutkan nama file dan nomor baris. A nama sepertiT_STRING
menjelaskan simbol parser/tokenizer tidak't proses akhirnya. Ini isn't tentu penyebab kesalahan sintaks, namun. It's penting untuk melihat ke dalam sebelumnya baris kode juga. Seringkali kesalahan sintaks adalah kecelakaan yang terjadi sebelumnya. Kesalahan nomor baris di mana parser meyakinkan menyerah untuk memproses itu semua.Memecahkan kesalahan sintaks
Ada banyak pendekatan untuk mempersempit dan memperbaiki kesalahan sintaks cegukan.
;
titik koma yang hilang pada baris sebelumnya berakhir/pernyataan. (Setidaknya dari gaya pandang. ) {
blok kode }
yang tidak benar tertutup atau bersarang, anda mungkin perlu untuk menyelidiki lebih jauh ke kode sumber. Penggunaan yang tepat kode lekukan untuk menyederhanakan itu. +-*/.
harus berwarna yang berbeda juga. Mereka mungkin berada dalam konteks yang salah. "
atau '
string penanda. ++
, --
, atau tanda kurung berikut operator. Dua senar/pengidentifikasi langsung mengikuti satu sama lain yang tidak benar dalam banyak konteks. jika
laporan menjadi berbeda atau bersarang jika
kondisi. ? :
kondisi operator dapat kode kompak dan berguna memang. Tapi itu doesn't pertolongan yang mudah dibaca dalam semua kasus. Sukai polos jika
laporan sementara paham. jika:
/elseif:
/endif;
) adalah umum untuk template, tapi bisa dibilang lebih mudah untuk mengikuti dari normal {
kode }
blok. ;
untuk mengakhiri pernyataan/garis. "
atau '
dan tidak lolos dalam tanda kutip. .
rangkaian. (
tanda kurung )
. Menghitung mereka dalam melaporkan baris. Ada jumlah yang sama dari mereka? diff
rusak dan terakhir versi kerja. Yang mungkin mencerahkan seperti apa syntax masalah ini.
grep --color -P -n "\[\x80-\xFF\]" file.php
sebagai langkah pertama untuk menemukan non-ASCII simbol-simbol. //
atau #
komentar digunakan. Multiline /*...*/
komentar yang tidak jarang mengganggu parser ketika linebreaks mendapatkan diabaikan. php -v
untuk baris perintah penerjemah <?php phpinfo();
untuk salah satu yang dipanggil melalui webserver.
Jika website anda hanya kosong, maka biasanya kesalahan sintaks adalah penyebabnya. Mengaktifkan tampilan mereka dengan:
error_reporting = E_ALL
display_errors = 1
Di php.ini
pada umumnya, atau melalui .htaccess
untuk mod_php,
atau bahkan .pengguna.ini
dengan FastCGI setup.
Sehingga dalam rusak script terlambat karena PHP dapat't bahkan menafsirkan/menjalankan baris pertama. Cepat solusi kerajinan wrapper script, katakanlah test.php
: <?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
Kemudian memohon gagal kode dengan mengakses wrapper script.
Hal ini juga membantu untuk mengaktifkan PHP's error_log
dan melihat ke anda webserver's kesalahan.log
ketika script crash dengan tanggapan HTTP 500.
Saya pikir topik ini benar-benar overdiscussed/overcomplicated. Menggunakan IDE adalah cara untuk pergi untuk benar-benar menghindari kesalahan sintaks. Saya bahkan akan mengatakan bahwa bekerja tanpa sebuah IDE adalah jenis yang tidak profesional. Mengapa? Karena modern IDEs memeriksa sintaks anda setelah setiap karakter yang anda ketik. Ketika anda kode dan seluruh garis berwarna merah, dan sebuah peringatan besar perilaku menunjukkan anda tipe yang tepat dan posisi yang tepat dari kesalahan sintaks, maka ada's benar-benar tidak perlu untuk mencari solusi lain.
Anda'll (efektif) pernah mengalami kesalahan sintaks lagi, hanya karena anda melihat mereka saat anda mengetik. Serius.
Sangat baik IDEs dengan memeriksa sintaks (semua dari mereka yang tersedia untuk Linux, Windows dan Mac):
[
Hari-hari ini, unexpected [
array bracket ini sering terlihat pada usang PHP versi. The short array sintaks tersedia sejak PHP >= 5.4. Instalasi yang lebih tua hanya mendukung array()
.
$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
⇑
Fungsi Array hasil dereferencing juga tidak tersedia untuk versi PHP yang lebih tua:
$result = get_whatever()["key"];
⇑
[Referensi - Apa ini berarti kesalahan dalam PHP? - "Syntax error, unexpected \[
"]2 menunjukkan yang paling umum dan praktis workarounds.
Meskipun, anda're selalu lebih baik hanya meng-upgrade instalasi PHP anda. Untuk shared webhosting rencana, penelitian pertama jika misal SetHandler php56-fcgi
dapat digunakan untuk mengaktifkan runtime baru.
Lihat juga:
BTW, ada juga preprosesor dan PHP 5.4 sintaks down-converter jika anda're benar-benar lengket dengan yang lebih tua + lebih lambat versi PHP.
Penyebab lain untuk Unexpected [
kesalahan sintaks
Jika itu's tidak di-PHP versi ketidakcocokan, maka's seringkali polos typo atau pendatang baru sintaks kesalahan:
dilindungi $var["x"] = "Tidak,"; ⇑
[
dengan pembukaan kurung kurawal {
atau tanda kurung (
adalah umum pengawasan.foreach [$a sebanyak $b) ⇑
Atau bahkan:
fungsi foobar[$a, $b, $c] { ⇑
$var = const[123]; ⇑
Setidaknya PHP menafsirkan bahwa const
sebagai nama yang konstan.
Jika anda bermaksud untuk mengakses variabel array (yang khas karena di sini), kemudian tambahkan terkemuka $
sigil - sehingga menjadi sebuah $namavar
.
global
kata kunci pada anggota array asosiatif. Hal ini tidak berlaku sintaks:global $var['kunci'];
]
penutupan braket persegiIni agak jarang, tapi ada juga sintaks kecelakaan dengan mengakhiri array ]
bracket.
)
tanda kurung atau }
kurung kurawal yang umum:fungsi foobar($a, $b, $c] { ⇑
$var = 2];
Yang sering terjadi pada multi-line dan bersarang deklarasi array.
$array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15];
⇑
Jika demikian, gunakan IDE anda untuk pencocokan braket untuk menemukan setiap dini ]
array penutupan. Setidaknya lebih banyak menggunakan spasi dan baris baru untuk mempersempit.
Sebuah "tak terduga T_VARIABLE
" berarti bahwa ada's literal $variable
nama, yang doesn't masuk ke dalam arus ekspresi/pernyataan struktur.
Hal ini paling sering menunjukkan hilang koma di baris sebelumnya. Variabel tugas berikut pernyataan adalah indikator yang baik di mana untuk melihat:
⇓ func1() $var = 1 + 2; # parse error di line +2
Sebuah kecelakaan yang sering adalah string concatenations dengan dilupakan .
operator:
⇓ cetak "di sinilah nilai: " $nilai;
Btw, anda harus memilih string interpolasi (variabel-variabel dasar dalam tanda kutip ganda) setiap kali yang membantu pembacaan. Yang menghindari aturan sintaks masalah.
String interpolasi adalah bahasa scripting fitur inti. Tidak ada rasa malu dalam memanfaatkan itu. Mengabaikan setiap mikro-optimasi menyarankan tentang variabel
.
rangkaian yang lebih cepat. It's tidak.
Tentu saja masalah yang sama dapat timbul dalam ungkapan lain, misalnya operasi aritmatika:
⇓ cetak 4 + 7 $var;
PHP dapat't kira berikut jika variabel harus telah ditambah, dikurangi atau dibandingkan dll.
Yang sama untuk sintaks daftar, seperti di hotel populasi, di mana parser juga menunjukkan diharapkan koma ,
misalnya:
⇓ $var = array("1" => $val $val2, $val3 $val4);
Atau fungsi daftar parameter:
⇓ fungsi myfunc($param1, $param2 $param3, $param4)
Dengan kata lain apakah anda melihat ini dengan daftar
atau global
pernyataan, atau bila kurang ;
koma di untuk
loop.
Ini parser error juga terjadi di kelas declarations. Anda hanya dapat menetapkan statis konstanta, bukan ekspresi. Dengan demikian parser mengeluh tentang variabel-variabel seperti yang ditugaskan data:
kelas xyz { ⇓ var $nilai = $_GET["input"];
Tak tertandingi }
penutupan kurung kurawal dapat secara khusus memimpin di sini. Jika metode ini dihentikan terlalu dini (penggunaan yang tepat lekukan!), kemudian nyasar variabel ini sering salah dalam kelas deklarasi tubuh.
Anda dapat juga pernah memiliki variabel mengikuti pengenal secara langsung:
⇓ $this->myFunc$VAR();
Btw, ini adalah sebuah contoh umum di mana tujuannya adalah untuk menggunakan variabel variabel mungkin. Dalam hal ini variabel properti lookup dengan $this->{"myFunc$VAR"}();
misalnya.
Mengambil diingat bahwa menggunakan variabel variabel harus menjadi pengecualian. Pendatang baru sering mencoba untuk menggunakan mereka terlalu santai, bahkan ketika array akan menjadi lebih sederhana dan lebih tepat.
Terburu-buru mengetik dapat menyebabkan untuk dilupakan pembukaan kurung
untuk jika
dan for
dan foreach
pernyataan:
⇓ foreach $array as $key) {
Solusi: tambahkan hilang pembukaan (
antara pernyataan dan variabel.
⇓ lain ($var >= 0)
Solusi: Hapus kondisi dari yang lain
atau gunakan elseif
.
⇓ fungsi() menggunakan $var {}
Solusi: Menambahkan tanda kurung di sekitar $var
.
Seperti yang disebutkan dalam referensi jawaban pada "tak Terlihat liar Unicode" (seperti non-breaking space), anda juga mungkin melihat kesalahan ini untuk tidak curiga kode seperti:
<?php ⇐ $var = new PDO(...);
It's lebih lazim di awal file dan copy-dan-paste kode. Periksa dengan hexeditor, jika kode anda tidak muncul secara visual untuk mengandung sintaks masalah.
Berat nama T_CONSTANT_ENCAPSED_STRING
dan T_ENCAPSED_AND_WHITESPACE
mengacu dikutip "string"
literal.
Mereka're digunakan dalam konteks yang berbeda, tetapi sintaks masalah yang cukup mirip. T_ENCAPSED... peringatan terjadi di double quoted string konteks, sementara T_CONSTANT... string yang sering tersesat di dataran PHP ekspresi atau pernyataan.
T_STRING
adalah sedikit keliru. Itu tidak merujuk ke dikutip "string"
. Itu berarti mentah identifier yang dihadapi. Hal ini dapat berkisar dari telanjang
kata-kata untuk sisa KONSTAN
atau nama-nama fungsi, lupa dikutp string, atau teks biasa.
"
tanda kutip ganda. echo
/print
baris bukannya melarikan diri dan keluar. Lebih baik lagi mempertimbangkan HEREDOC bagian.
Lihat juga https://stackoverflow.com/questions/3446216/what-is-the-difference-between-single-quoted-and-double-quoted-strings-in-php. <?xml
header di script PHP(
Pembukaan kurung biasanya mengikuti konstruksi bahasa seperti jika
/foreach
/untuk
/array
/daftar
atau memulai sebuah ekspresi aritmatika. Mereka're sintaksis benar setelah "strings"
, yang sebelumnya ()
, a lone $
, dan dalam beberapa khas deklarasi konteks.
konstan
jika
{
{
atau }
karena salah lekukan Jika kode anda terlihat seperti ini, mulai dari awal! Selain itu's unfixable untuk anda atau orang lain. Ada's tidak ada gunanya menampilkan ini di internet untuk menanyakan untuk membantu.
Anda hanya akan dapat untuk memperbaiki itu, jika anda secara visual dapat mengikuti bersarang struktur dan hubungan jika/lain conditional dan mereka {
blok kode }
. Menggunakan IDE anda untuk melihat apakah mereka're semua dipasangkan.
if (true) {
jika (false) {
...
}
elseif ($apapun) {
if ($something2) {
...
}
else {
...
}
}
else {
...
}
jika (false) { // yang kedua jika
pohon
...
}
else {
...
}
}
elseif (false) {
...
}
Setiap kali }
}
tidak akan menutup cabang, tapi sebelumnya kondisi struktur. Oleh karena itu tetap dengan satu coding style; don't mix and match dalam nested if/else pohon.
Terlepas dari konsistensi di sini, ternyata bermanfaat untuk menghindari kondisi yang terlalu panjang. Menggunakan variabel sementara atau fungsi untuk menghindari terbaca jika
-ekspresi.
2.
JIKA
tidak dapat digunakan dalam ekspresi jika
pernyataan dalam sebuah ekspresi, seperti cetak pernyataan:
⇓
echo "<a href='," . if ($link == "contoh.org") { echo ...
Yang valid saja.
Anda dapat menggunakan ternary bersyarat, tapi waspadalah terhadap pembacaan dampak.
echo "<a href='," . ($link ? "http://yes" : "http://no") . "";
Jika tidak istirahat seperti output konstruksi naik: gunakan beberapa jika dan
echo.
Lebih baik lagi, gunakan sementara variabel, dan tempat anda conditional sebelum:
if ($link) { $href = "ya"; } else { $href = "tidak"; }
echo "Link";
Mendefinisikan fungsi-fungsi atau metode untuk kasus seperti ini sering masuk akal juga.
;
titik koma Bentuk yang benar <?php } elseif
:
<?php if ($x) { ?> html <?php } elseif ($y) { ?> html <?php } ?>
Ini lebih atau kurang variasi dari salah lekukan - mungkin sering didasarkan pada salah coding niat.
Anda tidak mash pernyataan lain inbetween jika
dan elseif
/yang lain
struktural token:
if (true) {
}
echo "di antara"; ←
elseif (false) {
}
?> teks <?php ←
else {
}
Baik hanya dapat terjadi dalam {...}
blok kode, tidak di antara struktur pengendalian token.
jika
dan lain
cabang-cabang. Anda juga dapat bagian if/else di antara berbagai struktur kontrol:
foreach ($array as $i) {
if ($i) { ... }
}
else { ... }
Tidak ada sintaksis kaitannya antara jika
dan yang lain
. The foreach
leksikal lingkup berakhir di }
, jadi ada's tidak ada gunanya untuk jika
struktur untuk melanjutkan.
9.
jika:
⋯ elseif:
⋯ yang lain:
⋯ endif;
. Yang anda benar-benar harus berpikir dua kali tentang.
:
usus untuk ;
semicolon. (Tertutup di "titik Koma terlalu dini") endif;
tidak sesuai jika:
. } endif;
adalah dua kali lipat jika
-terminator.
}
kurung kurawal. Ketika PHP pembicaraan tentang sebuah "tak terduga $end
", itu berarti bahwa kode anda berakhir sebelum waktunya. (Pesan ini sedikit menyesatkan ketika diambil secara harfiah. It's tidak tentang suatu variabel yang bernama "$akhir", karena kadang-kadang diasumsikan oleh pendatang baru. Hal ini mengacu pada "akhir dari file", EOF.)
Penyebab: tidak Seimbang
{
dan}
untuk kode blok / dan fungsi atau class deklarasi.
It's selalu tentang hilang }
kurung kurawal tutup sebelumnya kode blok.
Sekali lagi, penggunaan yang tepat lekukan untuk menghindari masalah tersebut.
Menggunakan IDE dengan pencocokan braket, untuk mencari tahu di mana }
adalah salah.
Ada cara pintas keyboard di sebagian besar Ide dan teks editor:
Paling IDEs juga sorot pencocokan kawat gigi, tanda kurung dan tanda kurung. Yang membuatnya cukup mudah untuk memeriksa mereka korelasi:
Dan Unexpected $end
sintaks/parser error juga bisa terjadi karena tidak terselesaikan ekspresi atau pernyataan:
$var = func(1,
?>
EOFJadi, melihat akhir dari script pertama. Tanda ;
sering berlebihan untuk pernyataan terakhir dalam setiap script PHP. Tapi anda harus punya satu. Justru karena itu menyempit seperti sintaks masalah.
Lain kejadian yang umum muncul dengan HEREDOC atau NOWDOC string. Mengakhiri penanda pergi diabaikan dengan memimpin spasi, tab, dll.:
print <<< END
Content...
Content....
END;
# ↑ terminator isn't exactly at the line start
Oleh karena itu parser mengasumsikan HEREDOC string untuk melanjutkan sampai akhir file (maka "Unexpected $end"). Hampir semua Ide dan syntax-highlighting editor akan membuat yang jelas ini atau memperingatkan tentang hal itu.
Jika anda menggunakan \
dalam string, itu memiliki arti khusus. Ini disebut "Karakter Escape" dan biasanya menceritakan parser untuk mengambil karakter berikutnya secara harfiah.
Contoh: echo 'kata Jim \'Hello\'';
akan mencetak kata Jim 'halo'
Jika anda melarikan diri penutupan quote string, penutupan penawaran akan diambil secara harfiah dan tidak sesuai dengan peruntukannya, yaitu sebagai cetak quote sebagai bagian dari string dan tidak menutup string. Ini akan menunjukkan kesalahan parse biasa setelah anda membuka berikutnya string atau di akhir script.
Kesalahan yang sangat umum ketika specifiying jalan di Windows: "C:\xampp\htdocs\"
adalah salah. Anda perlu "C:\\xampp\\htdocs\\"
.
Agak jarang anda lihat ini syntax error ketika menggunakan sintaks alternatif untuk pernyataan/blok kode pada template. Menggunakan jika
dan yang lain:
dan hilang endif;
misalnya.
Kontrol konstruksi seperti jika
, foreach
, untuk
, sementara
, daftar
, global
, kembali
, apakah
, print
, echo
hanya dapat digunakan sebagai laporan. Mereka biasanya berada pada baris sendiri.
Cukup universal telah anda terjawab tanda titik koma di baris sebelumnya jika parser mengeluh tentang pernyataan kontrol:
⇓ $x = myfunc() if (true) {
Solusi: melihat ke baris sebelumnya; tambahkan titik koma.
Lokasi lain di mana hal ini terjadi adalah di kelas declarations. Di bagian kelas anda hanya bisa daftar properti inisialisasi dan metode bagian. Tidak ada kode yang mungkin berada di sana.
kelas xyz { if (true) {} foreach ($var) {}
Seperti kesalahan sintaks umumnya terwujud untuk salah bersarang {
dan }
. Khususnya bila fungsi blok kode sempat tertutup terlalu dini.
Paling konstruksi bahasa yang bisa hanya dapat digunakan sebagai statements. Mereka tidak't dimaksudkan untuk ditempatkan di dalam ungkapan lain:
⇓ $var = array(1, 2, foreach($lain sebagai $_), 5, 6);
Demikian juga dapat't anda menggunakan jika
dalam string, ekspresi matematika atau di tempat lain:
⇓ cetak "Ya, " . if (true) { "anda!" } . " tidak't bekerja"; // Menggunakan ternary kondisi di sini sebaliknya, ketika berpengalaman cukup.
Untuk menanamkan jika
kondisi seperti dalam ungkapan khusus, anda seringkali ingin menggunakan ?:
terner evaluasi.
Hal yang sama berlaku untuk untuk
, sementara
, global
, echo
dan memperpanjang lebih rendah daftar
.
⇓ echo 123, echo 567, "hah?";
Sedangkan cetak()
adalah bahasa builtin yang dapat digunakan dalam ekspresi konteks. (Tapi jarang masuk akal.)
Anda juga dapat't menggunakan do
atau jika
dan bahasa lainnya konstruksi untuk fungsi yang ditetapkan pengguna atau nama kelas. (Mungkin di PHP7. Tetapi bahkan kemudian itu tidak't dianjurkan.)
<
>
Operator perbandingan seperti ==
, >=
, ===
, !=
, <>
, !==
dan <=
atau <
dan >
sebagian besar harus digunakan hanya dalam ungkapan-ungkapan, seperti jika
ekspresi. Jika parser mengeluh tentang mereka, maka hal itu sering berarti salah atau pengupas serasi (
)
parens di sekitar mereka.
Khususnya untuk jika
pernyataan dengan beberapa perbandingan, anda harus berhati-hati untuk benar menghitung pembukaan dan penutupan kurung:
⇓ if (($foo < 7) && $bar) > 5 || $baz < 9) { ... } ↑
Di sini jika
kondisi di sini sudah dihentikan oleh )
Setelah perbandingan anda menjadi cukup kompleks ini sering membantu untuk membaginya menjadi beberapa dan bersarang jika
konstruksi yang agak.
Umum pendatang baru pitfal adalah mencoba untuk menggabungkan isset()
atau kosong()
dengan perbandingan:
⇓ if (empty($_POST["var"] == 1)) {
Atau bahkan:
⇓ if (isset($variabel !== "nilai")) {
Ini doesn't masuk akal untuk PHP, karena isset
dan kosong
adalah konstruksi bahasa yang hanya menerima nama-nama variabel. Itu doesn't masuk akal untuk membandingkan hasil yang baik, karena output hanya/sudah boolean.
>=
lebih besar atau sama dengan =>
array operatorKedua operator terlihat agak mirip, sehingga mereka kadang-kadang bisa dicampur:
⇓ if ($var => 5) { ... }
Anda hanya perlu ingat bahwa ini operator perbandingan ini disebut "lebih besar dari atau sama" untuk mendapatkannya tepat.
Lihat juga: https://stackoverflow.com/questions/2551718/if-statement-structure-in-php
Anda juga dapat't menggabungkan dua perbandingan jika mereka berhubungan sama nama variabel:
⇓ if ($xyz > 5 dan < 100)
PHP dapat't menyimpulkan bahwa anda dimaksudkan untuk membandingkan nilai awal variabel lagi. Ekspresi yang biasanya dipasangkan menurut operator didahulukan, sehingga pada saat <
dilihat, ada'd hanya boolean hasil tersisa dari variabel asli.
Lihat juga: tak terduga T_IS_SMALLER_OR_EQUAL
Anda dapat't membandingkan terhadap variabel dengan deretan operator:
⇓ $reult = (5 < $x < 10);
Ini harus dipecah menjadi dua perbandingan, masing-masing melawan $x
.
Ini sebenarnya lebih banyak kasus yang di-blacklist ekspresi (karena setara operator associativity). It's sintaksis yang berlaku di beberapa C-gaya bahasa, tapi PHP tidak't menafsirkannya seperti yang diharapkan dibandingkan rantai baik.
>
<
Lebih besar dari >
atau kurang dari <
operator don't memiliki kebiasaan T_XXX
tokenizer nama. Dan sementara mereka dapat salah seperti mereka orang lain, anda lebih sering melihat parser mengeluh tentang mereka untuk salah kutip string dan tumbuk HTML:
⇓ cetak "<a href='z">Halo"; ↑
Jumlah ini string "<a href='z"
dibandingkan >
untuk konstanta literal Halo
dan kemudian yang lain <
perbandingan. Atau yang's setidaknya bagaimana PHP melihatnya. Sebenarnya penyebab dan kesalahan sintaks adalah prematur string "
penghentian.
It's juga tidak mungkin untuk sarang PHP start kategori:
<?php echo <?php my_func(); ?> ↑
Lihat juga:
Jika anda mencoba untuk menggunakan null penggabungan operator ??
di versi PHP PHP sebelum 7 anda akan mendapatkan kesalahan ini.
<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP
Kesalahan yang serupa dapat terjadi karena nullable jenis, seperti dalam:
function add(?int $sum): ?int {
Yang lagi-lagi menunjukkan usang versi PHP yang digunakan (baik CLI versi php -v
atau webserver terikat satu phpinfo();
).
Token T_LNUMBER
mengacu pada "lama" / nomor.
Dalam PHP, dan sebagian besar bahasa pemrograman yang lain, variabel tidak dapat diawali dengan angka. Karakter pertama harus huruf atau garis bawah.
$1 // Buruk $_1 // yang Baik
preg_replace
-penampung "$1"
di PHP konteks:preg_replace("/#(\w+)/e", strtopupper($1) )
Di mana callback harus telah dikutip. (Sekarang /e
regex bendera telah usang. Tapi itu's kadang-kadang masih disalahgunakan di preg_replace_callback
fungsi.)
↓ $json->0->nilai
Sementara tokenizer/parser tidak memungkinkan literal $1
sebagai nama variabel, satu bisa gunakan ${1}
atau ${"1"}
. Yang merupakan sintaksis solusi untuk non-standar pengenal. (Itu's terbaik untuk menganggapnya sebagai sebuah lingkup lokal lookup. Tapi umumnya: lebih suka polos array untuk kasus seperti ini!)
Menggelikan, tapi sangat tidak dianjurkan, PHPs parser memungkinkan Unicode-pengenal; seperti bahwa $➊
akan berlaku. (Tidak seperti literal 1
).
Tak terduga lama juga dapat terjadi untuk array declarations - saat hilang ,
koma:
$xy = array(1 2 3);
Atau juga panggilan fungsi dan deklarasi, dan konstruk lainnya:
func(1, 2 3);
fungsi xy($z 2);
for ($i=2 3<$z)
Jadi biasanya ada's salah satu ;
atau ,
hilang untuk memisahkan daftar atau ekspresi.
Dan lagi, salah kutip string adalah sumber sering nyasar nomor:
echo "
Kasus seperti ini harus ditangani lebih atau kurang seperti Unexpected T_STRING kesalahan.
Tidak fungsi, kelas, atau namespaces dapat diberi nama dimulai dengan nomor kedua:
↓ fungsi 123shop() {
Cukup banyak yang sama seperti untuk nama variabel.
Hal ini dapat disebabkan oleh memiliki karakter yang tidak valid dalam variabel nama. Variabel nama harus ikuti aturan ini:
nama Variabel mengikuti aturan yang sama seperti yang lain label di PHP. Yang valid nama variabel dimulai dengan huruf atau garis bawah, diikuti oleh sejumlah huruf, angka, atau garis bawah. Sebagai ekspresi reguler, akan dinyatakan demikian: '[a-zA-Z\x7f-\xff][a-zA-Z0-9\x7f-\xff]*'
lanjutkan
adalah pernyataan (seperti untuk, atau jika) dan harus muncul mandiri. Hal ini tidak dapat digunakan sebagai bagian dari sebuah ekspresi. Sebagian karena terus doesn't mengembalikan nilai, tetapi dalam sebuah ekspresi setiap sub-ekspresi harus menghasilkan beberapa nilai sehingga secara keseluruhan ekspresi yang menghasilkan sebuah nilai. Yang's perbedaan antara pernyataan dan ekspresi.
Yang berarti lanjutkan
tidak dapat digunakan dalam ternary pernyataan atau pernyataan apapun yang membutuhkan nilai kembali.
Sama berlaku untuk break;
tentu saja. It's juga tidak dapat digunakan dalam ekspresi konteks, tapi yang ketat pernyataan (pada tingkat yang sama sebagai foreach
atau jika
block).
Sekarang ini mungkin lebih mengejutkan untuk kembali
, tapi yang's juga hanya blok-tingkat pernyataan. Itu tidak mengembalikan nilai (atau NULL) lebih tinggi lingkup/fungsi, tetapi tidak mengevaluasi sebagai ekspresi itu sendiri. → Artinya: ada's tidak ada gunanya melakukan kembali(return(false);;
Sintaks menggunakan usus besar - jika tidak ada usus besar kesalahan di atas akan terjadi.
<?php while($query->fetch()): ?>
....
<?php endwhile; ?>
Alternatif untuk sintaks ini menggunakan kurung kurawal:
<?php while($query->fetch()) { ?>
....
<?php } ?>