PHP ayrıştırma / sözdizimi hataları; ve onları nasıl çözeceğim


652

Herkes sözdizimi hatalarıyla karşılaşır. Deneyimli programcılar bile yazım hataları yapar. Yeni gelenler 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 Ayrıştırma hatası: sözdizimi hatası, 20. satırdaki index.php dosyasında beklenmeyen '{'

Beklenmedik sembol her zaman gerçek suçlu değildir. Ancak satır numarası nereden bakacağınıza dair kabaca bir fikir veriyor.

Her zaman kod içeriğine bakın . Sözdizimi hata sık bahsedilen içinde gizler veya içinde önceki kod hatları . Kodunuzu kılavuzdaki sözdizimi örnekleriyle karşılaştırın.

Her durum diğerine uymuyor olsa da. Yine de sözdizimi hatalarını çözmek için bazı genel adımlar vardır . Bu referanslar ortak tuzakları özetledi:

Yakından ilgili referanslar:

Ve:

Stack Overflow ayrıca ç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ışı sayılır.
  • Bu yüzden sözdizimi düzeltme isteklerini göndermeden önce lütfen temel adımları takip edin .
  • Hala yapmak zorundaysanız, lütfen kendi çözme girişiminizi, düzeltmeye teşebbüslerinizi ve neyin yanlış ya da neyin yanlış olabileceği üzerine düşünme sürecinizi gösterin.

Senin Eğer tarayıcı örneğin "SyntaxError: yasadışı karakteri" olarak hata mesajı görüntülemesine, o zaman aslında değilile ilgili, ancak bir - 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üklendikten veya yükseltildikten 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. kurmak.


1
Bu bir cevap olmak için yeterli veri değil, ancak parsekit_compile_string ile bir analizör yazabilir ve daha kolay cevaplar verebilir. IDE'nize entegre edilirse, bu oldukça bilgilendirici olabilir.
Owen Beresford

4
Bunun üzerine etkileyici miktarda çalışma yaptınız. Buna saygı duy. Öğretmenlerin hataları hızlı bir şekilde belirlemeyi veya IDE'ler oluşturan veya hızlı düzeltmeler uygulayanları öğrenmeleri muhtemelen çok iyidir. Bununla birlikte, IDE'ler @Panique'in önerdiği gibi, bu çalışmanın çoğunu sizin için etkili bir şekilde yapacaklar. Ayrıca, im birçok durumda sıfırdan tekrar başlangıç ​​iyi bir seçenektir.
allprog

1
@ Fred-ii- Bence çoğu neden T_IF / T_FOREACH / ...bloğa benzer . Yine de IF / ELSE / ELSEIF soruları için daha özel bir özet hazırlamak istedim.
mario

1
@mario Bunu nasıl ifade edeceğimi bilmiyorum, ama bu soru-cevap biraz yeniden yazılmalı ve daha yapılandırılmış olmalı mı? (geçici yorum)
Rizier123

2
Biliyorum, keşke yıllar önce PHP öğrenirken bu listeye sahip olsaydım.Çok yeni başlayanlar için çok yararlı.
Chipster

Yanıtlar:


291

Sözdizimi hataları nedir?

PHP, C stili ve zorunlu programlama dillerine aittir . Yanlış yerleştirilmiş semboller veya tanımlayıcılarla karşılaştığında kurtulamayan katı dilbilgisi kuralları vardır. Kodlama niyetinizi tahmin edemez.

İşlev tanımı sözdizimi özeti

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 . Ayrıca parantez / parantez dengelemeye yardımcı olur.

    Beklenen: noktalı virgül

  • 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 iletisinde şunlar bulunur:

Ayrıştırma hatası: sözdizimi hatası, beklenmedik T_STRING , bekliyor ' ;' içinde file.php'den üzerine hat 217

Hangi sözdizimi hatasının olası konumunu listeler . Belirtilen dosya adı ve satır numarasına bakın .

Gibi bir takma adT_STRING , ayrıştırıcı / belirteç hangi sembolü nihayet işleyemedi açıklar. Ancak sözdizimi hatasının nedeni bu değildir.

