PHP 8.3: Yeni Sürüm Analizi – Yenilikler ve Değişimler

PHP 8.3 Yeni Sürüm Analizi
Yazı içeriği

PHP çok büyük bir kullanıcı kitlesi tarafından web geliştirme amaçlı kullanılan bir betik dili. PHP’nin en son stabil ve güncel sürümü 8.3, 23.11.2023 tarihinde yayınlandı. 2000’de yayınlanan PHP 3.x sürümünden bu yana çok fazla yenilik getirildi ve değişiklikler oldu. PHP hala çok büyük bir kitle tarafından kullanılan en popüler web geliştirme (web tasarım) dilleri arasında. Bu yazımızda PHP 8.3 sürümündeki yenilikleri ve değişimleri kod örnekleriyle inceleyip analiz edeceğiz. 

PHP 8.3 Yeni Büyük Özellikler ve Geliştirmeler

PHP 8.3’te bir önceki PHP sürümü PHP 8.2’ye kıyasla birçok büyük yenilik ve geliştirme var. Aynı zamanda bazı özellikler ise kullanımdan kaldırıldı (deprecated). Yenilikler ve geliştirmeleri şimdi tek tek kod örnekleriyle inceleyeceğiz

Typed Class Constants (Tür Bildirilen Sınıf Sabitleri)

Tür bildirmek (declare type) web geliştirmede stabiliteyi arttıran, hata oranlarını düşüren geliştiriciler için çok önemli bir özellik. Sınıftaki (class) özellikler (property) için tür bildirme özelliği PHP 7.4’te eklendi. Bu özellikte sonraki sürümlerde birçok geliştirme yapılmasına rağmen bu özellik hala sınıftaki sabitlerde (constant) kullanılamıyordu. PHP 8.3 ile artık sınıftaki sabitler için tür bildirme mümkün.

// Doğru kullanım:
class MyClass {
    // Bildirilen tür ve değer aynı
    const string VERSION = "PHP 8.3"; // değer string
}

// Hatalı kullanım:
class MyClass {
    // Bildirilen tür ile değer farklı
    const int VERSION = "PHP 8.3"; // değer string
}

// Hatalı kullanım:
class MyClass {
    // Bildirilen tür sınıf sabitleri için desteklenmiyor
    const void VERSION = "PHP 8.3"; // değer string
}
PHP

Bazı tür bildirimleri sınıf sabitleri için desteklenmez. 

Sınıf sabitleri için desteklenmeyen tür bildirimleri: voidcallablenever

Yeni Bir Fonksiyon: json_validate()

JSON formatındaki verilerle (json-encoded data) çalışırken veriyi kullanmadan önce gelen verinin geçerli olduğunu doğrulamamız gerekir. Bunu PHP 8.3’ten önceki sürümlerde aşağıdaki gibi veya benzer yöntemlerle yapıyorduk.

// PHP 8.3'ten önceki sürümlerde JSON verisini doğrulama

$data = $json_decode($maybeJSON);

if (json_last_error() === JSON_ERROR_NONE) {
    // $data ile gerçekleştirilecek işlemler
}
PHP

Bu eski örnekte JSON verisini doğrularken PHP, verinin büyüklüğüne göre değişmekle beraber kayda değer bellek tüketebilir. PHP 8.3’te ise performans odaklı hızlı çözüm yaratan yeni bir PHP fonksiyonu eklendi: json_validate(). Bu fonksiyonun kullanım senaryosunu altta örnekledik.

// PHP 8.3'te JSON verisini doğrulama
$data = $json_decode($maybeJSON);

if (json_validate($maybeJSON)) {
    // $data ile gerçekleştirilecek işlemler
}
PHP

Yeni Bir Özellik: #[Override]

PHP’de arayüzleri uygularken (implementing interfaces) arayüzdeki yöntemler için detaylı işlevsellik sağlarız. Bir sınıfın örneğini (instance of class) oluştururken aynı isme ve uyumlu imzaya sahip alternatif bir sürüm oluşturarak ana yöntemi geçersiz kılabiliriz (override a parent method). Bu durum yazılımda büyük sorunlar ayol açabilir. Kısaca, sorun ana yöntemi gözden kaçan küçük bir yazım hatası (typo) sonucu geçersiz kıldığımızı sanmamız.

PHP 8.3 #[Override] özelliği (attribute) bu sorun için çözüm sunar. Şimdi örnekte bunu görelim.

