PHP parse/syntax hataları; ve nasıl çözülür?
Herkes sözdizimi hatalarıyla karşılaşır. Deneyimli programcılar bile yazım hataları yapar. Yeni başlayanlar için bu sadece öğrenme sürecinin bir parçasıdır. Ancak, aşağıdaki gibi hata mesajlarını yorumlamak genellikle kolaydır:
PHP Parse error: syntax error, unexpected '{' in index.php on line 20 Beklenmedik sembol her zaman gerçek suçlu değildir. Ancak satır numarası, aramaya nereden başlanacağı konusunda kabaca bir fikir verir. Her zaman kod bağlamına bakın. Sözdizimi hatası genellikle bahsedilen veya önceki kod satırlarında gizlenir. Kodunuzu kılavuzdaki sözdizimi örnekleriyle karşılaştırın. Her durum diğeriyle eşleşmese de. Yine de sözdizimi hatalarını çözmek için bazı genel adımlar vardır](https://stackoverflow.com/a/18050072). Bu referanslar yaygın tuzakları özetlemiştir:
- Beklenmeyen T_STRING](https://stackoverflow.com/a/18092277)
- Beklenmeyen T_VARIABLE
Beklenmeyen '$varname' (T_VARIABLE)- Beklenmeyen T_CONSTANT_ENCAPSED_STRING
Beklenmeyen T_ENCAPSED_AND_WHITESPACE- Beklenmeyen $son
- Beklenmeyen T_FONKSİYON...
- Beklenmeyen
{
Beklenmeyen}
Beklenmeyen(
Beklenmeyen)
- Beklenmeyen
[
Beklenmeyen]
- Beklenmeyen T_IF
Beklenmeyen T_FOREACH
Beklenmeyen T_FOR
Beklenmeyen T_WHILE
Beklenmeyen T_DO
Beklenmeyen T_PRINT
Beklenmeyen T_ECHO- Beklenmeyen T_LNUMBER
- Beklenmeyen ?
- Beklenmeyen devam (T_CONTINUE)
Beklenmeyen devam (T_BREAK)
Beklenmeyen devam (T_RETURN)- Unexpected '='
- Beklenmeyen T_INLINE_HTML...
- Beklenmeyen T_PAAMAYIM_NEKUDOTAYIM...
- Beklenmeyen T_OBJECT_OPERATOR...
- Beklenmeyen T_DOUBLE_ARROW...
- Beklenmeyen T_SL...
- Beklenmeyen T_BOOLEAN_OR...
Beklenmeyen T_BOOLEAN_AND...- Beklenmeyen T_IS_EQUAL
Beklenmeyen T_IS_GREATER_OR_EQUAL
Beklenmeyen T_IS_IDENTICAL
Beklenmeyen T_IS_NOT_EQUAL
Beklenmeyen T_IS_NOT_IDENTICAL
Beklenmeyen T_IS_SMALLER_OR_EQUAL
Beklenmeyen<
Beklenmeyen>
- Beklenmeyen T_NS_SEPARATOR...
- Girdide beklenmeyen karakter: '``' (ASCII=92) state=1
- Beklenmeyen 'public' (T_PUBLIC)
Beklenmeyen 'private' (T_PRIVATE)
Beklenmeyen 'protected' (T_PROTECTED)
Beklenmeyen 'final' (T_FINAL)...- Beklenmeyen T_STATIC...
- Beklenmeyen T_CLASS...
- Beklenmeyen T_DNUMBER
- Beklenmeyen
,
(virgül)- Unpexected
.
(dönem)- Beklenmeyen
;
(noktalı virgül)- Beklenmeyen
*
(asterisk)- Beklenmeyen
:
(iki nokta üst üste) Yakından ilişkili referanslar:- PHP'de bu hata ne anlama geliyor? (çalışma zamanı hataları)
- Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_XXX
- Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE
- Parse error: syntax error, unexpected T_VARIABLE
- Bu sembol PHP'de ne anlama geliyor? (dil simgeleri)
- Bu
""
akıllı''
tırnak işaretleri PHP için hiçbir şey ifade etmiyor Ve:
- php.net'teki PHP kılavuzu ve çeşitli dil belirteçleri
- Veya Wikipedia'nın PHP üzerine sözdizimi tanıtımı.
- Ve son olarak php tag-wiki tabii ki. Stack Overflow çaylak kodlayıcılara da kucak açsa da, çoğunlukla profesyonel programlama sorularına yöneliktir.
- Herkesin kodlama hatalarına ve dar yazım hatalarına cevap vermek çoğunlukla konu dışı olarak kabul edilir.
- Bu nedenle, sözdizimi düzeltme istekleri göndermeden önce lütfen temel adımları takip etmek için zaman ayırın.
Eğer hala yapmak zorundaysanız, lütfen kendi çözüm girişiminizi, düzeltme girişimlerinizi ve neyin yanlış göründüğü veya olabileceği konusundaki düşünce sürecinizi gösterin. Eğer tarayıcınız "SyntaxError: illegal character" gibi hata mesajları gösteriyorsa, bu aslında [tag:php]ile ilgili değil, [tag:javascript]-syntax error ile ilgilidir.
Satıcı kodunda ortaya çıkan sözdizimi hataları: Son olarak, sözdizimi hatası kod tabanınızı düzenleyerek değil, harici bir satıcı paketi yüklendikten veya yükseltildikten sonra ortaya çıktıysa, PHP sürüm uyumsuzluğundan kaynaklanabileceğini göz önünde bulundurun, bu nedenle satıcı'nın gereksinimlerini platform kurulumunuzla karşılaştırın.
Sözdizimi hataları nelerdir?
PHP C-style ve imperative programlama dillerine aittir. Yanlış yerleştirilmiş semboller veya tanımlayıcılarla karşılaştığında kurtaramayacağı katı dilbilgisi kurallarına sahiptir. Kodlama niyetinizi tahmin edemez.
En önemli ipuçları
Her zaman alabileceğiniz birkaç temel önlem vardır:
Ayrıştırıcı hataları nasıl yorumlanır
Tipik bir sözdizimi hata mesajı şöyledir:
;
noktalı virgüller önceki satır sonlarında/ifadelerinde eksiktir. (En azından biçimsel açıdan. ){
kod blokları}
yanlış kapatılmış veya iç içe geçmişse, kaynak kodun daha da yukarısını araştırmanız gerekebilir. Bunu kolaylaştırmak için uygun kod girintisi kullanın.+-*/.
de farklı renklerde olmalıdır. Aksi takdirde yanlış bağlamda olabilirler."
veya'
dizgi işaretçisi buldunuz demektir.++
,--
veya parantez değilse işleçler yalnızdır. Birbirini doğrudan takip eden iki dizgi/tanımlayıcı çoğu bağlamda yanlıştır.if
ifadelerini farklı veya iç içeif
koşullarına bölün.Uzun kod bloklarını bölümlere ayırmak gerçekten sözdizimi hatalarının kaynağını bulmaya yardımcı olur.
? :
koşul operatörü kodu sıkıştırabilir ve gerçekten yararlıdır. Ancak her durumda okunabilirliğe yardımcı olmaz. İncelenmemişken düzif
ifadelerini tercih edin.39;nin alternatif sözdizimi (
if:/
elseif:/
endif;) şablonlar için yaygındır, ancak normal
{kod
}` bloklarına göre takip edilmesi daha az kolaydır.;
.veya
'` için uyumsuz dize tırnakları ve içindeki tırnakların açılmaması..
dize birleştirmesi için.(
parantezler)
. Bunları raporlanan satırda sayın. Eşit sayıda var mı?diff
ini her zaman görüntüleyebilirsiniz. Bu, sözdizimi sorununun ne olduğu konusunda aydınlatıcı olabilir.grep --color -P -n "\[\x80-\xFF\]" file.php
deneyin.//
veya#
yorumları kullanıldığında bir sorun olarak ortaya çıkar. Çok satırlı/*...*/
yorumları, satır sonları göz ardı edildiğinde ayrıştırıcıyı nadiren rahatsız eder.php -v
<?php phpinfo();
.Bunlar aynı olmak zorunda değildir. Özellikle çerçevelerle çalışırken, bunları eşleştirmeniz gerekir.
Beyaz ölüm ekranı
Web siteniz boşsa, bunun nedeni genellikle bir sözdizimi hatasıdır. İle görüntülenmelerini etkinleştirin:
error_reporting = E_ALL
display_errors = 1
Genel olarakphp.ini
dosyanızda veya mod_php için.htaccess
aracılığıyla, veya hatta FastCGI kurulumları ile.user.ini
. Bozuk betik içinde bunu etkinleştirmek çok geçtir çünkü PHP ilk satırı bile yorumlayamaz/çalıştıramaz. Hızlı bir çözüm,test.php
gibi bir sarmalayıcı betik hazırlamaktır:Ardından bu sarmalayıcı komut dosyasına erişerek başarısız olan kodu çağırın. Ayrıca PHP'nin
error_log
özelliğini etkinleştirmek ve bir betik HTTP 500 yanıtlarıyla çöktüğünde web sunucunuzun'error.log
dosyasına bakmak da yardımcı olur.Beklenmeyen T_VARIABLE
Bir "unexpected
T_VARIABLE
" mevcut ifade/ifade yapısına uymayan gerçek bir$variable
adı olduğu anlamına gelir.Eksik noktalı virgül
Genellikle bir önceki satırda eksik noktalı virgül olduğunu gösterir. Bir ifadeyi takip eden değişken atamaları nereye bakılacağının iyi bir göstergesidir:
Dize birleştirme
Sık karşılaşılan bir hata, unutulmuş
.
operatörü ile string concatenations:Bu arada, okunabilirliğe yardımcı olacaksa string interpolation (çift tırnak içinde temel değişkenler) tercih etmelisiniz. Bu da bu sözdizimi sorunlarını önler.
Eksik ifade operatörleri
Elbette aynı sorun aritmetik işlemler gibi diğer ifadelerde de ortaya çıkabilir:
PHP burada değişkenin eklenip eklenmeyeceğini, çıkarılıp çıkarılmayacağını veya karşılaştırılıp karşılaştırılmayacağını tahmin edemez.
Listeler
Dizi popülasyonlarında olduğu gibi, ayrıştırıcının örneğin beklenen bir virgül
,
belirttiği sözdizimi listeleri için de aynıdır:Veya fonksiyon parametre listeleri:
Bunu
list
veyaglobal
deyimlerinde veyafor
döngüsünde;
noktalı virgül olmadığında da görebilirsiniz.Sınıf bildirimleri
Bu ayrıştırıcı hatası [sınıf bildirimlerinde] de meydana gelir (https://stackoverflow.com/questions/5122729/im-getting-a-syntax-error-unexpected-t-variable-error-i-dont-see-what-im). Sadece statik sabitler atayabilirsiniz, ifadeler atayamazsınız. Bu nedenle ayrıştırıcı, değişkenleri atanmış veri olarak şikayet eder:
Eşleşmeyen
}
kapanış küme parantezleri özellikle buraya yol açabilir. Bir yöntem çok erken sonlandırılırsa (uygun girinti kullanın!), başıboş bir değişken genellikle sınıf bildirimi gövdesine yanlış yerleştirilir.Tanımlayıcılardan sonra gelen değişkenler
Ayrıca hiçbir zaman bir değişkenin bir tanımlayıcıyı takip etmesini doğrudan sağlayamazsınız:
Bu arada, bu, belki de değişken değişkenler kullanma niyetinin olduğu yaygın bir örnektir. Bu durumda, örneğin
$this->{"myFunc$VAR"}();
ile bir değişken özellik araması.Dil yapılarından sonra eksik parantezler
Aceleyle yazmak parantez açmanın unutulmasına neden olabilir if
ve
forve
foreach` ifadeleri için:Çözüm: ifade ve değişken arasına eksik olan
(
ifadesini ekleyin.Else koşulları beklemiyor
Çözüm: else
kısmındaki koşulları kaldırın veya [
elseif`](http://php.net/manual/en/control-structures.elseif.php) kullanın.Kapatma için parantezlere ihtiyacınız var
Çözüm: $var`ın etrafına parantez ekleyin.
Görünmez beyaz boşluk
"Invisible stray Unicode" (non-breaking space gibi) hakkındaki referans cevap'da belirtildiği gibi, bu hatayı aşağıdaki gibi masum kodlar için de görebilirsiniz:
Dosyaların başlangıcında ve kopyalanıp yapıştırılan kodlarda oldukça yaygındır. Kodunuz görsel olarak bir sözdizimi sorunu içeriyor gibi görünmüyorsa, bir hexeditor ile kontrol edin.
Ayrıca bakınız
Beklenmeyen T_STRING
T_STRING
biraz yanlış bir isimlendirmedir. Tırnak içine alınmış bir
"string"e atıfta bulunmaz. Ham bir tanımlayıcı ile karşılaşıldığı anlamına gelir. Bu,
barekelimelerden artık
CONSTANT` veya fonksiyon isimlerine, unutulmuş tırnaksız dizelere veya herhangi bir düz metne kadar değişebilir.Yanlış alıntılanmış dizeler
Bu sözdizimi hatası en çok yanlış alıntılanmış dize değerleri için yaygındır. Tırnak içine alınmamış ve başıboş `"` veya `'` tırnak işaretleri geçersiz bir ifade oluşturacaktır: ⇓ ⇓ echo "click here"; Sözdizimi vurgulama bu tür hataları çok belirgin hale getirecektir. Hangisinin [string enclosure][1] olarak kullanıldığına bağlı olarak, `\"` çift tırnaklardan veya `\'` tek tırnaklardan kaçmak için ters eğik çizgi kullanmayı unutmamak önemlidir. - Kolaylık sağlamak için, içinde çift tırnak bulunan düz HTML çıktısı alırken dış tek tırnakları tercih etmelisiniz. - Değişkenleri enterpole etmek istiyorsanız çift tırnaklı dizeleri kullanın, ancak bu durumda `"` çift tırnaklarının kaçmasına dikkat edin. - Daha uzun çıktılar için, içeri ve dışarı kaçmak yerine birden fazla `echo`/`print` satırını tercih edin. Daha da iyisi bir [HEREDOC][2] bölümü düşünün. Ayrıca bakınız *https://stackoverflow.com/questions/3446216/what-is-the-difference-between-single-quoted-and-double-quoted-strings-in-php*.Kapalı olmayan dizgiler
Eğer bir kapanış `"`][3] kaçırırsanız, genellikle daha sonra bir sözdizimi hatası ortaya çıkar. Sonlandırılmamış bir dize genellikle bir sonraki amaçlanan dize değerine kadar biraz kod tüketecektir: ⇓ echo "Some text", $a_variable, "and some runaway string ; success("finished"); ⇯ O zaman ayrıştırıcının itiraz edebileceği sadece gerçek `T_STRING`ler değildir. Sık rastlanan bir başka varyasyon da tırnak içine alınmamış değişmez HTML için [``Unexpected '>'`](https://stackoverflow.com/questions/6507796/troubleshooting-parse-error-unexpected-error).Programlama dışı dize tırnak işaretleri
Bir blog veya web sitesinden *kodu kopyalayıp yapıştırırsanız*, bazen geçersiz kodla karşılaşırsınız. PHP'nin beklediği [tipografik tırnak işaretleri][4] değildir: $text = 'Bir şey bir şey...' + "bunlar tırnak işareti değil"; Tipografik/akıllı tırnak işaretleri Unicode sembolleridir. PHP bunları bitişik alfanümerik metnin bir parçası olarak ele alır. Örneğin `"bunlar" bir sabit tanımlayıcı olarak yorumlanır. Ancak, takip eden herhangi bir metin değişmezi ayrıştırıcı tarafından bir bareword/T_STRING olarak görülür.Eksik noktalı virgül; tekrar
Önceki satırlarda sonlandırılmamış bir ifadeniz varsa, takip eden herhangi bir ifade veya dil yapısı ham tanımlayıcı olarak görülür: ⇓ func1() function2(); PHP iki fonksiyonu birbiri ardına mı çalıştırmak istediğinizi, yoksa sonuçlarını çarpmak, toplamak, karşılaştırmak ya da sadece birini mi çalıştırmak istediğinizi anlayamaz.PHP betiklerinde kısa açık etiketler ve
Bu oldukça nadir görülen bir durumdur. Ancak short_open_tags etkinleştirilmişse, PHP betiklerinize [bir XML bildirimi ile] başlayamazsınız[5]: ⇓ <?xml version="1.0"?> PHP `<?`'yi görecek ve kendisi için geri alacaktır. Başıboş `xml`nin ne için kullanıldığını anlamayacaktır. Sabit olarak yorumlanacaktır. Ancak `version` başka bir değişmez/sabit olarak görülecektir. Ve ayrıştırıcı, aralarında bir ifade operatörü olmadan birbirini takip eden iki değişmezi/değeri anlamlandıramayacağından, bu bir ayrıştırıcı hatası olacaktır.<?xml
başlıklarıGörünmez Unicode karakterler
Sözdizimi hatalarının en korkunç nedenlerinden biri [boşluk bırakmayan][6] gibi Unicode sembolleridir. PHP Unicode karakterlerin tanımlayıcı ismi olarak kullanılmasına izin verir. Eğer bir T_STRING ayrıştırıcı şikayeti alırsanız aşağıdaki gibi tamamen şüpheli olmayan kodlar için: <?php Baskı 123; Başka bir metin düzenleyicisine ihtiyacınız var. Ya da bir hexeditor. Burada düz boşluklar ve satırsonları gibi görünen şeyler görünmez sabitler içerebilir. Java tabanlı IDE'ler bazen UTF-8 BOM'un içine karışmış, sıfır genişlikli boşluklar, paragraf ayırıcılar vb. Her şeyi yeniden düzenlemeye, boşlukları kaldırmaya ve normal boşlukları geri eklemeye çalışın. Her satır başına gereksiz `;` deyim ayırıcıları ekleyerek sorunu azaltabilirsiniz: <?php ;print 123; Buradaki fazladan `;` noktalı virgül, önceki görünmez karakteri tanımlanmamış bir sabit referansa dönüştürecektir (ifade olarak ifade). Bu da PHP'nin yararlı bir uyarı üretmesini sağlar.Değişken isimlerinin önünde `$` işareti eksik
[PHP'de değişkenler][7] bir dolar işareti ve ardından değişkenin adı ile gösterilir. Dolar işareti (`$`), tanımlayıcıyı bir değişken adı olarak işaretleyen bir [sigil][8] işaretidir. Bu işaret olmadan, tanımlayıcı bir [dil anahtar sözcüğü][9] veya bir [sabit][10] olabilir. Bu, PHP kodu başka bir dilde yazılmış koddan ["translated"][11] (C, Java, JavaScript, vb.) olduğunda yaygın bir hatadır. Bu gibi durumlarda, değişken tipinin bir bildirimi (orijinal kod tipli değişkenler kullanan bir dilde yazıldığında) de gizlice girebilir ve bu hatayı üretebilir.Kaçan Tırnak İşaretleri
Bir dize içinde `` kullanırsanız, bunun özel bir anlamı vardır. Buna "[Kaçış Karakteri][12]" denir ve normalde ayrıştırıcıya bir sonraki karakteri harfi harfine almasını söyler. Örnek: `echo 'Jim said \'Hello\'';`, `Jim said 'hello'` yazdıracaktır. Bir dizenin kapanış tırnak işaretinden kaçarsanız, kapanış tırnak işareti amaçlandığı gibi değil tam anlamıyla alınır, yani dizenin bir parçası olarak yazdırılabilir bir tırnak işareti olarak alınır ve dizeyi kapatmaz. Bu, genellikle bir sonraki dizeyi açtıktan sonra veya kodun sonunda bir ayrıştırma hatası olarak gösterilir. Windows'ta yol belirtirken çok yaygın bir hata: `"C:\xampp\htdocs\"` yanlış. İhtiyacınız olan `"C:\\xampp\\htdocs\\"`.