Agora Metin2 1
Agora Metin2
EnesDeniz™ 1
EnesDeniz™
Cancan.1234 1
Cancan.1234
lHezarfeNl 1
lHezarfeNl
Bodyguardd 1
Bodyguardd
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
mavzermete 1
mavzermete
kaptanmikro1 1
kaptanmikro1
Reklam vermek için turkmmo@gmail.com

PHP'de Null Birleştirme Operatörleri: ?? ve ??= Kullanımı

image.jpeg


?? operatörü, sol tarafındaki değer mevcutsa ve null değilse bu değeri; aksi takdirde sağ taraftaki değeri döndürür: $name = $_GET['name'] ?? 'Guest';. Bu yöntemi doğrudan anahtarı okumaktan ayıran en önemli özellik, değişken veya dizi anahtarı eksik olduğunda herhangi bir uyarı mesajı üretmemesidir.

PHP:
<?php
$name = $_GET["name"] ?? "Guest";
$lang = $_GET["lang"] ?? "en";

echo "<p>Hello, " . htmlspecialchars($name) . " (language: " . htmlspecialchars($lang) . ")</p>";
echo '<p><a href="?name=Ada">?name=Ada</a> | <a href="?name=Linus&lang=fi">?name=Linus&amp;lang=fi</a> | <a href="?">no query</a></p>';

Kodu ilk çalıştırdığınızda herhangi bir sorgu dizesi bulunmadığı için varsayılan değerler kullanılır. Parametrelerle yeniden çalıştırıldığında ise $_GET dizisi dolu olacaktır. Eğer $_GET["name"] ifadesini ?? kullanmadan okumaya çalışsaydınız, standart bir PHP kurulumunda Warning: Undefined array key "name" uyarısı alırdınız.

?? Operatörü, isset() Fonksiyonunun Kısa Yazımıdır

$a ?? $b yazımı, aslında isset($a) ? $a : $b ifadesiyle aynı anlama gelir. Bu yapı; değişkenler, iç içe geçmiş dizi anahtarları ve nesne özellikleri üzerinde çalışır ve herhangi bir eksik parça bulduğunda hata vermeden işlemi durdurur.

PHP:
<?php
$config = [
    "db" => ["host" => "localhost", "port" => null],
];

// The long way
$host = isset($config["db"]["host"]) ? $config["db"]["host"] : "127.0.0.1";

// The same with ??
$host = $config["db"]["host"] ?? "127.0.0.1";
$port = $config["db"]["port"] ?? 3306;        // null, so default
$user = $config["db"]["user"] ?? "root";      // missing key
$cache = $config["cache"]["ttl"] ?? 60;       // missing parent key too
$debug = $undefinedVariable ?? false;         // missing variable

var_dump($host, $port, $user, $cache, $debug);

Bu operatör, isset fonksiyonuyla aynı mantıkla çalıştığı için, bir anahtar mevcut olsa bile değeri null ise varsayılan değer döndürülür.

Birden Fazla Kaynağı Kontrol Etmek İçin ?? Zincirleme

?? operatörü sağdan birleşimlidir ve dilediğiniz kadar zincirlenebilir. PHP, bu zincirde karşılaştığı ilk atanmış ve null olmayan değeri döndürür.

PHP:
<?php
$fromQuery = null;
$fromCookie = null;
$fromProfile = "fr";

$lang = $fromQuery ?? $fromCookie ?? $fromProfile ?? "en";
echo $lang, "\n";

$settings = ["theme" => null];
$theme = $settings["theme"] ?? $settings["defaultTheme"] ?? "light";
echo $theme, "\n";

??= Operatörü: Sadece Null Durumunda Atama Yapma

$a ??= $b kullanımı, yalnızca $a değişkeni tanımlanmamışsa veya null ise $b değerini $a değişkenine atar. Bu yöntem, varsayılan değerleri doldurmanın veya bir hesaplamayı bir kez yapıp yeniden kullanmanın en kısa yoludur.

PHP:
<?php
$options = ["color" => "red", "size" => null];

$options["color"] ??= "blue";   // already set, unchanged
$options["size"] ??= "M";       // null, so assigned
$options["qty"] ??= 1;          // missing, so assigned
print_r($options);

// Compute once, reuse afterwards
function slowSquare(int $n): int {
    echo "computing $n\n";
    return $n * $n;
}
$cache = [];
foreach ([4, 4, 7, 4] as $n) {
    $cache[$n] ??= slowSquare($n);
    echo "$n squared is {$cache[$n]}\n";
}

??= operatörünün sağ tarafındaki ifade, yalnızca atama işlemi gerçekleştiğinde değerlendirilir; computing 4 ifadesinin sadece bir kez görünmesinin nedeni budur.

?? ve ?: (Kısa Ternary) Arasındaki Farklar

?? operatörü sadece null olup olmadığını test ederken, ?: operatörü değerin "truthy" (doğru kabul edilen) olup olmadığına bakar. Bu durum 0, "" ve "0" gibi değerlerde farklı sonuçlar doğurur:

PHP:
<?php
$inputs = ["qty" => "0", "note" => "", "coupon" => null];

foreach (["qty", "note", "coupon", "missing"] as $key) {
    $viaCoalesce = $inputs[$key] ?? "default";
    $viaElvis = ($inputs[$key] ?? null) ?: "default";
    printf("%-8s ?? => %-10s ?: => %s\n",
        $key, var_export($viaCoalesce, true), var_export($viaElvis, true));
}

"0" değeri gerçek bir girdi olarak kabul edilir; bu yüzden ?? onu korurken, ?: onu değiştirir. Tek başına ?: kullanımı eksik anahtarlar için uyarı vereceğinden, kod örneğinde bu durum ($inputs[$key] ?? null) ?: ... şeklinde sarmalanmıştır.

Nullsafe Operatörü ?->

?->, aynı mantığın PHP 8 ile eklenen nesne versiyonudur. Eğer sol taraftaki nesne null ise, işlem zinciri durdurulur ve Call to a member function getAddress() on null gibi bir Error fırlatmak yerine null döndürülür. Bir varsayılan değer belirlemek isterseniz zincirin sonuna ?? ekleyebilirsiniz.

PHP:
<?php
class Address {
    public function __construct(public string $city) {}
}

class User {
    public function __construct(public ?Address $address = null) {}
    public function getAddress(): ?Address { return $this->address; }
}

function findUser(int $id): ?User {
    return match ($id) {
        1 => new User(new Address("Paris")),
        2 => new User(),
        default => null,
    };
}

foreach ([1, 2, 3] as $id) {
    $city = findUser($id)?->getAddress()?->city ?? "unknown";
    echo "user $id: $city\n";
}

Kullanıcı 2 mevcut ancak adresi yok, kullanıcı 3 ise tamamen eksik. Her iki durumda da herhangi bir hata oluşmadan ?? "unknown" varsayılan değerine ulaşılır.

Sık Yapılan Hata: ?? Operatörünün İşlem Önceliği

?? operatörü, nokta (.) birleştirme ve aritmetik operatörlere göre daha düşük önceliğe sahiptir. Bu nedenle "Count: " . $count ?? 0 ifadesinde PHP önce asla null olmayacak olan "Count: " . $count stringini oluşturur ve varsayılan değer hiçbir zaman kullanılmaz.

PHP:
<?php
$count = null;

echo "Count: " . $count ?? 0, "\n";     // the ?? applies to the whole string
echo "Count: " . ($count ?? 0), "\n";   // what was meant

?? ifadesini daha geniş bir ifadenin içinde kullandığınızda, öncelik sorunlarını önlemek için onu her zaman parantez içine alın.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst