PHP parse/kesalahan sintaks; dan bagaimana menyelesaikannya?
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.
Apa kesalahan sintaks?
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.
Yang paling penting tips
Ada beberapa tindakan pencegahan dasar anda selalu dapat mengambil:
Bagaimana menafsirkan parser error
Khas sintaks pesan kesalahan yang berbunyi:
;
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 bersarangjika
kondisi.Partisi panjang blok kode benar-benar membantu untuk menemukan asal-usul kesalahan sintaks.
? :
kondisi operator dapat kode kompak dan berguna memang. Tapi itu doesn't pertolongan yang mudah dibaca dalam semua kasus. Sukai polosjika
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.Itu bukan't tentu sama. Khususnya ketika bekerja dengan framework, anda akan mereka cocok.
White screen of death
Jika website anda hanya kosong, maka biasanya kesalahan sintaks adalah penyebabnya. Mengaktifkan tampilan mereka dengan:
error_reporting = E_ALL
display_errors = 1
Diphp.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, katakanlahtest.php
:Kemudian memohon gagal kode dengan mengakses wrapper script. Hal ini juga membantu untuk mengaktifkan PHP's
error_log
dan melihat ke anda webserver'skesalahan.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.
Menggunakan sintaks memeriksa IDE berarti:
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):
Unexpected
[
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 mendukungarray()
.Fungsi Array hasil dereferencing juga tidak tersedia untuk versi PHP yang lebih tua:
[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 sintaksJika 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'];
Tak terduga
]
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.Unexpected T_VARIABLE
Sebuah "tak terduga
T_VARIABLE
" berarti bahwa ada's literal$variable
nama, yang doesn't masuk ke dalam arus ekspresi/pernyataan struktur.Hilang koma
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
rangkaian String
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.
Hilang ekspresi operator
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.
Daftar
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
atauglobal
pernyataan, atau bila kurang;
koma diuntuk
loop.Kelas deklarasi
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.Variabel setelah pengidentifikasi
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.Hilang parens setelah konstruksi bahasa
Terburu-buru mengetik dapat menyebabkan untuk dilupakan pembukaan kurung untuk
jika
danfor
danforeach
pernyataan:⇓ foreach $array as $key) {
Solusi: tambahkan hilang pembukaan
(
antara pernyataan dan variabel.yang Lain tidak mengharapkan kondisi
⇓ lain ($var >= 0)
Solusi: Hapus kondisi dari
yang lain
atau gunakanelseif
.Perlu kurung untuk penutupan
⇓ fungsi() menggunakan $var {}
Solusi: Menambahkan tanda kurung di sekitar
$var
.tak Terlihat spasi
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.
Lihat juga
Tak terduga T_CONSTANT_ENCAPSED_STRING
tak Terduga T_ENCAPSED_AND_WHITESPACE
Berat nama
T_CONSTANT_ENCAPSED_STRING
danT_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.Salah variabel interpolasi
Dan muncul paling sering untuk salah variabel PHP interpolasi: ⇓ ⇓ echo "di sinilah $salah['array'] akses"; Mengutip array kunci yang harus di PHP konteks. Tapi di double quoted string (atau HEREDOCs) ini adalah sebuah kesalahan. Parser mengeluh tentang terkandung tunggal dikutip `'string'`, karena biasanya mengharapkan literal pengenal / kunci di sana. Lebih tepatnya itu's yang valid untuk menggunakan PHP2-gaya [sintaks sederhana dalam tanda kutip ganda](http://www.php.net/language.types.string#language.types.string.parsing) untuk array referensi: echo "Ini adalah hanya $valid[di sini] ..."; Bersarang array atau lebih objek referensi namun memerlukan [kompleks keriting string expression](http://www.php.net/language.types.string#language.types.string.parsing#complex+curly+syntax) sintaks: echo "Gunakan {$array['as_usual']} dengan keriting sintaks."; Jika tidak yakin, hal ini umumnya lebih aman untuk digunakan. It's bahkan sering dianggap lebih mudah dibaca. Dan lebih baik IDEs benar-benar menggunakan berbeda pewarnaan sintaks untuk itu.Hilang rangkaian
Jika string berikut ekspresi, tetapi tidak memiliki rangkaian atau operator lain, kemudian anda'll see PHP mengeluh tentang string literal: ⇓ cetak "Hello " . DUNIA " !"; Sementara itu's jelas untuk anda dan saya, PHP hanya dapat't *kira* bahwa string dimaksudkan untuk ditambahkan di sana.Membingungkan string quote kandang
Sintaks yang sama terjadi kesalahan ketika [pembaur string delimiters](https://stackoverflow.com/questions/13565768/php-syntax-error-unexpected-t-constant-encapsed-string). String dimulai dengan single `'` atau dua `"` quote juga berakhir dengan hal yang sama. ⇓ cetak "klik di sini"; ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟ Contoh yang dimulai dengan tanda kutip ganda. Tapi tanda kutip ganda juga ditakdirkan untuk atribut HTML. Yang dimaksud operator konkatenasi dalam namun menjadi ditafsirkan sebagai bagian dari kedua string dalam tanda kutip tunggal. > Tip****: Mengatur editor/IDE untuk menggunakan sedikit berbeda pewarnaan untuk single dan double quoted string. (Hal ini juga membantu dengan logika aplikasi untuk sukai misalnya double quoted string untuk teks output, dan single quoted string hanya untuk konstan seperti nilai-nilai.) Ini adalah contoh yang baik di mana anda seharusnya't keluar dari tanda kutip ganda di tempat pertama. Bukan hanya menggunakan [tepat `\"` escapes](https://stackoverflow.com/questions/10674121/php-parse-error-syntax-error-unexpected-t-constant-encapsed-string-expecting) untuk atribut HTML´ kutipan: cetak "klik di sini"; Sementara ini juga dapat menyebabkan sintaks kebingungan, semua baik Ide/editor lagi membantu dengan mewarnai lolos kutipan yang berbeda.Hilang pembukaan penawaran
Ekuivalen adalah [lupa membuka `"`/`'` quotes](https://stackoverflow.com/questions/17379114/how-to-fix-unexpected-t-constant-encapsed-string-syntax-error) resep untuk parser error: ⇓ make_url(login', 'open'); Di sini`', '` akan menjadi sebuah string literal setelah bareword, ketika jelas `login` itu dimaksudkan untuk menjadi sebuah parameter string.Array daftar
Jika anda melewatkan `,` koma dalam array pembuatan blok, parser akan melihat dua berturut-turut string: array( ⇓ "kunci" => "nilai" "next" => "....", ); Perhatikan bahwa baris terakhir selalu dapat mengandung tambahan koma, tapi pemandangan salah satu di antara dimaafkan. Yang sulit untuk menemukan tanpa sintaks.Fungsi daftar parameter
Hal yang sama [untuk fungsi calls](https://stackoverflow.com/questions/9352932/syntax-error-unexpected-t-constant-encapsed-string): ⇓ myfunc(123, "text", "dan", "lebih")Pelarian string
Variasi yang umum adalah cukup hanya lupa string terminator: ⇓ mysql_evil("SELECT * FROM barang); cetak ",'ok',"; ⇑ Berikut PHP mengeluh tentang dua string literal langsung mengikuti satu sama lain. Tapi penyebab sebenarnya adalah tertutup sebelumnya string saja. **Lihat juga**Unexpected T_STRING
T_STRING
adalah sedikit keliru. Itu tidak merujuk ke dikutip"string"
. Itu berarti mentah identifier yang dihadapi. Hal ini dapat berkisar daritelanjang
kata-kata untuk sisaKONSTAN
atau nama-nama fungsi, lupa dikutp string, atau teks biasa.salah kutip string
Ini kesalahan sintaks adalah yang paling umum untuk salah kutip nilai string namun. Apapun yang tidak lolos dan nyasar `"` atau `'` quote akan membentuk ekspresi tidak valid: ⇓ ⇓ echo "klik di sini"; Sintaks akan membuat kesalahan seperti itu super jelas. It's penting untuk ingat untuk menggunakan garis miring terbalik untuk melarikan diri `\"` tanda kutip ganda, atau `\'` tanda kutip tunggal - tergantung pada yang digunakan sebagai [string kandang][1]."
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.tidak Tertutup string
Jika anda melewatkan penutupan `"`][3] kemudian kesalahan sintaks biasanya terwujud nanti. Sebuah string tidak terselesaikan akan sering mengkonsumsi sedikit kode sampai berikutnya ditujukan nilai string: ⇓ echo "text", $a_variable, "dan beberapa pelarian string ; sukses("selesai"); ⇯ It's tidak hanya literal `T_STRING yang parser mungkin protes kemudian. Lain sering variasi adalah sebuah [`tak Terduga '>'`](https://stackoverflow.com/questions/6507796/troubleshooting-parse-error-unexpected-error) untuk dikutp literal HTML.Non-pemrograman string quotes
Jika anda *copy dan paste* kode dari sebuah blog atau website, anda kadang-kadang berakhir dengan kode yang tidak valid. [Tipografi kutipan aren't][4] apa yang PHP mengharapkan: $teks = 'Sesuatu..' + "ini ain't quotes"; Tipografi/smart kutipan simbol Unicode. PHP memperlakukan mereka sebagai bagian dari berdampingan teks alfanumerik. Misalnya `"ini` diartikan sebagai konstan pengenal. Tapi setiap teks berikut literal ini kemudian dilihat sebagai bareword/T_STRING oleh parser.hilang koma; lagi
Jika anda memiliki aplikasi yang tidak terselesaikan ekspresi di garis sebelumnya, maka setiap pernyataan berikut atau bahasa yang membangun akan dilihat sebagai baku identifier: ⇓ func1() function2(); PHP hanya dapat't know jika anda dimaksudkan untuk menjalankan dua fungsi lain, atau jika anda dimaksudkan untuk memperbanyak hasil mereka, menambahkannya, membandingkan mereka, atau hanya menjalankan satu `||` atau yang lain.Short open tag dan
Ini agak jarang. Tapi jika short_open_tags diaktifkan, maka anda dapat't begin PHP script [dengan deklarasi XML][5]: ⇓ <?xml version="1.0"?> PHP akan melihat `<?` dan merebut kembali itu untuk dirinya sendiri. Itu tidak't memahami apa yang nyasar `xml` itu dimaksudkan untuk. It'll mendapatkan diartikan sebagai konstan. Tapi `versi` akan terlihat seperti yang lain literal/konstan. Dan sejak parser dapat't membuat rasa dari dua berikutnya literal/nilai-nilai tanpa ekspresi operator di antara, yang'll menjadi parser kegagalan.<?xml
header di script PHPtak Terlihat karakter Unicode
Yang paling mengerikan penyebab kesalahan sintaks adalah simbol Unicode, seperti [non-breaking space][6]. PHP memungkinkan karakter Unicode sebagai identifier nama. Jika anda mendapatkan T_STRING parser keluhan untuk sepenuhnya curiga kode seperti: <?php cetak 123; Anda perlu untuk keluar editor teks lainnya. Atau hexeditor bahkan. Apa yang tampak seperti biasa spasi dan baris baru di sini, mungkin tak terlihat mengandung konstanta. Berbasis Java Ide yang kadang-kadang tidak menyadari sebuah BOM UTF-8 hancur dalam, nol-lebar spasi, paragraf pemisah, dll. Cobalah untuk reedit semuanya, hapus spasi dan menambah ruang biasa kembali. Anda dapat mempersempit dengan dengan menambahkan berlebihan `;` pernyataan pemisah di setiap lini mulai: <?php ;cetak 123; Ekstra `;` koma di sini akan mengkonversi sebelumnya tak terlihat karakter ke undefined constant referensi (ekspresi sebagai pernyataan). Yang kembali membuat PHP memproduksi bermanfaat pemberitahuan.` $ ` tanda hilang di depan nama variabel
[Variabel dalam PHP][7] yang diwakili oleh tanda dolar diikuti dengan nama variabel. Tanda dolar (`$`) adalah [sigil][8] bahwa tanda pengenal sebagai nama variabel. Tanpa ini sigil, identifier bisa menjadi [bahasa kata kunci][9] atau [konstan][10]. Ini adalah kesalahan umum ketika kode PHP adalah ["diterjemahkan" dari kode yang ditulis dalam bahasa lain][11] (C, Java, JavaScript, dll.). Dalam kasus tersebut, deklarasi variabel type (ketika kode asli yang ditulis dalam bahasa yang menggunakan diketik variabel) bisa juga menyelinap keluar dan menghasilkan kesalahan ini.Lolos tanda Kutip
Jika anda menggunakan `\` dalam string, itu memiliki arti khusus. Ini disebut "[Karakter Escape][12]" 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\\"`.Tak terduga
(
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.deklarasi Fungsi parameter
Jarang terjadinya kesalahan ini adalah [mencoba untuk menggunakan ekspresi seperti fungsi default parameter][1]. Ini adalah tidak didukung, bahkan di PHP7: fungsi header_fallback($nilai, $expires = waktu() + 90000) { Parameter dalam deklarasi fungsi hanya dapat nilai literal atau ekspresi konstan. Tidak seperti fungsi doa, di mana anda dapat dengan bebas menggunakan `apapun(1+sesuatu()*2)` dll.Kelas properti default
Hal yang sama untuk [anggota kelas declarations](https://stackoverflow.com/questions/11313051/parse-error-syntax-error-unexpected-expecting-or-in), di mana hanya literal/konstan nilai-nilai yang diizinkan, bukan ekspresi: kelas xyz { ⇓ var $default = get_config("xyz_default"); Menempatkan hal-hal seperti itu dalam konstruktor. Lihat juga [Why don't PHP atribut memungkinkan fungsi?](https://stackoverflow.com/questions/3960323/why-dont-php-attributes-allow-functions) Sekali lagi perhatikan bahwa PHP 7 hanya memungkinkan `var $xy = 1 + 2 +3;` konstan ekspresi di sana.JavaScript sintaks dalam PHP
Menggunakan JavaScript atau jQuery sintaks][2] tidak't bekerja di PHP untuk alasan yang jelas: <?php ⇓ cetak $(document).teks(); Ketika ini terjadi, itu biasanya menunjukkan tidak terselesaikan sebelumnya string; dan literal `<script>` bagian yang bocor ke kode PHP konteks.isset(()), kosong, kunci, berikutnya, saat ini
Kedua `isset()` dan `kosong()` adalah bahasa built-in, bukan fungsi. Mereka [perlu untuk mengakses variabel ini diatas][3]. Jika anda tidak sengaja menambahkan sepasang kurung terlalu banyak, maka anda'a membuat ekspresi namun: ⇓ if (isset(($_GET["id"]))) { Hal yang sama berlaku untuk setiap bahasa construct yang membutuhkan implisit nama variabel akses. Ini built-in merupakan bagian dari tata bahasa, karena itu don't izin dekoratif tambahan tanda kurung. User-level fungsi yang memerlukan referensi variabel -tapi mendapatkan ekspresi hasil berlalu - menyebabkan kesalahan runtime sebaliknya.## Tak terduga `)`
tidak Ada parameter fungsi
Anda tidak dapat memiliki nyasar [koma terakhir dalam fungsi panggilan][4]. PHP mengharapkan nilai yang ada dan thusly mengeluh tentang penutupan dini `)` tanda kurung. ⇓ callfunc(1, 2, ); Tanda koma hanya diperbolehkan di `array()` atau `daftar()` konstruksi.belum Selesai ekspresi
Jika anda lupa sesuatu dalam sebuah ekspresi aritmatika, maka parser menyerah. Karena bagaimana mungkin menafsirkan bahwa: ⇓ $var = 2 * (1 + ); Dan jika anda lupa menutup `)` bahkan, kemudian anda'd mendapatkan keluhan tentang yang tak terduga titik koma sebagai gantinya.Foreach sebagai
Untuk [dilupakan variabel `$` prefiks dalam pernyataan kontrol](https://stackoverflow.com/questions/11624495/how-to-fix-syntax-error-in-php-unexpected) anda akan melihat: ↓ ⇓ foreach ($array as salah) { PHP di sini kadang-kadang memberitahu anda itu diharapkan `::` sebagai gantinya. Karena kelas::$variabel bisa puas yang diharapkan $variabel ekspresi..konstan
## Tak terduga `{` Kurung kurawal `{` dan `}` menyertakan kode blok. Dan kesalahan sintaks tentang mereka biasanya menunjukkan beberapa incorrec bersarang.
tak Tertandingi subexpressions di
Paling sering [tidak seimbang `(` dan `)`](https://stackoverflow.com/questions/11473504/php-syntax-error-on-line-9) adalah penyebab jika parser mengeluh tentang pembukaan keriting `{` muncul terlalu dini. Contoh sederhana: ⇓ if (($x == $y) && (2 == true) { Menghitung parens atau gunakan IDE yang membantu dengan itu. Juga don't menulis kode tanpa spasi. Pembacaan dakwaan.jika
{ dan } dalam ekspresi konteks
Anda dapat't menggunakan kurung kurawal dalam ekspresi. Jika anda bingung kurung dan curlys, itu tidak't sesuai dengan bahasa grammer: ⇓ $var = 5 * {7 + $x}; Ada beberapa pengecualian untuk identifier konstruksi, seperti lokal lingkup variabel `${referensi}`.Variabel variabel atau keriting var ekspresi
Ini cukup langka. Tapi anda mungkin juga mendapatkan `{` dan `}` parser keluhan untuk variabel kompleks ekspresi: ⇓ cetak "Hello {$dunia[2{]} !"; Meskipun ada's kemungkinan yang lebih tinggi untuk an unexpected `}` dalam konteks tersebut.## Unexpected `}` Ketika mendapatkan sebuah "unexpected `}`" kesalahan, anda've sebagian besar tertutup blok kode terlalu dini.
pernyataan Terakhir dalam blok kode
Hal ini dapat terjadi karena setiap tidak terselesaikan ekspresi. Dan jika baris terakhir dalam fungsi/blok kode tidak memiliki akhiran `;` titik koma: fungsi fasilitas() { doStuff() } ⇧ Di sini parser dapat't memberitahu jika anda mungkin masih ingin menambahkan `+ 25;` ke hasil fungsi atau sesuatu yang lain.tidak Valid blok bersarang / Lupa
Anda'll kadang-kadang melihat ini parser error ketika sebuah blok kode adalah `}` menutup terlalu awal, atau anda lupa pembukaan `{` bahkan: fungsi doStuff() { jika (benar) ⇦ cetak "ya"; } } ⇧ Dalam cuplikan di atas `jika` tidak't memiliki pembukaan `{` kurung kurawal. Dengan demikian penutupan `}` salah satu di bawah ini menjadi berlebihan. Dan oleh karena itu selanjutnya penutupan `}`, yang dimaksudkan untuk fungsi, tidak associatable asli pembukaan `{` kurung kurawal. Kesalahan tersebut bahkan lebih sulit untuk menemukan yang tepat tanpa kode lekukan. Menggunakan IDE dan pencocokan braket.{
## Tak terduga `{`, expecting `(` Konstruksi bahasa yang memerlukan kondisi/pernyataan header **dan** blok kode akan memicu kesalahan ini.
daftar Parameter
Misalnya [misdeclared fungsi tanpa parameter list][5] tidak diizinkan: ⇓ fungsi apapun { }pernyataan Kontrol kondisi
Dan anda dapat't juga memiliki [`jika` tanpa kondisi][6]. ⇓ jika { } Yang doesn't masuk akal, jelas. Hal yang sama juga untuk tersangka, `untuk`/`foreach`, `sementara`/`melakukan`, dll. > Jika anda've punya kesalahan ini, anda pasti harus melihat beberapa manual contoh-contoh.Tak terduga T_IF
Bersyarat kontrol blok `jika`, `elseif` dan `lain` mengikuti struktur yang sederhana. Ketika anda menghadapi kesalahan sintaks, it's paling mungkin hanya valid blok bersarang → dengan hilang `{` kurung kurawal `}` - atau salah satu terlalu banyak. [![enter image description here][1]][1] 1.Tak terduga T_ELSEIF
Tak terduga T_ELSE
Tak terduga T_ENDIF
Hilang
Serasi kode kawat gigi umum kurang baik-diformat kode seperti: if((!($opt["uniQartz5.8"]!=$ini->check58)) atau (empty($_POST['poree']))) {if ($true) {echo"halp";} elseif((!$z)atau%b){excSmthng(Palsu,5.8)}elseif (False){{
atau}
karena salah lekukanJika 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 keduajika
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 terbacajika
-ekspresi. 2.JIKA
tidak dapat digunakan dalam ekspresijika
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 beberapajika 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.Kontrol blok don't kembali "hasil"
Sekarang ini adalah kurang umum, tetapi beberapa coders bahkan mencoba untuk mengobati `jika` seolah-olah itu bisa kembali *hasil*: $var = if ($x == $y) { "benar" }; Yang secara struktural identik dengan menggunakan `jika` dalam rangkaian string / ekspresi. * Tapi [struktur kontrol](http://php.net/language.control-structures) (if / foreach / sementara) don't memiliki *"hasil"*. * Literal string "benar" juga akan hanya menjadi batal pernyataan.Anda'll harus menggunakan sebuah tugas *di blok kode*: if ($x == $y) { $var = "benar"; } Selain itu, resort ke `?:` terner perbandingan.
Jika dalam Jika
Anda tidak dapat sarang `jika`](https://stackoverflow.com/questions/13316003/php-parse-error-syntax-error-unexpected-t-if) dalam kondisi baik: ⇓ if ($x == true dan (jika $y != false)) { ... } Yang jelas berlebihan, karena `dan` (atau `atau`) sudah memungkinkan chaining perbandingan. 3.Lupa
Sekali lagi: masing-Masing blok kontrol kebutuhan akan sebuah pernyataan. Jika sebelumnya kode bagian isn't diakhiri oleh tanda titik koma, maka yang's dijamin kesalahan sintaks: ⇓ $var = 1 + 2 + 3 if (true) { ... } Btw, baris terakhir dalam `{...}` blok kode membutuhkan tanda titik koma juga. 4.;
titik komatitik Koma terlalu dini
Sekarang ini's mungkin salah untuk menyalahkan tertentu coding style, sebagai perangkap ini terlalu mudah untuk mengabaikan: ⇓ if ($x == 5); { $y = 7; } lain ← { $x = -1; } Yang terjadi lebih sering dari yang anda bayangkan. * Ketika anda [mengakhiri `jika ()` ekspresi `;`](https://stackoverflow.com/questions/12856700/syntax-error-unexpected-t-else) itu akan mengeksekusi kekosongan pernyataan. The `;` menjadi kosong `{}` sendiri! * The `{...}` block dengan demikian terlepas dari `jika`, dan akan selalu berjalan. * Jadi `else` tidak lagi memiliki sebuah hubungan yang terbuka `jika` membangun, yang adalah mengapa hal ini akan menyebabkan tak Terduga T_ELSE kesalahan sintaks.Yang juga menjelaskan demikian juga variasi halus ini kesalahan sintaks: if ($x) { x_is_true(); }; else { something_else(); }; Di mana `;` setelah blok kode `{...}` mengakhiri seluruh `jika` membangun, memutus `yang lain` cabang sintaksis. 5.
Tidak menggunakan code blocks
It's sintaksis diperbolehkan untuk menghilangkan kurung kurawal `{`...`}` untuk blok kode di `jika`/`elseif`/`yang lain` cabang-cabang. Yang sedih adalah sintaks gaya yang sangat umum untuk paham coders. (Di bawah asumsi yang salah ini adalah lebih cepat untuk mengetik atau membaca). Namun yang's sangat mungkin untuk perjalanan sintaks. Cepat atau lambat tambahan pernyataan akan menemukan jalan mereka ke dalam if/else cabang: jika (benar) $x = 5; elseif (palsu) $x = 6; $y = 7; ← lain $z = 0; Tapi untuk benar-benar menggunakan kode blok, anda ***memiliki*** untuk menulis `{`...`}` mereka seperti itu! > Bahkan dibumbui programmer menghindari hal ini braceless sintaks, atau setidaknya memahami hal itu sebagai suatu yang luar biasa pengecualian untuk aturan. 6.Lain / Elseif di salah order
Satu hal untuk mengingatkan diri sendiri adalah [bersyarat order](http://php.net/control-structures.elseif), tentu saja. if ($a) { ... } else { ... } elseif ($b) { ... } ↑ Anda dapat memiliki banyak `elseif ini seperti yang anda inginkan, tapi [`yang lain` telah pergi terakhir](https://stackoverflow.com/questions/16619075/parse-error-syntax-error-unexpected-t-elseif). Yang's hanya cara itu. 7.Kelas deklarasi
Sebagai [tersebut di atas](https://stackoverflow.com/a/18092318/345031), anda dapat't memiliki kontrol pernyataan dalam sebuah deklarasi kelas: kelas xyz { if (true) { fungsi ($var) {} } Anda juga [lupa function](https://stackoverflow.com/questions/5440036/php-parse-error-syntax-error-unexpected-t-if-expecting-t-function) definisi, atau menutup satu `}` terlalu dini dalam kasus tersebut. 8.tak Terduga T_ELSEIF / T_ELSE
Saat pencampuran PHP dan HTML, penutupan `}` untuk `jika/elseif` harus sama PHP block `<?php ?>` berikutnya `elseif/lain`. Ini akan menghasilkan error sebagai penutup `}` untuk `jika` 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 salah lekukan - mungkin sering didasarkan pada salah coding niat. Anda tidak mash pernyataan lain inbetween
jika
danelseif
/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
danlain
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
danyang lain
. Theforeach
leksikal lingkup berakhir di}
, jadi ada's tidak ada gunanya untukjika
struktur untuk melanjutkan. 9.T_ENDIF
Jika tak terduga T_ENDIF adalah mengeluh tentang, kau're menggunakan sintaks alternatif gayajika:
⋯elseif:
⋯yang lain:
⋯endif;
. Yang anda benar-benar harus berpikir dua kali tentang.:
usus untuk;
semicolon. (Tertutup di "titik Koma terlalu dini")endif;
tidak sesuaijika:
.} endif;
adalah dua kali lipatjika
-terminator.Sementara "unexpected $end" biasanya harga untuk dilupakan penutupan
}
kurung kurawal.Tugas vs. perbandingan
Jadi, ini bukan kesalahan sintaks, tapi layak disebut dalam konteks ini: ⇓ if ($x = true) { } else { do_false(); } Yang's tidak [`==`/`===` sebagai perbandingan, tapi sebuah `=` tugas](https://stackoverflow.com/questions/2063480/the-3-different-equals). Ini lebih halus, dan akan dengan mudah menyebabkan beberapa pengguna tak berdaya untuk mengedit seluruh kondisi blok. Watch out untuk tugas-tugas yang tidak diinginkan pertama - whenver anda mengalami kesalahan logika / misbeheviour.Unexpected $end
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.)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:
![Pencocokan braket di sebuah IDE][1]
Tidak terselesaikan ekspresi
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.Menjorok HEREDOC spidol
Lain kejadian yang umum muncul dengan [HEREDOC atau NOWDOC][2] string. Mengakhiri penanda pergi diabaikan dengan memimpin spasi, tab, dll.:
Tak terduga T_IF
Tak terduga T_FOREACH
Tak terduga T_FOR
Tak terduga T_WHILE
Tak terduga T_DO
Unexpected T_ECHO
Kontrol konstruksi seperti
jika
,foreach
,untuk
,sementara
,daftar
,global
,kembali
,apakah
,print
,echo
hanya dapat digunakan sebagai laporan. Mereka biasanya berada pada baris sendiri.Koma; kau di mana?
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.
Kelas deklarasi
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.Pernyataan dalam ekspresi konteks
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 rendahdaftar
.⇓ echo 123, echo 567, "hah?";
Sedangkan
cetak()
adalah bahasa builtin yang dapat digunakan dalam ekspresi konteks. (Tapi jarang masuk akal.)kata kunci yang Dicadangkan sebagai pengidentifikasi
Anda juga dapat't menggunakan
do
ataujika
dan bahasa lainnya konstruksi untuk fungsi yang ditetapkan pengguna atau nama kelas. (Mungkin di PHP7. Tetapi bahkan kemudian itu tidak't dianjurkan.)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
>
Operator perbandingan seperti
==
,>=
,===
,!=
,<>
,!==
dan<=
atau<
dan>
sebagian besar harus digunakan hanya dalam ungkapan-ungkapan, sepertijika
ekspresi. Jika parser mengeluh tentang mereka, maka hal itu sering berarti salah atau pengupas serasi(
)
parens di sekitar mereka.Parens pengelompokan
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.isset() tumbuk dengan membandingkan
Umum pendatang baru pitfal adalah mencoba untuk menggabungkan
isset()
ataukosong()
dengan perbandingan:⇓ if (empty($_POST["var"] == 1)) {
Atau bahkan:
⇓ if (isset($variabel !== "nilai")) {
Ini doesn't masuk akal untuk PHP, karena
isset
dankosong
adalah konstruksi bahasa yang hanya menerima nama-nama variabel. Itu doesn't masuk akal untuk membandingkan hasil yang baik, karena output hanya/sudah boolean.Membingungkan
>=
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
apa-Apa untuk membandingkan terhadap
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
Perbandingan rantai
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.
tak Terduga
>
tak Terduga
<
Lebih besar dari
>
atau kurang dari<
operator don't memiliki kebiasaanT_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 literalHalo
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:
Tak terduga '?'
Jika anda mencoba untuk menggunakan null penggabungan operator
??
di versi PHP PHP sebelum 7 anda akan mendapatkan kesalahan ini.Tak terduga '?', mengharapkan variabel
Kesalahan yang serupa dapat terjadi karena nullable jenis, seperti dalam:
Yang lagi-lagi menunjukkan usang versi PHP yang digunakan (baik CLI versi
php -v
atau webserver terikat satuphpinfo();
).Tak terduga T_LNUMBER
Token
T_LNUMBER
mengacu pada "lama" / nomor.tidak Valid variabel nama
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 dipreg_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 literal1
).Liar array entri
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.salah kutip HTML
Dan lagi, salah kutip string adalah sumber sering nyasar nomor:
↓ ↓
echo "
Kasus seperti ini harus ditangani lebih atau kurang seperti Unexpected T_STRING kesalahan.
pengenal Lainnya
Tidak fungsi, kelas, atau namespaces dapat diberi nama dimulai dengan nomor kedua:
↓ fungsi 123shop() {
Cukup banyak yang sama seperti untuk nama variabel.
Tak terduga '='
Hal ini dapat disebabkan oleh memiliki karakter yang tidak valid dalam variabel nama. Variabel nama harus ikuti aturan ini:
Tak terduga 'terus' (T_CONTINUE)
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.Tak terduga 'break' (T_BREAK)
Sama berlaku untuk
break;
tentu saja. It's juga tidak dapat digunakan dalam ekspresi konteks, tapi yang ketat pernyataan (pada tingkat yang sama sebagaiforeach
ataujika
block).Tak terduga 'kembali' (T_RETURN)
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 melakukankembali(return(false);;
Tak terduga 'endwhile' (T_ENDWHILE)
Sintaks menggunakan usus besar - jika tidak ada usus besar kesalahan di atas akan terjadi.
Alternatif untuk sintaks ini menggunakan kurung kurawal:
http://php.net/manual/en/control-structures.while.php
Pesan kesalahan yang mulai
Parse error: syntax error, unexpected ':'
dapat disebabkan oleh keliru menulis statis kelas referensiKelas::$Variabel
sebagaiKelas:$Variable
.