PHP ayrıştırma / sözdizimi hataları; ve nasıl çözülür
Herkes sözdizimi hatalarıyla karşılaşır. Deneyimli programcılar bile yazım hataları yapar. Yeni gelenler için bu, öğrenme sürecinin sadece bir parçasıdır. Ancak, genellikle aşağıdaki gibi hata mesajlarını yorumlamak kolaydır:
PHP Ayrıştırma hatası: sözdizimi hatası, satır 20'deki index.php'de beklenmeyen '{'
Beklenmeyen sembol her zaman gerçek suçlu değildir. Ancak satır numarası, nereden bakmaya başlayacağınız konusunda kabaca bir fikir verir.
Daima kod bağlamına bakın . Sözdizimi hata sık bahsedilen içinde gizler veya içinde önceki kod hatları . Kodunuzu kılavuzdaki söz dizimi örnekleriyle karşılaştırın.
Her vaka diğeriyle eşleşmese de. Yine de sözdizimi hatalarını çözmek için bazı genel adımlar vardır . Bu referanslar, sık karşılaşılan güçlükleri özetledi:
Beklenmeyen T_STRING
Beklenmeyen T_VARIABLE Beklenmeyen '$ varname' (T_VARIABLE)
Beklenmeyen T_CONSTANT_ENCAPSED_STRING Beklenmeyen T_ENCAPSED_AND_WHITESPACE
Beklenmeyen $ end
Beklenmeyen T_FUNCTION …
Beklenmeyen {Beklenmeyen }Beklenmeyen (Beklenmeyen Beklenmeyen)
Beklenmedik [Beklenmedik]
Beklenmeyen T_IF Beklenmeyen T_FOREACH Beklenmeyen T_FOR Beklenmeyen T_WHILE Beklenmeyen T_DO Beklenmeyen T_PRINT Beklenmeyen T_ECHO
Beklenmeyen T_LNUMBER
Beklenmedik mi?
Beklenmeyen devam etme (T_CONTINUE) Beklenmeyen devam etme (T_BREAK) Beklenmeyen devam etme (T_RETURN)
Beklenmeyen '='
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 …
Girişte beklenmeyen karakter: ' \' (ASCII = 92) durum = 1
Beklenmeyen "genel" (T_PUBLIC) Beklenmeyen "özel" (T_PRIVATE) Beklenmeyen "korumalı" (T_PROTECTED) Beklenmeyen "son" (T_FINAL) …
Beklenmeyen T_STATIC …
Beklenmeyen T_CLASS …
Beklenmeyen 'kullanım' (T_USE)
Beklenmeyen T_DNUMBER
Beklenmeyen , (virgül)
Beklenmeyen . (nokta)
Beklenmeyen ; (noktalı virgül)
Beklenmeyen * (yıldız işareti)
Beklenmeyen : (iki nokta üst üste)
Beklenmeyen& (referansla çağrı süresi)
Beklenmedik .
Yakından ilgili referanslar:
- Bu hata PHP'de ne anlama geliyor? (çalışma zamanı hataları)
- Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_XXX
- Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_ENCAPSED_AND_WHITESPACE
- Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_VARIABLE
- Bu sembol PHP'de ne anlama geliyor? (dil simgeleri)
- Bu “”akıllı ‘’alıntılar PHP için hiçbir şey ifade etmiyor
Ve:
- Php.net PHP kılavuzu ve çeşitli dil jeton
- Veya Wikipedia'nın PHP'de sözdizimi tanıtımı .
- Ve son olarak elbette php tag-wiki'miz .
Stack Overflow çaylak kodlayıcıları da ağırlarken, çoğunlukla profesyonel programlama sorularına yöneliktir.
- Herkesin kodlama hatalarını ve dar yazım hatalarını yanıtlamak çoğunlukla konu dışı kabul edilir.
- Bu nedenle , söz dizimi düzeltme isteklerini göndermeden önce lütfen temel adımları izlemeye zaman ayırın .
- Hala mecbur kalırsanız, lütfen kendi çözme girişiminizi, düzeltme girişimlerinizi ve neyin yanlış göründüğüne veya olabileceğine dair düşünce sürecinizi gösterin.
Senin Eğer tarayıcı örneğin "SyntaxError: yasadışı karakteri" olarak görüntüler hata mesajları, o zaman aslında değil php lı, ama bir javascript - sözdizimi hatası .
Satıcı kodunda ortaya çıkan sözdizimi hataları: Son olarak, kod tabanınızı düzenleyerek sözdizimi hatası ortaya çıkmadıysa, ancak harici bir satıcı paketi yüklemesinden veya yükseltmesinden sonra bunun PHP sürümü uyumsuzluğundan kaynaklanabileceğini göz önünde bulundurun, bu nedenle satıcının gereksinimlerini platformunuza göre kontrol edin kurulum.
Yanıtlar
Sözdizimi hataları nelerdir?
PHP, C-stili ve zorunlu programlama dillerine aittir . Yanlış yerleştirilmiş semboller veya tanımlayıcılarla karşılaştığında düzeltemeyeceği katı gramer kurallarına sahiptir. Kodlama niyetinizi tahmin edemez.
En önemli ipuçları
Her zaman alabileceğiniz birkaç temel önlem vardır:
Uygun kod girintisini kullanın veya herhangi bir yüksek kodlama stilini benimseyin. Okunabilirlik düzensizlikleri önler.
Bir kullan IDE PHP veya editör ile dizim . Bu da parantez / parantez dengelemeye yardımcı olur.
Kılavuzdaki dil referansını ve örnekleri okuyun . İki kez, biraz yetkin olmak için.
Ayrıştırıcı hataları nasıl yorumlanır
Tipik bir sözdizimi hata mesajı şunları okur:
Ayrıştırma hatası: sözdizimi hatası, beklenmedik T_STRING , bekliyor '
;
' içinde file.php'den üzerine hat 217
Bir sözdizimi hatasının olası yerini listeler . Belirtilen dosya adını ve satır numarasını görün .
Gibi bir takma adT_STRING
, ayrıştırıcının / belirtecin nihayet işleyemediği sembolü açıklar. Bununla birlikte, sözdizimi hatasının nedeni bu olmayabilir.
Önceki kod satırlarına da bakmak önemlidir . Sözdizimi hataları genellikle daha önce meydana gelen aksiliklerdir. Hata satırı numarası, ayrıştırıcının her şeyi işlemekten kesin olarak vazgeçtiği yerdir.
Sözdizimi hatalarını çözme
Sözdizimi hıçkırıklarını daraltmak ve düzeltmek için birçok yaklaşım vardır.
Bahsedilen kaynak dosyayı açın. Bahsedilen kod satırına bakın .
Kaçak dizeler ve yanlış yerleştirilmiş operatörler için, genellikle suçluyu bulduğunuz yer burasıdır.
Satırı soldan sağa okuyun ve her bir sembolün ne yaptığını hayal edin.
Daha düzenli olarak önceki satırlara da bakmanız gerekir .
Özellikle,
;
önceki satır sonlarında / ifadesinde eksik noktalı virgül eksiktir. (En azından üslup açısından.)Eğer
{
kod blokları}
yanlış kapalı veya iç içe olan, kaynak koduna kadar daha da araştırmak gerekebilir. Bunu basitleştirmek için uygun kod girintisini kullanın .
Bak sözdizimi renklendirme !
Dizeler, değişkenler ve sabitlerin hepsi farklı renklere sahip olmalıdır.
Operatörler
+-*/.
de farklı renkte olmalıdır. Aksi takdirde yanlış bağlamda olabilirler.Dize renklendirmesinin çok uzun veya çok kısa olduğunu görürseniz, çıkış karaktersiz veya eksik bir kapanış
"
veya'
dize işaretçisi bulmuşsunuzdur.Aynı renkte iki noktalama karakterinin yan yana olması da sorun anlamına gelebilir. O değilse Genellikle, operatörler yalnız olan
++
,--
operatör aşağıdaki veya parantezler. Doğrudan birbirini takip eden iki dizge / tanımlayıcı çoğu bağlamda yanlıştır.
Boşluk sizin arkadaşınızdır . Herhangi bir kodlama stilini takip edin .
Uzun satırları geçici olarak ayırın.
Operatörler veya sabitler ve dizeler arasına serbestçe yeni satırlar ekleyebilirsiniz . Ayrıştırıcı daha sonra hataların ayrıştırılması için satır numarasını somutlaştıracaktır. Çok uzun koda bakmak yerine, eksik veya yanlış yerleştirilmiş sözdizimi sembolünü izole edebilirsiniz.
Karmaşık
if
ifadeleri farklı veya iç içe geçmişif
koşullara ayırın .Uzun matematik formülleri veya mantık zincirleri yerine, kodu basitleştirmek için geçici değişkenler kullanın. (Daha okunaklı = daha az hata.)
Arasına yeni satırlar ekleyin:
- Doğru olarak kolayca tanımlayabileceğiniz kod,
- Emin olmadığınız kısımlar,
- Ve ayrıştırıcının şikayet ettiği satırlar.
Uzun kod bloklarını bölümlere ayırmak, sözdizimi hatalarının kökenini bulmaya gerçekten yardımcı olur.
Dışında açıklama kod rencide.
Sorun kaynağını izole edemezseniz, kod bloklarını yorumlamaya (ve böylece geçici olarak kaldırmaya) başlayın.
Ayrıştırma hatasından kurtulduğunuzda sorunun kaynağını bulmuş olursunuz. Oraya daha yakından bakın.
Bazen tüm işlev / yöntem bloklarını geçici olarak kaldırmak istersiniz. (Eşleşmeyen küme parantezleri ve yanlış girintili kod olması durumunda.)
Sözdizimi sorununu çözemediğinizde , yorumlanmış bölümleri sıfırdan yeniden yazmaya çalışın .
Yeni gelen biri olarak, kafa karıştırıcı sözdizimi yapılarının bazılarından kaçının.
Üçlü
? :
koşul operatörü kodu sıkıştırabilir ve gerçekten kullanışlıdır. Ancak her durumda okunabilirliğe yardımcı olmuyor.if
Tersine çevrilmemişken sade ifadeleri tercih edin .PHP'nin alternatif sözdizimi (
if:
/elseif:
/endif;
) şablonlar için yaygındır, ancak izlemesi muhtemelen normal{
kod}
bloklarından daha az kolaydır .
En yaygın yeni gelen hataları şunlardır:
;
İfadeleri / satırları sonlandırmak için eksik noktalı virgül ."
Veya için uyuşmayan dize tırnakları'
ve içindeki çıkış karaktersiz tırnaklar.Unutulan operatörler, özellikle dizgi
.
birleştirme için.Dengesiz
(
parantezler)
. Bunları bildirilen satırda sayın. Eşit sayıda var mı?
Bir sözdizimi problemini çözmenin diğerini ortaya çıkarabileceğini unutmayın.
Bir sorunu ortadan kaldırırsanız, ancak aşağıdaki kodda bazı diğer ekinler ortaya çıkarsa, çoğunlukla doğru yoldasınız demektir.
Yeni bir sözdizimi hatasını düzenledikten sonra aynı satırda ortaya çıkarsa, değiştirmeye çalıştığınız muhtemelen bir başarısızlıktır. (Her zaman değil.)
Düzeltemezseniz, daha önce çalışan kodun bir yedeğini geri yükleyin.
- Bir kaynak kodu sürüm belirleme sistemi benimseyin. Her zaman
diff
bozuk ve en son çalışan sürümü görüntüleyebilirsiniz. Sözdizimi sorununun ne olduğu konusunda aydınlatıcı olabilir.
- Bir kaynak kodu sürüm belirleme sistemi benimseyin. Her zaman
Görünmez başıboş Unicode karakterler : Bazı durumlarda, kaynağınızda bir hexeditor veya farklı bir düzenleyici / görüntüleyici kullanmanız gerekir. Bazı problemler sadece kodunuza bakarak bulunamaz.
grep --color -P -n "\[\x80-\xFF\]" file.phpASCII olmayan sembolleri bulmak için ilk önlem olarak deneyin .
Özellikle BOM'lar, sıfır genişlikli boşluklar veya bölünmeyen boşluklar ve akıllı alıntılar düzenli olarak kaynak koduna girebilir.
Dosyalara hangi tür satır kırılmalarının kaydedildiğine dikkat edin.
PHP \nsatır başlarını değil, satırsonlarını onurlandırır \r.
Bu bazen MacOS kullanıcıları için bir sorundur (yanlış yapılandırılmış düzenleyiciler için OS X'te bile).
Genellikle tek satırlık
//
veya#
yorumlar kullanıldığında sorun olarak ortaya çıkar . Satırlı/*...*/
satır aralıkları görmezden gelirler esnasında notlar nadiren ayrıştırıcı rahatsız yoktur.
Senin Eğer sözdizimi hatası web üzerinden iletmez : makinenizde bir sözdizimi hatası var olur. Ancak aynı dosyayı çevrimiçi olarak yayınlamak artık onu sergilemiyor. Bu sadece iki şeyden biri anlamına gelebilir:
Yanlış dosyaya bakıyorsun!
Veya kodunuz görünmez başıboş Unicode içeriyordu (yukarıya bakın). Kolayca öğrenebilirsiniz: Kodunuzu web formundan metin düzenleyicinize kopyalamanız yeterlidir.
PHP sürümünüzü kontrol edin . Tüm sözdizimi yapıları her sunucuda kullanılamaz.
php -v
komut satırı yorumlayıcısı için<?php phpinfo();
web sunucusu aracılığıyla çalıştırılan için.
Bunların mutlaka aynı olması gerekmez. Özellikle çerçevelerle çalışırken, onları eşleştireceksiniz.PHP'nin ayrılmış anahtar kelimelerini işlevler / yöntemler, sınıflar veya sabitler için tanımlayıcılar olarak kullanmayın .
Deneme-yanılma, son çarenizdir.
Her şey başarısız olursa, hata mesajınızı her zaman google'da arayabilirsiniz . Sözdizimi sembollerini aramak kadar kolay değildir (Stack Overflow'un kendisi SymbolHound tarafından indekslenir ). Bu nedenle, alakalı bir şey bulmanız için birkaç sayfaya daha bakmanız gerekebilir.
Diğer kılavuzlar:
- PHP Hata Ayıklama Temelleri , David Sklar
- PHP Hatalarını Düzeltme Jason McCreary
- PHP Hataları - Mario Lurig Tarafından Yapılan 10 Yaygın Hata
- Yaygın PHP Hataları ve Çözümleri
- WordPress Web Sitenizde Nasıl Sorun Giderilir ve Düzeltilir
- Tasarımcılar İçin PHP Hata Mesajları Rehberi - Smashing Magazine
Beyaz ekran ölüm
Web siteniz boşsa, bunun nedeni genellikle sözdizimi hatasıdır. Ekranlarını şununla etkinleştirin:
error_reporting = E_ALL
display_errors = 1
Genelde php.iniveya .htaccessmod_php için aracılığıyla veya hatta .user.iniFastCGI kurulumları ile.
Bunu bozuk betik içinde etkinleştirmek çok geç çünkü PHP ilk satırı bile yorumlayamıyor / çalıştıramıyor. Hızlı bir çözüm, bir sarmalayıcı komut dosyası oluşturmaktır, örneğin test.php
:
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
Sonra bu sarmalayıcı betiğine erişerek başarısız olan kodu çağırın.
Ayrıca , bir komut dosyası HTTP 500 yanıtları ile çöktüğünde PHP'leri etkinleştirmenize error_log
ve web sunucunuzaerror.log bakmanıza yardımcı olur .
Bence bu konu tamamen fazla tartışılmış / fazla karmaşık. Herhangi bir sözdizimi hatasından tamamen kaçınmanın yolu IDE kullanmaktır. Hatta IDE olmadan çalışmanın profesyonelce olmadığını söyleyebilirim. Neden? Çünkü modern IDE'ler yazdığınız her karakterden sonra sözdiziminizi kontrol eder. Kod yazdığınızda ve tüm satırınız kırmızıya döndüğünde ve büyük bir uyarı size sözdizimi hatasının tam türünü ve tam konumunu gösterdiğinde, başka bir çözüm aramanıza kesinlikle gerek kalmaz.
Sözdizimi denetimi IDE kullanmak şu anlama gelir:
Bir daha asla sözdizimi hatalarına rastlamazsınız, çünkü onları yazarken doğru görürsünüz. Ciddi anlamda.
Sözdizimi denetimi ile mükemmel IDE'ler (tümü Linux, Windows ve Mac için mevcuttur):
- NetBeans [ücretsiz]
- PHPStorm [199 ABD Doları]
- PHP Eklentisi ile Eclipse [ücretsiz]
- Sublime [80 USD] (esas olarak bir metin düzenleyici, ancak PHP Sözdizimi Ayrıştırıcı gibi eklentilerle genişletilebilir )
Beklenmedik [
Bu günlerde, beklenmedik [
dizi ayracı genellikle eski PHP sürümlerinde görülür. Kısa dizi sözdizimi PHP beri mevcuttur > = 5.4 . Daha eski kurulumlar yalnızca destekler array()
.
$php53 = array(1, 2, 3); $php54 = [1, 2, 3];
⇑
Dizi işlevi sonucu başvurunun kaldırılması aynı şekilde eski PHP sürümleri için kullanılamaz:
$result = get_whatever()["key"];
⇑
Referans - Bu hata PHP'de ne anlama geliyor? - "Sözdizimi hatası, beklenmeyen \[" , en yaygın ve pratik çözümleri gösterir.
Yine de, PHP kurulumunuzu yükseltmeniz her zaman daha iyidir. Paylaşılan web barındırma planları için, örneğin SetHandler php56-fcgi
daha yeni bir çalışma zamanını etkinleştirmek için kullanılıp kullanılamayacağını araştırın .
Ayrıca bakınız:
- Başvurunun kaldırılması işlevi için PHP sözdizimi sonucu → PHP 5.4'ten itibaren mümkündür
- PHP sözdizimi hatası, beklenmeyen '['
- Diziler için kısa açıklama: {} veya [] gibi birebir sözdizimi var mı?
- PHP 5.3.10 ve PHP 5.5.3 sözdizimi hatası beklenmeyen '['
- PHP array () ve [] arasındaki fark
- PHP Dizisi Sözdizimi Ayrıştırma Hatası Sol Köşeli Ayraç "["
BTW, eski + daha yavaş PHP sürümlerine gerçekten bağlıysanız , önişlemciler ve PHP 5.4 sözdizimi aşağı dönüştürücüler de vardır.
Beklenmeyen[
sözdizimi hatalarının diğer nedenleri
PHP sürüm uyumsuzluğu değilse, çoğu zaman düz bir yazım hatası veya yeni gelen sözdizimi hatasıdır:
Sen kullanamazsınız sınıflarında dizi mal bildiriminde / ifadeleri bile PHP 7'de.
protected $var["x"] = "Nope"; ⇑
[
Küme parantezlerini{
veya parantezleri açmakla kafa karıştırmak ,(
yaygın bir gözetimdir.foreach [$a as $b) ⇑
Ya da:
function foobar[$a, $b, $c] { ⇑
Veya sabitleri (PHP 5.6'dan önce) diziler olarak göstermeye çalışmak:
$var = const[123]; ⇑
En azından PHP bunu
const
sabit bir isim olarak yorumlar .Bir dizi değişkenine erişmek istediyseniz (buradaki tipik neden budur), o zaman
$
baştaki işareti ekleyin - böylece bir$varname
.global
Bir ilişkisel dizinin bir üyesinde anahtar kelimeyi kullanmaya çalışıyorsunuz . Bu geçerli bir sözdizimi değil:global $var['key'];
Beklenmeyen ]
kapanış köşeli ayraç
Bu biraz daha nadirdir, ancak sonlandırıcı dizi ]
dirseğiyle sözdizimi kazaları da vardır .
Yine,
)
parantez veya}
küme parantezi ile uyuşmazlıklar yaygındır:function foobar($a, $b, $c] { ⇑
Veya dizinin olmadığı bir diziyi sonlandırmaya çalışmak:
$var = 2];
Genellikle çok satırlı ve iç içe geçmiş dizi bildirimlerinde ortaya çıkar.
$array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15]; ⇑
Öyleyse, herhangi bir erken
]
dizi kapanışını bulmak için parantez eşleşmesi için IDE'nizi kullanın . En azından daraltmak için daha fazla boşluk ve satırsonu kullanın.
Beklenmeyen T_VARIABLE
"Beklenmeyen T_VARIABLE
" $variable
, mevcut ifade / ifade yapısına uymayan birebir isim olduğu anlamına gelir .
noktalı virgül eksik
Genellikle ö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; # parse error in line +2
Dize birleştirme
Sık karşılaşılan bir aksilik, unutulmuş işleçle dize birleştirmeleridir
.
:⇓ print "Here comes the value: " $value;
Btw, okunabilirliğe yardımcı olduğu her durumda dize enterpolasyonunu (çift tırnak içindeki temel değişkenler) tercih etmelisiniz . Bu sözdizimi sorunlarını ortadan kaldırır.
Dize enterpolasyonu, bir komut dosyası dili temel özelliğidir. Kullanmakta utanılacak bir şey yok. Değişken
.
birleştirme işleminin daha hızlı olmasıyla ilgili mikro optimizasyon önerilerini göz ardı edin . Değil.Eksik ifade operatörleri
Elbette aynı sorun diğer ifadelerde de ortaya çıkabilir, örneğin aritmetik işlemler:
⇓ print 4 + 7 $var;
PHP burada değişkenin eklenmesi, çıkarılması veya karşılaştırılması vb. Gerektiğini tahmin edemez .
Listeler
Ayrıştırıcının aynı zamanda beklenen bir virgül gösterdiği dizi popülasyonlarında olduğu gibi söz dizimi listeleri için de aynı,
,
örneğin:⇓ $var = array("1" => $val, $val2, $val3 $val4);
Veya fonksiyonlar parametre listeleri:
⇓ function myfunc($param1, $param2 $param3, $param4)
Benzer şekilde, bunu
list
veyaglobal
ifadeleriyle veya;
birfor
döngüde noktalı virgül bulunmadığında görüyorsunuz .Sınıf bildirimleri
Bu ayrıştırıcı hatası , sınıf bildirimlerinde de ortaya çıkar . İfadeler değil, yalnızca statik sabitler atayabilirsiniz. Böylece ayrıştırıcı, atanmış veriler olarak değişkenlerden şikayet eder:
class xyz { ⇓ var $value = $_GET["input"];
Eşsiz
}
kapanış küme parantezleri özellikle buraya yol açabilir. Bir yöntem çok erken sonlandırılırsa (uygun girinti kullanın!), O zaman başıboş bir değişken genellikle sınıf bildirimi gövdesine yanlış yerleştirilir.Tanımlayıcılardan sonraki değişkenler
Ayrıca bir değişkenin doğrudan bir tanımlayıcıyı takip etmesine de sahip olamazsınız :
⇓ $this->myFunc$VAR();
Btw, bu, niyetin belki de değişken değişkenleri kullanmak olduğu yaygın bir örnektir . Bu durumda
$this->{"myFunc$VAR"}();
, örneğin bir değişken özellik araması .Değişken değişkenleri kullanmanın bir istisna olması gerektiğini unutmayın. Yeni gelenler, diziler daha basit ve daha uygun olsa bile, genellikle onları çok gelişigüzel kullanmaya çalışırlar.
Dil yapılarından sonra parantezler eksik
Aceleyle yazım,
if
vefor
veforeach
ifadeleri için parantez açma veya kapatma unutulmasına neden olabilir :⇓ foreach $array as $key) {
Çözüm: Eksik açıklığı
(
ifade ve değişken arasına ekleyin .⇓ if ($var = pdo_query($sql) { $result = …
Küme
{
ayracı,if
ifadeyi önce)
kapanış parantezi ile kapatmadan kod bloğunu açmaz .Başka koşullar beklemiyor
⇓ else ($var >= 0)
Çözüm: Koşulları kaldırın
else
veya kullanın elseif.Kapatma için parantez gerekir
⇓ function() use $var {}
Çözüm: Çevresine parantez ekleyin
$var
.Görünmez boşluk
"Görünmez başıboş Unicode" ( bölünmeyen boşluk gibi ) ile ilgili referans yanıtında belirtildiği gibi , bu hatayı şüphelenmeyen kodlar için de görebilirsiniz:
<?php ⇐ $var = new PDO(...);
Dosyaların başlangıcında ve kopyalayıp yapıştırılan kod için 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
- Arama: beklenmeyen T_VARIABLE
Beklenmeyen T_CONSTANT_ENCAPSED_STRING
Beklenmeyen T_ENCAPSED_AND_WHITESPACE
Kullanışlı isimler T_CONSTANT_ENCAPSED_STRING
ve T_ENCAPSED_AND_WHITESPACE
alıntılanan değişmez değerlere atıfta bulunur ."string"
Farklı bağlamlarda kullanılırlar, ancak sözdizimi sorunu oldukça benzerdir. T_ENCAPSED… uyarılar çift tırnaklı dizge bağlamında meydana gelirken, T_CONSTANT… dizeleri genellikle düz PHP ifadelerinde veya ifadelerinde yanlıştır .
Yanlış değişken enterpolasyonu
Ve en sık yanlış PHP değişken enterpolasyonu için ortaya çıkar:
⇓ ⇓ echo "Here comes a $wrong['array'] access";
Diziler anahtarlarından alıntı yapmak PHP bağlamında bir zorunluluktur. Ancak çift tırnaklı dizelerde (veya HEREDOC'larda) bu bir hatadır. Ayrıştırıcı, içerilen tek alıntıdan şikayet eder
'string'
, çünkü genellikle orada bir değişmez tanımlayıcı / anahtar bekler.Daha doğrusu , dizi referansları için çift tırnak içinde PHP2 tarzı basit sözdizimi kullanmak geçerlidir :
echo "This is only $valid[here] ...";
Bununla birlikte, iç içe diziler veya daha derin nesne başvuruları, karmaşık kıvrımlı dize ifadesi sözdizimini gerektirir :
echo "Use {$array['as_usual']} with curly syntax.";
Emin değilseniz, bunun kullanımı genellikle daha güvenlidir. Genellikle daha okunabilir olarak bile kabul edilir. Ve daha iyi IDE'ler aslında bunun için farklı sözdizimi renklendirmesi kullanır.
Eksik birleştirme
Bir dizge bir ifadeyi takip ediyorsa, ancak bir bitiştirme veya başka bir işleç yoksa, PHP'nin dize değişmezinden şikayet ettiğini görürsünüz:
⇓ print "Hello " . WORLD " !";
Siz ve benim için açık olsa da, PHP dizenin oraya eklenmesi gerektiğini tahmin edemiyor .
Kafa karıştırıcı dize alıntı muhafazaları
Aynı sözdizimi hatası, dize sınırlayıcıları karıştırıldığında ortaya çıkar . Tek
'
veya çift tırnakla başlayan bir dizge"
de aynı şekilde biter.⇓ print "<a href="' . $link . '">click here</a>"; ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟
Bu örnek çift tırnaklarla başladı. Ancak HTML öznitelikleri için de çift tırnak işaretleri vardı. Bununla birlikte, içindeki amaçlanan birleştirme operatörü, tek tırnak içindeki ikinci bir dizenin parçası olarak yorumlandı.
İpucu : Düzenleyicinizi / IDE'nizi, tek ve çift tırnaklı dizeler için biraz farklı renklendirme kullanacak şekilde ayarlayın. (Ayrıca, uygulama mantığına, örneğin metinsel çıktı için çift tırnaklı dizeleri ve yalnızca sabit benzeri değerler için tek tırnaklı dizeleri tercih etmeye yardımcı olur.)
Bu, en başta çift tırnaktan kaçmamanız gereken iyi bir örnektir. Bunun yerine , HTML özelliklerinin alıntıları için uygun \"çıkışları kullanın :
print "<a href=\"{$link}\">click here</a>";
Bu aynı zamanda sözdizimi karmaşasına da yol açabilse de, tüm daha iyi IDE'ler / editörler, kaçan alıntıları farklı şekilde renklendirerek yine yardımcı olurlar.
Eksik açılış teklifi
Aynı şekilde , ayrıştırıcı hataları için bir reçete açmayı "/ 'alıntı yapmayı unuturlar:
⇓ make_url(login', 'open');
Burada,
', '
açıklogin
bir şekilde bir dizge parametresi olması gerektiğinde , bir engelden sonra bir dize değişmezi olur .Dizi listeleri
Bir
,
dizi oluşturma bloğunda bir virgül atlarsanız, ayrıştırıcı iki ardışık dize görür:array( ⇓ "key" => "value" "next" => "....", );
Son satırın her zaman fazladan virgül içerebileceğini, ancak aralarından birine atlamak affedilemez. Sözdizimi vurgulamadan keşfetmek zordur.
Fonksiyon parametre listeleri
İşlev çağrıları için aynı şey :
⇓ myfunc(123, "text", "and" "more")
Kaçak dizeler
Yaygın bir varyasyon, oldukça basitçe unutulmuş dizi sonlandırıcılardır:
⇓ mysql_evil("SELECT * FROM stuffs); print "'ok'"; ⇑
Burada PHP, birbirini doğrudan takip eden iki değişmez dizgeden şikayet eder. Ama asıl neden elbette kapatılmamış önceki dizedir.
Ayrıca bakınız
- PHP'de İlişkisel Dizilerin enterpolasyonu (çift tırnaklı dizge)
- PHP - sözdizimi hatası, beklenmeyen T_CONSTANT_ENCAPSED_STRING
- Sözdizimi hatası, PHP'de beklenmeyen T_CONSTANT_ENCAPSED_STRING
- SQL Sorgusunda beklenmeyen T_CONSTANT_ENCAPSED_STRING hatası
Beklenmeyen T_STRING
T_STRING
biraz yanlış bir adlandırma. Bir alıntıya atıfta bulunmaz "string"
. Ham bir tanımlayıcıyla karşılaşıldığı anlamına gelir. Bu, bare
sözcüklerden artıklara CONSTANT
veya işlev adlarına, unutulmuş alıntılanmamış dizelere veya herhangi bir düz metne kadar değişebilir .
Yanlış alıntılanmış dizeler
Ancak bu sözdizimi hatası, yanlış alıntılanmış dize değerleri için en yaygın olanıdır. Herhangi bir çıkış karaktersiz ve başıboş
"
veya'
alıntı geçersiz bir ifade oluşturacaktır:⇓ ⇓ echo "<a href="http://example.com">click here</a>";
Sözdizimi vurgulama, bu tür hataları çok belirgin hale getirecektir. Hangisinin dize kapsamı olarak kullanıldığına bağlı olarak
\"
, çift tırnaktan kaçmak için ters eğik çizgi kullanmayı veya\'
tek tırnak işaretini kullanmayı unutmamak önemlidir .- Kolaylık sağlamak için düz HTML çıktısını içinde çift tırnaklarla birlikte dıştaki tek tırnakları tercih etmelisiniz.
- Değişkenlerin enterpolasyonunu yapmak istiyorsanız çift tırnaklı dizeler kullanın, ancak daha sonra değişmez
"
çift tırnakların kaçmasına dikkat edin . - Daha uzun çıktı için, içeri ve dışarı kaçmak yerine çoklu
echo
/print
satırları tercih edin. Daha da iyisi bir HEREDOC bölümünü düşünün .
Başka bir örnek, PHP ile oluşturulan HTML kodu içinde PHP girişi kullanmaktır:$text = '<div>some text with <?php echo 'some php entry' ?></div>'
Bu
$text
, birçok satırla büyükse ve geliştirici tüm PHP değişkeni değerini görmezse ve kaynağını unutan kod parçasına odaklanırsa gerçekleşir. Örnek buradaAyrıca bkz PHP alıntı-tek ve çift tırnakla arasındaki fark nedir? .
Kapatılmamış dizeler
Eğer varsa bir kapanış kaçırma" sonra bir söz dizimi hatası genellikle sonradan materializes. Sonlandırılmamış bir dize, bir sonraki amaçlanan dize değerine kadar genellikle biraz kod tüketir:
⇓ echo "Some text", $a_variable, "and some runaway string ; success("finished"); ⇯
O
T_STRING
zaman çözümleyicinin itiraz edebileceği şey sadece gerçek değil . Diğer bir sık yapılan varyasyon, Unexpected '>'alıntılanmamış değişmez HTML içindir.Programlamayan dize tırnakları
Eğer varsa kopyalama ve yapıştırma bir blog veya web sitesinden kod, bazen geçersiz kod ile bitirmek. Tipografik alıntılar PHP'nin beklediği şeyler değildir :
$text = ’Something something..’ + ”these ain't quotes”;
Tipografik / akıllı tırnaklar Unicode sembolleridir. PHP bunları bitişik alfanümerik metnin bir parçası olarak ele alır. Örneğin
”these
, sabit bir tanımlayıcı olarak yorumlanır. Ancak aşağıdaki herhangi bir metin, ayrıştırıcı tarafından bir açık kelime / T_STRING olarak görülür.Eksik noktalı virgül; tekrar
Önceki satırlarda sonlandırılmamış bir ifadeniz varsa, aşağıdaki herhangi bir ifade veya dil yapısı ham tanımlayıcı olarak görülür:
⇓ func1() function2();
PHP, iki işlevi birbiri ardına çalıştırmak mı istediğinizi, yoksa sonuçlarını çoğaltmak mı, eklemek mi, karşılaştırmak mı yoksa yalnızca birini
||
veya diğerini mi çalıştırmak istediğinizi bilemez .<?xml
PHP betiklerinde kısa açık etiketler ve başlıklarBu oldukça nadirdir. Ancak short_open_tags etkinleştirilirse, PHP betiklerinize bir XML bildirimi ile başlayamazsınız :
⇓ <?xml version="1.0"?>
PHP onu görecek
<?
ve kendisi için geri isteyecektir . Serserinin ne anlamaxml
geldiğini anlamayacak . Sabit olarak yorumlanacak. Ancak,version
başka bir değişmez / sabit olarak görülecektir. Ve ayrıştırıcı, arada bir ifade operatörü olmadan sonraki iki değişmez değeri / değeri anlamayacağından, bu bir ayrıştırıcı hatası olur.Görünmez Unicode karakterler
Sözdizimi hatalarının en korkunç nedeni, bölünemez boşluk gibi Unicode sembolleridir . PHP, tanımlayıcı adları olarak Unicode karakterlerine izin verir. Tamamen şüpheli olmayan bir kod için T_STRING ayrıştırıcı şikayeti alırsanız, örneğin:
<?php print 123;
Başka bir metin düzenleyiciyi kırmanız gerekiyor. Ya da bir hexeditor bile. Burada düz boşluklar ve satırsonları gibi görünen şeyler görünmez sabitler içerebilir. Java tabanlı IDE'ler bazen içinde karıştırılmış bir UTF-8 BOM'dan, sıfır genişlikli boşluklardan, paragraf ayırıcılardan vb. Habersizdir. Her şeyi yeniden düzenlemeye, boşlukları kaldırmaya ve normal boşlukları tekrar içeri eklemeye çalışın.
;
Her satır başlangıcına fazladan ifade ayırıcıları ekleyerek bunu daraltabilirsiniz :<?php ;print 123;
Buradaki ekstra
;
noktalı virgül, önceki görünmez karakteri tanımsız bir sabit referansa (ifade olarak ifade) dönüştürecektir. Bu da PHP'nin faydalı bir uyarı üretmesini sağlar.Değişken adlarının önünde "$" işareti eksik
PHP'deki değişkenler bir dolar işareti ve ardından değişkenin adı ile temsil edilir.
Dolar işareti (
$
) bir olduğunu deseni- o işaretleri bir değişkenin bir isim olarak tanımlayıcı. Bu işaret olmadan, tanımlayıcı bir dil anahtar sözcüğü veya sabit olabilir .Bu, PHP kodu başka bir dilde (C, Java, JavaScript, vb.) Yazılmış koddan "çevrildiğinde" yaygın bir hatadır . Bu gibi durumlarda, değişken türünün bir bildirimi (orijinal kod, yazılan değişkenleri kullanan bir dilde yazıldığında) gizlice dışarı çıkıp bu hatayı üretebilir.
Kaçan Tırnak işaretleri
Eğer kullanırsanız
\
bir dizede, özel bir anlamı vardır. Buna " Kaçış Karakteri " denir ve normalde ayrıştırıcıya bir sonraki karakteri tam anlamıyla almasını söyler.Örnek:
echo 'Jim said \'Hello\'';
yazdıracakJim said 'hello'
Bir dizenin kapanış teklifinden kaçarsanız, kapanış alıntı harfi harfiyen alınır ve amaçlandığı gibi değil, yani dizenin parçası olarak yazdırılabilir bir alıntı olarak ve dizeyi kapatmaz. Bu, genellikle bir sonraki dizeyi açtıktan sonra veya komut dosyasının sonunda bir ayrıştırma hatası olarak gösterilecektir.
Windows'ta yolları belirtirken çok yaygın görülen hata:
"C:\xampp\htdocs\"
yanlış. İhtiyacın var"C:\\xampp\\htdocs\\"
.Yazılan özellikler
Özellik yazmayı kullanmak için PHP ≥7.4'e ihtiyacınız var, örneğin:
public stdClass $obj;
Beklenmedik (
Parantezlerin açılması tipik olarak if
/ foreach
/ for
/ array
/ gibi dil yapılarını izler list
veya bir aritmetik ifade başlatır. Sözdizimsel olarak sonradan "strings"
, bir önceki ()
, bir yalnız $
ve bazı tipik bildirim bağlamlarında yanlıştırlar .
İşlev bildirim parametreleri
Bu hata için daha nadir görülen bir durum, ifadeleri varsayılan işlev parametreleri olarak kullanmaya çalışmaktır . Bu, PHP7'de bile desteklenmez:
function header_fallback($value, $expires = time() + 90000) {
Bir işlev bildirimindeki parametreler yalnızca değişmez değerler veya sabit ifadeler olabilir. Serbestçe kullanabileceğiniz işlev çağrılarının aksine
whatever(1+something()*2)
, vb.Sınıf özelliği varsayılanları
Aynı şey , ifadelere değil, yalnızca değişmez / sabit değerlere izin verilen sınıf üyesi bildirimleri için de geçerlidir:
class xyz { ⇓ var $default = get_config("xyz_default");
Yapıcıya böyle şeyler koyun. Ayrıca bkz. PHP öznitelikleri neden işlevlere izin vermiyor?
Yine, PHP 7'nin
var $xy = 1 + 2 +3;
orada yalnızca sabit ifadelere izin verdiğini unutmayın .PHP'de JavaScript sözdizimi
JavaScript veya jQuery sözdiziminin kullanılması , açık nedenlerden dolayı PHP'de çalışmayacaktır:
<?php ⇓ print $(document).text();
Bu olduğunda, genellikle sonlandırılmamış bir önceki dizeyi gösterir; ve
<script>
PHP kod bağlamına sızan değişmez bölümler.isset (()), boş, anahtar, sonraki, geçerli
Hem
isset()
veempty()
dil yerleşik ins değil fonksiyonlardır. Bunlar doğrudan bir değişken erişmesi gereken . Yanlışlıkla çok fazla parantez eklerseniz, ancak bir ifade oluşturursunuz:⇓ if (isset(($_GET["id"]))) {
Aynısı, örtük değişken adı erişimi gerektiren herhangi bir dil yapısı için de geçerlidir. Bu yerleşik öğeler dil gramerinin bir parçasıdır, bu nedenle dekoratif ek parantezlere izin vermez.
Değişken başvurusu gerektiren kullanıcı düzeyindeki işlevler - ancak bir ifade sonucu geçirilir - bunun yerine çalışma zamanı hatalarına yol açar.
Beklenmedik )
Eksik fonksiyon parametresi
Bir işlev çağrısında son olarak başıboş virgül kullanamazsınız . PHP orada bir değer bekler ve dolayısıyla erken kapanış
)
parantezinden şikayet eder .⇓ callfunc(1, 2, );
Sondaki virgüllere yalnızca
array()
veyalist()
yapılarda izin verilir .Bitmemiş ifadeler
Aritmetik ifadede bir şeyi unutursanız, ayrıştırıcı pes eder. Çünkü bunu nasıl yorumlamalı:
⇓ $var = 2 * (1 + );
Ve kapanışı
)
bile unuttuysanız, bunun yerine beklenmedik noktalı virgül hakkında bir şikayet alırsınız.Foreach as
constant
İçin unutulmuş değişken $kontrol tablolara önekleri göreceksiniz:
↓ ⇓ foreach ($array as wrong) {
Buradaki PHP bazen size bunun
::
yerine a beklediğini söyler . Çünkü bir sınıf:$variable could have satisfied the expected $değişken ifade ..
Beklenmedik {
Kıvırcık parantezler {
ve }
kod bloklarını çevreleyin. Ve bunlarla ilgili sözdizimi hataları genellikle bazı yanlış yerleştirmeleri gösterir.
Bir içindeki eşleşmemiş alt ifadeler
if
En yaygın olarak dengesizdir (ve) ayrıştırıcı,
{
çok erken görünen açılış kıvrımından şikayet ederse neden budur . Basit bir örnek:⇓ if (($x == $y) && (2 == true) {
Parantezlerinizi sayın veya buna yardımcı olan bir IDE kullanın. Ayrıca boşluk bırakmadan kod yazmayın. Okunabilirlik önemlidir.
İfade bağlamında {and}
İfadelerde küme parantezi kullanamazsınız. Parantezleri ve kıvrımları karıştırırsanız, dil gramerine uymaz:
⇓ $var = 5 * {7 + $x};
Yerel kapsam değişkeni gibi, tanımlayıcı yapımı için birkaç istisna vardır
${references}
.Değişken değişkenler veya kıvrık değişken ifadeler
Bu oldukça nadirdir. Ancak karmaşık değişken ifadeleri için şikayetler de alabilir
{
ve}
ayrıştırabilirsiniz:⇓ print "Hello {$world[2{]} !";
Bu
}
tür bağlamlarda beklenmedik olma olasılığı daha yüksek olsa da .
Beklenmedik }
"Beklenmeyen }
" bir hata aldığınızda, çoğunlukla bir kod bloğunu çok erken kapatmışsınızdır.
Bir kod bloğundaki son ifade
Sonlandırılmamış herhangi bir ifade için olabilir.
Ve bir fonksiyon / kod bloğunun son satırında sonda
;
noktalı virgül yoksa :function whatever() { doStuff() } ⇧
Burada ayrıştırıcı, belki hala
+ 25;
işlev sonucuna veya başka bir şeye eklemek isteyip istemediğinizi söyleyemez .Geçersiz blok yuvalama / Unutulmuş
{
Bazen bu ayrıştırıcı hatasını bir kod bloğu
}
çok erken kapatıldığında veya bir açılışı{
bile unuttuğunuzda görürsünüz :function doStuff() { if (true) ⇦ print "yes"; } } ⇧
Yukarıdaki kod parçasında
if
açılış{
küme ayracı yoktu . Böylece aşağıdaki kapanış}
gereksiz hale geldi. Ve bu nedenle,}
işleve yönelik bir sonraki kapanış , orijinal açma{
küme ayracı ile ilişkilendirilebilir değildi.Bu tür hataları, uygun kod girintisi olmadan bulmak daha da zordur. Bir IDE ve parantez eşleştirme kullanın.
Beklenmedik {
, bekliyorum(
Bir koşul / bildirim başlığı ve bir kod bloğu gerektiren dil yapıları bu hatayı tetikleyecektir.
Parametre listeleri
Örneğin , parametre listesi olmayan yanlış bildirilmiş işlevlere izin verilmez:
⇓ function whatever { }
Kontrol ifadesi koşulları
Ve aynı şekilde bir ifkoşulsuz olamazsınız .
⇓ if { }
Açıkçası bu mantıklı değil. Olağan şüpheliler için aynı şey,
for
/foreach
,while
/do
, vb.Bu belirli hatayı aldıysanız, kesinlikle bazı manuel örneklere bakmalısınız.
Beklenmeyen $ end
PHP "beklenmedik $end
" bir şeyden bahsettiğinde , bu kodunuzun zamanından önce sona erdiği anlamına gelir. (Mesaj kelimenin tam anlamıyla alındığında biraz yanıltıcıdır. Bu, bazen yeni gelenlerin varsaydığı gibi, "$ end" adlı bir değişkenle ilgili değildir. "Dosyanın sonu" anlamına gelir EOF.)
Neden: Dengesiz
{
ve}
kod blokları / ve işlev veya sınıf bildirimleri için.
Bu var hemen hemen her zaman bir eksik hakkında }
önceki kod blokları kapatmak için küme ayracı.
Yine, bu tür sorunları önlemek için uygun girintiyi kullanın.
Nerede
}
yanlış olduğunu bulmak için köşeli ayraç eşleşen bir IDE kullanın . Çoğu IDE'de ve metin düzenleyicide klavye kısayolları vardır:- NetBeans, PhpStorm, Komodo: Ctrl[veCtrl]
- Tutulma, Aptana: CtrlShiftP
- Atom, Sublime: Ctrlm- Zend StudioCtrlM
- Geany, Notepad ++: CtrlB- Joe: CtrlG- Emacs: C-M-n- Vim:%
Çoğu IDE ayrıca eşleşen parantezleri, parantezleri ve parantezleri vurgular . Bu, korelasyonlarını incelemeyi oldukça kolaylaştırır:
Sonlandırılmamış ifadeler
Ve Unexpected $end
sonlandırılmamış ifadeler veya ifadeler için de sözdizimi / ayrıştırıcı hatası oluşabilir:
$var = func(1,
?>
EOF
Öyleyse, önce senaryoların sonuna bakın. Bir sonda ;
, herhangi bir PHP betiğindeki son ifade için genellikle gereksizdir. Ama bir tane almalısın . Tam da bu tür sözdizimi sorunlarını daralttığı için.
Girintili HEREDOC işaretçileri
Başka bir yaygın durum HEREDOC veya NOWDOC dizelerinde görülür . Sonlandırma işaretçisi baştaki boşluklar, sekmeler vb. İle yok sayılır:
print <<< END
Content...
Content....
END;
# ↑ terminator isn't exactly at the line start
Bu nedenle ayrıştırıcı, HEREDOC dizesinin dosyanın sonuna kadar devam edeceğini varsayar (bu nedenle "Beklenmeyen $ end"). Hemen hemen tüm IDE'ler ve sözdizimi vurgulayan editörler bunu açık hale getirecek veya bu konuda uyaracaktır.
Kaçan Tırnak işaretleri
Eğer kullanırsanız \
bir dizede, özel bir anlamı vardır. Buna " Kaçış Karakteri " denir ve normalde ayrıştırıcıya bir sonraki karakteri tam anlamıyla almasını söyler.
Örnek: echo 'Jim said \'Hello\'';
yazdıracakJim said 'hello'
Bir dizenin kapanış teklifinden kaçarsanız, kapanış alıntı harfi harfiyen alınır ve amaçlandığı gibi değil, yani dizenin parçası olarak yazdırılabilir bir alıntı olarak ve dizeyi kapatmaz. Bu, genellikle bir sonraki dizeyi açtıktan sonra veya komut dosyasının sonunda bir ayrıştırma hatası olarak gösterilecektir.
Windows'ta yolları belirtirken çok yaygın görülen hata: "C:\xampp\htdocs\"
yanlış. İhtiyacın var "C:\\xampp\\htdocs\\"
.
Alternatif sözdizimi
Şablonlarda ifade / kod blokları için alternatif sözdizimi kullanırken bu sözdizimi hatasını biraz daha nadir görebilirsiniz. Kullanılması if:
ve else:
bir kayıp endif;
örneğin.
Ayrıca bakınız:
- PHP sözdizimi hatası "beklenmedik $ end"
- Ayrıştırma hatası: Sözdizimi hatası, PHP kodumda beklenmeyen dosya sonu
- PHP kullanarak, beklenmeyen dosya sonu hatası sözdizimi hatasını ayrıştırma
- PHP Ayrıştırma hatası: sözdizimi hatası, CodeIgniter Görünümünde beklenmeyen dosya sonu
- Ayrıştırma hatası: sözdizimi hatası, beklenmeyen dosya sonu (Kayıt komut dosyası)
- "Ayrıştırma hatası: sözdizimi hatası, beklenmeyen $ end" Üni kayıt atamam için
- PHP Hatalarını Düzeltme: PHP Hatası # 3: Beklenmeyen dosya sonu
Beklenmeyen T_IF
Beklenmeyen T_ELSEIF
Beklenmeyen T_ELSE
Beklenmeyen T_ENDIF
Şartlı denetim blokları if
, elseif
ve else
basit bir yapıya izleyin. Bir sözdizimi hatasıyla karşılaştığınızda, büyük olasılıkla geçersiz blok iç içe geçmesidir → eksik {
kaşlı ayraçlar }
veya çok fazla.
Eksik
{
veya}
yanlış girinti nedeniyleUyumsuz kod parantezleri, daha az iyi biçimlendirilmiş kodlarda yaygındır, örneğin:
if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if ($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
Kodunuz böyle görünüyorsa, yeniden başlayın! Aksi takdirde siz veya başka biri için düzeltilemez. Yardım istemek için bunu internette sergilemenin bir anlamı yok.
Yalnızca if / else koşullarının ve
{
kod bloklarının iç içe geçmiş yapısını ve ilişkisini görsel olarak takip edebiliyorsanız, düzeltebilirsiniz}
. Hepsinin eşleşip eşleşmediğini görmek için IDE'nizi kullanın.if (true) { if (false) { … } elseif ($whatever) { if ($something2) { … } else { … } } else { … } if (false) { // a second `if` tree … } else { … } } elseif (false) { … }
Herhangi bir çift
}
}
sadece bir dalı değil, aynı zamanda bir önceki koşul yapısını da kapatır. Bu nedenle tek bir kodlama stiline bağlı kalın; iç içe geçmiş if / else ağaçlarında karıştırmayın ve eşleştirmeyin.Buradaki tutarlılığın yanı sıra, uzun koşullardan kaçınmak da faydalı oluyor. Okunamayan
if
ifadelerden kaçınmak için geçici değişkenler veya işlevler kullanın .IF
ifadelerde kullanılamazŞaşırtıcı derecede sık karşılaşılan bir yeni hata, bir
if
ifade içinde bir ifade kullanmaya çalışmaktır , örneğin bir print cümlesi:⇓ echo "<a href='" . if ($link == "example.org") { echo …
Elbette ki geçersiz.
Üçlü bir koşul kullanabilirsiniz , ancak okunabilirlik etkilerine dikkat edin.
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
Aksi takdirde, bu tür çıktı yapılarını kırın: birden çok ifs ve echos kullanın .
Daha da iyisi, geçici değişkenler kullanın ve koşullarınızı aşağıdakilerden önce yerleştirin:if ($link) { $href = "yes"; } else { $href = "no"; } echo "<a href='$href'>Link</a>";
Bu tür durumlar için işlevleri veya yöntemleri tanımlamak da genellikle mantıklıdır.
Kontrol blokları "sonuç" vermiyor
Şimdi bu daha az yaygındır, ancak birkaç kodlayıcı
if
bir sonuç döndürecekmiş gibi davranmaya bile çalışır :$var = if ($x == $y) { "true" };
if
Bir dize birleştirme / ifade içinde kullanmakla yapısal olarak aynıdır .- Ancak kontrol yapılarının (if / foreach / while) bir "sonucu" yoktur .
- Değişmez dizge "true" da sadece bir void ifadesi olacaktır.
Kod bloğunda bir atama kullanmanız gerekecek :
if ($x == $y) { $var = "true"; }
Alternatif olarak,
?:
üçlü karşılaştırmaya başvurabilirsiniz .Eğer içindeyse
Sen yuvalayamazsınız birif ya bir koşul içinde:
⇓ if ($x == true and (if $y != false)) { ... }
Bu açıkça gereksizdir, çünkü
and
(veyaor
) zaten zincirleme karşılaştırmalarına izin verir.Unutulmuş
;
noktalı virgülBir kez daha: Her kontrol bloğunun bir ifade olması gerekir. Önceki kod parçası noktalı virgülle sonlandırılmazsa, bu garantili bir sözdizimi hatasıdır:
⇓ $var = 1 + 2 + 3 if (true) { … }
Btw, bir
{…}
kod bloğunun son satırında da noktalı virgül gerekir.Noktalı virgül çok erken
Şimdi, bu tuzağı gözden kaçırmak çok kolay olduğundan, belirli bir kodlama stilini suçlamak muhtemelen yanlıştır:
⇓ if ($x == 5); { $y = 7; } else ← { $x = -1; }
Bu hayal edebileceğinizden daha sık oluyor.
- Ne zaman sona if ()ifadenin; bir boşluk deyimi çalıştırır.
;
Bir boş olur{}
kendi! - Böylelikle
{…}
blok, öğesinden ayrılırif
ve her zaman çalışır. - Yani
else
artık açık birif
yapıyla bir ilişkisi yoktu , bu yüzden bu Beklenmeyen bir T_ELSE sözdizimi hatasına yol açar.
Bu da bu sözdizimi hatasının benzer şekilde ince bir varyasyonunu açıklar:
if ($x) { x_is_true(); }; else { something_else(); };
Sonraki
;
kod bloğu{…}
tümif
yapıyı sonlandırır veelse
dalı sözdizimsel olarak ayırır.- Ne zaman sona if ()ifadenin; bir boşluk deyimi çalıştırır.
Kod bloklarını kullanmamak
Sözdizimsel kıvırcık Parantezleri yapmasına izin verdiklerine
{
...}
kod bloklarıif
/elseif
/else
dallar. Bu ne yazık ki, ters kodlayıcılar için çok yaygın olan bir sözdizimi stilidir. (Yanlış varsayım altında bu, yazmak veya okumak daha hızlıydı).Ancak bu, sözdizimini artırma olasılığı yüksektir. Er ya da geç ek ifadeler if / else dallarında yerini bulacaktır:
if (true) $x = 5; elseif (false) $x = 6; $y = 7; ← else $z = 0;
Aslında kod blokları kullanmak Ama, var yazmasına
{
...}
gibi onları!Deneyimli programcılar bile bu köşeli ayraçsız sözdiziminden kaçınır veya en azından onu kuralın istisnai bir istisnası olarak anlar.
Yanlış sırada Else / Elseif
Kendinize hatırlatmanız gereken bir şey elbette şartlı emirdir .
if ($a) { … } else { … } elseif ($b) { … } ↑
İstediğiniz kadar e sahip olabilirsiniz
elseif
, ancak elseen son gitmeniz gerekir . İşte böyle.Sınıf bildirimleri
Yukarıda belirtildiği gibi , bir sınıf bildiriminde kontrol ifadelerine sahip olamazsınız:
class xyz { if (true) { function ($var) {} }
Bu gibi durumlarda ya bir işlev tanımını unuttunuz ya da
}
çok erken kapattınız.Beklenmeyen T_ELSEIF / T_ELSE
PHP ve HTML karıştırırken, kapanış
}
bir içinif/elseif
aynı PHP bloğunun içinde olmalıdır<?php ?>
sonraki olarakelseif/else
. Bu kapanış gibi bir hata üretecektir}
içinif
ihtiyaçları parçası olmakelseif
:<?php if ($x) { ?> html <?php } ?> <?php elseif ($y) { ?> html <?php } ?>
Doğru form
<?php } elseif
:<?php if ($x) { ?> html <?php } elseif ($y) { ?> html <?php } ?>
Bu, aşağı yukarı yanlış girintinin bir varyasyonudur - muhtemelen çoğunlukla yanlış kodlama niyetlerine dayanmaktadır.
Sen olamaz diğer ifadeleri püre İnbetweenif
veelseif
/else
yapısal jeton:if (true) { } echo "in between"; ← elseif (false) { } ?> text <?php ← else { }
Her ikisi de
{…}
kontrol yapısı simgeleri arasında değil , yalnızca kod bloklarında gerçekleşebilir .- Bu zaten mantıklı değil. PHP
if
veelse
dallar arasında atladığında bazı "tanımlanmamış" durum olduğu gibi değil . - Basılı ifadelerin nereye ait olduğu / veya her iki dalda da tekrarlanmaları gerekip gerekmediğine karar vermelisiniz.
Ayrıca, farklı kontrol yapıları arasında bir if / else'i de ayıramazsınız :
foreach ($array as $i) { if ($i) { … } } else { … }
Hiçbir yoktur sözdizimsel ilişki arasındaki
if
veelse
.foreach
En sözcük kapsam uçları}
, böylece için anlamı yokif
yapısı devam etmek.- Bu zaten mantıklı değil. PHP
T_ENDIF
Beklenmeyen bir T_ENDIF hakkında şikayet edilirse, alternatif sözdizimi stilini
if:
⋯elseif:
⋯else:
kullanıyorsunuzdurendif;
. Bunun hakkında gerçekten iki kez düşünmen gereken.Yaygın bir tuzak, ürkütücü bir şekilde benzer olan :kolonun ;noktalı virgülle karıştırılmasıdır . ("Noktalı virgül çok erken" ile kapatılmıştır)
Şablon dosyalarında girintiyi izlemek daha zor olduğundan, alternatif sözdizimini kullanırken o kadar çok -
endif;
hiçbiriyle eşleşmemeniz olasıdırif:
.Kullanılması } endif;bir olduğunu katına
if
-terminatör.
"Beklenmeyen $ end" ise genellikle unutulmuş bir kapanış
}
küme ayracı için fiyattır .Ödev ve karşılaştırma
Dolayısıyla, bu bir sözdizimi hatası değil, ancak bu bağlamda bahsetmeye değer:
⇓ if ($x = true) { } else { do_false(); }
Bu bir ==/ ===karşılaştırma= değil , bir ödev . Bu oldukça incedir ve bazı kullanıcıları kolayca çaresizce tüm durum bloklarını düzenlemeye yönlendirir. Öncelikle istenmeyen görevlere dikkat edin - bir mantık hatası / yanlış davranışla karşılaştığınızda.
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>
Gibi Karşılaştırma operatörleri ==
, >=
, ===
, !=
, <>
, !==
ve <=
ya <
ve >
çoğunlukla gibi, sadece ifadelerde kullanılması gereken if
ifadeler. Ayrıştırıcı onlardan şikayet ederse, bu genellikle yanlış eşleştirme veya (
)
çevrelerindeki uyumsuz parens anlamına gelir .
Parens gruplaması
Özellikle
if
birden çok karşılaştırmalı ifadeler için, parantezleri açıp kapatmayı doğru saymaya dikkat etmelisiniz :⇓ if (($foo < 7) && $bar) > 5 || $baz < 9) { ... } ↑
Burada buradaki
if
durum,)
Karşılaştırmalarınız yeterince karmaşık hale geldiğinde, genellikle onu birden çok ve iç içe yerleştirilmiş
if
yapılara bölmeye yardımcı olur .isset () karşılaştırılarak ezildi
Yaygın bir yeni gelen, pitfal birleştirmeye isset()veya empty()karşılaştırmalarla çalışıyor :
⇓ if (empty($_POST["var"] == 1)) {
Ya da:
⇓ if (isset($variable !== "value")) {
Bu PHP için bir anlam ifade etmiyor çünkü
isset
veempty
sadece değişken isimlerini kabul eden dil yapıları. Sonucu karşılaştırmak da mantıklı değil, çünkü çıktı sadece / zaten bir boolean.Dizi operatörüyle
>=
büyük veya eşit kafa karıştırıcı=>
Her iki operatör de biraz benzer görünüyor, bu yüzden bazen karışıyorlar:
⇓ if ($var => 5) { ... }
Doğru yapmak için bu karşılaştırma operatörünün " büyüktür veya eşittir " olarak adlandırıldığını hatırlamanız yeterlidir .
Ayrıca bkz: PHP'de if ifade yapısı
Karşılaştırılacak bir şey yok
Aynı değişken adıyla ilgiliyse iki karşılaştırmayı da birleştiremezsiniz:
⇓ if ($xyz > 5 and < 100)
PHP, ilk değişkeni yeniden karşılaştırmak istediğinizi çıkaramaz. İfadeler genellikle operatör önceliğine göre eşleştirilir , bu nedenle
<
görüldüğü zaman , orijinal değişkenden geriye yalnızca bir mantıksal sonuç kalır .Ayrıca bkz .: beklenmeyen T_IS_SMALLER_OR_EQUAL
Karşılaştırma zincirleri
Bir işleç satırı olan bir değişkenle karşılaştıramazsınız:
⇓ $reult = (5 < $x < 10);
Bu, her biri karşı olmak üzere iki karşılaştırmaya bölünmelidir
$x
.Bu aslında daha çok bir kara listeye alınmış ifadeler durumudur (eşdeğer operatör ilişkilendirmesi nedeniyle). Birkaç C tarzı dilde sözdizimsel olarak geçerlidir, ancak PHP bunu beklenen karşılaştırma zinciri olarak da yorumlamaz.
Beklenmedik
>
Beklenmedik<
Operatörlerden büyük
>
veya küçük olanların<
özel birT_XXX
belirteç adı yoktur. Ve diğerleri gibi yanlış yerleştirilmiş olsalar da, ayrıştırıcının yanlış alıntılanmış dizeler ve karışık HTML için onlardan şikayet ettiğini daha sık görürsünüz:⇓ print "<a href='z">Hello</a>"; ↑
Bir dizeye Bu miktarlar
"<a href='z"
kıyaslanan>
bir değişmez sabiteHello
ve sonra başka<
karşılaştırma. Ya da en azından PHP bunu böyle görüyor. Asıl neden ve sözdizimi hatası, erken dize"
sonlandırmasıydı.PHP başlangıç etiketlerini iç içe yerleştirmek de mümkün değildir:
<?php echo <?php my_func(); ?> ↑
Ayrıca bakınız:
- php beklenmeyen T_IS_NOT_EQUAL hatası
- sözdizimi hatası, beklenmeyen T_IS_EQUAL
- Dönüş ifadesinde sözdizimi hatası
- http://forums.phpfreaks.com/topic/96891-parse-error-syntax-error-unexpected-t-is-not-identical-expecting-or/
Beklenmeyen T_IF
Beklenmeyen T_FOREACH
Beklenmeyen T_FOR
Beklenmeyen T_WHILE
Beklenmeyen T_DO
Beklenmeyen T_ECHO
Kontrol gibi yapıları if
, foreach
, for
, while
, list
, global
, return
, do
, print
, echo
sadece tablolara olarak kullanılabilir. Genellikle kendi başlarına bir hatta ikamet ederler.
Noktalı virgül; neredesin
Ayrıştırıcı bir kontrol ifadesinden şikayet ederse, evrensel olarak önceki satırda bir noktalı virgül kaçırdınız mı?
⇓ $x = myfunc() if (true) {
Çözüm: önceki satıra bakın; noktalı virgül ekleyin.
Sınıf bildirimleri
Bunun meydana geldiği bir başka konum da sınıf bildirimleridir . Sınıf bölümünde yalnızca özellik başlatmalarını ve yöntem bölümlerini listeleyebilirsiniz. Orada hiçbir kod bulunamaz.
class xyz { if (true) {} foreach ($var) {}
Bu tür sözdizimi hataları genellikle yanlış iç içe geçmiş
{
ve}
. Özellikle fonksiyon kodu blokları çok erken kapatıldığında.İfade bağlamındaki ifadeler
Çoğu dil yapısı yalnızca ifade olarak kullanılabilir . Diğer ifadelerin içine yerleştirilmeleri amaçlanmamıştır:
⇓ $var = array(1, 2, foreach($else as $_), 5, 6);
Aynı şekilde bir
if
dizelerde, matematik ifadelerinde veya başka bir yerde kullanamazsınız :⇓ print "Oh, " . if (true) { "you!" } . " won't work"; // Use a ternary condition here instead, when versed enough.
if
Özellikle bir ifadeye benzer koşulları gömmek için , genellikle ?:üçlü bir değerlendirme kullanmak istersiniz .Aynı için de geçerlidir
for
,while
,global
,echo
ve daha az bir uzanırlist
.⇓ echo 123, echo 567, "huh?";
Oysa
print()
ifade bağlamında kullanılabilen yerleşik bir dildir. (Ancak nadiren mantıklıdır.)Tanımlayıcı olarak ayrılmış anahtar kelimeler
Ayrıca, kullanıcı tanımlı işlevler veya sınıf adları için
do
veyaif
ve diğer dil yapılarını kullanamazsınız . (Belki PHP 7'de olabilir. Ancak o zaman bile tavsiye edilmez.)Kontrol bloğunuzdan sonra iki nokta üst üste (:) veya küme parantez ({) yerine noktalı virgül var
Denetim yapıları, kapsamlarını temsil etmek için tipik olarak küme parantezleri içine alınır (ancak iki nokta üst üste alternatif bir sözdiziminde kullanılabilir ). Yanlışlıkla noktalı virgül kullanırsanız, bu bloğu vaktinden önce kapatırsınız ve kapanış ifadenizin bir hata atmasına neden olur.
foreach ($errors as $error); <-- should be : or {
Beklenmeyen '?'
Eğer boş birleştirme işlecini ??
PHP 7'den önceki bir PHP sürümünde kullanmaya çalışıyorsanız bu hatayı alırsınız.
<?= $a ?? 2; // works in PHP 7+ <?= (!empty($a)) ? $a : 2; // All versions of PHP
Beklenmeyen '?', Beklenen değişken
Null yapılabilir türler için benzer bir hata oluşabilir, örneğin:
function add(?int $sum): ?int {
Bu da eski bir PHP sürümünün kullanıldığını gösterir (ya CLI sürümü php -v
ya da web sunucusuna bağlı phpinfo();
).
Beklenmeyen T_LNUMBER
Jeton T_LNUMBER
, "uzun" / sayı anlamına gelir.
Geçersiz değişken adları
PHP'de ve diğer programlama dillerinin çoğunda, değişkenler bir sayıyla başlayamaz. İlk karakter alfabetik veya alt çizgi olmalıdır.
$1 // Bad $_1 // Good
-Placeholders'ı PHP bağlamında kullanmak için sıklıkla ortaya çıkar :
preg_replace
"$1"
# ↓ ⇓ ↓ preg_replace("/#(\w+)/e", strtopupper($1) )
Geri aramanın alıntılandığı yer. (Artık
/e
normal ifade bayrağı kullanımdan kaldırılmıştır. Ancak bazenpreg_replace_callback
işlevlerde hala kötüye kullanılmaktadır .)Aynı tanımlayıcı kısıtlaması nesne özellikleri için de geçerlidir , btw.
↓ $json->0->value
Tokenizer / çözümleyici bir hazır izin vermiyor olsa da
$1
değişken adı olarak, tek olabilir kullanabilir${1}
veya${"1"}
. Standart olmayan tanımlayıcılar için sözdizimsel bir çözümdür. (Bunu yerel kapsam araması olarak düşünmek en iyisidir. Ancak genellikle: bu tür durumlar için düz dizileri tercih edin!)Eğlenceli bir şekilde, ancak çok da tavsiye edilmeyen PHP ayrıştırıcısı, Unicode tanımlayıcılara izin verir; böyle
$➊
geçerli olacaktır. (Birebirden farklı olarak1
).
Başıboş dizi girişi
Virgül eksik olduğunda , dizi bildirimleri için de beklenmedik bir uzunluk oluşabilir
,
:# ↓ ↓ $xy = array(1 2 3);
Veya benzer şekilde işlev çağrıları ve bildirimleri ve diğer yapılar:
func(1, 2 3);
function xy($z 2);
for ($i=2 3<$z)
Bu nedenle, genellikle listeleri veya ifadeleri ayırmak için biri
;
veya,
eksiktir.Yanlış alıntılanmış HTML
Ve yine, yanlış alıntılanmış dizeler , sık rastlanan başıboş sayılar kaynağıdır:
# ↓ ↓ echo "<td colspan="3">something bad</td>";
Bu tür durumlar aşağı yukarı Beklenmeyen T_STRING hataları gibi ele alınmalıdır .
Diğer tanımlayıcılar
Ne işlevler, sınıflar ne de ad alanları bir sayıyla başlayarak adlandırılabilir:
↓ function 123shop() {
Değişken adlarıyla hemen hemen aynı.
Beklenmeyen '='
Bunun nedeni, değişken adında geçersiz karakterler bulunması olabilir. Değişkenler adları gerekir bu kurallara uyun:
Değişken isimleri PHP'deki diğer etiketlerle aynı kuralları izler. Geçerli bir değişken adı, bir harf veya alt çizgiyle başlar ve ardından herhangi bir sayıda harf, sayı veya alt çizgi gelir. Normal bir ifade olarak şu şekilde ifade edilir: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'
Beklenmeyen "devam" (T_CONTINUE)
continue
bir ifadedir (for veya if gibi) ve bağımsız görünmelidir. Bir ifadenin parçası olarak kullanılamaz. Kısmen, devam bir değer döndürmediğinden, ancak bir ifadede her alt ifadenin bir değerle sonuçlanması gerektiğinden, genel ifade bir değerle sonuçlanır. Bir ifade ile ifade arasındaki fark budur.
Bu, continue
üçlü bir ifadede veya bir dönüş değeri gerektiren herhangi bir ifadede kullanılamaz.
Beklenmeyen 'ara' (T_BREAK)
break;
Elbette aynı şey geçerli . Ayrıca ifade bağlamında kullanılamaz, ancak katı bir ifade ( foreach
bir if
blok ile aynı seviyede ).
Beklenmeyen 'dönüş' (T_RETURN)
Şimdi bu daha şaşırtıcı olabilir return
, ancak bu aynı zamanda sadece blok düzeyinde bir ifade . Daha yüksek kapsam / işleve bir değer (veya NULL) döndürür, ancak ifadenin kendisi olarak değerlendirilmez. → Yani: yapmanın bir anlamı yokreturn(return(false);;
Beklenmedik "."
PHP'nin desteklenmeyen bir sürümünde splat operatörünü ( ...) kullanmaya çalışıyorsanız bu durum oluşabilir .
...
ilk olarak bir işleve değişken sayıda argüman yakalamak için PHP 5.6'da kullanıma sunuldu:
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
PHP 7.4'te, bunu Array ifadeleri için kullanabilirsiniz .
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
Beklenmeyen "son" (T_ENDWHILE)
Sözdizimi iki nokta üst üste kullanıyor - iki nokta üst üste yoksa yukarıdaki hata ortaya çıkar.
<?php while($query->fetch()): ?>
....
<?php endwhile; ?>
Bu sözdiziminin alternatifi süslü parantez kullanmaktır:
<?php while($query->fetch()) { ?>
....
<?php } ?>
http://php.net/manual/en/control-structures.while.php
Başlayan bir hata mesajı Parse error: syntax error, unexpected ':'
yanlışlıkla bir sınıf statik referansı yazan kaynaklanabilir Class::$Variable
olarak Class:$Variable
.