Önceki kod satırlarına da bakmak önemlidir . Genellikle sözdizimi hataları daha önce olan yanlıştır. Hata satırı numarası, ayrıştırıcının tümünü işlemek için 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 dosyasını açın. Belirtilen kod satırına bakın .

    • Kaçak teller ve yanlış yerleştirilmiş operatörler için, bu genellikle suçluyu bulduğunuz yerdir.

    • Soldan sağa satırı okuyun ve her sembolün ne yaptığını hayal edin.

  • Daha düzenli olarak önceki satırlara da bakmanız gerekir .

    • Özellikle, eksik ;noktalı virgüller önceki satır sonlarında / ifadesinde eksik. (En azından biçimsel bakış 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 sabitler farklı renklere sahip olmalıdır.

    • Operatörler +-*/.de farklı renklendirilmelidir. Aksi takdirde yanlış bağlamda olabilirler.

    • Dize renklendirmesinin çok fazla veya çok kısa olduğunu görürseniz, çıkış karakterinden çıkmış veya eksik bir kapanış "veya 'dize işaretçisi buldunuz .

    • Aynı renkte iki noktalama işaretinin yan yana olması da sorun olabilir. O değilse Genellikle, operatörler yalnız olan ++, --operatör aşağıdaki veya parantezler. Çoğu bağlamda birbirini doğrudan izleyen iki dize / tanımlayıcı yanlıştır.

  • Beyaz alan senin arkadaşın . Herhangi bir kodlama stilini takip edin .

  • Uzun çizgileri geçici olarak ayırın.

    • İşleçler veya sabitler ve dizeler arasında serbestçe yeni satırlar ekleyebilirsiniz . Ayrıştırıcı daha sonra, ayrıştırma hataları 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 ififadeleri farklı veya iç içe ifkoş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 fazla okunabilir = daha az hata.)

    • Şunlara yeni satır ekleyin:

      1. Kolayca doğru olarak tanımlayabileceğiniz kod,
      2. Emin olmadığınız kısımlar,
      3. Ayrıştırıcının şikayet ettiği çizgiler.

      Uzun kod bloklarını bölümlere ayırmak, sözdizimi hatalarının kaynağını bulmaya gerçekten yardımcı olur.

  • Dışında açıklama kod rencide.

    • Sorun kaynağını izole edemiyorsanız, kod bloklarını yorumlamaya (ve geçici olarak kaldırmaya) başlayın.

    • Ayrıştırma hatasından kurtulduğunuz anda, sorun kaynağını buldunuz. Oraya daha yakından bakın.

    • Bazen tüm işlev / yöntem bloklarını geçici olarak kaldırmak isteyebilirsiniz. (Eşsiz kıvırcık parantez ve yanlış girintili kod durumunda.)

    • Sözdizimi sorununu çözemediğinizde , yorum yapılan bölümleri sıfırdan yeniden yazmaya çalışın .

  • Yeni gelen olarak, kafa karıştırıcı sözdizimi yapılarından bazılarından kaçının.

    • Üçlü ? :koşul operatörü kodu kompakt hale getirebilir ve gerçekten yararlıdır. Ancak her durumda okunabilirliğe yardımcı olmaz. Açık ifiken düz ifadeleri tercih edin .

    • PHP'nin alternatif sözdizimi ( if:/ elseif:/ endif;) şablonlar için yaygındır, ancak normal {kod }bloklarından daha az takip edilmesi kolaydır .

  • En yaygın yeni hatalar:

    • ;İfadeleri / satırları sonlandırmak için eksik noktalı virgüller .

    • İçindeki "veya için eşleşmeyen tırnak 'işaretleri.

    • Unutulmuş işleçler, özellikle dize .birleştirme için.

    • Dengesiz (parantezler ). Onları rapor edilen satırda sayın. Eşit sayıda var mı?

  • Bir sözdizimi sorununun çözülmesinin bir sonraki sözdizimini çözebileceğini unutmayın.

    • Bir sorunu ortadan kaldırırsanız, ancak diğer kodlar aşağıdaki kodda yukarı çıkarsa, çoğunlukla doğru yoldasınız demektir.

    • Yeni bir sözdizimi hatası düzenlendikten sonra aynı satırda kırpılırsa, denemeye çalıştığınız değişiklik muhtemelen bir hataydı. (Her zaman olmasa da.)

  • Düzeltemiyorsanız, daha önce çalışan kodun bir yedeğini geri yükleyin.

    • Bir kaynak kodu versiyonlama sistemi benimseyin. Her zaman diffkırık ve son çalışan sürümü görebilirsiniz. Sözdizimi sorununun ne olduğu konusunda aydınlatıcı olabilir.
  • Görünmez sokak Unicode karakterleri : Bazı durumlarda, kaynağınızda bir hexeditor veya farklı bir düzenleyici / görüntüleyici kullanmanız gerekir. Bazı sorunlar 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 kırılmayan boşluklar ve akıllı tırnaklar düzenli olarak kaynak koduna girebilir.

  • Dosyalara hangi tür çizgi işaretlerinin kaydedildiğine dikkat edin.

    • PHP \nsatırsonlarını değil satırsonlarını onurlandırıyor \r.

    • Bu, MacOS kullanıcıları için bazen bir sorundur (yanlış yapılandırılmış düzenleyiciler için OS X'te bile).

    • Genellikle tek satır //veya #yorumlar kullanıldığında sorun olarak ortaya çıkar . Çok satırlı /*...*/yorumlar, satır aralıkları yok sayıldığında ayrıştırıcıyı nadiren rahatsız eder.

  • Senin Eğer sözdizimi hatası web üzerinden iletmez : makinenizde bir sözdizimi hatası var olur. Ancak aynı dosyayı çevrimiçi yayınlamak artık onu göstermiyor. Bu sadece iki şeyden biri anlamına gelebilir:

    • Yanlış dosyaya bakıyorsunuz!

    • Veya kodunuz görünmez kaçak Unicode içeriyordu (yukarıya bakın). Kolayca öğrenebilirsiniz: Kodunuzu web formundan tekrar metin düzenleyicinize kopyalamanız yeterlidir.

  • PHP sürümünüzü kontrol edin . Tüm sözdizimi yapıları her sunucuda bulunmaz.

    • php -v komut satırı yorumlayıcısı için

    • <?php phpinfo(); web sunucusu üzerinden çağrılan kişi için.


    Bunlar mutlaka aynı değildir. Özellikle çerçevelerle çalışırken, onları eşleştireceksiniz.

  • PHP'nin ayrılmış anahtar sözcüklerini işlevler / yöntemler, sınıflar veya sabitler için tanımlayıcı olarak kullanmayın .

  • Deneme yanılma son çareniz.

Her şey başarısız olursa, her zaman hata mesajınızı Google'a gönderebilirsiniz. Sözdizimi sembollerinin aranması kolay değildir (Stack Overflow'un kendisi SymbolHound tarafından dizine eklenir ). Bu nedenle, alakalı bir şey bulmadan önce birkaç sayfa daha bakmanız gerekebilir.

Diğer kılavuzlar:

Beyaz ekran ölüm

Web siteniz boşsa, genellikle sözdizimi hatası neden olur. Ekranlarını aşağıdakilerle etkinleştirin:

  • error_reporting = E_ALL
  • display_errors = 1

Genelde php.iniveya .htaccessmod_php için veya hatta.user.ini FastCGI kurulumlarında.

PHP'nin ilk satırı yorumlayamadığı / çalıştıramadığı için bozuk komut dosyasında etkinleştirmek çok geç. Hızlı bir çözüm, bir sarıcı komut dosyası hazırlıyor test.php:

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

Sonra bu sarmalayıcı komut dosyasına erişerek hatalı kodu çağırın.

Ayrıca bir komut dosyası HTTP 500 yanıtlarıyla çöktüğünde PHP'leri etkinleştirmeye error_logve web sunucunuzaerror.log bakmanıza yardımcı olur .


error_reporting(E_ALL | E_STRICT);PHP'nin önceki sürümleri için
Geo

2
Bazı IDE'ler (NetBeans gibi) yalnızca sözdizimi vurgulamayı değil, aynı zamanda kod biçimlendirmesini de destekler. Kodunuzu düzgün bir şekilde biçimlendirme ve zaman zaman IDE'den yeniden biçimlendirilmesini isteme alışkanlığınız varsa, benzersiz parantezler gibi sorunları tespit etmekte zorlanabilirsiniz.
Josep Valls

115

Bu konunun tamamen aşırı tartışılmış / aşırı karmaşık olduğunu düşünüyorum. Herhangi bir sözdizimi hatasından tamamen kaçınmanın bir yolu IDE kullanmaktır. Hatta IDE olmadan çalışmanın da 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ı bildirimi sözdizimi hatasının tam türünü ve tam konumunu gösterir, o zaman kesinlikle başka bir çözüm aramanıza gerek yoktur.

Sözdizimi denetleme IDE kullanmak:

Yazarken doğru gördüğünüz için bir daha asla sözdizimi hatalarına girmeyeceksiniz. Ciddi anlamda.

Sözdizimi kontrolüne sahip mükemmel IDE'ler (tümü Linux, Windows ve Mac için kullanılabilir):

  1. NetBeans [ücretsiz]
  2. PHPStorm [199 $ USD]
  3. PHP Eklentisi ile Tutulma [ücretsiz]
  4. Sublime [80 $ USD] (esas olarak bir metin editörü, ancak PHP Sözdizimi Ayrıştırıcı gibi eklentilerle genişletilebilir )

2
Açıkçası. Bununla birlikte, IDE'leri burada bırakmak, sözdizimi yardımlarında farklılık gösterebilecekleri biraz ayrıntı verebilir misiniz? Sublime çoğunlukla IDE değil bir editördür; ama sonra daha güzel ve çabuk; öncelikle sözdizimi vurgulanır, aynı zamanda parantez eşleşmesinde de geçerlidir. PHPStorm'dan farklı olarak örneğin T_CONSTANT_AND_ENCAPSED hatalarını anında keşfeder; ancak satır içi hatalar için daha dalgalı çizgiler yapar. NetBeans'in sözdizimi ipuçları PHP'lerden bile daha şifreliydi (izin verilen yapıları serbest bırakmak). Artılarını / eksilerini deneyimlerinizi paylaşabilir misiniz? favori Eclipse / PDT veya ..?
mario

@mario Sanırım konuya gerçekten çok derinsiniz, bu yüzden burada yanlış bir şey söylemek istemiyorum, ama tüm kod I (ve takım arkadaşlarım, kodlayan arkadaşlar, serbest ortaklar) hiç IDE'de hiç yazılmadı sözdizimi hatası. Bu yüzden en azından Netbeans / PHPStorm'un sözdizimi kontrolünün son derece güçlü olduğunu düşünüyorum. Ama belki sorunuzu yanlış okudum. Birkaç saat ver ...;)
Sliq

