PHP

2011-07-08 11 views
8

ben 5.3.3 bir derleyici hatasına yol açmaz şu anlayış neden bazı sorun yaşıyorum (Hatalı aşımı doğru benim arkadaşları 5.2.5 üzerine):PHP

<?php 
    echo "starting\n"; 

    switch(1) { 
     case 2: 
      echo "two\n"; 
      break; 
     defalut:  // note the misspelling 
      echo "deflaut\n"; 
    } 

    echo "ending\n"; 
Ben bir if açıklamada kullanırsak ne beklenir bana verir,

starting 
ending 

Ancak:

yerine bana bir derleyici hatası (ya da hatta bir uyarı) verilmesi sadece bu verir

<?php 
    if (1 == deflaut) 
     echo "deflaut2\n"; 

verir:

PHP Notice: Use of undefined constant deflaut - assumed 'deflaut' in ... 

Bunun nedeni nedir? Bu tür bir şey hakkında katı olduğunu söylemek için devre dışı bırakabileceğim bir yer var mı?

+0

Harika bir soru. 5.3.3'te bir hata olduğunu düşünmüyorum ama cevapların ne olduğunu görmek istiyorum. – Endophage

+2

Pek çok kişinin kodu okuduğunu, ancak şu soruyu sormadığı gerçeğinden bahsetmiyoruz: -P – Endophage

+0

@Ben: Bu soru değil. – hakre

cevap

4

Sorun, kodunuzun düşündüğünüz şeyi yapmamasıdır. Bir case bloğu yalnızca bir sonraki case bloğu oluştuğunda veya default: bulunduğunda veya } kapanışına ulaşıldığında sona erer. Bu, defalut'un case 2: bloğunun bir parçası olduğu anlamına gelir. Yani asla yorumlanmadı bile.

Ancak, hatta bir sözdizimi hatası (patlamaz sen switch (2) yapamaz bile goto operatör PHP 5.3 tanıtıldı çünkü. Budur. PHP ifade başında sözdizimi word: şimdi bir hedef erişilebilir goto yoluyla. Yani goto defalut; çünkü sonsuz döngüler önlemek için switch blokların içindeki hedeflere bir kısıtlama,

(Aslında, olamaz. etikete gitmek için kullanılabilir, ancak bu durumumuzu gösteriyor ...)

Bunu zorlayabilirsiniz. veya beklediğiniz hata bulunduğunda case defalut yaparak.

+0

Çok anlam ifade eden harika bir açıklama. +1 ve teşekkür ederim. – Endophage

+0

"Bunun nedeni, goto operatörünün PHP 5.3'te tanıtılmasıdır." ಠ_ಠ –

8

O muhtemelen goto ile kullanılabilir (teknik defaultbir etiket ve case etiketin bir özel tür de olarak yorumlanabilir göz önüne alındığında, mantıklı) sadece başka bir etiket olarak yorumlanıyor olabilir. Bir goto'u deneyin ve öğrenin. Yapardım ama PHP 5.3.3'üm yok, üzgünüm.

+0

Bu doğru. Benzer sorunlar C/C++ http://bytes.com/topic/c/answers/217909-faulty-default – Rodaine

+0

da var. O zaman neden 5.2'de hata yapsın? PHP'nin hangi sürümü doğru şekilde ele alınmadığı düşünülmelidir? Yoksa bu kasıtlı bir değişiklik mi? – Endophage

+0

@Endophage: Bilmiyorum. – Ryan

1

İlginç, benim 5.3.2, bu IF başarısız, yanlış yazılmış varsayılanın üstünde başka bir durum bildirimi yok.

Buna "T_UNEXPECTED_STRING" sözdizimi hatasıyla ölür:

switch (1) { 
    defalut: 
     echo "this should never come out"; 
     break; 
    default: 
     echo "default matched properly" 
} 

Bu seferki çalışır:

switch (1) { 
    case 2: 
     echo "2\n"; 
     break; 
    defalut: 
     echo "this should never come out"; 
     break; 
    default: 
     echo "the default value\n"; 
} 

Bu PHP'nin bir hata buldum görünür. Ciddi bir hatayı düşünmüyorum, ama yine de bir böcek.

+1

Bunun nedeni, anahtar yapısındaki tüm kodların bir 'case' veya' default' içinde görünmesidir. Beklenmedik * bir şey alırsınız * eğer bir 'case' veya' default' içinde değilse. İkinci örneğiniz bir 'case' içindeki bir etikettir, bu yüzden derler. – webbiedave

+0

Teknik olarak, durum, break ifadesiyle kapalı olarak düşünülmelidir. Ama sanırım PHP'nin ayrıştırma ağacı başka bir durumda veya gerçek bir varsayılanda kapanıyorsa, bu mantıklı olur. –