BU NEDEN OLUYOR?
Zaman içinde PHP daha fazla güvenlik odaklı bir dil haline geldi. Varsayılan olarak önceden kapatılmış olan ayarlar artık varsayılan olarak açıktır. Bunun mükemmel bir örneği E_STRICT
, PHP 5.4.0'dan itibaren varsayılan olarak açılan .
Ayrıca, PHP belgelerine göre E_NOTICE
php.ini dosyasında varsayılan olarak devre dışıdır. PHP dokümanları hata ayıklama amacıyla açılmasını önerir . Ancak, Ubuntu deposundan ve BitNami'nin Windows yığınından PHP'yi indirdiğimde başka bir şey görüyorum.
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
error_reporting
Varsayılan olarak "varsayılan" değere değil, varsayılan olarak üretim değerine ayarlanmış olduğuna dikkat edin . Bu biraz kafa karıştırıcı ve ben var, bu yüzden php.ini dışında belgelenmiş değildir değil diğer dağıtımlarında bu valide.
Ancak sorunuzu cevaplamak için, daha önce açılmadığında bu hata şimdi ortaya çıkıyor çünkü:
PHP'yi yüklediniz ve yeni varsayılan ayarlar biraz zayıf bir şekilde belgelenmiş ancak hariç tutulmuyor E_NOTICE
.
E_NOTICE
tanımlanmamış değişkenler ve tanımlanmamış dizinler gibi uyarılar aslında kodunuzu daha temiz ve güvenli hale getirmeye yardımcı olur. Yıllar önce, E_NOTICE
etkin kalmamın değişkenlerimi bildirmemi zorladığını söyleyebilirim. C'yi öğrenmeyi çok daha kolay hale getirdi, değişkenlerin rahatsızlıktan çok daha büyük olduğunu bildirmiyordu.
BU KONUDA NE YAPABİLİRİM?
E_NOTICE
"Varsayılan değer" i kopyalayıp E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
eşittir oturum açtıktan sonra şu anda önerilmeyenle değiştirerek kapatın error_reporting =
. CGI veya FPM kullanıyorsanız Apache'yi veya PHP'yi yeniden başlatın. "Right" php.ini dosyasını düzenlediğinizden emin olun. PHP'yi Apache, fpm veya PHP-FPM çalıştırıyorsanız php-fpm, PHP-CGI, vb. Çalıştırıyorsanız cgi vb. İle çalıştırıyorsanız doğru olanı Apache olacaktır. Bu önerilen yöntem değildir, ancak eski kodunuz düzenlemek son derece zor olabilir, o zaman en iyi bahsiniz olabilir.
E_NOTICE
Dosya veya klasör seviyesini kapatın . Bazı eski kodlarınız varsa, ancak işleri "doğru" şekilde yapmak istiyorsanız, bu tercih edilebilir. Bunu yapmak için Apache2, Nginx veya seçtiğiniz sunucunuz ne olursa olsun danışmalısınız. Apache'de, php_value
içinde kullanabilirsiniz <Directory>
.
Daha temiz olması için kodunuzu yeniden yazın. Bir üretim ortamına geçerken bunu yapmanız gerekiyorsa veya birisinin hatalarınızı görmesini istemiyorsanız, hataların görüntülenmesini devre dışı bıraktığınızdan ve yalnızca hatalarınızı günlüğe kaydettiğinizden emin olun ( php.ini ve sunucu ayarlarınıza bakın display_errors
ve log_errors
) .
3. seçeneği genişletmek için: Bu idealdir. Bu rotaya gidebilirsen, yapmalısın. Başlangıçta bu rotaya gitmiyorsanız, kodunuzu bir geliştirme ortamında test ederek bu rotayı sonunda taşımayı düşünün. Siz oradayken, kurtulun ~E_STRICT
ve ~E_DEPRECATED
gelecekte neyin yanlış gidebileceğini görün. Bilmediğiniz bir sürü hata göreceksiniz, ancak gelecekte PHP'yi yükseltmeniz gerektiğinde hoş olmayan bir sorun yaşamanızı engelleyecektir.
HATALAR NE DEMEKTİR?
Undefined variable: my_variable_name
- Bu, bir değişken kullanımdan önce tanımlanmadığında ortaya çıkar. PHP betiği yürütüldüğünde, dahili olarak sadece bir null değeri varsayar. Ancak, bir değişkeni tanımlanmadan önce hangi senaryoda kontrol etmeniz gerekir? Sonuçta, bu "özensiz kod" için bir argüman. Bir geliştirici olarak, değişkenlerin kapsamlarında tanımlanabileceği kadar yüksek olarak tanımlandığı açık kaynaklı bir proje gördüğümde onu sevdiğimi söyleyebilirim. Gelecekte hangi değişkenlerin açılacağını söylemeyi kolaylaştırır ve kodu okumayı / öğrenmeyi kolaylaştırır.
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
- Bu, bir dizideki bir değere erişmeye çalıştığınızda oluşur ve varolmaz. Bu hatayı önlemek için bir koşullu denetim gerçekleştirin.
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
Başka bir seçenek, işlevinizin üst kısmında boş bir dizi bildirmektir. Bu her zaman mümkün değil.
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(ek ipucu)
- Bu ve diğer sorunlarla karşılaştığımda, NetBeans IDE'yi (ücretsiz) kullandım ve bana bir dizi uyarı ve bildirim verdi. Bazıları çok yararlı ipuçları sunuyor. Bu bir gereklilik değil ve IDE'leri artık büyük projeler dışında kullanmıyorum.
vim
Bu günlerde daha çok insanım :).