Cevabınız zaten açık. Sorularımızın% 99'una uyuyor. Bununla birlikte, buradaki bağlam için, hangi IDE'nin daha yeni başlayanlar için yararlı ipuçları sağladığına karar vermek istiyorum . Muhtemelen bizim için küçük, renklendirme ve dalgalı çizgiler yeterince ustasanız yeterli. Ancak farklılıkların yeni başlayanlar için daha önemli olabileceğini düşünüyorum.
mario

Bazen bir IDE uygulanabilir bir seçenek olmayabilir. Örneğin, bir WordPress temasında veya eklentisinde hızlı düzenlemeler yapmak. Evet, tüm kodu bir IDE'ye kopyalayabilirim, ancak sonra hızlı bir düzenleme umduğumda açmam, hepsini buraya yapıştırmam, üstbilgileri ve diğer tüm zaman israfını ayarlamam gerekiyor. Şimdi, yeni özellikler geliştiriyorsanız veya sıfırdan başlıyorsanız, evet, bir IDE'de yapın. Kurmak için başlangıçta biraz fazla zaman ayırdığınızdan pişman olmayacaksınız.
1934286

IDE'yi sadece bir araç kutusu değil, bir fragman olarak görüyorum. DÜZELTME olmayabilir, ancak sözdizimi hatalarını bulmanıza ve önlemenize yardımcı olabilir. Burada birçok cevap, kodunuzu temiz tutarsanız bir hata yapma şansınızın daha az olduğunu ve fark edilmesinin daha kolay olduğunu söylüyor. Otomatik girintileme, kod ipuçları, değişken oluşum, otomatik kapanma parantezleri ve otomatik biçimlendirme ile bana günde birçok yazım hatası kazandırır ve neden bir tane kullandığımın ana avantajıdır. Bu, bu sorunun kapsamı dışındaki her şeyi saymaz (hata ayıklayıcı, veritabanı bağlayıcısı, uml diyagramı vb.) IDE size zaman kazandıracak ve sözdizimi hatalarından daha fazlasını önleyecektir.
Louis Loudog Trottier

58

