- Konu sahibi
- #1
PHP’de null coalescing operatörü
Bu ifade,
Operatör yalnızca
Bir profil sayfasında kullanıcı adı sorgu parametresiyle gönderilebiliyorsa, varsayılan değer belirleyebilirsiniz:
Doğru operatör, “eksik” tanımınıza bağlıdır.
Örneğin
Operatör zincirlenebilir. PHP soldan sağa ilerleyerek
Burada önce
Bir değişkene yalnızca mevcut değeri
Bu,
Uygulamada önce “eksik” sayılan durumun yalnızca
??, bir değişken veya dizi anahtarının mevcut ve null olmayan değerini kullanır; değer yoksa ya da null ise sağ taraftaki varsayılan değeri döndürür. En temel kullanım şöyledir:
Kod:
$ad = $_GET['ad'] ?? 'Misafir';
Bu ifade,
$_GET['ad'] mevcut ve null değilse onun değerini $ad değişkenine atar. Anahtar yoksa veya değeri null ise 'Misafir' kullanılır. Eksik bir dizi anahtarını kontrol ederken ayrıca isset() yazmanız gerekmez.Nasıl çalışır?
$sol ?? $sag ifadesi mantıksal olarak şu karara karşılık gelir: Sol taraf tanımlı ve null değilse sol tarafı, aksi durumda sağ tarafı döndür. Sağ taraf yalnızca ihtiyaç olduğunda değerlendirilir. Bu nedenle varsayılan değer bir fonksiyon çağrısı veya maliyetli bir işlemse, sol taraf geçerli olduğunda bu işlem çalıştırılmaz.
Kod:
$sayfa = $_GET['sayfa'] ?? 1;
$tema = $ayarlar['tema'] ?? 'acik';
$etiket = null;
$sonuc = $etiket ?? 'Varsayılan';
// $sonuc: 'Varsayılan'
Operatör yalnızca
null değerini yok sayar. 0, false ve boş metin '' geçerli değerlerdir; bunlar varsayılan değerle değiştirilmez.Somut örnek: isteğe bağlı kullanıcı adı
Bir profil sayfasında kullanıcı adı sorgu parametresiyle gönderilebiliyorsa, varsayılan değer belirleyebilirsiniz:
Kod:
$girdi = $_GET['kullanici'] ?? 'ziyaretci';
if (!is_string($girdi)) {
http_response_code(400);
exit('Tek bir metin bekleniyor.');
}
echo 'Hoş geldin, ' . htmlspecialchars(
$girdi, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'
);
?kullanici=ayse ile istek geldiğinde çıktı Hoş geldin, ayse olur. Dizi biçimindeki kullanici girdisi reddedilir; ?? tek başına tür doğrulamaz. Çıktı HTML metin bağlamında kaçışlanır. Parametre gönderilmediğinde ise Hoş geldin, ziyaretci yazdırılır. Parametre boş metin olarak gönderilirse ?? bunu eksik kabul etmez; boş metin geçerli olduğu için sonuç boş kalır. Boş metni de varsayılan saymak istiyorsanız ayrıca iş kuralı uygulamalısınız:
Kod:
$girdi = $_GET['kullanici'] ?? '';
if (!is_string($girdi)) {
http_response_code(400);
exit('Tek bir metin bekleniyor.');
}
$kullaniciAdi = $girdi;
if ($kullaniciAdi === '') {
$kullaniciAdi = 'ziyaretci';
}
Benzer ifadeler arasındaki fark
Doğru operatör, “eksik” tanımınıza bağlıdır.
?? yalnızca tanımsız veya null değerleri ele alır; false, 0 ve boş metin için davranışını korur.| İfade | Ne zaman varsayılanı kullanır? | 0, false ve boş metin |
|---|---|---|
$x ?? $v | $x yoksa veya null ise | Korunur |
isset($x) | $x mevcut ve null değilse true | Değerin kendisini döndürmez |
empty($x) | Değer PHP açısından “boş” kabul edilirse | Genellikle boş kabul edilir |
Örneğin
$adet = 0 ise $adet ?? 10 sonucu 0 olur. $adet ?: 10 ise 0 false kabul edildiğinden 10 döner. Sayısal sıfırın anlamlı olduğu formlarda bu fark önemlidir.Birden fazla varsayılan ve atama
Operatör zincirlenebilir. PHP soldan sağa ilerleyerek
null olmayan ilk değeri bulur:
Kod:
$dil = $kullaniciDili ?? $siteDili ?? 'tr';
Burada önce
$kullaniciDili, sonra $siteDili değerlendirilir. İkisi de yoksa sonuç 'tr' olur.Bir değişkene yalnızca mevcut değeri
null ise varsayılan atamak için birleşik atama biçimini kullanabilirsiniz:
Kod:
$ayar ??= 'varsayilan';
Bu,
$ayar tanımsızsa veya null ise ona 'varsayilan' atar. Değişkenin değeri 0, false veya '' ise mevcut değer korunur.Sık yapılan hatalar
- Boş değer ile null değerini karıştırmak:
??boş metni,0değerini veyafalsedeğerini değiştirmez. Bu değerlerin de geçersiz sayılması gerekiyorsa açık bir kontrol yazın. - Girdi doğrulaması yaptığını sanmak:
$_GET['sayfa'] ?? 1yalnızca varsayılan değer sağlar; gelen değerin sayı, aralık veya beklenen biçimde olduğunu doğrulamaz. Kullanımdan önce ilgili doğrulamayı yapın. - Nesne özelliklerine dikkatsiz erişmek: Özellik okumasında isset benzeri denetim uygulanabilir. Ancak ??, soldaki rastgele metot çağrısını nullsafe yapmaz ve fırlatılan istisnaları yakalamaz. Nesne zincirinin ve sihirli yöntemlerin davranışını ayrıca değerlendirin.
- Operatör önceliğini varsaymak: Karmaşık ifadelerde okunabilirlik için parantez kullanın. Özellikle string birleştirme, koşullu ifadeler ve fonksiyon çağrılarıyla birlikte sonucu küçük bir örnekle kontrol edin.
Uygulamada önce “eksik” sayılan durumun yalnızca
null ve tanımsızlık mı, yoksa boş metin ve sıfır gibi değerler mi olduğunu belirleyin. Yalnızca ilk grupta ?? doğrudan ve uygun çözümdür; ikinci grupta ise açık doğrulama koşulları kullanmanız gerekir.