PHP 8.3 Yenilikleri: Tipli Sabitler ve Daha Fazlası

PHP 8.3, dilin tip sistemi ve okunabilirlik tarafında pratik iyileştirmeler getiren bir sürümdür. Bu rehberde, günlük kod yazarken gerçekten kullanaca...

PHP 8.3 Yenilikleri: Tipli Sabitler ve Daha Fazlası

PHP 8.3, dilin tip sistemi ve okunabilirlik tarafında pratik iyileştirmeler getiren bir sürümdür. Bu rehberde, günlük kod yazarken gerçekten kullanacağınız özelliklere odaklanıyorum: tipli sınıf sabitleri, dinamik sınıf sabiti getirme, salt okunur özelliklerin klonlanması, json_validate() ve rastgelelik yardımcıları. Her başlıkta önce ne işe yaradığını, sonra kısa bir örnekle beklenen davranışı açıklıyorum.

Önkoşullar ve kapsam

  • PHP 8.3 veya üzeri bir çalışma zamanı gerekir; burada anlatılan sözdizimi ve fonksiyonlar önceki sürümlerde çalışmaz.
  • Örnekler çerçeve bağımsızdır; herhangi bir PHP projesine uygulanabilir.
  • Sürüm yükseltmesi yapıyorsanız, önce test ortamında çalıştırıp geriye dönük uyumsuzlukları kontrol edin.

Tipli sınıf sabitleri

PHP 8.3 öncesinde sınıf sabitlerine tür bildirimi eklenemiyordu. Artık sabitlere tür verebilirsiniz; böylece sabitin değeri, bildirilen türle uyumlu olmak zorunda kalır.

<?php

class Siparis
{
    public const string DURUM_BEKLEMEDE = 'beklemede';
    public const int MAKS_ADET = 100;
    public const array GECERLI_DURUMLAR = ['beklemede', 'hazır', 'iptal'];
}

Beklenen davranış: tanımlı türle uyuşmayan bir değer atarsanız, kod çalıştırıldığında TypeError alırsınız. Bu, sabitlerin yanlışlıkla bozulmasını erken aşamada yakalamanızı sağlar. Örneğin public const int MAKS_ADET = 'yüz'; yazarsanız hata alırsınız.

Alt sınıflarda tür uyumu da önemlidir: bir sabiti geçersiz kılan alt sınıf, üst sınıftaki türle uyumlu bir değer vermelidir. Bu kural, kalıtım zincirinde tutarlılığı korur.

Dinamik sınıf sabiti getirme

Daha önce sabit adını bir değişkenden çözmek için constant() gibi dolaylı yollara başvuruluyordu. PHP 8.3 ile SınıfAdı::{$değişken} sözdizimi doğrudan kullanılabilir.

<?php

class ParaBirimi
{
    public const string USD = 'ABD Doları';
    public const string EUR = 'Euro';
}

$kod = 'EUR';
echo ParaBirimi::{$kod}; // Euro

Beklenen davranış: $kod değişkeninin değeri, sınıfta tanımlı bir sabit adıyla eşleşiyorsa o sabitin değeri döner. Eşleşme yoksa hata alırsınız; bu nedenle gelen değeri kullanıcı girdisinden alıyorsanız mutlaka bir izin listesiyle doğrulayın.

<?php

$kod = $_GET['kod'] ?? '';
$izinli = ['USD', 'EUR'];

if (!in_array($kod, $izinli, true)) {
    throw new InvalidArgumentException('Geçersiz para birimi kodu.');
}

echo ParaBirimi::{$kod};

Güvenlik notu: dinamik sabit adını doğrudan dış girdiyle beslemek, beklenmeyen sabitlere erişim veya hata tabanlı bilgi sızması riski taşır. Yukarıdaki gibi bir izin listesi kullanmak bu riski ortadan kaldırır.

Salt okunur özelliklerin klonlanması

PHP 8.1 ile gelen readonly özellikler, klonlama sırasında değiştirilemiyordu. PHP 8.3, __clone içinde salt okunur özellikleri yeniden başlatmanıza izin verir.

<?php

class Nokta
{
    public function __construct(
        public readonly int $x,
        public readonly int $y,
    ) {}

    public function __clone(): void
    {
        $this->x = $this->x + 1;
    }
}

$ilk = new Nokta(1, 2);
$kopya = clone $ilk;

echo $kopya->x; // 2