beklenmedik [

Bu günlerde, beklenmeyen [dizi ayracı, eski PHP sürümlerinde yaygın olarak görülmektedir. Kısa dizi sözdizimi PHP beri mevcuttur > = 5.4 . Eski kurulumlar yalnızca desteklenir array().

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

Dizi işlevi sonucu silme işlemi eski PHP sürümlerinde de kullanılamaz:

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

Başvuru - Bu hata PHP'de ne anlama geliyor? - "Sözdizimi hatası, beklenmedik \[" en yaygın ve pratik çözümleri gösterir.

Yine de, PHP kurulumunuzu yükseltmek her zaman daha iyidir. Paylaşılan web barındırma planları için, örneğin SetHandler php56-fcgidaha yeni bir çalışma zamanını etkinleştirmek için önce kullanılabilirse araştırma yapın .

Ayrıca bakınız:

BTW, ayrıca eski + yavaş PHP sürümleri ile gerçekten yapışırsanız ön iş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ü uyuşmazlığı değilse, genellikle 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ıvırcık parantez {veya parantez açmakla karıştırmak (ortak bir gözetimdir.

    foreach [$a as $b)
            

    Ya da:

    function foobar[$a, $b, $c] {
                   
  • Veya diziler olarak sabitleri (PHP 5.6'dan önce) dereference denemek

    $var = const[123];
           

    En azından PHP bunu constsabit bir isim olarak yorumlar .

    Bir dizi değişkenine (buradaki tipik nedendir) erişmek istiyorsanız, önde gelen $sigil'i ekleyin - böylece bir olur $varname.

  • globalAnahtar kelimeyi ilişkilendirilebilir bir dizinin bir üyesinde kullanmaya çalışıyorsunuz . Bu geçerli bir sözdizimi değil:

    global $var['key'];


Beklenmedik ] kapanış köşeli ayraç

Bu biraz daha nadirdir, ancak sonlanan dizi ]braketiyle de sözdizimi kazaları da vardır .

  • Yine )parantez veya }kıvırcık parantez ile uyumsuzluklar yaygındır:

    function foobar($a, $b, $c] {
                              
  • Veya dizinin olmadığı bir diziyi sonlandırmaya çalışmak:

    $var = 2];

    Bu genellikle çok satırlı ve iç içe dizi bildirimlerinde oluşur.

    $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ştirme için IDE'nizi kullanın . En azından daraltmak için daha fazla boşluk ve satırsonu kullanın.


'PHP 5.4 sözdizimi aşağı dönüştürücüler' bağlantısı github.com/IonutBajescu/short-arrays-to-long-arrays yukarıdaki bozuk.
Danimal Reks

46

Beklenmedik T_VARIABLE

"Beklenmedik T_VARIABLE" $variable, geçerli ifade / ifade yapısına sığmayan bir gerçek ad olduğu anlamına gelir .

kasıtlı olarak soyut / eksik operatör + $ değişken diyagram

  1. noktalı virgül eksik

    En sık olarak önceki satırda eksik bir noktalı virgül belirtir . Bir ifadeyi izleyen değişken atamalar, nereye bakılacağının iyi bir göstergesidir:

           
    func1()
    $var = 1 + 2;     # parse error in line +2
  2. Dize birleştirme

    Sık sık bir aksilik, unutulan işleçle dize birleştirmeleridir. :

                                   
    print "Here comes the value: "  $value;

    Btw, okunabilirliğe yardımcı olduğunda dize enterpolasyonunu (çift tırnak içindeki temel değişkenler) tercih etmelisiniz . Bu sözdizimi sorunlarını önler.

    Dize enterpolasyonu bir komut dosyası dili çekirdek özelliğidir. Kullanırken utanç yok. Değişken hakkında herhangi bir mikro optimizasyon önerisini göz ardı edin. birleştirme işleminin daha hızlı olduğu almayın . Değil.

  3. Eksik ifade işleçleri

    Elbette aynı konu diğer ifadelerde de ortaya çıkabilir, örneğin aritmetik işlemler:

               
    print 4 + 7 $var;

    PHP yapamıyor değişkenin eklenmesi, çıkarılması veya karşılaştırılması gerekiyorsa burada tahmin .

  4. Listeler

    Ayrıştırıcının ayrıca beklenen bir virgül belirttiği ,örneğin dizi popülasyonlarında olduğu gibi sözdizimi listeleri için aynıdır :

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

    Veya fonksiyon parametre listeleri:

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

    Aynı şekilde bunu listveya globalifadeleriyle veya bir ;noktalı virgül eksikkenfor döngüde .

  5. Sınıf bildirimleri

    Bu ayrıştırıcı hatası sınıf bildirimlerinde de oluşur . İfadeler değil, yalnızca statik sabitler atayabilirsiniz. Böylece ayrıştırıcı değişkenler hakkında atanmış veri olarak şikayet eder:

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

    Eşsiz }kapanma kıvırcık parantezleri özellikle buraya yol açabilir. Bir yöntem çok erken sonlandırılırsa (uygun girinti kullanın!), Bir başıboş değişken genellikle sınıf bildirim gövdesine yanlış yerleştirilir.

  6. Tanımlayıcılardan sonraki değişkenler

    Ayrıca, hiçbir zaman bir değişkenin doğrudan tanımlayıcıyı izlemesini sağlayamazsı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 genellikle diziler daha basit ve daha uygun olsa bile bunları çok rahat kullanmaya çalışırlar.

  7. Dil kurulduktan sonra eksik parantez

    Hasty yazarak unutulan açılması veya için kapanış parantezi yol açabilir ifve forve foreachifadeleri:

           
    foreach $array as $key) {

    Çözüm: (deyim ve değişken arasındaki eksik açıklığı ekleyin .

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

    Kıvrık {ayraç, ififadeyi önce )kapama paranteziyle kapatmadan kod bloğunu açmaz .

  8. Else şartlar beklemiyor

         
    else ($var >= 0)

    Çözüm: Koşulları kaldırın elseveya kullanın elseif.

  9. Kapatma için braketlere ihtiyacınız var

         
    function() uses $var {}

    Çözüm: Etrafına köşeli ayraç ekleyin $var.

  10. Görünmez boşluk

    "Görünmez kaçak Unicode" ( kırılmayan alan gibi ) referans yanıtında belirtildiği gibi , bu hatayı şüpheli olmayan 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çeriyorsa, bir hexeditor ile kontrol edin.

Ayrıca bakınız


32

Beklenmedik T_CONSTANT_ENCAPSED_STRING
Beklenmedik T_ENCAPSED_AND_WHITESPACE

Kullanılmayan isimler T_CONSTANT_ENCAPSED_STRINGve T_ENCAPSED_AND_WHITESPACEalıntı yapılan değişmezler"string" .

Farklı bağlamlarda kullanılırlar, ancak sözdizimi sorunu oldukça benzerdir. T_ENCAPSED… uyarıları çift tırnaklı dize bağlamında meydana gelirken, T_CONSTANT… dizeleri genellikle düz PHP ifadelerinde veya ifadelerinde sapar .

  1. Yanlış değişken enterpolasyonu

    Ve en sık yanlış PHP değişken enterpolasyonu için gelir:

                                   
    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) bu bir hatadır. Ayrıştırıcı, içerilen tekli 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özdizimini kullanmak geçerlidir :

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

    İç içe diziler veya daha derin nesne başvuruları karmaşık kıvırcık dize ifadesi sözdizimini gerektirir :

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

    Emin değilseniz, bu genellikle kullanımı daha güvenlidir. Genellikle daha okunabilir olarak kabul edilir. Ve daha iyi IDE'ler aslında bunun için farklı sözdizimi renklendirme kullanır.

  2. Eksik birleştirme

    Bir dize bir ifadeyi izliyor, ancak bir birleştirme veya başka bir işleçten yoksunsa PHP'nin dize değişmezinden şikayet ettiğini görürsünüz:

                           
    print "Hello " . WORLD  " !";

    Sizin ve benim için açık olsa da, PHP dizenin oraya eklenmesi gerektiğini tahmin edemez .

  3. Kafa karıştırıcı dize tırnakları

    Dize sınırlayıcılarını karıştırırken aynı sözdizimi hatası oluşur . Tek 'veya çift tırnakla başlayan bir dize "de aynı ile biter.

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

    Bu örnek çift tırnak işareti ile başladı. Ancak HTML özellikleri için çift tırnak işaretleri de kullanılmıştır. Bununla birlikte, amaçlanan birleştirme operatörü, tek tırnak içinde ikinci bir dizenin parçası olarak yorumlandı.

    İpucu : Editör / IDE'nizi, tek ve çift tırnaklı dizeler için biraz farklı renklendirme kullanacak şekilde ayarlayın. (Ayrıca, uygulama mantığının metin çıktısı için çift tırnaklı dizeleri ve yalnızca sabit benzeri değerler için tek tırnaklı dizeleri tercih etmesine yardımcı olur.)

    Bu, ilk etapta çift tırnaklardan kurtulmamanı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 da sözdizimi karışıklığına yol açsa da, tüm daha iyi IDE'ler / editörler kaçan alıntıları farklı renklendirerek tekrar yardımcı olur.

  4. Eksik açılış teklifi

    Eşit olarak açılması "/' ayrıştırıcı hataları için bir tarif tırnak unutulur :

                   
     make_url(login', 'open');

    Burada, ', 'açıkça loginbir string parametresi olması gerektiği zaman, bir bareword'dan sonra bir string değişmezi haline gelecektir .

  5. Dizi listeleri

    ,Dizi oluşturma bloğundaki virgülleri kaçırırsanız , ayrıştırıcı art arda iki dize görür:

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

    Son satırın her zaman ekstra bir virgül içerebileceğini, ancak aradaki bir çizgiyi gözden kaçırmanın affedilemez olduğunu unutmayın. Sözdizimi vurgulaması olmadan keşfedilmesi zor.

  6. İşlev parametre listeleri

    İşlev çağrıları için aynı şey :

                             
    myfunc(123, "text", "and"  "more")
  7. Kaçak teller

    Ortak bir varyasyon oldukça basit bir şekilde unutulmuş string sonlandırıcılar:

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

    Burada PHP, birbirini doğrudan takip eden iki dize değişmezinden yakınıyor. Ancak asıl sebep, kapatılmamış bir önceki dize.

Ayrıca bakınız


27

Beklenmedik T_STRING

T_STRINGbiraz yanlış isim. Bir alıntıya atıfta bulunmaz "string". Ham bir tanımlayıcıyla karşılaşıldığı anlamına gelir. Bu, baresözcüklerden artık CONSTANTveya işlev adlarına, unutulmamış dizgilere veya herhangi bir düz metne kadar değişebilir .

  1. Yanlış dizeler

    Ancak bu sözdizimi hatası, en çok yanlış sıralanan dize değerleri için yaygındır. Çıkış karakteri olmayan ve başıboş "veya 'tırnak işaretleri geçersiz bir ifade oluşturur:

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

    Sözdizimi vurgulama, bu tür hataları çok açık hale getirecektir. Dize muhafazası olarak kullanılana bağlı olarak \", çift tırnak işareti veya \'tek tırnak işareti için ters eğik çizgi kullanmayı unutmayın .

    • Kolaylık sağlamak için, içinde çift tırnak bulunan düz HTML çıktıları verirken dış tek tırnakları tercih etmelisiniz.
    • Değişkenleri enterpolasyonlamak istiyorsanız çift tırnaklı dizeler kullanın, ancak sonradan "çift ​​tırnak işaretleri kullanmaktan kaçının.
    • Daha uzun çıktı için, içeri ve dışarı kaçmak yerine çoklu echo/ printsatırları tercih edin. Daha iyisi bir HEREDOC bölümünü düşünün .

    Başka bir örnek, PHP ile oluşturulan HTML kodunun 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ştiricinin tüm PHP değişken değerini görmemesi ve kaynağını unutan kod parçasına odaklanması durumunda olur. Örnek burada

    Ayrıca bkz . PHP'de tek tırnaklı ve çift tırnaklı dizeler arasındaki fark nedir? .

  2. 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");
             ⇯

    T_STRINGAyrıştırıcının o zaman protesto edebileceği sadece gerçek değil . Başka bir sık ​​değişiklik, Unexpected '>'sıralanmamış değişmez HTML için birdir.

  3. Programlamayan dize tırnak işaretleri

    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 gibi değildir :

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

    Tipografik / akıllı tırnak işaretleri Unicode sembolleridir. PHP bunları bitişik alfasayısal metnin bir parçası olarak görür. Örneğin ”these, sabit bir tanımlayıcı olarak yorumlanır. Ancak aşağıdaki metin değişmezleri ayrıştırıcı tarafından bir bareword / T_STRING olarak görülür.

  4. Eksik noktalı virgül; tekrar

    Önceki satırlarda sonlandırılmamış bir ifadeniz varsa, aşağıdaki 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ırmayı veya sonuçlarını çoğaltmayı, eklemeyi, karşılaştırmayı veya yalnızca birini ||veya diğerini çalıştırmayı amaçladığını bilemez .

  5. Kısa açık etiketler ve <?xmlPHP komut dosyalarında başlıklar

    Bu oldukça nadirdir. Ancak short_open_tags etkinse, PHP komut dosyalarınıza XML bildirimi ile başlayamazsınız :

          
    <?xml version="1.0"?>

    PHP kendisini görecek <?ve geri alacaktır . Kaçakın ne anlama xmlgeldiğini anlamayacak . Sürekli olarak yorumlanacaktır. Ancak versionirade başka bir değişmez / sabit olarak görülecektir. Ayrıştırıcı, aralarında bir ifade operatörü olmadan sonraki iki değişmez değeri / değeri anlayamadığından, ayrıştırıcı hatası olur.

  6. Görünmez Unicode karakterler

    Sözdizimi hatalarının en iğrenç nedeni, kırılmayan alan gibi Unicode sembolleridir . PHP, Unicode karakterlerin tanımlayıcı adları olarak kullanılmasına izin verir. Tamamen şüphesiz kod için bir T_STRING ayrıştırıcı şikayeti alırsanız, örneğin:

    <?php
        print 123;

    Başka bir metin editörü kırmanız gerekiyor. Ya da bir hekim bile. Burada düz alanlara ve yeni satırlara benzeyen şey görünmez sabitler içerebilir. Java tabanlı IDE'ler bazen sıfır genişlikli boşluklar, paragraf ayırıcılar vb. İçinde karıştırılan UTF-8 BOM'dan habersizdir.

    ;Her satır başlangıcında gereksiz 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. Hangi karşılığında PHP yararlı bir bildirim üretmek yapar.

  7. 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 imza olmadan, tanımlayıcı bir dil anahtar kelimesi veya bir sabit olabilir .

    PHP kodu başka bir dilde (C, Java, JavaScript, vb.) Yazılan koddan "çevrildiğinde" yaygın bir hatadır . Bu gibi durumlarda, değişken türünün bildirimi (orijinal kod, yazılan değişkenleri kullanan bir dilde yazıldığında) da gizlenebilir ve bu hatayı oluşturabilir.

  8. 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 kelimenin tam anlamıyla almasını söyler.

    Örnek: echo 'Jim said \'Hello\'';yazdıracakJim said 'hello'

    Bir dizenin kapanış teklifinden kaçarsanız, kapanış teklifi tam olarak ve amaçlandığı gibi değil, yani dizenin bir parçası olarak yazdırılabilir bir alıntı olarak alınır ve dizeyi kapatmaz. Bu, bir sonraki dizeyi açtıktan sonra veya komut dosyasının sonunda genellikle ayrıştırma hatası olarak gösterilir.

    Windows'da yolları belirtirken çok yaygın bir hata var: "C:\xampp\htdocs\"yanlış. Gerek "C:\\xampp\\htdocs\\".


18

beklenmedik (

Açma parantezleri genellikle if/ foreach/ for/ array/ gibi dil yapılarını izler listveya aritmetik bir ifade başlatır. "strings"Bir önceki (), bir yalnız $ve bazı tipik bildirim bağlamlarından sonra sözdizimsel olarak yanlıştırlar .

  1. İşlev bildirim parametreleri

    Bu hata için daha nadir bir durum, ifadeleri varsayılan işlev parametreleri olarak kullanmaya çalışıyor . PHP7'de bile bu desteklenmez:

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

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

  2. Sınıf özelliği varsayılanları

    İfadeler yerine yalnızca değişmez / sabit değerlere izin verilen sınıf üyesi bildirimleri için aynı şey :

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

    Bu tür şeyleri yapıcıya koyun. Ayrıca bkz. PHP öznitelikleri neden işlevlere izin vermiyor?

    Yine PHP 7'nin sadece var $xy = 1 + 2 +3;sabit ifadelere izin verdiğini unutmayın .

  3. PHP'de JavaScript sözdizimi

    JavaScript veya jQuery sözdizimini kullanmak PHP'de belirgin nedenlerle çalışmaz:

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

    Bu olduğunda, genellikle sonlandırılmamış önceki bir dizeyi gösterir; ve <script>PHP kod içeriğine sızan gerçek bölümler.

  4. isset (()), boş, anahtar, sonraki, geçerli

    Her ikisi de isset()ve empty()işlevler değil, dil yerleşiktir. Bunlar doğrudan bir değişken erişmesi gereken . Yanlışlıkla bir çift parantez eklerseniz, 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şikler dil gramerinin bir parçasıdır, bu nedenle dekoratif ekstra parantezlere izin vermeyin.

    Değişken başvurusu gerektiren kullanıcı düzeyi işlevler - ancak bir ifade sonucu iletilir - çalışma zamanı hatalarına neden olur.


beklenmedik )

  1. Yok fonksiyon parametresi

    Bir işlev çağrısında başıboş virgül kullanamazsınız . PHP orada bir değer bekler ve böylece erken kapanış )parantezinden şikayet eder .

                  
    callfunc(1, 2, );

    Bir arka virgül sadece izin verilen array()ya da list()yapılar.

  2. Tamamlanmamış ifadeler

    Aritmetik ifadedeki bir şeyi unutursanız, ayrıştırıcı pes eder. Çünkü muhtemelen bunu nasıl yorumlamalıdır:

                   
    $var = 2 * (1 + );

    Kapanışı )bile unutursanız, bunun yerine beklenmedik noktalı virgül hakkında bir şikayet alırsınız.

  3. Öngörüldü constant

    İçin unutulmuş değişken $kontrol tablolara önekleri göreceksiniz:

                           
    foreach ($array as wrong) {

    PHP burada bazen ::bunun yerine bekleniyor . Bir class :: $ değişkeni beklenen $ değişken ifadesini karşılayabildiğinden ..


beklenmedik {

Kıvırcık parantez {ve }kod blokları içine alın. Ve bunlar hakkındaki sözdizimi hataları genellikle bazı yanlış yuvalamalara işaret eder.

  1. Birindeki eşleşmeyen alt ifadeler if

    En sık dengesizdir (ve) ayrıştırıcı, açılış kıvırcıkının {çok erken görünmesinden şikayet ederse nedendir . 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.

  2. {ve} ifade bağlamında

    İfadelerde kıvırcık ayraç kullanamazsınız. Parantezleri ve kıvrımları karıştırırsanız, dil dilbilgisine uymaz:

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

    Tanımlayıcı yapısı için yerel kapsam değişkeni gibi birkaç istisna vardır ${references}.

  3. Değişken değişkenler veya süslü değişken ifadeleri

    Bu oldukça nadirdir. Ama aynı zamanda alabilirsiniz {ve }karmaşık değişken ifadeleri çözümleyici şikayetleri:

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

    Her ne kadar bu }tür bağlamlarda beklenmedik bir ihtimal daha yüksek olsa da .


beklenmedik }

"Beklenmedik }" bir hata alırken , çoğunlukla bir kod bloğunu çok erken kapattınız.

  1. Kod bloğundaki son ifade

    Sonlandırılmamış herhangi bir ifade için olabilir.

    Bir işlev / kod bloğundaki son satırda ;noktalı virgül yoksa :

    function whatever() {
        doStuff()
    }            

    Burada ayrıştırıcı, belki de hala + 25;işlev sonucuna veya başka bir şeye eklemek isteyip istemediğinizi söyleyemez .

  2. Geçersiz blok yerleştirme / Unutuldu {

    Bazen bir kod bloğu }çok erken kapatıldığında bu ayrıştırıcı hatasını görürsünüz veya bir açmayı {bile unutursunuz :

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

    Yukarıdaki kod parçasında ifaçılış {kıvırcık ayracı yoktu . Böylece aşağıdaki kapanış }gereksiz hale geldi. Bu nedenle, }işlev için tasarlanan bir sonraki kapanış , orijinal açılış {kıvırcık ayraçla ilişkilendirilemedi .

    Bu tür hataları, uygun kod girintisi olmadan bulmak daha da zordur. Bir IDE ve parantez eşleşmesi kullanın.


Beklenmedik {, bekleniyor(

Koşul / bildirim üstbilgisi ve kod bloğu gerektiren dil yapıları bu hatayı tetikler.

  1. Parametre listeleri

    Örneğin , parametre listesi olmayan yanlış tanımlanmış işlevlere izin verilmez:

                     
    function whatever {
    }
  2. Kontrol bildirimi koşulları

    Aynı şekilde ifkoşulsuz da olamazsınız .

      
    if {
    }

    Açıkçası anlamsız. Her zamanki şüpheliler için aynı şey, for/ foreach, while/ do, vb.

    Bu özel hatayla karşılaşırsanız, kesinlikle bazı manuel örneklere bakmalısınız.


1
Bu yazıdaki sorumun cevabını arıyordum, ama kendime - "Beklenmedik {" sorununa cevap buldum, bu yüzden cevabımla paylaşmak istedim - benim için sorun satır kodlamasıydı - bir şekilde benim dosyaları macintosh satır sonları kullanıyorlardı, ama onları windows satır sonları olarak değiştirdiğimde - benim sorunum (localhost (WAMP) üzerinde her şey çalışıyor, ancak linux webserver üzerinde dont) çözüldü.
Edgars Aivars

@EdgarsAivars Yorumunuz için teşekkürler! Platforma özgü çizgi kırılmalar aslında nadir ve zor bir konudur. Muhtemelen burada da bahsedeceğim. ( Diğer referans cevabında bir kenara bırakılmıştı .)
mario

Beklenmedik} alma kodumun bir parçası php kısa etiket <kullanıldığını bulundu? yerine <? php - bunu diğer sunucularda çalıştığı için bulmam biraz zaman aldı.
c7borg

14

Beklenmeyen $ end

PHP bir "beklenmedik $end" durumdan söz ettiğinde, kodunuzun erken bittiği anlamına gelir. (Mesaj, kelimenin tam anlamıyla alındığında biraz yanıltıcıdır. 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.

Her zaman} önceki kod bloklarını kapatmak için eksik bir süslü ayraç hakkında .

  • Yine, bu tür sorunları önlemek için uygun girinti kullanın.

  • Nerede }yanlış olduğunu bulmak için, parantez eşleşmeli bir IDE kullanın . Çoğu IDE ve metin editöründe klavye kısayolları vardır:

    • NetBeans, PhpStorm, Komodo: Ctrl[veCtrl]
    • Tutulma, Aptana: CtrlShiftP
    • Atom, Sublime: Ctrlm- Zend StudioCtrlM
    • Geany, Not Defteri ++: CtrlB- Joe: CtrlG- Emacs: C-M-n- Vim:%

Çoğu IDE aynı zamanda eşleşen parantezleri, köşeli parantezleri ve parantezleri de vurgular . Bu, korelasyonlarını incelemeyi oldukça kolaylaştırır:

IDE'de köşeli parantez eşleme

Sonlandırılmamış ifadeler

Ve Unexpected $endsözdizimi / ayrıştırıcı hata da sonlandırılmamış ifadeler veya beyana oluşabilir:

  • $var = func(1, ?>EOF

Bu yüzden, önce komut dosyalarının sonuna bakın. ;Herhangi bir PHP betiğindeki son deyim için genellikle bir takip gereksizdir. Ama bir tane olmalı . Kesinlikle bu sözdizimi sorunlarını daralttığı için.

Girintili HEREDOC işaretleri

Başka bir yaygın olay HEREDOC veya NOWDOC dizelerinde görülür . Sonlandırma işareti önde gelen 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 vurgulayıcı editörler bunu açıkça ortaya koyacak veya 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 kelimenin tam anlamıyla almasını söyler.

Örnek: echo 'Jim said \'Hello\'';yazdıracakJim said 'hello'

Bir dizenin kapanış teklifinden kaçarsanız, kapanış teklifi tam olarak ve amaçlandığı gibi değil, yani dizenin bir parçası olarak yazdırılabilir bir alıntı olarak alınır ve dizeyi kapatmaz. Bu, bir sonraki dizeyi açtıktan sonra veya komut dosyasının sonunda genellikle ayrıştırma hatası olarak gösterilir.

Windows'da yolları belirtirken çok yaygın bir hata var: "C:\xampp\htdocs\"yanlış. Gerek "C:\\xampp\\htdocs\\".

Alternatif sözdizimi

Biraz daha nadiren, şablonlarda ifade / kod blokları için alternatif sözdizimini kullanırken bu sözdizimi hatasını görebilirsiniz. Kullanmak if:ve else:ve endif;örneğin bir eksik .

Ayrıca bakınız:


14

Beklenmedik T_IF
Beklenmedik T_ELSEIF
Beklenmedik T_ELSE
Beklenmedik T_ENDIF

Şartlı denetim blokları if, elseifve elsebasit 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çme → eksik {kıvırcık parantezlerle }- veya çok fazla.

resim açıklamasını buraya girin

  1. Eksik {veya }yanlış girinti nedeniyle

    Eşleşmeyen kod ayraçları, daha az iyi biçimlendirilmiş kodlar için ortaktır:

    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 sizin veya başka bir kişi tarafından düzeltilemez. Yardım istemek için bunu internette sergilemenin bir anlamı yok.

    Bunu ancak, eğer if / else koşullarının ve {kod bloklarının iç içe yapısını ve ilişkisini görsel olarak takip edebiliyorsanız düzeltebilirsiniz }. Hepsinin eşleştirilmiş olup olmadığını 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 önceki bir koşul yapısını da kapatacaktır. Bu nedenle bir kodlama stiline sadık kalın; iç içe eğer / else ağaçları karıştırıp eşleştirmeyin.

    Buradaki tutarlılık dışında, uzun koşullardan da kaçınmak faydalıdır. Okunamayan ififadeleri önlemek için geçici değişkenler veya işlevler kullanın .

  2. IF ifadelerde kullanılamaz

    Şaşırtıcı bir şekilde yeni gelen bir hata, ifbir ifadede print ifadesi gibi bir ifade kullanmaya çalışıyor :

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

    Tabii ki geçersiz.

    Üçlü bir koşullu kullanabilirsiniz , ancak okunabilirlik etkilerine dikkat edin.

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

    Aksi takdirde bu tür çıkış yapılarını kesin: birden fazla ifs ve echos kullanın .
    Daha da iyisi, geçici değişkenler kullanın ve koşullarınızı önce yerleştirin:

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

    Bu gibi durumlar için işlevler veya yöntemler tanımlamak da genellikle mantıklıdır.

    Kontrol blokları "sonuç" döndürmez

    Şimdi bu daha az yaygındır, ancak birkaç kodlayıcı ifbir sonuç döndürebilirmiş gibi davranmaya çalışır :

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

    Hangi yapısal olarak ifbir dize birleştirme / ifade içinde kullanmakla aynıdır .

    • Ancak kontrol yapılarının (if / foreach / while) bir "sonucu" yoktur .
    • Değişmez "true" dizesi de geçersiz bir ifade olur.

    Kod bloğunda bir ödev kullanmanız gerekir :

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

    Alternatif olarak ?:üçlü bir karşılaştırmaya başvurunuz.

    Eğer Varsa

    Sen yuvalayamazsınız birif ya bir koşul içinde:

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

    Açıkçası gereksizdir, çünkü and(veya or) zaten zincirleme karşılaştırmalara izin verir.

  3. Unutulmuş ;noktalı virgüller

    Bir 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, {…}kod bloğundaki son satırda noktalı virgül de gerekiyor.

  4. Noktalı virgül çok erken

    Şimdi, bu tuzağın göz ardı edilmesi çok kolay olduğu için belirli bir kodlama stilini suçlamak muhtemelen yanlış:

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

    Bu tahmin edebileceğinizden daha sık olur.

    • Ne zaman sona if ()ifadenin; bir boşluk deyimi çalıştırır. ;Bir boş olur {}kendi!
    • {…}Blok böylece ayrılır ifve her zaman çalışır.
    • Bu yüzden elseartık açık bir ifyapı ile ilişkisi yoktu , bu yüzden bu beklenmedik bir T_ELSE sözdizimi hatasına yol açacaktı.

    Bu da bu sözdizimi hatasının benzer şekilde ince bir varyasyonunu açıklar:

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

    Nerede ;kodundan sonra blok {…}bütün sonlandırır if Severing, yapısı elsesözdizimsel dalı.

  5. Kod bloklarını kullanmamak

    Sözdizimsel kıvırcık Parantezleri yapmasına izin verdiklerine {... }kod blokları if/ elseif/ elsedallar. Ne yazık ki tersine kodlayıcılar için çok yaygın bir sözdizimi tarzıdır. (Yanlış varsayım altında bu yazı yazmak veya okumak için daha hızlıdır).

    Ancak bu sözdizimini açma olasılığı yüksektir. Er ya da geç ek ifadeler if / else dallarına girecek:

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

    Ama aslında kod bloklarını kullanmak için yazmak zorundasınız{ ... }onları böyle!

    Tecrübeli programcılar bile bu acımasız sözdiziminden kaçınırlar ya da en azından kurala istisnai bir istisna olarak anlarlar.

  6. Else / Elseif yanlış sırada

    Kendinizi hatırlatmanız gereken bir şey elbette koşullu düzendir .

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

    İstediğiniz kadar elseifs'ye sahip olabilirsiniz , ancak elsesonuna kadar gitmek zorundasınız . İşte böyle.

  7. Sınıf bildirimleri

    Yukarıda belirtildiği gibi , bir sınıf bildiriminde kontrol ifadeleri olamaz:

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

    Bir işlev tanımını unuttun ya da }bu gibi durumlarda çok erken kapattın.

  8. Beklenmedik T_ELSEIF / T_ELSE

    PHP ve HTML karıştırılırken, a'nın kapanışı }bir sonraki ile if/elseifaynı PHP bloğunda olmalıdır . Bu , gereksinimlerin kapanması aşağıdakilerin bir parçası olması nedeniyle bir hata oluşturur :<?php ?>elseif/else}ifelseif

    <?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 sıklıkla yanlış kodlama niyetlerine dayanmaktadır.
    Sen olamaz diğer ifadeleri püre İnbetween if ve elseif/ elseyapısal jeton:

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

    Her ikisi de sadece {…}kod bloklarında olabilir, kontrol yapısı simgeleri arasında değil.

    • Bu hiç mantıklı değil. PHP arasında atlar ifve elsedallar olduğunda "tanımsız" bir durum söz konusu değildir .
    • Basılı beyanların nereye ait olduğu / veya her iki dalda da tekrarlanması gerekip gerekmediğini kararlaştırmanız gerekir.

    Ayrıca bir if / else komutunu farklı kontrol yapıları arasında paylaşamazsınız:

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

    Hiçbir yoktur sözdizimsel ilişki arasındaki ifve else. foreachEn sözcük kapsam uçları }, böylece için anlamı yok ifyapısı devam etmek.

  9. T_ENDIF

    Beklenmedik bir T_ENDIF'den şikayet edildiyse, alternatif sözdizimi stilini if:elseif:else:⋯ kullanıyorsunuz endif;. Hangi gerçekten iki kez düşünmek gerekir.

    • Yaygın bir tuzak, bir noktalı virgül için ürkütücü benzer :kolonu; karıştırmaktadır . ("Noktalı virgül çok erken" kapsamında)

    • Girintinin şablon dosyalarında izlenmesi daha zor olduğundan, alternatif sözdizimini kullanırken daha çok - endif;herhangi biriyle eşleşmiyor olabilir if:.

    • Kullanılması } endif; bir olduğunu katına if -terminatör.

    Bir "beklenmedik $ son" genellikle unutulmuş bir kapanış }kıvırcık ayracı için fiyattır .

  10. Ödev ile karşılaştırma

    Yani, bu bir sözdizimi hatası değil, bu bağlamda bahsetmeye değer:

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

    Bu bir ==/ ===karşılaştırma= değil , bir ödevdir . Bu oldukça incedir ve bazı kullanıcıları kolayca tüm durum bloklarını çaresizce düzenlemeye yönlendirecektir. Öncelikle istenmeyen mantıklara dikkat edin - bir mantık hatası / yanlış kötüye kullanma ile karşılaştığınızda.


