Hata Giderme @ Çalışmıyor

4 Cevap php

Ben mutlu benim PHP dev kurulumunda hata bastırma operatörü kullanarak oldum. Ama son zamanlarda şöyle Bildirimleri ile vurmak aldık:

Notice: Uninitialized string offset: 0 in C:\websites\xxx\htdocs\includes\myscript.php on line 35

Hat 35:

$file_name = @$File['file_name'];

Ben display_errors var, ve 6143 (E_ALL) ayarlanır error_reporting.

Ben bir şey eksik? Hata bastırılmış gerekmiyor mu?

Edit:

Bakire komut test:

$a = array();
$b = @$a['f5'];

Hatayı Bastırılmış. Yani biz bir şekilde error_reporting değerini değiştirerek ediyoruz düşünüyorum. (11, Film)

Yr yardım için thx.

4 Cevap

Throw-away komut ya da gerçekten bir hata yakalamak için iyi bir yol yoktur örnekleri haricinde burada hata bastırma büyük bir hayranıyım.

Beni Uninitialized string offset hata davranışını anlatalım. Bu bir hata değil:

Example #1

$a = 0;
$b = $a['f5'];

$a sayısal bir skaler bir değerdir. Ikinci satırda PHP örtük bir dize için bu sayısal değer atıyor. Dizge '0', 1 kadar bir uzunluğa sahiptir.

PHP Eğer dahili diziler gibi PHP mağazalar dizeleri gibi, bir dizi dizin kullanarak bir dize bir karakter arama yapabilirsiniz. Örneğin:

$s= 'abcd';
print_r($s[1]);

Bu dize, ikinci karakter olduğu gibi bu kodun çıktısı b olacaktır. Örnek # 1 arama 'f5' dizeleri sadece karakter konumuna endeksli olabilir gibi bir sayıya dönüştürülür ediliyor. echo intval('f5'); PHP, sayısal bir bağlamda 0 gibi 'f5' dizesini yorumluyor bize gösteriyor.

Benimle bugüne kadar? Burada örnek uyguladığımızda 2. böyle olur

Example #2

$a = '';
$b = $a['f5'];

$a sıfır uzunlukta bir dize. İkinci satır $b= $a[0]; aynıdır - yani, ikinci satır bir sıfır uzunlukta dize ilk karakter için istiyor, ancak dize herhangi bir karakter içeriyor. Yani PHP dizin sadece yok bildirerek, aşağıdaki hata atıyor:

Notice: Uninitialized string offset: 0 in C:\websites\tcv3\wc2009\htdocs\aatest_array.php on line 3

Bunlar gevşek yazdığınız dilinde programlama sert darbelere vardır.

Hata 0 ofset bir dize içerdiğinden, sağlanan kod satırına geçerli olmamalıdır. Offset bir tamsayı yoktur; Orada dize 'file_name kullanıyoruz.

Ayrıca, kullanarak '@' gerçekten kötü bir fikir. Fonksiyonlar komut dosyası nerede ya da neden olarak kesinlikle hiçbir gösterge ile çıkmak için neden başarısız olabilir. Eğer yapıştırılan kod satırı işlemek için daha iyi bir yolu şudur:

if (isset($File['file_name'])) {
  $file_name = $File['file_name'];
} else {
  // throw exception, return FALSE, print an error and exit, whatever
}

Tamam, burada bir şey var: PHP dizi olmayan değişkenler için indisleri ile başa gelmez. Örneğin:

$a = 0;
$b = $a['f5'];

Bir hata oluşturmaz.

Oysa:

$a = '';
$b = $a['f5'];

Bu hata oluşturur:

Notice: Uninitialized string offset: 0 in C:\websites\tcv3\wc2009\htdocs\aatest_array.php on line 3

Ve ben olmamdı sorun. Ben dizi () ile $ a başlatılırken etrafında onu geçerseniz, hata bastırma çalışır. Ayrıca, hata bastırılması olmadan hata uygun dizin verir.

Bu PHP 5.2.2 bir hata olduğunu sanıyorum. Birisi daha güncel sürüm bu test edebilir miyim?

Lütfen yardım çocuklar için teşekkürler.

Hayır, @ baskılayıcı işlev çağrıları değil, değişken erişim ve bildirimleri gelen uyarıları göstermekten kaçınır. Notice bir dize öğesi [0] o tanımlı değil, bu nedenle başlatılmamış erişen olduğunu anlatıyor. Bu bastırmak istiyorsanız C ile bunu yapabilir gibi, tüm başlatılmamış değişkenler için kontrol edin ve onlara göre bir değer vermeye çalışın