class A {
    protected function myOverrideFunc(): void {}

// Doğru kullanım
// Bu örnek çalışacak
// Üstteki sınıfta ilgili method var ve geçersiz kılındı
class B extends A {
    #[\Override]
    public function myOverrideFunc(): void {}

// Hatalı kullanım
// Bu örnek çalışmayacak, çünkü ana sınıfta method yok
// Muhtemelen gözden kaçan bir yazım hatası
class C extends A {
    #[\Override]
    public function myOverrideFunction(): void {}
}
PHP

readonly Özelliklerinin Derin Klonlanması

PHP, bireysel sınıf özelliklerini (ndividual class properties) PHP 8.1’de readonly şeklinde bildirme, PHP 8.2’de ise bunu tüm sınıfa atama imkanı sundu. Fakat web geliştiricilerin (web developer) çoğu bu tür özellikleri içeren sınıflarla çalışırken uygulanan limitlemelerin programlama mantığında pratikliğin önüne geçtiğini düşünüyordu. 

Bunu değiştirmek için RFC ile iki ana öneride bulunuldu:

readonly

  1. readonly sınıfların genişletilmesine izin verilmeyen sınıflara izin vermek
  2. readonly klonlama sırasında özelliklerin yeniden başlatılmasına izin vermek

2.ci öneri PHP 8.3’te yer buldu. PHP 8.3’e eklenen bu yeni yaklaşım, readonly özelliklerine sahip bir sınıfın örneklerinin (instances of a class with readonly properties) __clone sihirli metotuyla (magic method)  yeniden başlatılmasına olanak sağlar.

RFC’deki bu kod örneği, bu yeni metotun nasıl çalıştığını anlamamıza yardımcı olabilir:

Sınıf Sabitlerinin ve Sayılama Üyelerinin Dinamik Getirilmesi (Dynamic Fetching of Class Constants and Enum Members)

PHP’deki diğer özelliklerden farklı olarak, sınıf sabitlerini (class constants) ve sayılama üyelerini (enum members)  değişken isimleriyle çekmek biraz daha karmaşıktır. PHP 8.3’ten önce bunu aşağıdaki örnekteki gibi yapabiliyorduk:

class Foo {
    public function __construct(
        public readonly DateTime $bar,
        public readonly DateTime $baz
    ) {}

    public function __clone() {
        // Klon çağrıldığında $bar yeni bir DateTime alacak
        $this->bar = clone $this->bar;

        // Ardından bu metod çağrılacak
        $this->cloneBaz();
    }