11

Beklenmedik T_IS_EQUAL
Beklenmedik T_IS_GREATER_OR_EQUAL
Beklenmedik T_IS_IDENTICAL
Beklenmedik T_IS_NOT_EQUAL
Beklenmedik T_IS_NOT_IDENTICAL
Beklenmedik T_IS_SMALLER_OR_EQUAL
Beklenmedik <
Beklenmedik>

Gibi Karşılaştırma operatörleri ==, >=, ===, !=, <>, !==ve <=ya <ve >çoğunlukla gibi, sadece ifadelerde kullanılması gereken ififadeler. Ayrıştırıcı onlar hakkında şikayet ederse, genellikle yanlış soyma veya ( )çevrelerinde uyuşmayan eşler anlamına gelir .

  1. Parens gruplaması

    Özellikle ifçoklu karşılaştırmalı ifadeler için açılış ve kapanış parantezlerini doğru saymaya dikkat etmelisiniz :

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

    Burada buradaki ifdurum zaten)

    Karşılaştırmalarınız yeterince karmaşık hale geldiğinde, genellikle birden çok ve iç içe ifyapılara bölünmesine yardımcı olur .

  2. isset () karşılaştırmalı olarak ezildi

    Yaygın yeni gelen pitfal birleştirmek için çalışıyor isset()veya empty()karşılaştırmaları ile:

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

    Ya da:

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

    Bu PHP için bir anlam ifade etmez, çünkü issetve emptysadece değişken adları kabul eden dil yapılarıdır. Sonucu da karşılaştırmak mantıklı değil, çünkü çıktı sadece / zaten bir boole.

  3. Dizi operatörü >=ile daha 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ışık oluyorlar:

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

    Sadece doğru yapmak için bu karşılaştırma operatörünün " büyük veya eşit " olarak adlandırıldığını hatırlamanız gerekir .

    Ayrıca bkz: PHP'de deyim yapısı

  4. Karşılaştırılacak bir şey yok

    Aynı değişken adına sahip olmaları durumunda iki karşılaştırmayı birleştiremezsiniz:

                     
    if ($xyz > 5 and < 100)

    PHP, ilk değişkeni tekrar karşılaştırmak istediğinizi belirleyemez. İfadeler genellikle operatör önceliğine göre eşleştirilir , bu nedenle <göründüğü zaman , orijinal değişkenden yalnızca bir boole sonucu kalır .

    Ayrıca bakınız: beklenmedik T_IS_SMALLER_OR_EQUAL

  5. Karşılaştırma zincirleri

    Bir işleç satırıyla bir değişkeni karşılaştıramazsınız:

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

    Bu, her biri aleyhine olmak üzere iki karşılaştırmaya bölünmelidir $x.

    Bu aslında daha çok kara listeye alınmış ifadeler (eşdeğer işleç ilişkilendirmesi nedeniyle). Sözdizimsel olarak birkaç C stili dilde geçerlidir, ancak PHP bunu beklenen karşılaştırma zinciri olarak yorumlamaz.

  6. Beklenmedik >
    Beklenmedik<

    Operatörlerden daha büyük >veya daha küçük <bir özel T_XXXbelirteç adı yoktur. Diğerleri gibi yanlış yerleştirilebilseler de, ayrıştırıcının yanlış dizilmiş diziler ve püresi HTML için şikayet ettiğini daha sık görürsünüz:

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

    Bu , bir değişmez sabit ile "<a href='z"karşılaştırılan bir dize ve daha sonra başka bir karşılaştırma anlamına gelir. Ya da en azından PHP bunu görüyor. Asıl neden ve sözdizimi hatası, erken dize sonlandırmasıydı.>Hello<"

    PHP başlangıç ​​etiketlerini yerleştirmek de mümkün değildir:

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

