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:

  • 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.

Mengomentari pertanyaan (18)
Larutan

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:

  • Penggunaan yang tepat kode lekukan, atau mengadopsi tinggi coding style. Pembacaan mencegah penyimpangan.
  • Gunakan IDE atau editor untuk PHP dengan sintaks. Yang juga membantu dengan tanda kurung/braket balancing.
  • Baca referensi bahasa dan contoh-contoh dalam manual. Dua kali, untuk menjadi agak mahir.

    Bagaimana menafsirkan parser error

    Khas sintaks pesan kesalahan yang berbunyi:

    Parse error: syntax error, unexpected T_STRING, mengharapkan ';' di file.php pada baris 217 Yang berisi daftar mungkin lokasi kesalahan sintaks. Melihat disebutkan nama file dan nomor baris. A nama seperti T_STRING menjelaskan simbol parser/tokenizer tidak't proses akhirnya. Ini isn't tentu penyebab kesalahan sintaks, namun. It's penting untuk melihat ke dalam sebelumnya baris kode juga. Seringkali kesalahan sintaks adalah kecelakaan yang terjadi sebelumnya. Kesalahan nomor baris di mana parser meyakinkan menyerah untuk memproses itu semua.

    Memecahkan kesalahan sintaks

    Ada banyak pendekatan untuk mempersempit dan memperbaiki kesalahan sintaks cegukan.

  • Buka disebutkan di file sumber. Melihat disebutkan baris kode.
  • Untuk pelarian string dan salah operator, hal ini biasanya di mana anda menemukan pelakunya.
  • Membaca garis dari kiri ke kanan dan membayangkan apa yang masing-masing simbol tidak.
  • Lebih teratur, anda perlu melihat sebelumnya garis juga.
  • Secara khusus, hilang ; titik koma yang hilang pada baris sebelumnya berakhir/pernyataan. (Setidaknya dari gaya pandang. )
  • Jika { 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.
  • Lihat di pewarnaan sintaks!
  • String dan variabel dan konstanta semua harus memiliki warna yang berbeda.
  • Operator +-*/. harus berwarna yang berbeda juga. Mereka mungkin berada dalam konteks yang salah.
  • Jika anda melihat string pewarnaan memperpanjang terlalu jauh atau terlalu pendek, maka anda telah menemukan aplikasi yang tidak lolos atau hilang penutupan " atau ' string penanda.
  • Memiliki dua berwarna sama karakter tanda baca selanjutnya untuk masing-lain juga bisa berarti masalah. Biasanya, operator tunggal jika itu's tidak ++, --, atau tanda kurung berikut operator. Dua senar/pengidentifikasi langsung mengikuti satu sama lain yang tidak benar dalam banyak konteks.
  • Spasi adalah teman anda. Ikuti setiap coding style.
  • Memecah antrean panjang sementara.
  • Anda dapat dengan bebas menambahkan baris baru antara operator atau konstanta dan string. Parser akan mengkonkretkan nomor baris untuk parsing kesalahan. Bukannya melihat sangat panjang kode, anda dapat mengisolasi hilang atau salah tempat sintaks simbol.
  • Berpisah kompleks jika laporan menjadi berbeda atau bersarang jika kondisi.
  • Bukan panjang rumus matematika atau logika rantai, menggunakan variabel sementara untuk menyederhanakan kode. (Lebih mudah dibaca = lebih sedikit kesalahan.)
  • Tambahkan baris baru di antara:
  1. Kode yang anda dapat dengan mudah mengidentifikasi sebagai yang benar,
  2. Bagian-bagian yang anda're yakin tentang,
  3. Dan garis yang parser mengeluh tentang.
    Partisi panjang blok kode benar-benar membantu untuk menemukan asal-usul kesalahan sintaks.
  • Komentar kode menyinggung.
  • Jika anda dapat't mengisolasi masalah sumber, mulai komentar (dan dengan demikian menghapus sementara) blok kode.
  • Segera setelah anda menyingkirkan parsing error, anda telah menemukan masalah sumber. Melihat lebih dekat sana.
  • Kadang-kadang anda ingin untuk sementara menghapus fungsi lengkap/metode blok. (Dalam kasus yang tak tertandingi kurung kurawal dan salah menjorok kode.)
  • Ketika anda dapat't menyelesaikan masalah sintaks, cobalah untuk ulang yang komentar bagian dari awal.
  • Sebagai pendatang baru, menghindari beberapa membingungkan sintaks konstruksi.
  • Terner ? : kondisi operator dapat kode kompak dan berguna memang. Tapi itu doesn't pertolongan yang mudah dibaca dalam semua kasus. Sukai polos jika laporan sementara paham.
  • PHP's alternatif sintaks (jika:/elseif:/endif;) adalah umum untuk template, tapi bisa dibilang lebih mudah untuk mengikuti dari normal { kode } blok.
  • Yang paling lazim pendatang baru kesalahan adalah:
  • Hilang titik koma ; untuk mengakhiri pernyataan/garis.
  • Serasi string kutipan " atau ' dan tidak lolos dalam tanda kutip.
  • Lupa operator, khususnya untuk string . rangkaian.
  • Tidak seimbang ( tanda kurung ). Menghitung mereka dalam melaporkan baris. Ada jumlah yang sama dari mereka?
  • Don't lupa bahwa memecahkan satu masalah sintaks dapat mengungkap berikutnya.
  • Jika anda membuat satu masalah pergi, tapi tanaman lainnya di beberapa kode di bawah ini, anda're kebanyakan di jalan yang benar.
  • Jika setelah editing baru syntax error tanaman dalam baris yang sama, maka anda berusaha mengubah mungkin sebuah kegagalan. (Meskipun tidak selalu.)
  • Mengembalikan cadangan sebelumnya bekerja code, jika anda dapat't memperbaikinya.
  • Mengadopsi source code versioning system. Anda selalu dapat melihat diff rusak dan terakhir versi kerja. Yang mungkin mencerahkan seperti apa syntax masalah ini.
  • Terlihat menyimpang karakter Unicode: Dalam beberapa kasus, anda perlu menggunakan hexeditor atau berbeda editor/viewer pada sumber anda. Beberapa masalah tidak dapat ditemukan hanya dari melihat kode anda.
  • Cobalah grep --color -P -n "\[\x80-\xFF\]" file.php sebagai langkah pertama untuk menemukan non-ASCII simbol-simbol.
  • Khususnya BOMs, nol-lebar spasi, atau non-breaking ruang, dan kutipan pintar secara teratur dapat menemukan jalan mereka ke dalam kode sumber.
  • Mengurus yang jenis linebreaks disimpan dalam file.
  • PHP hanya penghargaan \n baris, tidak \r kereta kembali.
  • Yang kadang-kadang menjadi masalah bagi pengguna MacOS (bahkan pada OS  X untuk misconfigured editor).
  • Sering hanya permukaan sebagai masalah ketika single-line // atau # komentar digunakan. Multiline /*...*/ komentar yang tidak jarang mengganggu parser ketika linebreaks mendapatkan diabaikan.
  • Jika anda syntax error tidak mengirimkan melalui web: Hal itu terjadi bahwa anda memiliki sintaks error pada mesin anda. Tapi posting yang sama file online tidak menunjukkan itu lagi. Yang hanya dapat berarti satu dari dua hal:
  • Anda melihat file yang salah!
  • Atau anda kode terkandung terlihat liar Unicode (lihat di atas). Anda dapat dengan mudah mengetahui: Hanya copy kode anda kembali dari formulir web ke editor teks anda.
  • Periksa versi PHP. Tidak semua sintaks konstruksi yang tersedia pada setiap server.
  • 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.
  • Don't menggunakan PHP's kata kunci cadangan sebagai pengidentifikasi untuk fungsi-fungsi/metode, kelas atau konstanta.
  • Trial-and-error adalah pilihan terakhir anda. Jika semuanya gagal, anda selalu dapat google pesan kesalahan. Sintaks simbol aren't sebagai mudah untuk mencari (Stack Overflow itu sendiri diindeks oleh SymbolHound meskipun). Oleh karena itu dapat mengambil melihat melalui beberapa halaman lagi sebelum anda menemukan sesuatu yang relevan. Panduan lebih lanjut:
  • PHP Debugging dasar-Dasar oleh David Sklar
  • Memperbaiki Kesalahan PHP oleh Jason McCreary
  • Kesalahan PHP – 10 Kesalahan Umum oleh Mario Lurig
  • Umum Kesalahan PHP dan Solusi
  • Cara Memecahkan masalah dan Memperbaiki Website WordPress anda
  • Panduan Untuk PHP Error Pesan Untuk Desainer - Smashing Magazine

    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 Di php.ini pada umumnya, atau melalui .htaccess untuk mod_php, atau bahkan .pengguna.ini dengan FastCGI setup. Sehingga dalam rusak script terlambat karena PHP dapat't bahkan menafsirkan/menjalankan baris pertama. Cepat solusi kerajinan wrapper script, katakanlah test.php:
<?php
   error_reporting(E_ALL);
   ini_set("display_errors", 1);
   include("./broken-script.php");

Kemudian memohon gagal kode dengan mengakses wrapper script. Hal ini juga membantu untuk mengaktifkan PHP's error_log dan melihat ke anda webserver's kesalahan.log ketika script crash dengan tanggapan HTTP 500.

Komentar (2)

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):

  1. NetBeans [free]
  2. PHPStorm [$199 USD]
  3. Eclipse dengan PHP Plugin [free]
  4. Agung [$80 USD] (terutama teks editor, tetapi dapat diperluas dengan plugin, seperti Sintaks PHP Parser)
Komentar (5)

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 mendukung array().

$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
         ⇑

Fungsi Array hasil dereferencing juga tidak tersedia untuk versi PHP yang lebih tua:

$result = get_whatever()["key"];
                      ⇑

[Referensi - Apa ini berarti kesalahan dalam PHP? - "Syntax error, unexpected \["]2 menunjukkan yang paling umum dan praktis workarounds.

Meskipun, anda're selalu lebih baik hanya meng-upgrade instalasi PHP anda. Untuk shared webhosting rencana, penelitian pertama jika misal SetHandler php56-fcgi dapat digunakan untuk mengaktifkan runtime baru.

Lihat juga:

BTW, ada juga preprosesor dan PHP 5.4 sintaks down-converter jika anda're benar-benar lengket dengan yang lebih tua + lebih lambat versi PHP.

Penyebab lain untuk Unexpected [ kesalahan sintaks

Jika itu's tidak di-PHP versi ketidakcocokan, maka's seringkali polos typo atau pendatang baru sintaks kesalahan:

dilindungi $var["x"] = "Tidak,"; ⇑

  • Membingungkan [ dengan pembukaan kurung kurawal { atau tanda kurung ( adalah umum pengawasan.

foreach [$a sebanyak $b) ⇑

Atau bahkan:

fungsi foobar[$a, $b, $c] { ⇑

  • Atau mencoba untuk dereference konstanta (sebelum PHP 5.6) sebagai array:

$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.

  • Anda mencoba untuk menggunakan global kata kunci pada anggota array asosiatif. Hal ini tidak berlaku sintaks:

global $var['kunci'];


Tak terduga ] penutupan braket persegi

Ini agak jarang, tapi ada juga sintaks kecelakaan dengan mengakhiri array ] bracket.

  • Lagi ketidaksesuaian dengan ) tanda kurung atau } kurung kurawal yang umum:

fungsi foobar($a, $b, $c] { ⇑

  • Atau mencoba untuk mengakhiri sebuah array di mana ada isn't satu:

$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.

Komentar (1)

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.

  1. 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

  1. 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.

String interpolasi adalah bahasa scripting fitur inti. Tidak ada rasa malu dalam memanfaatkan itu. Mengabaikan setiap mikro-optimasi menyarankan tentang variabel . rangkaian yang lebih cepat. It's tidak.

  1. 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.

  1. 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 atau global pernyataan, atau bila kurang ; koma di untuk loop.

  1. 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.

  1. 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.

Mengambil diingat bahwa menggunakan variabel variabel harus menjadi pengecualian. Pendatang baru sering mencoba untuk menggunakan mereka terlalu santai, bahkan ketika array akan menjadi lebih sederhana dan lebih tepat.

  1. Hilang parens setelah konstruksi bahasa

Terburu-buru mengetik dapat menyebabkan untuk dilupakan pembukaan kurung untuk jika dan for dan foreach pernyataan:

⇓ foreach $array as $key) {

Solusi: tambahkan hilang pembukaan ( antara pernyataan dan variabel.

  1. yang Lain tidak mengharapkan kondisi

⇓ lain ($var >= 0)

Solusi: Hapus kondisi dari yang lain atau gunakan elseif.

  1. Perlu kurung untuk penutupan

⇓ fungsi() menggunakan $var {}

Solusi: Menambahkan tanda kurung di sekitar $var.

  1. 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

Komentar (0)

Tak terduga T_CONSTANT_ENCAPSED_STRING
tak Terduga T_ENCAPSED_AND_WHITESPACE

Berat nama T_CONSTANT_ENCAPSED_STRING dan T_ENCAPSED_AND_WHITESPACE mengacu dikutip "string" literal. Mereka're digunakan dalam konteks yang berbeda, tetapi sintaks masalah yang cukup mirip. T_ENCAPSED... peringatan terjadi di double quoted string konteks, sementara T_CONSTANT... string yang sering tersesat di dataran PHP ekspresi atau pernyataan.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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")
  7. 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**
Komentar (0)

Unexpected T_STRING

T_STRING adalah sedikit keliru. Itu tidak merujuk ke dikutip "string". Itu berarti mentah identifier yang dihadapi. Hal ini dapat berkisar dari telanjang kata-kata untuk sisa KONSTAN atau nama-nama fungsi, lupa dikutp string, atau teks biasa.

  1. 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].
  1. 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.
  2. 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.
  3. 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.
  4. Short open tag dan <?xml header di script PHP

    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.
  5. tak 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.
  6. ` $ ` 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.
  7. 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\\"`.
Komentar (0)

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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 `)`
  5. 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.
  6. 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.
  7. Foreach sebagai konstan

    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..
    ## Tak terduga `{` Kurung kurawal `{` dan `}` menyertakan kode blok. Dan kesalahan sintaks tentang mereka biasanya menunjukkan beberapa incorrec bersarang.
  8. tak Tertandingi subexpressions di jika

    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.
  9. { 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}`.
  10. 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.
  11. 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.
  12. 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.
  13. daftar Parameter

    Misalnya [misdeclared fungsi tanpa parameter list][5] tidak diizinkan: ⇓ fungsi apapun { }
  14. 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.
Komentar (3)

Tak terduga T_IF
Tak terduga T_ELSEIF
Tak terduga T_ELSE
Tak terduga T_ENDIF

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.

Hilang { atau } karena salah lekukan

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){

Jika kode anda terlihat seperti ini, mulai dari awal! Selain itu's unfixable untuk anda atau orang lain. Ada's tidak ada gunanya menampilkan ini di internet untuk menanyakan untuk membantu. Anda hanya akan dapat untuk memperbaiki itu, jika anda secara visual dapat mengikuti bersarang struktur dan hubungan jika/lain conditional dan mereka { blok kode }. Menggunakan IDE anda untuk melihat apakah mereka're semua dipasangkan. if (true) { jika (false) { ... } elseif ($apapun) { if ($something2) { ... } else { ... } } else { ... } jika (false) { // yang kedua jika pohon ... } else { ... } } elseif (false) { ... } Setiap kali } } tidak akan menutup cabang, tapi sebelumnya kondisi struktur. Oleh karena itu tetap dengan satu coding style; don't mix and match dalam nested if/else pohon. Terlepas dari konsistensi di sini, ternyata bermanfaat untuk menghindari kondisi yang terlalu panjang. Menggunakan variabel sementara atau fungsi untuk menghindari terbaca jika-ekspresi. 2.

JIKA tidak dapat digunakan dalam ekspresi

Mengejutkan sering kesalahan pendatang baru ini mencoba untuk menggunakan sebuah jika pernyataan dalam sebuah ekspresi, seperti cetak pernyataan: ⇓ echo "<a href='," . if ($link == "contoh.org") { echo ... Yang valid saja. Anda dapat menggunakan ternary bersyarat, tapi waspadalah terhadap pembacaan dampak. echo "<a href='," . ($link ? "http://yes" : "http://no") . ""; Jika tidak istirahat seperti output konstruksi naik: gunakan beberapa jika danecho. 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 ; titik koma

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 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 dan elseif/yang lain struktural token: if (true) { } echo "di antara"; ← elseif (false) { } ?> teks <?php ← else { } Baik hanya dapat terjadi dalam {...} blok kode, tidak di antara struktur pengendalian token.

  • Ini tidak't make sense sih. It's tidak seperti itu ada beberapa "undefined" negara ketika PHP melompat antara jika dan lain cabang-cabang.
  • Anda'll harus membuat pikiran anda di mana cetak laporan milik / atau jika mereka perlu diulang di kedua cabang.

Anda juga dapat bagian if/else di antara berbagai struktur kontrol: foreach ($array as $i) { if ($i) { ... } } else { ... } Tidak ada sintaksis kaitannya antara jika dan yang lain. The foreach leksikal lingkup berakhir di }, jadi ada's tidak ada gunanya untuk jika struktur untuk melanjutkan. 9.

T_ENDIF

Jika tak terduga T_ENDIF adalah mengeluh tentang, kau're menggunakan sintaks alternatif gaya jika:elseif:yang lain:endif;. Yang anda benar-benar harus berpikir dua kali tentang.

  • Sebuah perangkap umum adalah membingungkan dan menakutkan mirip : usus untuk ; semicolon. (Tertutup di "titik Koma terlalu dini")
  • Sebagai indentasi adalah sulit untuk melacak di file template, lebih-lebih ketika menggunakan sintaks alternatif - it's masuk akal anda endif; tidak sesuai jika:.
  • Menggunakan } endif; adalah dua kali lipat jika-terminator.

    Sementara "unexpected $end" biasanya harga untuk dilupakan penutupan } kurung kurawal.
  1. 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.
Komentar (0)

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.)

Penyebab: tidak Seimbang { dan } untuk kode blok / dan fungsi atau class deklarasi.

It's selalu tentang hilang } kurung kurawal tutup sebelumnya kode blok.

  • Sekali lagi, penggunaan yang tepat lekukan untuk menghindari masalah tersebut.

  • Menggunakan IDE dengan pencocokan braket, untuk mencari tahu di mana } adalah salah. Ada cara pintas keyboard di sebagian besar Ide dan teks editor:

  • NetBeans, PhpStorm, Komodo: Pilih[ dan Pilih]
  • Eclipse, Aptana: PilihShiftP
  • Atom, Luhur: Pilihm - Zend Studio PilihM
  • Geany, Notepad++: PilihB - Joe: PilihG - Emacs: C-M-n - Vim: %

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, ?>EOF

Jadi, 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.:


print 
Komentar (0)

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.

  1. 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.

  1. 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.

  1. 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 jikakondisi seperti dalam ungkapan khusus, anda seringkali ingin menggunakan ?: terner evaluasi.

Hal yang sama berlaku untuk untuk, sementara, global, echo dan memperpanjang lebih rendah daftar.

⇓ echo 123, echo 567, "hah?";

Sedangkan cetak() adalah bahasa builtin yang dapat digunakan dalam ekspresi konteks. (Tapi jarang masuk akal.)

  1. kata kunci yang Dicadangkan sebagai pengidentifikasi

Anda juga dapat't menggunakan do atau jika dan bahasa lainnya konstruksi untuk fungsi yang ditetapkan pengguna atau nama kelas. (Mungkin di PHP7. Tetapi bahkan kemudian itu tidak't dianjurkan.)

Komentar (0)

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, seperti jika ekspresi. Jika parser mengeluh tentang mereka, maka hal itu sering berarti salah atau pengupas serasi ( ) parens di sekitar mereka.

  1. 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.

  1. isset() tumbuk dengan membandingkan

Umum pendatang baru pitfal adalah mencoba untuk menggabungkan isset() atau kosong() dengan perbandingan:

⇓ if (empty($_POST["var"] == 1)) {

Atau bahkan:

⇓ if (isset($variabel !== "nilai")) {

Ini doesn't masuk akal untuk PHP, karena isset dan kosong adalah konstruksi bahasa yang hanya menerima nama-nama variabel. Itu doesn't masuk akal untuk membandingkan hasil yang baik, karena output hanya/sudah boolean.

  1. Membingungkan >= lebih besar atau sama dengan => array operator

Kedua 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

  1. 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

  1. 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.

  1. tak Terduga >
    tak Terduga <

Lebih besar dari > atau kurang dari < operator don't memiliki kebiasaan T_XXX tokenizer nama. Dan sementara mereka dapat salah seperti mereka orang lain, anda lebih sering melihat parser mengeluh tentang mereka untuk salah kutip string dan tumbuk HTML:

⇓ cetak "<a href='z">Halo"; ↑

Jumlah ini string "<a href=&#39;z" dibandingkan > untuk konstanta literal Halo dan kemudian yang lain < perbandingan. Atau yang's setidaknya bagaimana PHP melihatnya. Sebenarnya penyebab dan kesalahan sintaks adalah prematur string " penghentian.

It's juga tidak mungkin untuk sarang PHP start kategori:

<?php echo <?php my_func(); ?> ↑

Lihat juga:

Komentar (0)

Tak terduga '?'

Jika anda mencoba untuk menggunakan null penggabungan operator ?? di versi PHP PHP sebelum 7 anda akan mendapatkan kesalahan ini.

<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP

Tak terduga '?', mengharapkan variabel

Kesalahan yang serupa dapat terjadi karena nullable jenis, seperti dalam:

function add(?int $sum): ?int {

Yang lagi-lagi menunjukkan usang versi PHP yang digunakan (baik CLI versi php -v atau webserver terikat satu phpinfo();).

Komentar (0)

Tak terduga T_LNUMBER

Token T_LNUMBER mengacu pada "lama" / nomor.

  1. 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

  • Cukup sering datang up untuk menggunakan preg_replace-penampung "$1" di PHP konteks:

↓ ⇓ ↓

preg_replace("/#(\w+)/e", strtopupper($1) )

Di mana callback harus telah dikutip. (Sekarang /e regex bendera telah usang. Tapi itu's kadang-kadang masih disalahgunakan di preg_replace_callback fungsi.)

↓ $json->0->nilai

  • Sementara tokenizer/parser tidak memungkinkan literal $1 sebagai nama variabel, satu bisa gunakan ${1} atau ${"1"}. Yang merupakan sintaksis solusi untuk non-standar pengenal. (Itu's terbaik untuk menganggapnya sebagai sebuah lingkup lokal lookup. Tapi umumnya: lebih suka polos array untuk kasus seperti ini!)

  • Menggelikan, tapi sangat tidak dianjurkan, PHPs parser memungkinkan Unicode-pengenal; seperti bahwa $➊ akan berlaku. (Tidak seperti literal 1).

  1. 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.

  1. salah kutip HTML

Dan lagi, salah kutip string adalah sumber sering nyasar nomor:

↓ ↓

echo "sesuatu yang buruk";

Kasus seperti ini harus ditangani lebih atau kurang seperti Unexpected T_STRING kesalahan.

  1. pengenal Lainnya

Tidak fungsi, kelas, atau namespaces dapat diberi nama dimulai dengan nomor kedua:

↓ fungsi 123shop() {

Cukup banyak yang sama seperti untuk nama variabel.

Komentar (0)

Tak terduga '='

Hal ini dapat disebabkan oleh memiliki karakter yang tidak valid dalam variabel nama. Variabel nama harus ikuti aturan ini:

nama Variabel mengikuti aturan yang sama seperti yang lain label di PHP. Yang valid nama variabel dimulai dengan huruf atau garis bawah, diikuti oleh sejumlah huruf, angka, atau garis bawah. Sebagai ekspresi reguler, akan dinyatakan demikian: '[a-zA-Z\x7f-\xff][a-zA-Z0-9\x7f-\xff]*'

Komentar (1)

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 sebagai foreach atau jika 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 melakukan kembali(return(false);;

Komentar (0)

Tak terduga 'endwhile' (T_ENDWHILE)

Sintaks menggunakan usus besar - jika tidak ada usus besar kesalahan di atas akan terjadi.

<?php while($query->fetch()): ?>
 ....
<?php endwhile; ?>

Alternatif untuk sintaks ini menggunakan kurung kurawal:

<?php while($query->fetch()) { ?>
  ....
<?php } ?>

http://php.net/manual/en/control-structures.while.php

Komentar (0)

Pesan kesalahan yang mulai Parse error: syntax error, unexpected &#39;:&#39; dapat disebabkan oleh keliru menulis statis kelas referensi Kelas::$Variabel sebagai Kelas:$Variable.

Komentar (0)