    private function cloneBaz() {
       // Bu __clone içinden çağrıldığından dolayı doğru bir kullanımdır
        unset($this->baz);
    }
}

$foo = new Foo(new DateTime(), new DateTime());
$foo2 = clone $foo;
PHP
class MyClass {
    public const THE_CONST = 9;
}

enum MyEnum: int {
    case FirstMember = 9;
    case SecondMember = 10;
}

$constantName = 'THE_CONST';
$memberName = 'FirstMember';

echo constant('MyClass::' . $constantName);
echo constant('MyEnum::' . #memberName)->value;
PHP

Şimdi PHP 8.3’te üstteki örnekteki sınıf ve enum tanımlamalarını kullanarak değerleri alalım:

$constantName = 'THE_CONST';
$memberName = 'FirstNumber';

echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;
PHP

Yeni Bir Metod: getBytesFromString()

PHP 8.3’te eklenen özellikler arasında en beklenmeyen olanı bu metod idi diyebiliriz: Önceden onaylanmış bir karakter koleksiyonunu (pre-approved collection of characters) kullanarak rastgele metin oluşturmak. 

Bu yeni yöntem çok basit ve net. Kaynak olarak bazı karakterleri metota veririz ve bunlardan kaç tanesini kullanmak istediğimizi belirtiriz. Hepsi bu kadar! Artık metotumuz belirtilen uzunluğa ulaşana kadar rastgele karakterler ile sonuç döndürecek. Şimdi bunu bir örnekle netleştirelim

$generateRandomString = new Random\Randomizer();
$allowedChars = 'ABCDEFGHJKMNPQRSTVWXYZ';

$generateRandomString->getBytesFromString($allowedChars, 6) // "MBDSFD" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 6) // "DJSDKA" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 4) // "SDLA" - rastgele gelen veri
PHP

Çıktının belirttiğimiz karakterlerin toplam uzunluğundan daha uzun olması mümkün. Aşağıdaki örnekte bunu gerçekleştirdik:

$generateRandomString = new Random\Randomizer();
$allowedChars = '123456';

$generateRandomString->getBytesFromString($allowedChars, 8) // "47384252" - rastgele gelen veri
PHP

Parametre olarak verdiğimiz karakterlerin hepsinin farklı olması halinde hangisinin seçileceği olasılığı eşittir. Ancak desteklenen karakter listemize aynı karakterden birden fazla ekleyerek çıktıda daha fazla görünmesini sağlayabiliriz. Bir sonraki örnekte bunu gösterdik.

$generateRandomString = new Random\Randomizer();
$allowedChars = 'AAAAA12345';

$generateRandomString->getBytesFromString($allowedChars, 5) // "4AA12" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 8) // "38A19AA5" - rastgele gelen veri
PHP

Yeni Metotlar: getFloat() ve nextFloat()

PHP 8.3 sunduğu bu yenilikte PHP’nin random uzantısını (extension) genişleten iki yeni metot sunar: getFloat() ve nextFloat().

Bu metotlarla alakalı bir örnek: 

$generateRandomNumber = new Random\Randomizer();

// Rastgele ondalıklı (float) bir rakam oluştur
// Değer 0 ile 5 arasında olsun
$generateRandomNumber->getFloat(0,5); // 2.483929 - rastgele gelen veri

// 0 ile 1 arasında rastgele ondalıklı bir rakam oluştur
$generateRandomNumber->nextFloat(); // 0.4828258 rastgele gelen veri
PHP

PHP 8.3’teki Küçük Yenilik ve Geliştirmeler

PHP 8.3’te üstteki yeniliklerin yanı sıra onlarca farklı küçük çaplı geliştirme ve yenilik daha var. Bunları aşağıdaki listede kaynak dökümanlarıyla beraber sıraladık.

PHP 8.3’te Kullanımdan Kaldırılanlar

PHP’nin her yeni sürümünde, bazı kodlar kullanımdan kaldırılmak üzere işaretlenir. Bu özellikler tamamen kullanımdan kaldırılınca kullanılması asla önerilmez. Kullanımdan kaldırılan bir kodun kullanılması halinde kod yürütüldüğünde bir hata mesajı döndürülür. 

PHP 8.3’teki kullanımdan kaldırılanların listesi:

PHP 8.3

Bu yazıda PHP 8.3’taki önemli değişiklikleri ve yenilikleri inceledik. PHP 8.3 sürümündeki tüm değişikliklerin daha ayrıntılı listesi için resmi değişiklik günlüğünü (official changelog) incelemenizi öneririz. Kodlarınızı veya sitenizi PHP 8.2’den PHP 8.3’e yükseltmek istiyorsanız bu rehber işinize yarayabilir: PHP 8.3’e Geçiş Rehberi -> https://www.php.net/manual/en/migration83.php

Eğer PHP sürümleri ve geçiş hakkında endişeliyseniz, PHP 8.3’e geçmek için yeni sürüme biraz zaman tanımanızı öneririz. 

Onur Özden Web Çözümleri olarak PHP ve JavaScript dilleri ve alakalı teknolojiler kapsamında tam kapsamlı Web Yazılım hizmetleri sunuyoruz.  Bir sorunuz veya talebiniz varsa, teklif almak için sol alttaki Whatsapp butonundan bize hızlı bir şekilde ulaşabilirsiniz. 

Etiketler:

Benzer yazılar

php-foreach
PHP Döngülerin Performanslı ve Etkili Kullanımı

PHP en iyi yaklaşımlar serimizin bu bölümünde PHP döngüler (loop) hakkında kaliteli kodlama ve en iyi yaklaşım örneklerini paylaştık. Artık PHP’de döngüleri daha performanslı ve etkili olarak kullanacaksınız!

Yazıyı oku
PHP Etiketleri
PHP Etiketlerinin Efektif Kullanımı

PHP en iyi yaklaşımlar serimizde bugünki konumuz: PHP etiketleri. PHP etiketlerini en iyi şekilde nasıl kullanabiliriz? PHP’de kısa etiketleri neden kullanmamalıyız? PHP etiketleri hakkında en iyi yaklaşımları öğrenin!

Yazıyı oku
PHP strpos() İşlevinin Doğru Kullanımı
PHP strpos() İşlevinin Doğru Kullanımı

PHP’de strpos işlevinde hiç anlatılmayan ipuçlarını ve sık karşılaşılan hataları hiç düşündünüz mü? Doğru ve en iyi PHP strpos() kullanımını öğrenmek için web sitemizdeki makaleden ve kod örneklerinden hemen ücretsiz…

Yazıyı oku
Yorumunu Paylaş
Sayfa Değerlendirmesi

Hızlı Detay Formu

Hızlı detay formumuzu doldurun ve aynı gün içerisinde taleplerinizi ve sitenizi inceleyip ulaşalım!

Hızlı İletişim Formu

Hızlı iletişim formumuzu doldurun ve aynı gün sitenizi analiz edip size ulaşalım!

Yanıtla
1
Whatsapp Destek Hattı
Merhaba. 👋
Size nasıl yardımcı olabiliriz?