Semua orang mengalami kesalahan sintaksis. Bahkan programmer berpengalaman membuat kesalahan ketik. Bagi pendatang baru, itu hanya bagian dari proses pembelajaran. Namun, sering kali mudah untuk menafsirkan pesan kesalahan seperti:
Kesalahan PHP Parse: kesalahan sintaksis, '{' tak terduga di index.php di baris 20
Simbol yang tidak terduga tidak selalu menjadi pelakunya. Tetapi nomor barisnya memberikan gambaran kasar ke mana harus mulai mencari.
Selalu perhatikan konteks kode . Kesalahan sintaks sering menyembunyikan di disebutkan atau di baris kode sebelumnya . Bandingkan kode Anda dengan contoh sintaks dari manual.
Meskipun tidak setiap kasus cocok dengan yang lain. Namun ada beberapa langkah umum untuk menyelesaikan kesalahan sintaksis . Referensi ini merangkum perangkap umum:
T_VARIABLE
Tidak Terduga '$ varname' (T_VARIABLE) Tidak TerdugaT_CONSTANT_ENCAPSED_STRING
Tidak Terduga T_ENCAPSED_AND_WHITESPACELanjutkan tak terduga (T_CONTINUE) Lanjutkan
tak terduga (T_BREAK) Lanjutkan
tak terduga (T_RETURN)Karakter tak terduga dalam input: '
\
' (ASCII = 92) status = 1Tidak terduga
,
(koma)Tidak diekspektasikan
.
(titik)Tidak terduga
;
(titik koma)Tidak terduga
*
(tanda bintang)Tidak terduga
:
(titik dua)Tidak terduga
&
(referensi lewat waktu panggilan)
Referensi yang terkait erat:
- Apa artinya kesalahan ini dalam PHP? (kesalahan runtime)
- Apa arti simbol ini dalam PHP? (token bahasa)
- Mereka
“”
pintar‘’
tanda kutip berarti apa-apa untuk PHP
Dan:
- The PHP manual di php.net dan berbagai nya token bahasa
- Atau pengantar sintaks Wikipedia di PHP .
- Dan yang terakhir tentu saja tag-wiki php kami .
Sementara Stack Overflow juga menyambut coders pemula, sebagian besar ditargetkan pada pertanyaan pemrograman profesional.
- Menjawab kesalahan koding dan kesalahan ketik semua orang dianggap sebagian besar di luar topik.
- Jadi silakan luangkan waktu untuk mengikuti langkah-langkah dasar , sebelum memposting permintaan memperbaiki sintaksis.
- Jika Anda masih harus, tolong tunjukkan inisiatif pemecahan Anda sendiri, upaya perbaikan, dan proses pemikiran Anda tentang apa yang tampak atau mungkin salah.
Jika browser Anda menampilkan pesan kesalahan seperti "SyntaxError: illegal character", maka sebenarnya tidakphp-berkaitan, tapi a javascript- kesalahan sintaksis .
Kesalahan sintaks yang muncul pada kode vendor: Akhirnya, pertimbangkan bahwa jika kesalahan sintaks tidak dimunculkan dengan mengedit basis kode Anda, tetapi setelah paket atau instal paket vendor eksternal, itu mungkin karena ketidakcocokan versi PHP, jadi periksa persyaratan vendor terhadap platform Anda mendirikan.
sumber
T_IF / T_FOREACH / ...
blok. Meskipun saya ingin menyusun ringkasan yang lebih khusus untuk pertanyaan IF / ELSE / ELSEIF.Jawaban:
Apa kesalahan sintaksisnya?
PHP termasuk dalam bahasa pemrograman C-style dan imperative . Ini memiliki aturan tata bahasa yang kaku, yang tidak dapat dipulihkan dari saat menemukan simbol atau pengidentifikasi salah tempat. Itu tidak bisa menebak niat coding Anda.
Kiat paling penting
Ada beberapa tindakan pencegahan dasar yang selalu dapat Anda lakukan:
Gunakan lekukan kode yang tepat , atau mengadopsi gaya pengkodean yang tinggi. Keterbacaan mencegah penyimpangan.
Gunakan IDE atau editor untuk PHP dengan penyorotan sintaksis . Yang juga membantu menyeimbangkan kurung / kurung.
Baca referensi bahasa dan contoh dalam manual. Dua kali, untuk menjadi agak mahir.
Bagaimana menafsirkan kesalahan parser
Pesan kesalahan sintaksis tipikal berbunyi:
Yang mencantumkan kemungkinan lokasi kesalahan sintaksis. Lihat nama file dan nomor baris yang disebutkan .
Seorang moniker seperti
T_STRING
menjelaskan simbol parser / tokenizer mana yang akhirnya tidak bisa diproses. Namun, ini tidak selalu menjadi penyebab kesalahan sintaksis.Penting juga untuk melihat baris kode sebelumnya . Seringkali kesalahan sintaks hanyalah kecelakaan yang terjadi sebelumnya. Nomor baris kesalahan hanya di mana parser meyakinkan menyerah untuk memproses semuanya.
Memecahkan kesalahan sintaks
Ada banyak pendekatan untuk mempersempit dan memperbaiki cegukan sintaksis.
Buka file sumber yang disebutkan. Lihatlah baris kode yang disebutkan .
Untuk string pelarian dan operator yang salah tempat, ini biasanya tempat Anda menemukan pelakunya.
Baca garis kiri ke kanan dan bayangkan apa yang dilakukan masing-masing simbol.
Lebih teratur, Anda perlu melihat garis sebelumnya juga.
Secara khusus,
;
titik koma yang hilang tidak ada pada akhir baris / pernyataan sebelumnya. (Setidaknya dari sudut pandang gaya.)Jika
{
blok kode}
salah ditutup atau disarangkan, Anda mungkin perlu menyelidiki lebih jauh kode sumber. Gunakan lekukan kode yang tepat untuk menyederhanakan itu.Lihatlah pewarnaan sintaks !
String dan variabel dan konstanta semua harus memiliki warna berbeda.
Operator
+-*/.
harus diwarnai juga berbeda. Jika tidak, mereka mungkin berada dalam konteks yang salah.Jika Anda melihat pewarnaan string memanjang terlalu jauh atau terlalu pendek, maka Anda telah menemukan penutupan
"
atau'
penanda string yang tidak terhindar atau hilang .Memiliki dua karakter tanda baca berwarna sama di samping satu sama lain juga dapat berarti masalah. Biasanya, operator tunggal jika tidak
++
,--
atau tanda kurung setelah operator. Dua string / pengidentifikasi yang secara langsung mengikuti satu sama lain tidak benar dalam sebagian besar konteks.Spasi adalah teman Anda . Ikuti gaya pengkodean apa pun .
Memecah garis panjang sementara.
Anda dapat dengan bebas menambahkan baris baru antara operator atau konstanta dan string. Parser kemudian akan mengkonkretkan nomor baris untuk kesalahan parsing. Alih-alih melihat kode yang sangat panjang, Anda dapat mengisolasi simbol sintaks yang hilang atau salah tempat.
Pisahkan
if
pernyataan kompleks menjadiif
kondisi berbeda atau bersarang .Alih-alih rumus matematika yang panjang atau rantai logika, gunakan variabel sementara untuk menyederhanakan kode. (Lebih mudah dibaca = lebih sedikit kesalahan.)
Tambahkan baris baru di antara:
Mempartisi blok kode yang panjang sangat membantu untuk menemukan asal kesalahan sintaks.
Komentari kode yang menyinggung.
Jika Anda tidak dapat mengisolasi sumber masalah, mulailah mengomentari (dan dengan demikian menghapus sementara) blok kode.
Segera setelah Anda menyingkirkan kesalahan penguraian, Anda telah menemukan sumber masalahnya. Lihat lebih dekat di sana.
Terkadang Anda ingin menghapus sementara blok fungsi / metode lengkap. (Dalam hal kurung kurawal yang tidak cocok dan kode indentasi salah.)
Ketika Anda tidak dapat menyelesaikan masalah sintaksis, cobalah untuk menulis ulang bagian komentar dari awal .
Sebagai pendatang baru, hindari beberapa konstruksi sintaks yang membingungkan.
? :
Operator kondisi ternary dapat memadatkan kode dan memang bermanfaat. Tetapi itu tidak membantu keterbacaan dalam semua kasus. Lebih sukaif
pernyataan polos saat tidak berversi.Sintaks alternatif PHP (
if:
/elseif:
/endif;
) adalah umum untuk template, tetapi bisa dibilang kurang mudah diikuti daripada blok{
kode normal}
.Kesalahan pendatang baru yang paling umum adalah:
Titik koma yang hilang
;
untuk mengakhiri pernyataan / baris.Kutipan string tidak cocok untuk
"
atau'
dan kutipan tidak terhapus di dalam.Operator yang terlupakan, khususnya untuk
.
penggabungan string .(
Tanda kurung tidak seimbang)
. Hitung di baris yang dilaporkan. Apakah jumlahnya sama?Jangan lupa bahwa menyelesaikan satu masalah sintaksis dapat mengungkap yang berikutnya.
Jika Anda membuat satu masalah hilang, tetapi ada beberapa kode lain di bawah ini, Anda sebagian besar berada di jalur yang benar.
Jika setelah mengedit kesalahan sintaksis yang baru muncul di baris yang sama, maka perubahan yang Anda coba mungkin gagal. (Meskipun tidak selalu.)
Kembalikan cadangan kode yang sebelumnya berfungsi, jika Anda tidak dapat memperbaikinya.
diff
versi rusak dan yang terakhir berfungsi. Yang mungkin mencerahkan seperti apa masalah sintaksisnya.Karakter Unicode nyasar yang tak terlihat : Dalam beberapa kasus, Anda perlu menggunakan hexeditor atau editor / penampil yang berbeda pada sumber Anda. Beberapa masalah tidak dapat ditemukan hanya dengan melihat kode Anda.
Coba
grep --color -P -n "\[\x80-\xFF\]" file.php
sebagai langkah pertama untuk menemukan simbol non-ASCII.Dalam BOM tertentu, spasi nol lebar, atau spasi tanpa putus, dan kutipan pintar secara teratur dapat menemukan jalan mereka ke kode sumber.
Perhatikan jenis linebreak mana yang disimpan dalam file.
PHP hanya menghormati \nbaris baru, bukan \rcarriage return.
Yang terkadang menjadi masalah bagi pengguna MacOS (bahkan pada OS X untuk editor yang salah konfigurasi).
Seringkali hanya muncul sebagai masalah ketika satu baris
//
atau#
komentar digunakan./*...*/
Komentar multiline jarang mengganggu pengurai ketika linebreak diabaikan.Jika kesalahan sintaks Anda tidak mengirimkan melalui web : Ini terjadi bahwa Anda memiliki kesalahan sintaks pada mesin Anda. Tetapi memposting file yang sama secara online tidak memperlihatkannya lagi. Yang hanya bisa berarti satu dari dua hal:
Anda melihat file yang salah!
Atau kode Anda berisi Unicode nyasar yang tidak terlihat (lihat di atas). Anda dapat dengan mudah mengetahuinya: Cukup salin kembali kode Anda dari formulir web ke editor teks Anda.
Periksa versi PHP Anda . Tidak semua konstruksi sintaks tersedia di setiap server.
php -v
untuk penerjemah baris perintah<?php phpinfo();
untuk yang dipanggil melalui server web.Itu belum tentu sama. Khususnya ketika bekerja dengan kerangka kerja, Anda akan menyesuaikannya.
Jangan gunakan kata kunci khusus PHP sebagai pengidentifikasi untuk fungsi / metode, kelas atau konstanta.
Trial-and-error adalah pilihan terakhir Anda.
Jika semuanya gagal, Anda selalu dapat google pesan kesalahan Anda. Simbol sintaksis tidak semudah dicari (Stack Overflow sendiri diindeks oleh SymbolHound ). Karenanya mungkin diperlukan beberapa halaman lagi sebelum Anda menemukan sesuatu yang relevan.
Panduan lebih lanjut:
Layar putih kematian
Jika situs web Anda kosong, biasanya kesalahan sintaks adalah penyebabnya. Aktifkan tampilan mereka dengan:
error_reporting = E_ALL
display_errors = 1
Di Anda
php.ini
secara umum, atau via.htaccess
untuk mod_php, atau bahkan.user.ini
dengan pengaturan FastCGI.Mengaktifkannya dalam skrip yang rusak sudah terlambat karena PHP bahkan tidak dapat mengartikan / menjalankan baris pertama. Solusi cepat adalah membuat skrip pembungkus, katakan
test.php
:Kemudian aktifkan kode gagal dengan mengakses skrip pembungkus ini.
Ini juga membantu untuk mengaktifkan PHP
error_log
dan melihat ke server weberror.log
Anda ketika skrip crash dengan respons HTTP 500.sumber
error_reporting(E_ALL | E_STRICT);
untuk versi PHP yang lebih lamaSaya pikir topik ini benar-benar overdiscussed / overcomplicated. Menggunakan IDE adalah cara untuk sepenuhnya menghindari kesalahan sintaks. Saya bahkan akan mengatakan bahwa bekerja tanpa IDE agak tidak profesional. Mengapa? Karena IDE modern memeriksa sintaks Anda setelah setiap karakter yang Anda ketikkan. Ketika Anda kode dan seluruh baris Anda berubah menjadi merah, dan pemberitahuan peringatan besar menunjukkan kepada Anda jenis yang tepat dan posisi yang tepat dari kesalahan sintaks, maka sama sekali tidak perlu mencari solusi lain.
Menggunakan IDE pemeriksaan-sintaks berarti:
Anda (secara efektif) tidak akan pernah mengalami kesalahan sintaks lagi, hanya karena Anda melihatnya tepat saat Anda mengetik. Serius.
IDE yang sangat baik dengan pemeriksaan sintaks (semuanya tersedia untuk Linux, Windows dan Mac):
sumber
Tidak terduga
[
Saat ini,
[
braket array yang tidak terduga biasanya terlihat pada versi PHP yang sudah usang. The sintaks array pendek tersedia sejak PHP > = 5.4 . Instalasi yang lebih lama hanya mendukungarray()
.Dereferencing hasil fungsi array juga tidak tersedia untuk versi PHP yang lebih lama:
Referensi - Apa artinya kesalahan ini dalam PHP? - "Kesalahan sintaksis, tidak terduga
\[
" menunjukkan solusi yang paling umum dan praktis.Padahal, Anda selalu lebih baik hanya meningkatkan instalasi PHP Anda. Untuk paket webhosting bersama, penelitian pertama jika eg
SetHandler php56-fcgi
dapat digunakan untuk mengaktifkan runtime yang lebih baru.Lihat juga:
BTW, ada juga preprosesor dan PHP 5.4 syntax down-converter jika Anda benar-benar menyukai versi PHP yang lebih lama + lebih lambat.
Penyebab lain untuk Tak Terduga
[
kesalahan sintaksis yang tidakJika ini bukan ketidakcocokan versi PHP, maka seringkali kesalahan kesalahan ketik atau pendatang baru:
Anda tidak dapat menggunakan deklarasi / ekspresi properti array di kelas , bahkan di PHP 7.
Membingungkan
[
dengan membuka kurung kurawal{
atau kurung(
adalah pengawasan umum.Atau bahkan:
Atau mencoba konstanta dereferensi (sebelum PHP 5.6) sebagai array:
Setidaknya PHP mengartikannya
const
sebagai nama konstan.Jika Anda bermaksud mengakses variabel array (yang merupakan penyebab khas di sini), kemudian tambahkan
$
sigil terkemuka - jadi itu menjadi a$varname
.Anda mencoba menggunakan
global
kata kunci pada anggota array asosiatif. Ini bukan sintaks yang valid:Braket kotak
]
penutup yang tidak terdugaIni agak jarang, tetapi ada juga sintaksis kecelakaan dengan
]
braket array terminating .Sekali lagi ketidakcocokan dengan
)
kurung atau kurung}
kurawal adalah hal yang umum:Atau mencoba mengakhiri array yang tidak ada:
Yang sering terjadi dalam deklarasi array multi-line dan bersarang .
Jika demikian, gunakan IDE Anda untuk pencocokan braket untuk menemukan
]
penutupan array prematur . Paling tidak gunakan lebih banyak spasi dan baris baru untuk mempersempitnya.sumber
T_VARIABLE tidak terduga
"Tak terduga
T_VARIABLE
" berarti ada$variable
nama literal , yang tidak cocok dengan struktur ekspresi / pernyataan saat ini.Tanda titik koma tidak ada
Ini paling umum menunjukkan titik koma yang hilang di baris sebelumnya. Penugasan variabel yang mengikuti pernyataan adalah indikator yang baik ke mana harus mencari:
Rangkaian string
Kecelakaan yang sering terjadi adalah penggabungan string dengan
.
operator yang dilupakan :Btw, Anda harus lebih memilih interpolasi string (variabel dasar dalam tanda kutip ganda) kapan pun yang membantu keterbacaan. Yang menghindari masalah sintaksis ini.
Operator ekspresi tidak ada
Tentu saja masalah yang sama dapat muncul dalam ekspresi lain, misalnya operasi aritmatika:
PHP tidak dapat menebak di sini jika variabel seharusnya ditambahkan, dikurangi atau dibandingkan dll.
Daftar
Sama untuk daftar sintaks, seperti dalam populasi array, di mana parser juga menunjukkan koma yang diharapkan
,
misalnya:Atau daftar parameter fungsi:
Setara Anda melihat ini dengan
list
atauglobal
pernyataan, atau ketika tidak memiliki;
titik koma dalam satufor
lingkaran.Deklarasi kelas
Kesalahan parser ini juga terjadi di deklarasi kelas . Anda hanya dapat menetapkan konstanta statis, bukan ekspresi. Jadi parser mengeluh tentang variabel sebagai data yang ditugaskan:
Tiada bandingan
}
Kurung kurawal penutupan yang dapat khususnya memimpin di sini. Jika suatu metode diakhiri terlalu dini (gunakan indentasi yang tepat!), Maka variabel nyasar biasanya salah tempat ke dalam badan deklarasi kelas.Variabel setelah pengidentifikasi
Anda juga tidak dapat memiliki variabel yang mengikuti pengenal secara langsung:
Btw, ini adalah contoh umum di mana niatnya adalah untuk menggunakan variabel variabel mungkin. Dalam hal ini pencarian properti variabel dengan
$this->{"myFunc$VAR"}();
misalnya.Kurung yang hilang setelah konstruksi bahasa
Pengetikan yang tergesa-gesa dapat menyebabkan pembukaan dan penutupan tanda kurung untuk
if
danfor
danforeach
pernyataan:Solusi: tambahkan celah yang hilang
(
antara pernyataan dan variabel.Kurung
{
kurawal tidak membuka blok kode, tanpa menutupif
ekspresi dengan)
kurung tutup terlebih dahulu.Lain tidak mengharapkan kondisi
Solusi: Hapus kondisi dari
else
atau gunakanelseif
.Perlu tanda kurung untuk penutupan
Solusi: Tambahkan tanda kurung di sekitar
$var
.Ruang kosong yang tak terlihat
Seperti disebutkan dalam jawaban referensi pada "Unicode nyasar yang tak terlihat" (seperti ruang yang tidak putus ), Anda mungkin juga melihat kesalahan ini untuk kode yang tidak curiga seperti:
Ini agak lazim di awal file dan untuk kode copy-and-paste. Periksa dengan hexeditor, jika kode Anda tidak tampak secara visual mengandung masalah sintaksis.
Lihat juga
sumber
T_CONSTANT_ENCAPSED_STRING
Tidak Terduga T_ENCAPSED_AND_WHITESPACE
Nama
T_CONSTANT_ENCAPSED_STRING
- nama yang berat danT_ENCAPSED_AND_WHITESPACE
merujuk pada literal yang dikutip ."string"
Mereka digunakan dalam konteks yang berbeda, tetapi masalah sintaksisnya sangat mirip. T_ENCAPSED ... peringatan muncul dalam konteks string yang dikutip ganda, sedangkan T_CONSTANT ... string sering tersesat dalam ekspresi atau pernyataan PHP biasa.
Interpolasi variabel tidak benar
Dan itu muncul paling sering untuk interpolasi variabel PHP yang salah:
Mengutip kunci array adalah suatu keharusan dalam konteks PHP. Tetapi dalam string yang dikutip ganda (atau HEREDOCs) ini adalah kesalahan. Pengurai mengeluh tentang tunggal terkandung yang dikutip
'string'
, karena biasanya mengharapkan pengenal / kunci literal di sana.Lebih tepatnya valid menggunakan sintaks sederhana gaya-PHP2 dalam tanda kutip ganda untuk referensi array:
Namun array bersarang atau referensi objek yang lebih dalam memerlukan sintaksis ekspresi string keriting yang kompleks :
Jika tidak yakin, ini biasanya lebih aman untuk digunakan. Bahkan sering dianggap lebih mudah dibaca. Dan IDE yang lebih baik benar-benar menggunakan pewarnaan sintaks yang berbeda untuk itu.
Rangkaian tidak ada
Jika string mengikuti ekspresi, tetapi tidak memiliki rangkaian atau operator lain, maka Anda akan melihat PHP mengeluh tentang string literal:
Meskipun jelas bagi Anda dan saya, PHP tidak dapat menebak bahwa string dimaksudkan untuk ditambahkan di sana.
Lampiran kutipan string yang membingungkan
Kesalahan sintaksis yang sama terjadi ketika pembatas string membingungkan . Sebuah string yang dimulai dengan kutipan tunggal
'
atau ganda"
juga berakhir dengan yang sama.Contoh itu dimulai dengan tanda kutip ganda. Tetapi tanda kutip ganda juga ditujukan untuk atribut HTML. Namun, operator concatenation yang dimaksud diinterpretasikan sebagai bagian dari string kedua dalam tanda kutip tunggal.
Ini adalah contoh yang baik di mana Anda seharusnya tidak keluar dari tanda kutip ganda di tempat pertama. Alih-alih, gunakan saja jalan keluar yang tepat
\"
untuk kutipan atribut HTML:Meskipun hal ini juga dapat menyebabkan kebingungan sintaksis, semua IDE / editor yang lebih baik lagi membantu dengan mewarnai kutipan yang diloloskan secara berbeda.
Kutipan pembuka tidak ada
Sama sekali lupa membuka
"
/'
mengutip resep untuk kesalahan parser:Di sini
', '
akan menjadi string literal setelah kata pengantar, ketika jelaslogin
dimaksudkan untuk menjadi parameter string.Daftar susunan
Jika Anda melewatkan
,
koma di blok pembuatan array, parser akan melihat dua string berturut-turut:Perhatikan bahwa baris terakhir mungkin selalu mengandung koma tambahan, tetapi menghadapinya tidak dapat dimaafkan. Yang sulit ditemukan tanpa penyorotan sintaksis.
Daftar parameter fungsi
Hal yang sama untuk panggilan fungsi :
String pelarian
Variasi umum adalah terminator string yang cukup mudah dilupakan:
Di sini PHP mengeluh tentang dua string literal yang langsung saling mengikuti. Tapi penyebab sebenarnya adalah string sebelumnya yang tidak tertutup tentu saja.
Lihat juga
sumber
T_STRING Tidak Terduga
T_STRING
sedikit keliru. Itu tidak merujuk pada kutipan"string"
. Ini berarti pengidentifikasi mentah ditemukan. Ini dapat berkisar daribare
kata-kata hingga sisaCONSTANT
atau nama fungsi, string yang tidak dikutip, atau teks biasa.String salah kutip
Kesalahan sintaksis ini paling umum untuk nilai string yang salah kutip. Setiap yang tidak terhindar dan tersesat
"
atau'
kutipan akan membentuk ekspresi yang tidak valid:Penyorotan sintaksis akan membuat kesalahan seperti itu menjadi sangat jelas. Penting untuk diingat untuk menggunakan garis miring terbalik untuk keluar dari
\"
tanda kutip ganda, atau\'
tanda kutip tunggal - tergantung pada yang digunakan sebagai selungkup tali ."
tanda kutip ganda.echo
/print
baris daripada melarikan diri masuk dan keluar. Lebih baik lagi pertimbangkan bagian HEREDOC .Contoh lain menggunakan entri PHP di dalam kode HTML yang dihasilkan dengan PHP:
Ini terjadi jika
$text
besar dengan banyak baris dan pengembang tidak melihat seluruh nilai variabel PHP dan fokus pada potongan kode yang lupa tentang sumbernya. Contohnya ada di siniLihat juga Apa perbedaan antara string tanda kutip tunggal dan kutip ganda dalam PHP? .
String tidak tertutup
Jika Anda melewatkan penutupan
"
maka kesalahan sintaksis biasanya terwujud kemudian. Suatu string yang tidak dikenali akan sering mengkonsumsi sedikit kode sampai nilai string yang dimaksud selanjutnya:Bukan hanya secara literal
T_STRING
yang bisa diprotes oleh parser. Variasi lain yang sering digunakan adalahUnexpected '>'
HTML literal tanpa tanda kutip.Kutipan string non-pemrograman
Jika Anda menyalin dan menempelkan kode dari blog atau situs web, Anda terkadang berakhir dengan kode yang tidak valid. Kutipan tipografis bukan yang diharapkan PHP:
Kutipan tipografi / pintar adalah simbol Unicode. PHP memperlakukan mereka sebagai bagian dari teks alfanumerik yang berdampingan. Misalnya
”these
ditafsirkan sebagai pengidentifikasi konstan. Tetapi setiap literal teks berikut ini kemudian dilihat sebagai bareword / T_STRING oleh parser.Titik koma yang hilang; lagi
Jika Anda memiliki ekspresi yang tidak ditentukan pada baris sebelumnya, maka pernyataan atau konstruksi bahasa berikut akan dianggap sebagai pengidentifikasi mentah:
PHP tidak dapat mengetahui apakah Anda bermaksud menjalankan dua fungsi secara berurutan, atau jika Anda bermaksud melipatgandakan hasilnya, menambahkannya, membandingkannya, atau hanya menjalankan satu
||
atau yang lainnya.Tag terbuka pendek dan
<?xml
header di skrip PHPIni agak tidak biasa. Tetapi jika short_open_tags diaktifkan, maka Anda tidak dapat memulai skrip PHP Anda dengan deklarasi XML :
PHP akan melihat
<?
dan mengklaimnya kembali untuk dirinya sendiri. Itu tidak akan mengerti untuk apa nyasarxml
itu dimaksudkan. Itu akan ditafsirkan sebagai konstan. Tetapiversion
akan dilihat sebagai lain literal / konstan. Dan karena parser tidak dapat memahami dua literal / nilai berikutnya tanpa operator ekspresi di antaranya, itu akan menjadi kegagalan parser.Karakter Unicode yang tak terlihat
Penyebab paling mengerikan untuk kesalahan sintaks adalah simbol Unicode, seperti ruang non-breaking . PHP memungkinkan karakter Unicode sebagai nama pengidentifikasi. Jika Anda mendapatkan keluhan parser T_STRING untuk kode yang sama sekali tidak berbahaya seperti:
Anda perlu keluar editor teks lain. Atau bahkan hexeditor. Apa yang tampak seperti spasi dan baris baru di sini, mungkin mengandung konstanta yang tidak terlihat. IDE berbasis Java terkadang tidak menyadari adanya BOM UTF-8 yang hancur, spasi nol lebar, pemisah paragraf, dll. Cobalah untuk menginstal ulang semuanya, hapus spasi dan tambahkan spasi normal kembali.
Anda dapat mempersempitnya dengan menambahkan
;
pemisah pernyataan berlebihan pada setiap baris awal:Titik
;
koma tambahan di sini akan mengubah karakter tak terlihat sebelumnya menjadi referensi konstan yang tidak ditentukan (ekspresi sebagai pernyataan). Yang sebaliknya membuat PHP menghasilkan pemberitahuan bermanfaat.Tanda `$` hilang di depan nama variabel
Variabel dalam PHP diwakili oleh tanda dolar diikuti dengan nama variabel.
Tanda dolar (
$
) adalah sigil yang menandai pengidentifikasi sebagai nama variabel. Tanpa sigil ini, pengidentifikasi dapat berupa kata kunci bahasa atau konstanta .Ini adalah kesalahan umum ketika kode PHP "diterjemahkan" dari kode yang ditulis dalam bahasa lain (C, Java, JavaScript, dll.). Dalam kasus seperti itu, deklarasi tipe variabel (ketika kode asli ditulis dalam bahasa yang menggunakan variabel yang diketik) juga bisa menyelinap keluar dan menghasilkan kesalahan ini.
Tanda kutip lolos
Jika Anda menggunakan
\
string, itu memiliki arti khusus. Ini disebut " Escape Karakter " dan biasanya memberitahu parser untuk mengambil karakter berikutnya secara harfiah.Contoh:
echo 'Jim said \'Hello\'';
akan dicetakJim said 'hello'
Jika Anda lolos dari kutipan penutupan string, kutipan penutupan akan diambil secara harfiah dan tidak seperti yang dimaksudkan, yaitu sebagai kutipan yang dapat dicetak sebagai bagian dari string dan tidak menutup string. Ini akan ditampilkan sebagai kesalahan parse secara umum setelah Anda membuka string berikutnya atau di akhir skrip.
Kesalahan yang sangat umum saat menentukan jalur di Windows:
"C:\xampp\htdocs\"
salah. Kamu butuh"C:\\xampp\\htdocs\\"
.sumber
Tidak terduga
(
Membuka tanda kurung biasanya mengikuti konstruksi bahasa seperti
if
/foreach
/for
/array
/list
atau memulai ekspresi aritmatika. Mereka secara sintaksis salah setelah"strings"
, sebelumnya()
, sendirian$
, dan dalam beberapa konteks deklarasi tipikal.Parameter deklarasi fungsi
Kejadian yang lebih jarang untuk kesalahan ini adalah mencoba menggunakan ekspresi sebagai parameter fungsi default . Ini tidak didukung, bahkan dalam PHP7:
Parameter dalam deklarasi fungsi hanya bisa berupa nilai literal atau ekspresi konstan. Tidak seperti untuk pemanggilan fungsi, di mana Anda dapat dengan bebas menggunakan
whatever(1+something()*2)
, dll.Default properti kelas
Hal yang sama untuk deklarasi anggota kelas , di mana hanya nilai literal / konstan yang diizinkan, bukan ekspresi:
Taruh hal-hal seperti itu di konstruktor. Lihat juga Mengapa atribut PHP tidak mengizinkan fungsi?
Sekali lagi perhatikan bahwa PHP 7 hanya memungkinkan
var $xy = 1 + 2 +3;
ekspresi konstan di sana.Sintaks JavaScript dalam PHP
Menggunakan sintaksis JavaScript atau jQuery tidak akan berfungsi di PHP karena alasan yang jelas:
Ketika ini terjadi, biasanya menunjukkan string sebelumnya yang tidak ditentukan; dan
<script>
bagian literal bocor ke dalam konteks kode PHP.isset (()), kosong, kunci, selanjutnya, saat ini
Keduanya
isset()
danempty()
merupakan built-in bahasa, bukan fungsi. Mereka perlu mengakses variabel secara langsung . Jika Anda secara tidak sengaja menambahkan sepasang tanda kurung terlalu banyak, maka Anda akan membuat ekspresi:Hal yang sama berlaku untuk konstruksi bahasa apa pun yang memerlukan akses nama variabel implisit. Ini built-in adalah bagian dari tata bahasa, oleh karena itu tidak mengizinkan kurung tambahan dekoratif.
Fungsi tingkat pengguna yang memerlukan referensi variabel -tapi mendapatkan hasil ekspresi yang lulus- mengarah ke kesalahan runtime sebagai gantinya.
Tidak terduga
)
Parameter fungsi tidak ada
Anda tidak dapat memiliki koma liar yang terakhir dalam panggilan fungsi . PHP mengharapkan nilai di sana dan karenanya mengeluh tentang
)
tanda kurung penutupan awal .Tanda koma hanya dibolehkan masuk
array()
ataulist()
dibuat.Ekspresi yang belum selesai
Jika Anda lupa sesuatu dalam ekspresi aritmatika, maka pengurai menyerah. Karena bagaimana seharusnya itu menafsirkan bahwa:
Dan jika Anda lupa penutupannya
)
bahkan, maka Anda akan mendapatkan keluhan tentang titik koma yang tak terduga.Berjuang sebagai
constant
Untuk awalan variabel yang terlupakan
$
dalam pernyataan kontrol, Anda akan melihat:PHP di sini terkadang memberi tahu Anda bahwa itu yang diharapkan
::
. Karena suatu kelas :: $ variabel dapat memenuhi ekspresi $ variabel yang diharapkan ..Tidak terduga
{
Kurung kurawal
{
dan}
lampirkan blok kode. Dan kesalahan sintaksis tentang mereka biasanya menunjukkan beberapa kesalahan dalam bersarang.Subekspresi yang tidak cocok dalam sebuah
if
Paling umum tidak seimbang
(
dan)
menjadi penyebabnya jika pengurai mengeluh tentang keriting bukaan yang{
muncul terlalu dini. Contoh sederhana:Hitung tanda kurung Anda atau gunakan IDE yang membantu itu. Juga jangan menulis kode tanpa spasi. Jumlah keterbacaan diperhitungkan.
{dan} dalam konteks ekspresi
Anda tidak dapat menggunakan kurung kurawal dalam ekspresi. Jika Anda bingung tanda kurung dan keriting, itu tidak akan sesuai dengan tata bahasa:
Ada beberapa pengecualian untuk konstruksi pengidentifikasi, seperti variabel lingkup lokal
${references}
.Variabel variabel atau ekspresi curly var
Ini sangat jarang. Tetapi Anda mungkin juga mendapatkan
{
dan}
memilah keluhan untuk ekspresi variabel yang kompleks:Meskipun ada kemungkinan yang lebih tinggi untuk hal yang tak terduga
}
dalam konteks seperti itu.Tidak terduga
}
Saat mendapatkan
}
kesalahan " tak terduga ", Anda sebagian besar telah menutup blok kode terlalu dini.Pernyataan terakhir dalam blok kode
Itu bisa terjadi untuk setiap ekspresi yang tidak ditentukan.
Dan jika baris terakhir dalam blok fungsi / kode tidak memiliki tanda
;
titik koma:Di sini parser tidak dapat memastikan apakah Anda mungkin masih ingin menambah
+ 25;
hasil fungsi atau yang lainnya.Sarang blok tidak valid / Lupa
{
Terkadang Anda akan melihat kesalahan parser ini ketika blok kode
}
ditutup terlalu dini, atau Anda{
bahkan lupa pembukaan :Dalam cuplikan di atas, kurung kurawal tidak
if
terbuka{
. Dengan demikian penutupan di}
bawah menjadi berlebihan. Dan oleh karena itu penutupan berikutnya}
, yang dimaksudkan untuk fungsi tersebut, tidak dapat dikaitkan dengan{
penjepit keriting pembukaan asli .Kesalahan semacam itu bahkan lebih sulit ditemukan tanpa lekukan kode yang tepat. Gunakan IDE dan pencocokan braket.
Tidak terduga
{
, mengharapkan(
Konstruk bahasa yang membutuhkan header kondisi / deklarasi dan blok kode akan memicu kesalahan ini.
Daftar parameter
Misalnya fungsi yang salah tulis tanpa daftar parameter tidak diizinkan:
Kondisi pernyataan kontrol
Dan Anda juga tidak dapat memiliki
if
kondisi tanpa .Jelas itu tidak masuk akal. Hal yang sama untuk tersangka biasa,
for
/foreach
,while
/do
, dll.sumber
$ End tidak terduga
Ketika PHP berbicara tentang "tak terduga
$end
", itu berarti bahwa kode Anda berakhir sebelum waktunya. (Pesannya agak menyesatkan ketika diambil secara harfiah. Ini bukan tentang variabel bernama "$ end", seperti yang kadang-kadang diasumsikan oleh pendatang baru. Ini merujuk pada "akhir file" EOF,.)Ini hampir selalu tentang
}
kurung kurawal yang hilang untuk menutup blok kode sebelumnya.Sekali lagi, gunakan lekukan yang tepat untuk menghindari masalah seperti itu.
Gunakan IDE dengan pencocokan braket, untuk mencari tahu di mana
}
kesalahannya. Ada beberapa pintasan keyboard di sebagian besar IDE dan editor teks:Sebagian besar IDE juga menyoroti kawat gigi, tanda kurung, dan tanda kurung yang cocok. Yang membuatnya mudah untuk memeriksa korelasinya:
Ekspresi yang dikurangi
Dan
Unexpected $end
kesalahan sintaks / pengurai juga dapat terjadi untuk ekspresi atau pernyataan yang tidak dikuatkan:$var = func(1,
?>
EOFJadi, lihat bagian akhir skrip terlebih dahulu. Trailing
;
sering berlebihan untuk pernyataan terakhir dalam skrip PHP apa pun. Tapi kamu harus memilikinya. Justru karena itu mempersempit masalah sintaksis ke bawah.Marker HEREDOC indentasi
Kejadian umum lainnya muncul dengan string HEREDOC atau NOWDOC . Marker terminating diabaikan dengan spasi, tab, dll .:
Oleh karena itu pengurai mengasumsikan string HEREDOC untuk melanjutkan sampai akhir file (karenanya "$ end tak terduga"). Hampir semua IDE dan editor yang menyoroti sintaksis akan membuat ini jelas atau memperingatkan tentang hal itu.
Tanda kutip lolos
Jika Anda menggunakan
\
string, itu memiliki arti khusus. Ini disebut " Escape Karakter " dan biasanya memberitahu parser untuk mengambil karakter berikutnya secara harfiah.Contoh:
echo 'Jim said \'Hello\'';
akan dicetakJim said 'hello'
Jika Anda lolos dari kutipan penutupan string, kutipan penutupan akan diambil secara harfiah dan tidak seperti yang dimaksudkan, yaitu sebagai kutipan yang dapat dicetak sebagai bagian dari string dan tidak menutup string. Ini akan ditampilkan sebagai kesalahan parse secara umum setelah Anda membuka string berikutnya atau di akhir skrip.
Kesalahan yang sangat umum saat menentukan jalur di Windows:
"C:\xampp\htdocs\"
salah. Kamu butuh"C:\\xampp\\htdocs\\"
.Sintaks alternatif
Agak jarang Anda bisa melihat kesalahan sintaks ini ketika menggunakan sintaks alternatif untuk blok pernyataan / kode dalam template. Menggunakan
if:
danelse:
dan yang hilangendif;
misalnya.Lihat juga:
sumber
T_IF
Tak Terduga T_ELSEIF
Tak Terduga T_ELSE
Tak Terduga T_ENDIF
Blok kontrol bersyarat
if
,elseif
danelse
ikuti struktur sederhana. Ketika Anda menemukan kesalahan sintaks, kemungkinan besar hanya bersarang blok tidak valid → dengan{
kurung kurawal yang hilang}
- atau terlalu banyak.Tidak ada
{
atau}
karena indentasi yang salahKawat gigi kode yang tidak cocok adalah umum untuk kode yang kurang diformat dengan baik seperti:
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.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 ekspresiKesalahan pendatang baru yang sering terjadi adalah mencoba menggunakan
if
pernyataan dalam ekspresi, seperti pernyataan cetak:Tentu saja yang tidak valid.
Anda dapat menggunakan persyaratan ternary , tetapi waspadai dampak keterbacaan.
Kalau tidak, hancurkan konstruksi output seperti ini: gunakan multiple
if
s danecho
s .Lebih baik lagi, gunakan variabel sementara , dan tempatkan kondisimu sebelumnya:
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 :Yang secara struktural identik dengan penggunaan
if
dalam string / ekspresi string.Anda harus menggunakan tugas dalam blok kode :
Atau,
?:
gunakan perbandingan terner.If in If
Anda tidak dapat membuat sarang
if
dalam kondisi:Yang jelas berlebihan, karena
and
(atauor
) sudah memungkinkan perbandingan rantai.Tanda
;
titik koma yang terlupakanSekali lagi: Setiap blok kontrol harus berupa pernyataan. Jika potongan kode sebelumnya tidak diakhiri dengan tanda titik koma, maka itu adalah kesalahan sintaksis yang dijamin:
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:
Yang terjadi lebih sering daripada yang Anda bayangkan.
if ()
ekspresi dengan;
itu akan menjalankan pernyataan kosong. The;
menjadi kosong{}
sendiri!{…}
blok sehingga terlepas dariif
, dan akan selalu berjalan.else
tidak lagi memiliki hubungan denganif
konstruksi terbuka , itulah sebabnya ini akan menyebabkan kesalahan sintaks T_ELSE yang tidak terduga.Yang juga menjelaskan variasi halus kesalahan sintaksis ini:
Di mana
;
setelah blok kode{…}
mengakhiri seluruhif
konstruksi, memutuskanelse
cabang secara sintaksis.Tidak menggunakan blok kode
Secara sintaksis diperbolehkan untuk menghilangkan kurung kurawal
{
...}
untuk blok kode diif
/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:
Tetapi untuk benar-benar menggunakan blok kode, Anda harus menulis
{
...}
seperti itu!Else / Elseif dalam urutan yang salah
Satu hal yang perlu diingatkan adalah tatanan bersyarat , tentu saja.
Anda dapat memiliki sebanyak yang
elseif
Anda inginkan, tetapielse
harus pergi terakhir . Begitulah adanya.Deklarasi kelas
Seperti disebutkan di atas , Anda tidak dapat memiliki pernyataan kontrol dalam deklarasi kelas:
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
}
untukif/elseif
harus dalam blok PHP yang sama<?php ?>
dengan yang berikutnyaelseif/else
. Ini akan menghasilkan kesalahan sebagai penutup}
dariif
kebutuhan untuk menjadi bagian darielseif
:Bentuk yang benar
<?php } elseif
: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
danelseif
/else
token struktural:Entah hanya dapat terjadi di
{…}
blok kode, bukan di antara token struktur kontrol.if
danelse
bercabang.Anda juga tidak dapat memisahkan jika / selain antara struktur kontrol yang berbeda:
Tidak ada hubungan sintaksis antara
if
danelse
. Theforeach
leksikal lingkup berakhir pada}
, sehingga tidak ada gunanya untukif
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 punif:
.Menggunakan
} endif;
adalah -minator gandaif
.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:
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.sumber
Tak terduga T_IS_EQUAL
tak terduga T_IS_GREATER_OR_EQUAL
tak terduga T_IS_IDENTICAL
tak terduga T_IS_NOT_EQUAL
T_IS_NOT_IDENTICAL tak terduga
T_IS_SMALLER_OR_EQUAL tak terduga
terduga
<
terduga
>
Operator perbandingan seperti
==
,>=
,===
,!=
,<>
,!==
dan<=
atau<
dan>
sebagian besar harus digunakan hanya dalam ekspresi, sepertiif
ekspresi. Jika parser mengeluh tentang mereka, maka itu sering berarti paring yang salah atau(
)
parism yang tidak cocok di sekitar mereka.Pengelompokan orangtua
Khususnya untuk
if
pernyataan dengan beberapa perbandingan, Anda harus berhati-hati dalam menghitung kurung buka dan tutup dengan benar :Di
if
sini kondisi di sini sudah diakhiri oleh)
Setelah perbandingan Anda menjadi cukup kompleks, sering kali membantu untuk memecahnya menjadi beberapa
if
konstruksi sekaligus bersarang .isset () dihaluskan dengan membandingkan
Pendatang baru yang umum adalah pitfal sedang mencoba untuk menggabungkan
isset()
atauempty()
dengan perbandingan:Atau bahkan:
Ini tidak masuk akal untuk PHP, karena
isset
danempty
merupakan konstruksi bahasa yang hanya menerima nama variabel. Tidak masuk akal untuk membandingkan hasilnya juga, karena outputnya hanya / sudah boolean.Membingungkan
>=
lebih besar atau sama dengan=>
operator arrayKedua operator terlihat agak mirip, sehingga mereka kadang-kadang bingung:
Anda hanya perlu mengingat bahwa operator perbandingan ini disebut " lebih besar atau sama dengan " untuk memperbaikinya.
Lihat juga: Jika struktur pernyataan dalam PHP
Tidak ada yang bisa dibandingkan
Anda juga tidak dapat menggabungkan dua perbandingan jika berkaitan dengan nama variabel yang sama:
PHP tidak dapat menyimpulkan bahwa Anda bermaksud membandingkan variabel awal lagi. Ekspresi biasanya dipasangkan sesuai dengan prioritas operator , sehingga pada saat
<
terlihat, hanya akan ada hasil boolean yang tersisa dari variabel asli.Lihat juga: T_IS_SMALLER_OR_EQUAL yang tidak terduga
Rantai perbandingan
Anda tidak dapat membandingkan dengan variabel dengan deretan operator:
Ini harus dipecah menjadi dua perbandingan, masing-masing melawan
$x
.Ini sebenarnya lebih merupakan kasus ekspresi daftar hitam (karena asosiasi operator setara). Secara sintaksis valid dalam beberapa bahasa gaya-C, tetapi PHP juga tidak akan menafsirkannya sebagai rantai perbandingan yang diharapkan.
Tak
>
Terduga Tak Terduga
<
Lebih besar
>
atau kurang dari<
operator tidak memilikiT_XXX
nama tokenizer khusus . Dan sementara mereka bisa salah tempat seperti yang lainnya, Anda lebih sering melihat pengurai mengeluh tentang mereka karena string yang salah kutip dan HTML yang dihaluskan:Ini berjumlah string
"<a href='z"
yang dibandingkan>
dengan konstanta literalHello
dan kemudian<
perbandingan lain . Atau setidaknya itulah yang dilihat PHP. Penyebab aktual dan kesalahan sintaksis adalah"
terminasi string prematur .Anda juga tidak dapat membuat tag awal PHP sarang:
Lihat juga:
sumber
Tak terduga T_IF
tak terduga T_FOREACH
tak terduga T_FOR
tak terduga T_WHILE
tak terduga T_DO
T_ECHO tak terduga
Kontrol konstruksi seperti
if
,foreach
,for
,while
,list
,global
,return
,do
,print
,echo
hanya dapat digunakan sebagai pernyataan. Mereka biasanya tinggal di garis sendiri.Titik koma; kamu di mana?
Secara universal apakah Anda melewatkan titik koma di baris sebelumnya jika parser mengeluhkan pernyataan kontrol:
Solusi: lihat baris sebelumnya; tambahkan titik koma.
Deklarasi kelas
Lokasi lain di mana ini terjadi adalah dalam deklarasi kelas . Di bagian kelas Anda hanya bisa mendaftar inisialisasi properti dan bagian metode. Tidak ada kode yang berada di sana.
Kesalahan sintaksis seperti itu biasanya muncul untuk bersarang
{
dan}
. Khususnya ketika blok kode fungsi ditutup terlalu dini.Pernyataan dalam konteks ekspresi
Sebagian besar konstruksi bahasa hanya dapat digunakan sebagai pernyataan . Mereka tidak dimaksudkan untuk ditempatkan di dalam ekspresi lain:
Anda juga tidak dapat menggunakan
if
string, ekspresi matematika atau di tempat lain:Untuk menyematkan
if
-seperti kondisi dalam ekspresi tertentu, Anda sering ingin menggunakan?:
evaluasi ternary .Hal yang sama berlaku untuk
for
,while
,global
,echo
dan memperpanjang lebih rendahlist
.Sedangkan
print()
bahasa bawaan yang dapat digunakan dalam konteks ekspresi. (Tapi jarang masuk akal.)Kata kunci yang dicadangkan sebagai pengidentifikasi
Anda juga tidak dapat menggunakan
do
atauif
dan konstruksi bahasa lainnya untuk fungsi atau nama kelas yang ditentukan pengguna. (Mungkin dalam PHP 7. Tetapi meskipun demikian itu tidak akan disarankan.)sumber
Tidak terduga '?'
Jika Anda mencoba menggunakan operator penggabungan nol
??
dalam versi PHP sebelum PHP 7, Anda akan mendapatkan kesalahan ini.'?' Tidak terduga, variabel yang diharapkan
Kesalahan serupa dapat terjadi untuk tipe nullable, seperti pada:
Yang lagi menunjukkan versi PHP yang ketinggalan zaman sedang digunakan (baik versi CLI
php -v
atau webserver terikatphpinfo();
).sumber
T_LNUMBER yang tidak terduga
Token
T_LNUMBER
mengacu pada nomor "panjang" /.Nama variabel tidak valid
Dalam PHP, dan sebagian besar bahasa pemrograman lainnya, variabel tidak dapat dimulai dengan angka. Karakter pertama harus alfabet atau garis bawah.
Cukup sering muncul untuk menggunakan
preg_replace
-placeholder"$1"
dalam konteks PHP:Di mana panggilan balik seharusnya dikutip. (Sekarang
/e
bendera regex sudah usang. Tapi kadang-kadang masih disalahgunakanpreg_replace_callback
fungsinya.)Kendala pengidentifikasi yang sama berlaku untuk properti objek , btw.
Sementara tokenizer / parser tidak memungkinkan literal
$1
sebagai nama variabel, orang dapat menggunakan${1}
atau${"1"}
. Yang merupakan solusi sintaksis untuk pengidentifikasi non-standar. (Yang terbaik adalah menganggapnya sebagai pencarian lingkup lokal. Tetapi umumnya: lebih suka array polos untuk kasus-kasus seperti itu!)Yang mengherankan, tetapi sangat tidak direkomendasikan, parser PHP memungkinkan pengidentifikasi Unicode; sedemikian rupa sehingga
$➊
akan valid. (Tidak seperti literal1
).Entri array yang tersesat
Panjang tak terduga juga dapat terjadi untuk deklarasi larik - saat kehilangan
,
koma:Atau juga panggilan fungsi dan deklarasi, dan konstruksi lainnya:
func(1, 2 3);
function xy($z 2);
for ($i=2 3<$z)
Jadi biasanya ada satu
;
atau,
tidak ada untuk memisahkan daftar atau ekspresi.HTML salah kutip
Dan lagi, string yang salah kutip adalah sumber yang sering nomor liar:
Kasus-kasus seperti itu harus diperlakukan kurang lebih seperti kesalahan T_STRING yang tidak terduga .
Pengidentifikasi lainnya
Baik fungsi, kelas, maupun ruang nama tidak bisa dinamai diawali dengan angka:
Hampir sama dengan nama variabel.
sumber
'=' Tidak Terduga
Ini dapat disebabkan oleh memiliki karakter yang tidak valid dalam nama variabel. Nama variabel harus mengikuti aturan ini:
sumber
'Lanjutkan' yang tidak terduga (T_CONTINUE)
continue
adalah pernyataan (seperti untuk, atau jika) dan harus tampil mandiri. Itu tidak dapat digunakan sebagai bagian dari ekspresi. Sebagian karena melanjutkan tidak mengembalikan nilai, tetapi dalam ekspresi setiap sub-ekspresi harus menghasilkan beberapa nilai sehingga keseluruhan ekspresi menghasilkan nilai. Itulah perbedaan antara pernyataan dan ungkapan.Itu berarti
continue
tidak dapat digunakan dalam pernyataan ternary atau pernyataan apa pun yang membutuhkan nilai balik.'Break' yang tidak terduga (T_BREAK)
Sama halnya
break;
tentu saja. Ini juga tidak dapat digunakan dalam konteks ekspresi, tetapi pernyataan yang ketat (pada tingkat yang sama denganforeach
atauif
blok).'Pengembalian' yang tidak terduga (T_RETURN)
Sekarang ini mungkin lebih mengejutkan
return
, tetapi itu juga hanya pernyataan tingkat blok . Itu mengembalikan nilai (atau NULL) ke lingkup / fungsi yang lebih tinggi, tetapi tidak mengevaluasi sebagai ekspresi itu sendiri. → Yaitu: tidak ada gunanya melakukanreturn(return(false);;
sumber
Tidak terduga '.'
Ini dapat terjadi jika Anda mencoba menggunakan operator percikan (
...
) dalam versi PHP yang tidak didukung....
pertama kali tersedia di PHP 5.6 untuk menangkap sejumlah variabel argumen ke suatu fungsi:Di PHP 7.4, Anda bisa menggunakannya untuk ekspresi Array .
sumber
'Endwhile' yang tak terduga (T_ENDWHILE)
Sintaks menggunakan titik dua - jika tidak ada titik dua kesalahan di atas akan terjadi.
Alternatif untuk sintaks ini menggunakan kurung keriting:
http://php.net/manual/en/control-structures.while.php
sumber
Pesan kesalahan yang dimulai
Parse error: syntax error, unexpected ':'
dapat disebabkan oleh keliru menulis referensi statis kelasClass::$Variable
sebagaiClass:$Variable
.sumber