PHP 8'e geçişten sonra günlükte Undefined array key uyarıları görmeye başladıysanız, çoğu zaman kod istekteki her alanın mutlaka geleceğini varsayıyordur. Uyarıyı bastırmak yerine iki soruyu ayırın: anahtar hiç yok mu, yoksa anahtar var ama değeri null mı? Uygulamanın kararı bu ayrımdan etkileniyorsa tek bir kısa sözdizimi yeterli olmayabilir.
Eksik, null ve boş değer aynı şey değil
Bir form alanı gönderilmediğinde $_POST['email'] anahtarı bulunmayabilir. Alan gönderilmiş ama boş bırakılmışsa değer çoğunlukla boş metindir. JSON gövdesinde ise açık null değeri de gelebilir. Bu üç duruma aynı varsayılanı vermek, örneğin kullanıcının mevcut e-posta adresini yanlışlıkla silmek gibi yan etkilere neden olabilir.
// Anahtar yoksa varsayılan değer kullanılır.
$page = $_GET['page'] ?? 1;
// Anahtarın varlığı, null değerinden bağımsız olarak önemlidir.
$hasLimit = array_key_exists('limit', $options);
// null değer de yok kabul edilecekse:
$limit = isset($options['limit']) ? (int) $options['limit'] : 20;
?? ve isset() null değerini eksik gibi ele alır. array_key_exists() ise anahtarın bulunup bulunmadığını kontrol eder; değer null olsa bile true döner. Bunlardan hangisinin doğru olduğu istek alanının iş anlamına bağlıdır.
Örneğin bir ayar ekranında alan hiç gönderilmediyse “değişiklik yok” anlamına gelebilir; alan açıkça boş gönderildiyse “değeri temizle” anlamına gelebilir. Her ikisini de ?? '' ile tek bir boş değere indirgemek bu farkı kaybettirir. API güncelleme uçlarında eksik alan ile null alanın farklı anlam taşıyıp taşımadığını sözleşmede açıkça belirleyin.
Girdiyi okurken kaynağı ve biçimi doğrulayın
Bir alan zorunluysa varsayılan vermek yerine doğrulama hatası üretmek daha doğru olabilir. Önce HTTP metodunu ve beklenen içerik türünü kontrol edin; ardından değerin türünü ve izin verilen aralığını doğrulayın. PHP'nin filter_input() fonksiyonu belirli filtrelerle dış girdiyi okumaya yardımcı olur; bunun nasıl kullanılacağı ve neden beklenmedik biçimde null dönebileceği PHP filter_input() neden null döndürür? yazısında ayrıca ele alınıyor.
Uyarı PHP 8'de bazı tanımsız anahtar erişimlerinin daha görünür hale gelmesiyle migration notlarında da açıklanmıştır. Bu, her uyarının yalnızca sürüm farkından kaynaklandığı anlamına gelmez; üretim kodunda alanın nereden geldiğini ve istemcinin hangi sözleşmeye uyması gerektiğini inceleyin. Ayrıntı için PHP'nin PHP 8 uyumsuzluk notlarına ve array_key_exists() belgesine bakın.