Ayrıca bakınız:


11

Beklenmedik T_IF
Beklenmedik T_FOREACH
Beklenmedik T_FOR
Beklenmedik T_WHILE
Beklenmedik T_DO
Beklenmedik T_ECHO

Kontrol gibi yapıları if, foreach, for, while, list, global, return, do, print, echosadece tablolara olarak kullanılabilir. Genellikle kendileri bir hatta kalırlar.

  1. Noktalı virgül; neredesin

    Ayrıştırıcı bir kontrol ifadesinden şikayet ederse, oldukça evrensel olarak önceki satırda noktalı virgül kaçırdınız mı :

                 
    $x = myfunc()
    if (true) {

    Çözüm: önceki satıra bakın; noktalı virgül ekleyin.

  2. Sınıf bildirimleri

    Bunun gerçekleştiği başka bir yer de 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 bulunmayabilir.

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

    Bu tür sözdizimi hataları genellikle yanlış yuvalanmış {ve }. Özellikle fonksiyon kodu blokları çok erken kapatıldığında.

  3. İ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 ifdize, matematik ifadesi 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.

    ifBenzer bir ifadeyi özellikle bir ifadeye gömmek için genellikle ?:üçlü bir değerlendirme kullanmak istersiniz .

    Aynı için de geçerlidir for, while, global, echove daha az bir uzanır list.

              
    echo 123, echo 567, "huh?";

    Oysa print()ifade bağlamında kullanılabilecek yerleşik bir dildir. (Ama nadiren mantıklı.)

  4. Tanımlayıcı olarak ayrılmış anahtar kelimeler

    Ayrıca kullanıcı tanımlı işlevler veya sınıf adları için doveya ifdiğer dil yapılarını kullanamazsınız . (Belki PHP 7'de. Ama o zaman bile tavsiye edilmez.)


7

Beklenmedik '?'

Eğer null birleştirme operatörünü ??PHP 7'den önce 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 '?', Değişken bekleniyor

Null olabilecek türler için aşağıdakine benzer bir hata oluşabilir:

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

Bu da eski bir PHP sürümünün kullanıldığını gösterir (CLI sürümü php -vveya web sunucusu bağlı sürüm phpinfo();).


5

Beklenmedik T_LNUMBER

Jeton T_LNUMBER"uzun" / sayıya karşılık gelir.

  1. Geçersiz değişken adları

    PHP ve diğer birçok programlama dilinde, değişkenler bir sayı ile başlayamaz. İlk karakter alfabetik veya alt çizgi olmalıdır.

    $1   // Bad
    $_1  // Good

    *

    • PHP yerlerinde -placeholder'ları kullanmak için sıklıkla gelir :preg_replace"$1"

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

      Geri aramanın alıntılanması gereken yer. (Şimdi /enormal ifade bayrağı kullanımdan kaldırıldı. Ancak bazen preg_replace_callbackişlevlerde hala yanlış kullanılıyor .)

    • Aynı tanımlayıcı kısıtı nesne özellikleri btw için de geçerlidir .

             
      $json->0->value
    • Tokenizer / çözümleyici bir hazır izin vermiyor olsa da $1değ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 ama çok tavsiye edilmeyen PHP ayrıştırıcısı Unicode tanımlayıcılarına izin verir; öyle ki $➊geçerli olurdu. (Bir kelimenin tam anlamıyla 1).

  2. Kaçak dizi girişi

    Dizi bildirimleri için ,virgül eksik olduğunda da beklenmeyen bir süre oluşabilir :

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

    Veya aynı ş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 bir eksik ;veya ,eksik vardır.

  3. Yanlış kullanılan HTML

    Ve yine, yanlış sıralanan dizeler başıboş sayıların sık görülen bir kaynağıdır:

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

    Bu tür vakalara az çok Beklenmedik T_STRING hataları gibi davranılmalıdır .

  4. Diğer tanımlayıcılar

    Ne işlevler, sınıflar, ne de ad alanları bir sayıdan başlayarak adlandırılamaz:

             
    function 123shop() {

    Değişken isimleri ile hemen hemen aynı.


2

Beklenmedik '='

Bunun nedeni, değişken adında geçersiz karakterler bulunması olabilir. Değişkenler adları gerekir bu kurallara uyun:

Değişken adları PHP'deki diğer etiketlerle aynı kurallara uyar. Geçerli bir değişken adı bir harf veya alt çizgi ile başlar, ardından istediğiniz sayıda harf, sayı veya alt çizgi gelir. Normal bir ifade olarak şöyle ifade edilir: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'


İyi ekleme John.
Funk Forty Niner

1

Beklenmeyen 'devam et' (T_CONTINUE)

continuebir ifadedir (for veya if gibi) ve bağımsız görünmelidir. Bir ifadenin parçası olarak kullanılamaz. Kısmen devam et bir değer döndürmediğinden, ancak bir ifadede her alt ifadenin bir değerle sonuçlanması gerekir, böylece genel ifade bir değerle sonuçlanır. Bu bir ifade ile ifade arasındaki farktır.

Bunun anlamı continue, bir üçlü açıklamada veya bir dönüş değeri gerektirir herhangi açıklamada kullanılamaz.

Beklenmeyen 'mola' (T_BREAK)

break;Tabii ki aynı şey geçerli . İfade bağlamında da kullanılamaz, ancak katı bir ifade ( foreachveyaif blokta).

Beklenmeyen 'dönüş' (T_RETURN)

Şimdi bu daha şaşırtıcı olabilir return, ama bu 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. → Bu: yapmanın bir anlamı yokreturn(return(false);;


1

Beklenmedik '.'

Bu, splat operatörünü ( ...) PHP'nin desteklenmeyen bir sürümünde kullanmaya çalışıyorsanız oluşabilir .

... ilk olarak bir işleve değişken sayıda bağımsız değişken 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 Array ifadeleri için kullanabilirsiniz .

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

0

Beklenmeyen 'bitiş zamanı' (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 kıvırcık parantez kullanmaktır:

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

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


0

Başlayan bir hata iletisi, Parse error: syntax error, unexpected ':'yanlışlıkla bir sınıf statik başvurusu Class::$Variableolarak yazılmasından kaynaklanabilir Class:$Variable.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.