Beklenen davranış: klonlama, __clone metodunu çağırır ve bu metot içinde salt okunur özellikler yeniden atanabilir. Bu, bir nesnenin kopyasını alırken belirli alanları bilinçli olarak değiştirmeniz gereken senaryolarda işe yarar. Dikkat edin: aynı özelliği __clone dışında yeniden atamaya çalışırsanız hata alırsınız.

json_validate() ile JSON doğrulama

Bir JSON dizesinin geçerli olup olmadığını anlamak için önce json_decode() çağırıp sonucu kontrol etmek yaygın bir yöntemdi. json_validate() bunu daha doğrudan yapar ve yalnızca geçerlilik durumunu döndürür.

<?php

$girdi = '{"ad":"Ayşe","yas":30}';

if (json_validate($girdi)) {
    echo 'Geçerli JSON';
} else {
    echo 'Geçersiz JSON';
}

Beklenen davranış: geçerli JSON için true, aksi halde false döner. Bu fonksiyon veriyi çözmez, yalnızca doğrular. Yani JSON'u hem doğrulayıp hem kullanmanız gerekiyorsa, doğrulama sonrası yine json_decode() çağırmanız gerekir. Büyük girdilerde yalnızca doğrulama yapmak, tam çözümlemeye kıyasla gereksiz bellek kullanımını önleyebilir.

Güvenlik notu: json_validate() yalnızca sözdizimsel geçerliliği kontrol eder. İçeriğin iş kurallarınıza uygunluğunu ayrıca doğrulamanız gerekir; geçerli JSON, güvenli veri anlamına gelmez.

Rastgelelik yardımcıları

PHP 8.3, Random eklentisine birkaç yardımcı ekler. Bunlar, güvenli rastgele değer üretmeyi daha okunur hale getirir.

<?php

$motor = new Random\Engine\Secure();

$tamSayi = $motor->generate();          // rastgele bir tam sayı
$baytlar = $motor->getBytes(16);         // 16 rastgele bayt

Beklenen davranış: generate() rastgele bir tam sayı, getBytes() ise istenen uzunlukta rastgele bayt dizisi döndürür. Bu yardımcılar, güvenlik gerektiren bağlamlarda (örneğin token üretimi) random_bytes() ve random_int() ile aynı amaçla kullanılabilir.

Güvenlik notu: Kimlik doğrulama token'ı, parola sıfırlama anahtarı gibi değerler için kriptografik olarak güvenli kaynak kullanın. rand() veya mt_rand() bu amaçlar için uygun değildir.

Yaygın hatalar

  • Tipli sabitlerde alt sınıfın türü ihlal etmesi: Alt sınıfta sabiti geçersiz kılarken üst sınıftaki türle uyumlu bir değer verdiğinizden emin olun.
  • Dinamik sabit adını doğrulamadan kullanmak: Dış girdiyi doğrudan Sınıf::{$değişken} içine koymayın; izin listesi uygulayın.
  • json_validate() sonrası veriyi kullanmaya çalışmak: Bu fonksiyon veriyi döndürmez; kullanmanız gerekiyorsa json_decode() çağırın.
  • __clone dışında salt okunur özelliği değiştirmeye çalışmak: Bu hata verir; yeniden atama yalnızca __clone içinde yapılabilir.

Sürüm yükseltirken kontrol listesi

  1. Çalışma zamanınızın en az PHP 8.3 olduğunu doğrulayın.
  2. Mevcut sabit tanımlarınızı gözden geçirin; tür eklemek istediğiniz yerleri belirleyin.
  3. constant() ile yapılan dinamik sabit erişimlerini yeni sözdizimine taşımayı değerlendirin.
  4. Klonlama davranışına bağlı kod varsa, readonly özelliklerin __clone içinde yeniden atanmasının beklentinizle uyumlu olduğunu test edin.
  5. JSON doğrulama noktalarında json_validate() kullanımının, sonraki json_decode() çağrılarıyla tutarlı olduğundan emin olun.

Bu özelliklerin ortak noktası, dili daha öngörülebilir kılmak: türler sabitlere kadar iniyor, klonlama davranışı netleşiyor ve doğrulama işlemleri sadeleşiyor. Yükseltme yaparken değişiklikleri küçük adımlarla test etmek, bu kazanımları risksiz biçimde devreye almanızı sağlar.

İLGİLİ İÇERİKLER

Bunları da Okumak İsteyebilirsiniz