Kesalahan parse / sintaksis PHP; dan bagaimana menyelesaikannya

651

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:

Referensi yang terkait erat:

Dan:

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 tidak-berkaitan, tapi a - 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.

mario
sumber
1
Ini tidak cukup data untuk menjadi jawaban, tetapi orang bisa menulis analisa dengan parsekit_compile_string, dan memberikan jawaban yang lebih ramah pada itu. Jika diintegrasikan ke dalam IDE Anda, ini bisa sangat informatif.
Owen Beresford
4
Anda melakukan pekerjaan yang luar biasa dalam hal ini. Hormati itu. Mungkin sangat baik bagi guru untuk belajar menunjukkan kesalahan secara cepat atau bagi mereka yang membuat IDE atau mengimplementasikan perbaikan cepat. Namun, IDE sudah efektif melakukan sebagian besar pekerjaan ini untuk Anda, seperti yang disarankan oleh @Panique. Selain itu, banyak kasus, mulai lagi dari awal adalah pilihan yang baik.
allprog
1
@ Fred-ii- Saya pikir sebagian besar penyebabnya mirip dengan T_IF / T_FOREACH / ...blok. Meskipun saya ingin menyusun ringkasan yang lebih khusus untuk pertanyaan IF / ELSE / ELSEIF.
mario
1
@ Mario Tidak tahu bagaimana cara mengucapkan ini, tetapi apakah T&J ini mungkin ditulis ulang dan lebih terstruktur? (komentar temporer)
Rizier123
2
Anda tahu, saya berharap saya memiliki daftar ini ketika saya sedang belajar PHP tahun yang lalu. Sangat membantu, terutama untuk pemula.
Chipster

Jawaban:

291

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.

Sintaks definisi fungsi abstrak

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.

    Diharapkan: titik koma

  • Baca referensi bahasa dan contoh dalam manual. Dua kali, untuk menjadi agak mahir.

Bagaimana menafsirkan kesalahan parser

Pesan kesalahan sintaksis tipikal berbunyi:

Kesalahan parse : kesalahan sintaksis, T_STRING yang tidak terduga , mengharapkan ' ;' di file.php pada baris 217

Yang mencantumkan kemungkinan lokasi kesalahan sintaksis. Lihat nama file dan nomor baris yang disebutkan .

Seorang moniker seperti T_STRINGmenjelaskan 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 ifpernyataan kompleks menjadi ifkondisi 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:

      1. Kode Anda dapat dengan mudah diidentifikasi sebagai benar,
      2. Bagian Anda tidak yakin tentang,
      3. Dan garis-garis yang dikeluhkan pengurai.

      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 suka ifpernyataan 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.

    • Mengadopsi sistem versi kode sumber. Anda selalu dapat melihat diffversi 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.phpsebagai 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.inisecara umum, atau via .htaccessuntuk 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:

<?php
   error_reporting(E_ALL);
   ini_set("display_errors", 1);
   include("./broken-script.php");

Kemudian aktifkan kode gagal dengan mengakses skrip pembungkus ini.

Ini juga membantu untuk mengaktifkan PHP error_logdan melihat ke server weberror.log Anda ketika skrip crash dengan respons HTTP 500.

mario
sumber
error_reporting(E_ALL | E_STRICT);untuk versi PHP yang lebih lama
Geo
2
Beberapa IDE (seperti NetBeans) tidak hanya mendukung penyorotan sintaksis tetapi juga pemformatan kode. Jika Anda terbiasa memformat kode dengan benar dan meminta IDE untuk memformat ulang untuk berjaga-jaga, Anda mungkin akan kesulitan menemukan masalah seperti kawat gigi yang tidak cocok.
Josep Valls
115

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

  1. NetBeans [gratis]
  2. PHPStorm [$ 199 USD]
  3. Eclipse dengan Plugin PHP [gratis]
  4. Luhur [$ 80 USD] (terutama editor teks, tetapi dapat diperluas dengan plugin, seperti PHP Syntax Parser )
Sliq
sumber
2
Jelas sekali. Namun, dengan menuliskan kembali IDE di sini, dapatkah Anda menjelaskan sedikit di mana mereka berbeda dalam bantuan sintaksis mereka? Sublim sebagian besar adalah editor, bukan IDE; tapi kemudian lebih cantik dan tajam; terutama hanya syntax highlighing tetapi juga benar di pencocokan braket. Ini dengan mudah menemukan kesalahan T_CONSTANT_AND_ENCAPSED langsung misalnya, tidak seperti PHPStorm; Namun yang melakukan garis berlekuk lebih banyak untuk kesalahan inline. Petunjuk sintaksis NetBeans digunakan untuk menjadi lebih samar daripada PHPs bahkan (relisting memperbolehkan membangun bukan). Bisakah Anda berbagi pengalaman tentang pro / kontra; apakah Eclipse / PDT favorit Anda atau ..?
mario
@ Mario Saya pikir Anda benar-benar terlibat dalam topik ini, jadi saya benar-benar tidak ingin mengatakan sesuatu yang salah di sini, tetapi semua kode I (dan rekan tim saya, teman yang memberi kode, mitra lepas) yang pernah ditulis dalam IDE tidak pernah dieksekusi dengan kesalahan sintaksis. Jadi saya pikir setidaknya cek sintaksis Netbeans / PHPStorm sangat kuat. Tapi mungkin saya salah membaca pertanyaan Anda. Beri aku beberapa jam ...;)
Sliq
Jawaban Anda sudah tepat. Cocok 99% dari pertanyaan kami. Namun untuk konteks di sini saya ingin pertimbangan trade-off di mana IDE memberikan tooltips yang lebih ramah-pemula . Mungkin kecil bagi kami, pewarnaan dan garis berlekuk cukup jika Anda cukup berpengalaman. Tapi saya kira perbedaannya bisa lebih signifikan bagi pemula.
mario
Terkadang IDE bukanlah opsi yang layak. Misalnya, melakukan pengeditan cepat ke tema atau plugin WordPress. Ya, saya bisa menyalin semua kode ke dalam IDE, tapi kemudian saya harus membukanya, menempelkan semuanya di sana, mengatur header dan semua waktu yang membuang-buang omong kosong, ketika saya hanya berharap untuk mengedit cepat. Sekarang, jika Anda sedang mengembangkan fitur baru atau mulai dari awal, maka, ya, lakukan dalam IDE. Anda tidak akan menyesal mengambil sedikit waktu ekstra di awal untuk mengaturnya.
1934286
Saya melihat IDE sebagai trailer, bukan hanya kotak peralatan. Ini mungkin tidak MEMPERBAIKI tetapi dapat membantu Anda menemukan dan mencegah kesalahan sintaksis. Banyak jawaban di sini tampaknya mengatakan bahwa jika Anda menjaga kode Anda bersih, Anda memiliki sedikit kesempatan untuk membuat kesalahan dan lebih mudah dikenali. Baik dengan indentasi otomatis, petunjuk kode, kemunculan variabel, kurung tutup otomatis dan pemformatan otomatis menghemat banyak kesalahan ketik sehari dan merupakan keuntungan utama mengapa saya menggunakannya. Ini tidak termasuk semua yang berada di luar cakupan pertanyaan ini (debugger, konektor basis data, diagram uml, dll.) IDE akan menghemat waktu Anda dan akan mencegah lebih dari sekadar kesalahan sintaksis.
Louis Loudog Trottier
58

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

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

Dereferencing hasil fungsi array juga tidak tersedia untuk versi PHP yang lebih lama:

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

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-fcgidapat 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 tidak

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

    protected $var["x"] = "Nope";
                  
  • Membingungkan [dengan membuka kurung kurawal {atau kurung (adalah pengawasan umum.

    foreach [$a as $b)
            

    Atau bahkan:

    function foobar[$a, $b, $c] {
                   
  • Atau mencoba konstanta dereferensi (sebelum PHP 5.6) sebagai array:

    $var = const[123];
           

    Setidaknya PHP mengartikannya constsebagai 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 globalkata kunci pada anggota array asosiatif. Ini bukan sintaks yang valid:

    global $var['key'];


Braket kotak ] penutup yang tidak terduga

Ini agak jarang, tetapi ada juga sintaksis kecelakaan dengan ]braket array terminating .

  • Sekali lagi ketidakcocokan dengan )kurung atau kurung }kurawal adalah hal yang umum:

    function foobar($a, $b, $c] {
                              
  • Atau mencoba mengakhiri array yang tidak ada:

    $var = 2];

    Yang sering terjadi dalam deklarasi array multi-line dan bersarang .

    $array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15];
                                                 

    Jika demikian, gunakan IDE Anda untuk pencocokan braket untuk menemukan ]penutupan array prematur . Paling tidak gunakan lebih banyak spasi dan baris baru untuk mempersempitnya.

mario
sumber
Tautan 'PHP 5.4 syntax down-converters' github.com/IonutBajescu/short-arrays-to-long-arrays di atas rusak.
Danimal Reks
46

T_VARIABLE tidak terduga

"Tak terduga T_VARIABLE" berarti ada $variablenama literal , yang tidak cocok dengan struktur ekspresi / pernyataan saat ini.

operator abstrak / tidak sengaja + diagram variabel $

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

           
    func1()
    $var = 1 + 2;     # parse error in line +2
  2. Rangkaian string

    Kecelakaan yang sering terjadi adalah penggabungan string dengan .operator yang dilupakan :

                                   
    print "Here comes the value: "  $value;

    Btw, Anda harus lebih memilih interpolasi string (variabel dasar dalam tanda kutip ganda) kapan pun yang membantu keterbacaan. Yang menghindari masalah sintaksis ini.

    Interpolasi string adalah fitur inti bahasa scripting . Tidak perlu malu menggunakannya. Abaikan saran pengoptimalan mikro tentang .penggabungan variabel yang lebih cepat . Ini bukan.

  3. Operator ekspresi tidak ada

    Tentu saja masalah yang sama dapat muncul dalam ekspresi lain, misalnya operasi aritmatika:

               
    print 4 + 7 $var;

    PHP tidak dapat menebak di sini jika variabel seharusnya ditambahkan, dikurangi atau dibandingkan dll.

  4. Daftar

    Sama untuk daftar sintaks, seperti dalam populasi array, di mana parser juga menunjukkan koma yang diharapkan ,misalnya:

                                          
    $var = array("1" => $val, $val2, $val3 $val4);

    Atau daftar parameter fungsi:

                                    
    function myfunc($param1, $param2 $param3, $param4)

    Setara Anda melihat ini dengan listatau globalpernyataan, atau ketika tidak memiliki ;titik koma dalam satu forlingkaran.

  5. 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:

    class xyz {      
        var $value = $_GET["input"];

    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.

  6. Variabel setelah pengidentifikasi

    Anda juga tidak dapat memiliki variabel yang mengikuti pengenal secara langsung:

                 
    $this->myFunc$VAR();

    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.

    Ingatlah bahwa menggunakan variabel variabel harus menjadi pengecualian. Pendatang baru sering mencoba menggunakannya terlalu santai, bahkan ketika array akan lebih sederhana dan lebih sesuai.

  7. Kurung yang hilang setelah konstruksi bahasa

    Pengetikan yang tergesa-gesa dapat menyebabkan pembukaan dan penutupan tanda kurung untuk ifdan fordan foreachpernyataan:

           
    foreach $array as $key) {

    Solusi: tambahkan celah yang hilang (antara pernyataan dan variabel.

                          
    if ($var = pdo_query($sql) {
         $result = 

    Kurung {kurawal tidak membuka blok kode, tanpa menutup ifekspresi dengan )kurung tutup terlebih dahulu.

  8. Lain tidak mengharapkan kondisi

         
    else ($var >= 0)

    Solusi: Hapus kondisi dari elseatau gunakan elseif.

  9. Perlu tanda kurung untuk penutupan

         
    function() uses $var {}

    Solusi: Tambahkan tanda kurung di sekitar $var.

  10. 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:

    <?php
                              
    $var = new PDO(...);

    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

mario
sumber
32

T_CONSTANT_ENCAPSED_STRING
Tidak Terduga T_ENCAPSED_AND_WHITESPACE

Nama T_CONSTANT_ENCAPSED_STRING- nama yang berat dan T_ENCAPSED_AND_WHITESPACEmerujuk 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.

  1. Interpolasi variabel tidak benar

    Dan itu muncul paling sering untuk interpolasi variabel PHP yang salah:

                                   
    echo "Here comes a $wrong['array'] access";

    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:

    echo "This is only $valid[here] ...";

    Namun array bersarang atau referensi objek yang lebih dalam memerlukan sintaksis ekspresi string keriting yang kompleks :

    echo "Use {$array['as_usual']} with curly syntax.";

    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.

  2. Rangkaian tidak ada

    Jika string mengikuti ekspresi, tetapi tidak memiliki rangkaian atau operator lain, maka Anda akan melihat PHP mengeluh tentang string literal:

                           
    print "Hello " . WORLD  " !";

    Meskipun jelas bagi Anda dan saya, PHP tidak dapat menebak bahwa string dimaksudkan untuk ditambahkan di sana.

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

                    
    print "<a href="' . $link . '">click here</a>";
          ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟

    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.

    Tip : Atur editor / IDE Anda untuk menggunakan pewarnaan yang sedikit berbeda untuk string yang dikutip tunggal dan ganda. (Ini juga membantu dengan logika aplikasi untuk memilih misalnya string yang dikutip ganda untuk output tekstual, dan string yang dikutip hanya untuk nilai-nilai yang konstan).

    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:

    print "<a href=\"{$link}\">click here</a>";

    Meskipun hal ini juga dapat menyebabkan kebingungan sintaksis, semua IDE / editor yang lebih baik lagi membantu dengan mewarnai kutipan yang diloloskan secara berbeda.

  4. Kutipan pembuka tidak ada

    Sama sekali lupa membuka "/ 'mengutip resep untuk kesalahan parser:

                   
     make_url(login', 'open');

    Di sini ', 'akan menjadi string literal setelah kata pengantar, ketika jelas logindimaksudkan untuk menjadi parameter string.

  5. Daftar susunan

    Jika Anda melewatkan ,koma di blok pembuatan array, parser akan melihat dua string berturut-turut:

    array(               
         "key" => "value"
         "next" => "....",
    );

    Perhatikan bahwa baris terakhir mungkin selalu mengandung koma tambahan, tetapi menghadapinya tidak dapat dimaafkan. Yang sulit ditemukan tanpa penyorotan sintaksis.

  6. Daftar parameter fungsi

    Hal yang sama untuk panggilan fungsi :

                             
    myfunc(123, "text", "and"  "more")
  7. String pelarian

    Variasi umum adalah terminator string yang cukup mudah dilupakan:

                                    
    mysql_evil("SELECT * FROM stuffs);
    print "'ok'";
          ⇑

    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

mario
sumber
27

T_STRING Tidak Terduga

T_STRINGsedikit keliru. Itu tidak merujuk pada kutipan "string". Ini berarti pengidentifikasi mentah ditemukan. Ini dapat berkisar dari barekata-kata hingga sisa CONSTANTatau nama fungsi, string yang tidak dikutip, atau teks biasa.

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

                                     
     echo "<a href="http://example.com">click here</a>";

    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 .

    • Untuk kenyamanan Anda harus memilih tanda kutip tunggal terluar ketika mengeluarkan HTML biasa dengan tanda kutip ganda di dalamnya.
    • Gunakan string yang dikutip ganda jika Anda ingin menginterpolasi variabel, tetapi kemudian hati-hati karena lolos dari "tanda kutip ganda.
    • Untuk output yang lebih panjang, lebih suka beberapa echo/ printbaris 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:

    $text = '<div>some text with <?php echo 'some php entry' ?></div>'

    Ini terjadi jika $textbesar dengan banyak baris dan pengembang tidak melihat seluruh nilai variabel PHP dan fokus pada potongan kode yang lupa tentang sumbernya. Contohnya ada di sini

    Lihat juga Apa perbedaan antara string tanda kutip tunggal dan kutip ganda dalam PHP? .

  2. 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:

                                                           
    echo "Some text", $a_variable, "and some runaway string ;
    success("finished");
             ⇯

    Bukan hanya secara literal T_STRINGyang bisa diprotes oleh parser. Variasi lain yang sering digunakan adalah Unexpected '>'HTML literal tanpa tanda kutip.

  3. 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:

    $text = Something something..’ + these ain't quotes”;

    Kutipan tipografi / pintar adalah simbol Unicode. PHP memperlakukan mereka sebagai bagian dari teks alfanumerik yang berdampingan. Misalnya ”theseditafsirkan sebagai pengidentifikasi konstan. Tetapi setiap literal teks berikut ini kemudian dilihat sebagai bareword / T_STRING oleh parser.

  4. 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:

           
    func1()
    function2();

    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.

  5. Tag terbuka pendek dan <?xml header di skrip PHP

    Ini agak tidak biasa. Tetapi jika short_open_tags diaktifkan, maka Anda tidak dapat memulai skrip PHP Anda dengan deklarasi XML :

          
    <?xml version="1.0"?>

    PHP akan melihat <?dan mengklaimnya kembali untuk dirinya sendiri. Itu tidak akan mengerti untuk apa nyasar xmlitu dimaksudkan. Itu akan ditafsirkan sebagai konstan. Tetapi versionakan 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.

  6. 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:

    <?php
        print 123;

    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:

    <?php
        ;print 123;

    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.

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

  8. 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\\".

mario
sumber
18

Tidak terduga (

Membuka tanda kurung biasanya mengikuti konstruksi bahasa seperti if/ foreach/ for/ array/ listatau memulai ekspresi aritmatika. Mereka secara sintaksis salah setelah "strings", sebelumnya (), sendirian $, dan dalam beberapa konteks deklarasi tipikal.

  1. Parameter deklarasi fungsi

    Kejadian yang lebih jarang untuk kesalahan ini adalah mencoba menggunakan ekspresi sebagai parameter fungsi default . Ini tidak didukung, bahkan dalam PHP7:

    function header_fallback($value, $expires = time() + 90000) {

    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.

  2. Default properti kelas

    Hal yang sama untuk deklarasi anggota kelas , di mana hanya nilai literal / konstan yang diizinkan, bukan ekspresi:

    class xyz {                   
        var $default = get_config("xyz_default");

    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.

  3. Sintaks JavaScript dalam PHP

    Menggunakan sintaksis JavaScript atau jQuery tidak akan berfungsi di PHP karena alasan yang jelas:

    <?php      
        print $(document).text();

    Ketika ini terjadi, biasanya menunjukkan string sebelumnya yang tidak ditentukan; dan <script>bagian literal bocor ke dalam konteks kode PHP.

  4. isset (()), kosong, kunci, selanjutnya, saat ini

    Keduanya isset()dan empty()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:

              
    if (isset(($_GET["id"]))) {

    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 )

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

                  
    callfunc(1, 2, );

    Tanda koma hanya dibolehkan masuk array()atau list()dibuat.

  2. Ekspresi yang belum selesai

    Jika Anda lupa sesuatu dalam ekspresi aritmatika, maka pengurai menyerah. Karena bagaimana seharusnya itu menafsirkan bahwa:

                   
    $var = 2 * (1 + );

    Dan jika Anda lupa penutupannya ) bahkan, maka Anda akan mendapatkan keluhan tentang titik koma yang tak terduga.

  3. Berjuang sebagai constant

    Untuk awalan variabel yang terlupakan $dalam pernyataan kontrol, Anda akan melihat:

                           
    foreach ($array as wrong) {

    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.

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

                                  
    if (($x == $y) && (2 == true) {

    Hitung tanda kurung Anda atau gunakan IDE yang membantu itu. Juga jangan menulis kode tanpa spasi. Jumlah keterbacaan diperhitungkan.

  2. {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:

               
    $var = 5 * {7 + $x};

    Ada beberapa pengecualian untuk konstruksi pengidentifikasi, seperti variabel lingkup lokal ${references}.

  3. Variabel variabel atau ekspresi curly var

    Ini sangat jarang. Tetapi Anda mungkin juga mendapatkan {dan }memilah keluhan untuk ekspresi variabel yang kompleks:

                          
    print "Hello {$world[2{]} !";

    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.

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

    function whatever() {
        doStuff()
    }            

    Di sini parser tidak dapat memastikan apakah Anda mungkin masih ingin menambah + 25;hasil fungsi atau yang lainnya.

  2. Sarang blok tidak valid / Lupa {

    Terkadang Anda akan melihat kesalahan parser ini ketika blok kode }ditutup terlalu dini, atau Anda {bahkan lupa pembukaan :

    function doStuff() {
        if (true)    
            print "yes";
        }
    }   

    Dalam cuplikan di atas, kurung kurawal tidak ifterbuka {. 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.

  1. Daftar parameter

    Misalnya fungsi yang salah tulis tanpa daftar parameter tidak diizinkan:

                     
    function whatever {
    }
  2. Kondisi pernyataan kontrol

    Dan Anda juga tidak dapat memiliki ifkondisi tanpa .

      
    if {
    }

    Jelas itu tidak masuk akal. Hal yang sama untuk tersangka biasa, for/ foreach, while/ do, dll.

    Jika Anda memiliki kesalahan khusus ini, Anda pasti harus mencari beberapa contoh manual.

mario
sumber
1
Sedang mencari jawaban untuk pertanyaan saya di posting ini, tetapi menemukan jawaban sendiri untuk masalah - "{Unexpected {", itulah sebabnya saya ingin berbagi dengan jawaban saya - bagi saya masalahnya adalah pemecah baris penyandian - entah bagaimana beberapa dari saya file menggunakan jeda baris macintosh, tetapi ketika saya mengubahnya ke jeda baris windows - masalah saya (pada localhost (WAMP) semuanya bekerja, tetapi pada linux server web tidak) diselesaikan.
Edgars Aivars

@EdgarsAivars Terima kasih atas komentar Anda! Linebreak khusus platform memang merupakan masalah yang tidak biasa dan rumit. Saya mungkin akan menyebutkannya di sini juga. (Itu hanya disebutkan sebagai samping dalam jawaban referensi lain .)
mario

Saya menemukan bahwa mendapatkan Unexpected} karena sepotong kode saya menggunakan tag pendek php <? alih-alih <? php - perlu waktu beberapa saat untuk menemukan yang ini berfungsi di server lain.
c7borg
14

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

Penyebab: Tidak seimbang {dan }untuk blok kode / dan fungsi atau deklarasi kelas.

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:

    • NetBeans, PhpStorm, Komodo: Ctrl[danCtrl]
    • Eclipse, Aptana: CtrlShiftP
    • Atom, Luhur: Ctrlm- Zend StudioCtrlM
    • Geany, Notepad ++: CtrlB- Joe: CtrlG- Emacs: C-M-n- Vim:%

Sebagian besar IDE juga menyoroti kawat gigi, tanda kurung, dan tanda kurung yang cocok. Yang membuatnya mudah untuk memeriksa korelasinya:

Pencocokan braket dalam IDE

Ekspresi yang dikurangi

Dan Unexpected $endkesalahan sintaks / pengurai juga dapat terjadi untuk ekspresi atau pernyataan yang tidak dikuatkan:

  • $var = func(1, ?>EOF

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

print <<< END
    Content...
    Content....
  END;
# ↑ terminator isn't exactly at the line start

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:dan else:dan yang hilang endif;misalnya.

Lihat juga:

mario
sumber
14

T_IF
Tak Terduga T_ELSEIF
Tak Terduga T_ELSE
Tak Terduga T_ENDIF

Blok kontrol bersyarat if, elseifdan elseikuti struktur sederhana. Ketika Anda menemukan kesalahan sintaks, kemungkinan besar hanya bersarang blok tidak valid → dengan {kurung kurawal yang hilang }- atau terlalu banyak.

masukkan deskripsi gambar di sini

  1. Tidak ada {atau }karena indentasi yang salah

    Kawat gigi kode yang tidak cocok adalah umum untuk kode yang kurang diformat dengan baik seperti:

    if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
    ($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){

    Jika kode Anda terlihat seperti ini, mulailah dari awal! Kalau tidak, itu tidak bisa diperbaiki untuk Anda atau orang lain. Tidak ada gunanya menampilkan ini di internet untuk meminta bantuan.

    Anda hanya akan dapat memperbaikinya, jika Anda dapat secara visual mengikuti struktur bersarang dan hubungan if / else conditional dan {blok kode mereka }. Gunakan IDE Anda untuk melihat apakah semuanya sudah berpasangan.

    if (true) {
         if (false) {
                  
         }
         elseif ($whatever) {
             if ($something2) {
                 
             } 
             else {
                 
             }
         }
         else {
             
         }
         if (false) {    //   a second `if` tree
             
         }
         else {
             
         }
    }
    elseif (false) {
        
    }

    Setiap dobel } }tidak hanya akan menutup cabang, tetapi struktur kondisi sebelumnya. Oleh karena itu tetap dengan satu gaya pengkodean; jangan campur dan cocokkan di pohon if / else bersarang.

    Terlepas dari konsistensi di sini, ternyata bermanfaat untuk menghindari kondisi yang panjang juga. Gunakan variabel atau fungsi sementara untuk menghindari ekspresi yang tidak bisa dibaca if.

  2. IF tidak dapat digunakan dalam ekspresi

    Kesalahan pendatang baru yang sering terjadi adalah mencoba menggunakan ifpernyataan dalam ekspresi, seperti pernyataan cetak:

                       
    echo "<a href='" . if ($link == "example.org") { echo 

    Tentu saja yang tidak valid.

    Anda dapat menggunakan persyaratan ternary , tetapi waspadai dampak keterbacaan.

    echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";

    Kalau tidak, hancurkan konstruksi output seperti ini: gunakan multiple ifs dan echos .
    Lebih baik lagi, gunakan variabel sementara , dan tempatkan kondisimu sebelumnya:

    if ($link) { $href = "yes"; } else { $href = "no"; }
    echo "<a href='$href'>Link</a>";

    Mendefinisikan fungsi atau metode untuk kasus-kasus seperti itu seringkali masuk akal juga.

    Blok kontrol tidak mengembalikan "hasil"

    Sekarang ini kurang umum, tetapi beberapa coders bahkan mencoba memperlakukan ifseolah-olah itu dapat mengembalikan hasil :

    $var = if ($x == $y) { "true" };

    Yang secara struktural identik dengan penggunaan ifdalam string / ekspresi string.

    • Tetapi struktur kontrol (jika / foreach / while) tidak memiliki "hasil" .
    • String literal "true" juga akan menjadi pernyataan kosong.

    Anda harus menggunakan tugas dalam blok kode :

    if ($x == $y) { $var = "true"; }

    Atau, ?:gunakan perbandingan terner.

    If in If

    Anda tidak dapat membuat sarangif dalam kondisi:

                        
    if ($x == true and (if $y != false)) { ... }

    Yang jelas berlebihan, karena and(atau or) sudah memungkinkan perbandingan rantai.

  3. Tanda ;titik koma yang terlupakan

    Sekali lagi: Setiap blok kontrol harus berupa pernyataan. Jika potongan kode sebelumnya tidak diakhiri dengan tanda titik koma, maka itu adalah kesalahan sintaksis yang dijamin:

                    
    $var = 1 + 2 + 3
    if (true) {  }

    Btw, baris terakhir dalam {…}blok kode juga perlu titik koma.

  4. Titik koma terlalu dini

    Sekarang mungkin salah untuk menyalahkan gaya pengkodean tertentu, karena perangkap ini terlalu mudah untuk diabaikan:

                
    if ($x == 5);
    {
        $y = 7;
    }
    else           
    {
        $x = -1;    
    }

    Yang terjadi lebih sering daripada yang Anda bayangkan.

    • Ketika Anda mengakhiri if ()ekspresi dengan; itu akan menjalankan pernyataan kosong. The ;menjadi kosong {}sendiri!
    • The {…}blok sehingga terlepas dari if, dan akan selalu berjalan.
    • Jadi elsetidak lagi memiliki hubungan dengan ifkonstruksi terbuka , itulah sebabnya ini akan menyebabkan kesalahan sintaks T_ELSE yang tidak terduga.

    Yang juga menjelaskan variasi halus kesalahan sintaksis ini:

    if ($x) { x_is_true(); }; else { something_else(); };

    Di mana ;setelah blok kode {…}mengakhiri seluruh if konstruksi, memutuskan elsecabang secara sintaksis.

  5. Tidak menggunakan blok kode

    Secara sintaksis diperbolehkan untuk menghilangkan kurung kurawal {... }untuk blok kode di if/ elseif/ elsecabang. Yang sayangnya adalah gaya sintaksis yang sangat umum untuk coders yang tidak berversi. (Dengan asumsi yang salah ini lebih cepat untuk mengetik atau membaca).

    Namun itu sangat mungkin untuk meningkatkan sintaksis. Cepat atau lambat pernyataan tambahan akan menemukan jalan mereka ke cabang if / else:

    if (true)
        $x = 5;
    elseif (false)
        $x = 6;
        $y = 7;     
    else
        $z = 0;

    Tetapi untuk benar-benar menggunakan blok kode, Anda harus menulis {... }seperti itu!

    Bahkan programmer berpengalaman menghindari sintaksis tanpa gelang ini, atau setidaknya memahaminya sebagai pengecualian yang luar biasa terhadap aturan.

  6. Else / Elseif dalam urutan yang salah

    Satu hal yang perlu diingatkan adalah tatanan bersyarat , tentu saja.

    if ($a) {  }
    else {  }
    elseif ($b) {  }
    

    Anda dapat memiliki sebanyak yang elseifAnda inginkan, tetapi elseharus pergi terakhir . Begitulah adanya.

  7. Deklarasi kelas

    Seperti disebutkan di atas , Anda tidak dapat memiliki pernyataan kontrol dalam deklarasi kelas:

    class xyz {
        if (true) {
            function ($var) {}
        }

    Anda juga lupa definisi fungsi , atau menutupnya }terlalu awal dalam kasus tersebut.

  8. T_ELSEIF / T_ELSE yang tidak terduga

    Saat mencampur PHP dan HTML, penutup }untuk if/elseifharus dalam blok PHP yang sama <?php ?>dengan yang berikutnya elseif/else. Ini akan menghasilkan kesalahan sebagai penutup }dari ifkebutuhan untuk menjadi bagian dari elseif:

    <?php if ($x) { ?>
        html
    <?php } ?>
    <?php elseif ($y) { ?>
        html
    <?php } ?>

    Bentuk yang benar <?php } elseif:

    <?php if ($x) { ?>
        html
    <?php } elseif ($y) { ?>
        html
    <?php } ?>

    Ini lebih atau kurang variasi dari indentasi yang salah - mungkin sering didasarkan pada niat pengkodean yang salah.
    Anda tidak dapat menumbuk pernyataan lain antara if dan elseif/ elsetoken struktural:

    if (true) {
    }
    echo "in between";    
    elseif (false) {
    }
    ?> text <?php      
    else {
    }

    Entah hanya dapat terjadi di {…}blok kode, bukan di antara token struktur kontrol.

    • Ini tidak masuk akal. Bukannya ada kondisi "tidak terdefinisi" ketika PHP beralih ifdan elsebercabang.
    • Anda harus memutuskan di mana pernyataan cetak menjadi milik / atau jika perlu diulang di kedua cabang.

    Anda juga tidak dapat memisahkan jika / selain antara struktur kontrol yang berbeda:

    foreach ($array as $i) {
        if ($i) {  }
    }
    else {  }

    Tidak ada hubungan sintaksis antara ifdan else. The foreachleksikal lingkup berakhir pada }, sehingga tidak ada gunanya untuk ifstruktur untuk melanjutkan.

  9. T_ENDIF

    Jika T_ENDIF yang tidak terduga dikeluhkan, Anda menggunakan gaya sintaksis alternatif if:elseif:else:endif;. Yang harus Anda pikirkan dua kali.

    • Perangkap yang umum membingungkan usus yang mirip :dengan ;semicolon . (Tercakup dalam "Titik Koma terlalu dini")

    • Karena lekukan lebih sulit untuk dilacak dalam file templat, semakin saat menggunakan sintaks alternatif - masuk akal Anda endif;tidak cocok dengan apa pun if:.

    • Menggunakan } endif; adalah -minator ganda if .

    Sementara "$ end yang tidak terduga" biasanya merupakan harga untuk }kurung kurawal penutupan yang terlupakan .

  10. Penugasan vs. perbandingan

    Jadi, ini bukan kesalahan sintaksis, tetapi layak disebutkan dalam konteks ini:

           
    if ($x = true) { }
    else { do_false(); }

    Itu bukan ==/ ===perbandingan, tetapi =tugas . Ini agak halus, dan akan dengan mudah membuat beberapa pengguna tanpa daya mengedit seluruh blok kondisi. Berhati-hatilah dengan tugas yang tidak diinginkan terlebih dahulu - kapan saja Anda mengalami kesalahan logika / keliru.

mario
sumber
11

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, seperti ifekspresi. Jika parser mengeluh tentang mereka, maka itu sering berarti paring yang salah atau ( )parism yang tidak cocok di sekitar mereka.

  1. Pengelompokan orangtua

    Khususnya untuk ifpernyataan dengan beberapa perbandingan, Anda harus berhati-hati dalam menghitung kurung buka dan tutup dengan benar :

                            
    if (($foo < 7) && $bar) > 5 || $baz < 9) { ... }
                          

    Di ifsini kondisi di sini sudah diakhiri oleh)

    Setelah perbandingan Anda menjadi cukup kompleks, sering kali membantu untuk memecahnya menjadi beberapa ifkonstruksi sekaligus bersarang .

  2. isset () dihaluskan dengan membandingkan

    Pendatang baru yang umum adalah pitfal sedang mencoba untuk menggabungkan isset()atau empty()dengan perbandingan:

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

    Atau bahkan:

                        
    if (isset($variable !== "value")) {

    Ini tidak masuk akal untuk PHP, karena issetdan emptymerupakan konstruksi bahasa yang hanya menerima nama variabel. Tidak masuk akal untuk membandingkan hasilnya juga, karena outputnya hanya / sudah boolean.

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

    Kedua operator terlihat agak mirip, sehingga mereka kadang-kadang bingung:

             
    if ($var => 5) { ... }

    Anda hanya perlu mengingat bahwa operator perbandingan ini disebut " lebih besar atau sama dengan " untuk memperbaikinya.

    Lihat juga: Jika struktur pernyataan dalam PHP

  4. Tidak ada yang bisa dibandingkan

    Anda juga tidak dapat menggabungkan dua perbandingan jika berkaitan dengan nama variabel yang sama:

                     
    if ($xyz > 5 and < 100)

    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

  5. Rantai perbandingan

    Anda tidak dapat membandingkan dengan variabel dengan deretan operator:

                      
     $reult = (5 < $x < 10);

    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.

  6. Tak >
    Terduga Tak Terduga<

    Lebih besar >atau kurang dari <operator tidak memiliki T_XXXnama 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:

                            
    print "<a href='z">Hello</a>";
                     ↑

    Ini berjumlah string "<a href='z"yang dibandingkan >dengan konstanta literal Hellodan 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:

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

Lihat juga:

mario
sumber
11

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, echohanya dapat digunakan sebagai pernyataan. Mereka biasanya tinggal di garis sendiri.

  1. Titik koma; kamu di mana?

    Secara universal apakah Anda melewatkan titik koma di baris sebelumnya jika parser mengeluhkan pernyataan kontrol:

                 
    $x = myfunc()
    if (true) {

    Solusi: lihat baris sebelumnya; tambahkan titik koma.

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

    class xyz {
        if (true) {}
        foreach ($var) {}

    Kesalahan sintaksis seperti itu biasanya muncul untuk bersarang {dan }. Khususnya ketika blok kode fungsi ditutup terlalu dini.

  3. Pernyataan dalam konteks ekspresi

    Sebagian besar konstruksi bahasa hanya dapat digunakan sebagai pernyataan . Mereka tidak dimaksudkan untuk ditempatkan di dalam ekspresi lain:

                       
    $var = array(1, 2, foreach($else as $_), 5, 6);

    Anda juga tidak dapat menggunakan ifstring, ekspresi matematika atau di tempat lain:

                   
    print "Oh, " . if (true) { "you!" } . " won't work";
    // Use a ternary condition here instead, when versed enough.

    Untuk menyematkan if-seperti kondisi dalam ekspresi tertentu, Anda sering ingin menggunakan ?:evaluasi ternary .

    Hal yang sama berlaku untuk for, while, global, echodan memperpanjang lebih rendah list.

              
    echo 123, echo 567, "huh?";

    Sedangkan print()bahasa bawaan yang dapat digunakan dalam konteks ekspresi. (Tapi jarang masuk akal.)

  4. Kata kunci yang dicadangkan sebagai pengidentifikasi

    Anda juga tidak dapat menggunakan doatau ifdan konstruksi bahasa lainnya untuk fungsi atau nama kelas yang ditentukan pengguna. (Mungkin dalam PHP 7. Tetapi meskipun demikian itu tidak akan disarankan.)

mario
sumber
7

Tidak terduga '?'

Jika Anda mencoba menggunakan operator penggabungan nol ??dalam versi PHP sebelum PHP 7, Anda akan mendapatkan kesalahan ini.

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

'?' Tidak terduga, variabel yang diharapkan

Kesalahan serupa dapat terjadi untuk tipe nullable, seperti pada:

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

Yang lagi menunjukkan versi PHP yang ketinggalan zaman sedang digunakan (baik versi CLI php -vatau webserver terikat phpinfo();).

John Conde
sumber
5

T_LNUMBER yang tidak terduga

Token T_LNUMBERmengacu pada nomor "panjang" /.

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

    $1   // Bad
    $_1  // Good

    *

    • Cukup sering muncul untuk menggunakan preg_replace-placeholder "$1"dalam konteks PHP:

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

      Di mana panggilan balik seharusnya dikutip. (Sekarang /ebendera regex sudah usang. Tapi kadang-kadang masih disalahgunakan preg_replace_callbackfungsinya.)

    • Kendala pengidentifikasi yang sama berlaku untuk properti objek , btw.

             
      $json->0->value
    • Sementara tokenizer / parser tidak memungkinkan literal $1sebagai 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 literal 1).

  2. Entri array yang tersesat

    Panjang tak terduga juga dapat terjadi untuk deklarasi larik - saat kehilangan ,koma:

    #            ↓ ↓
    $xy = array(1 2 3);

    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.

  3. HTML salah kutip

    Dan lagi, string yang salah kutip adalah sumber yang sering nomor liar:

    #                 ↓ ↓          
    echo "<td colspan="3">something bad</td>";

    Kasus-kasus seperti itu harus diperlakukan kurang lebih seperti kesalahan T_STRING yang tidak terduga .

  4. Pengidentifikasi lainnya

    Baik fungsi, kelas, maupun ruang nama tidak bisa dinamai diawali dengan angka:

             
    function 123shop() {

    Hampir sama dengan nama variabel.

mario
sumber
2

'=' Tidak Terduga

Ini dapat disebabkan oleh memiliki karakter yang tidak valid dalam nama variabel. Nama variabel harus mengikuti aturan ini:

Nama variabel mengikuti aturan yang sama dengan label lain di PHP. Nama variabel yang valid dimulai dengan huruf atau garis bawah, diikuti sejumlah huruf, angka, atau garis bawah. Sebagai ungkapan reguler, ini akan diekspresikan sebagai berikut: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'

John Conde
sumber
Tambahan yang bagus John.
Funk Forty Niner
1

'Lanjutkan' yang tidak terduga (T_CONTINUE)

continueadalah 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 continuetidak 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 dengan foreachatau ifblok).

'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);;

mario
sumber
1

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:

function concatenate($transform, ...$strings) {
    $string = '';
    foreach($strings as $piece) {
        $string .= $piece;
    }
    return($transform($string));
}

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

Di PHP 7.4, Anda bisa menggunakannya untuk ekspresi Array .

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
John Conde
sumber
0

'Endwhile' yang tak terduga (T_ENDWHILE)

Sintaks menggunakan titik dua - jika tidak ada titik dua kesalahan di atas akan terjadi.

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

Alternatif untuk sintaks ini menggunakan kurung keriting:

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

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

mplungjan
sumber
0

Pesan kesalahan yang dimulai Parse error: syntax error, unexpected ':'dapat disebabkan oleh keliru menulis referensi statis kelas Class::$Variablesebagai Class:$Variable.

David Spector
sumber