Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
PHP’de null coalescing operatörü ??, 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.

İfadeNe zaman varsayılanı kullanır?0, false ve boş metin
$x ?? $v$x yoksa veya null iseKorunur
isset($x)$x mevcut ve null değilse trueDeğerin kendisini döndürmez
empty($x)Değer PHP açısından “boş” kabul edilirseGenellikle 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​


  1. Boş değer ile null değerini karıştırmak: ?? boş metni, 0 değerini veya false değerini değiştirmez. Bu değerlerin de geçersiz sayılması gerekiyorsa açık bir kontrol yazın.
  2. Girdi doğrulaması yaptığını sanmak: $_GET['sayfa'] ?? 1 yalnı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.
  3. 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.
  4. 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.

Sık sorulan sorular​

Metin birleştirirken neden parantez gerekir?​

Nokta ile birleştirme, ?? operatöründen daha yüksek önceliklidir. 'Ad: ' . $ad ?? 'Misafir' yerine 'Ad: ' . ($ad ?? 'Misafir') yazın. İlk biçimde birleştirme önce gerçekleşebilir ve eksik değişken okuması uyarı verebilir; varsayılan seçimi yalnız istenen değerin çevresinde tutun.

Dizide null anahtarı ile hiç olmayan anahtar nasıl ayrılır?​

?? ve isset ikisini de varsayılan durum sayar. Anahtarın var olup null taşıdığını ayırmanız gerekiyorsa array_key_exists kullanın; sonra değeri ayrıca inceleyin. Bu ayrım, null değerinin bilinçli bir ayar veya temizleme isteği olarak kullanıldığı uygulamalarda önemlidir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic