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.
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.
Her zaman alabileceğiniz birkaç temel önlem vardır:
Tipik bir sözdizimi hata mesajı şöyledir:
Parse error: syntax error, unexpected T_STRING, expecting '
;
' in file.php on line 217 Bu da sözdizimi hatasının olası konumunu listeler. Bahsedilen dosya adı ve satır numarasına bakın. T_STRING` gibi bir moniker, ayrıştırıcının/tokenizerin en sonunda hangi sembolü işleyemediğini açıklar. Ancak, bu mutlaka sözdizimi hatasının nedeni değildir. Önceki kod satırlarına** da bakmak önemlidir. Genellikle sözdizimi hataları daha önce meydana gelen aksiliklerdir. Hata satırı numarası, ayrıştırıcının tümünü işlemekten kesin olarak vazgeçtiği yerdir.Sözdizimi hatalarını çözme
Sözdizimi aksaklıklarını daraltmak ve düzeltmek için birçok yaklaşım vardır.
;
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çe if
koşullarına bölün.? :
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üz if
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();
.
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 olarak php.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:<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
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.
Bir "unexpected T_VARIABLE
" mevcut ifade/ifade yapısına uymayan gerçek bir $variable
adı olduğu anlamına gelir.
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:
⇓
func1()
$var = 1 + 2; # +2 satırında ayrıştırma hatası
Sık karşılaşılan bir hata, unutulmuş .
operatörü ile string concatenations:
⇓
print "İşte değer geliyor: " $değer;
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.
Dize enterpolasyonu bir komut dosyası dili temel özelliğidir. Kullanmakta utanılacak bir şey yok. Değişken
.
birleştirmenin daha hızlı olduğuna dair mikro optimizasyon tavsiyelerini dikkate almayın. **Öyle değil.
Elbette aynı sorun aritmetik işlemler gibi diğer ifadelerde de ortaya çıkabilir:
⇓
print 4 + 7 $var;
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.
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:
⇓
$var = array("1" => $val, $val2, $val3 $val4);
Veya fonksiyon parametre listeleri:
⇓
function myfunc($param1, $param2 $param3, $param4)
Bunu list
veya global
deyimlerinde veya for
döngüsünde ;
noktalı virgül olmadığında da görebilirsiniz.
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:
sınıf xyz { ⇓
var $value = $_GET["input"];
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.
Ayrıca hiçbir zaman bir değişkenin bir tanımlayıcıyı takip etmesini doğrudan sağlayamazsınız:
⇓
$this->myFunc$VAR();
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ı.
Değişken kullanmanın istisna olması gerektiğini aklınızda bulundurun. Yeni başlayanlar, dizilerin daha basit ve uygun olacağı durumlarda bile bunları genellikle çok gelişigüzel kullanmaya çalışırlar.
Aceleyle yazmak parantez açmanın unutulmasına neden olabilir
ifve
forve
foreach` ifadeleri için:
⇓
foreach $array as $key) {
Çözüm: ifade ve değişken arasına eksik olan (
ifadesini ekleyin.
⇓
else ($var >= 0)
Çözüm: elsekısmındaki koşulları kaldırın veya [
elseif`](http://php.net/manual/en/control-structures.elseif.php) kullanın.
⇓
function() $var {} kullanır
Çözüm: $var`ın etrafına parantez ekleyin.
"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:
<?php
⇐
$var = yeni PDO(...);
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.
T_STRINGbiraz 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.
<?xml
başlıkları