PHP 7.4 İle Gelen Yenilikler

Mustafa Akçakaya
ClevelTeam
Published in
3 min readDec 11, 2019

--

28 Kasım 2019’da yayınlanan PHP 7.4 birçok yenilik ile birlikte geldi. Özellikle 7.0 gibi dilin gelişimine önemli ölçüde katkıda bulunan bu sürüm ayrıca 8.0 öncesinde desteklenecek son 7.x sürümü. Şimdilik 8.0 ile gelmesi planlanan JIT özelliği bir kenarda dursun, bu yazıda gelen bazı önemli yenilikleri derlemeye çalıştım.

Tip Verilmiş Sınıf Özellikleri

Typed Properties
https://wiki.php.net/rfc/typed_properties_v2

PHP 7 ile birlikte gelen sayıl türler (scalar) ve dönüş (return) tiplerine ek olarak RFC’nin 2. versiyonunda öne çıkan bu özellik sınıf özelliklerine de tip tanımlanmasına olanak sağlıyor. Daha önce (temel düzeyde) getter/setter tanımlaması yapılarak sağlanan tip güvenliği bu sayede daha hızlı bir şekilde sağlanabilecek. Örnek olarak 7.4 öncesi şu koda bakabiliriz:

Getter/setter kullanılarak tip güvenliği sağlanmış ve hata yapma olasılığı azaltılmış durumda. PHP 7.4 ile yazmak istersek şu şekilde yapmamız yeterli olacak:

Görüldüğü gibi tip güvenliğinden ödün verilmeden daha basit bir şekilde amaca ulaşmış olduk. Statik tanımlamalar için ise eskisi gibi görünürlük ifadesinden sonra static yazmamız yeterli olacak. Desteklenen tipleri ise int, float, string, iterable, array, object, self, parent ve bool. Callable ve void ise desteklenmiyor.

Elbette bu getter/setter kullanmaya gerek olmadığı anlamına gelmiyor, getter/setter ile tip belirlemeden fazlasını yapabileceğimizi unutmayalım.

Ok Fonksiyon Tanımlama

Arrow Functions
https://wiki.php.net/rfc/arrow_functions_v2

JavaScript’in tekrar popülerleşmesi ile artık her yerde gördüğümüz kısa fonksiyon yazımı PHP 7.4 ile PHP dünyasına da girmiş olacak. Bir örnek vermek gerekirse:

Burada önemli olan noktalardan biri ise $y değişkeni için use sözdizimini kullanmaya gerek olmaması. Arrow functions kullandığımızda klasik function scope olayı da değişmiş oluyor. Bu ayrıca kod yazarken dikkat etmemiz gereken bir nokta olacak gibi duruyor, özellikle de function scope’a güvenerek aynı isme sahip değişkenler kullanmaya alıştıysak artık dikkat etmemiz gerekecek.

Kovaryant Dönüşler ve Kontravaryant Parametreler

Covariant Returns and Contravariant Parameters
https://wiki.php.net/rfc/covariant-returns-and-contravariant-parameters

PHP 7.4 öncesi sürümde dönüş tipleri ve parametre tiplerinde keskin bir sınır çizilmiş durumdaydı. Arayüz (interface) kullandığımızda belirtilen yöntemden ne dönmesi gerekiyorsa onun dönmesi şarttı ya da tip belirtilmiş parametreler ise aynı tipe uymak zorundaydı. Yani üst tip yerine alt tip kullanmak mümkün değildi. Sadece, bir sınıf bir arayüzü kullanıyorsa, o arayüzü dönüş tipi olarak kullanmada bir esneklik söz konusuydu. PHP 7.4 ile artık alt tip yerine üst tip dönüşü yapılabilecek:

PHP 7.4 öncesi bir sürümde bu tür bir kullanım FATAL ERROR Declaration of UserFactory::make(): User must be compatible with Factory::make(): object… şeklinde hataya sebep olacaktır.

Kontravariant parametrelere örnek olarak da:

Dizi İfadelerde Yayılma Operatörü Kullanımı

Spread Operator in Array Expression
https://wiki.php.net/rfc/spread_operator_for_array

array_merge yönteminden daha hızlı olduğu bilinen yayılma operatörü (…) PHP 7.4 ile artık dizi tanımlamalarında da kullanılabilir hale geliyor:

Birleştirme Ataması (??=) Operatörü

Coalesce Assign (??=) Operator
https://wiki.php.net/rfc/null_coalesce_equal_operator

?? şeklinde kullanılan birleştirme operatörü karşılaştırma şeklinde kullanılırken ??= şeklinde kullanılacak olan birleştirme ataması operatörü ile karşılaştırma ile birlikte atama da mümkün olacak:

Zayıf Referanslar

Weak References
https://wiki.php.net/rfc/weakrefs

Zayıf referanslar, geçici nesnelere esnek bir erişim sağlıyor. Normal (güçlü) referansların aksine, zayıf referanslar çöp toplayıcının bu nesneyi serbest bırakmasını engellemez. Bu nedenle, bir nesne hala zayıf bir referans olsa da, nesne imha edilebilir. Bu gibi durumlarda, zayıf referans sorunsuz bir şekilde geçersiz hale gelir. Önbellekleme gibi yerlerde kullanım faydası sağlayacak olan zayıf referanslar şu an PECL eklentisi olarak kurulabiliyor:

Çıktısı ise:

Object still exists!object(MyClass)#1 (0) {}Destroying object!Object is dead!

Önyükleme

Preloading
https://wiki.php.net/rfc/preload

PHP’nin çalışma yapısı gereği yazdığınız kodların her istekte tekrar yüklenmesi gerekiyor. 7.4 ile gelecek olan preloading özelliği ile ilk yüklenen kod betiğinin bellekte tutularak her seferinde yeniden işleme alınmasının önüne geçilecek ve onu kullanan alt betikler direkt ulaşabilecek. Özellikle frameworklerde bir performans artışı sağlayacak olan bu özellik Java HotSpot VM için tasarlanan Sınıf Veri Paylaşımı’ndan ilham almış. Bu özellik ile bir framworkün ya da bir kütüphanenin belli bir kısmını, belki de tümünü belleğe almak mümkün olabilecek gibi duruyor. Elbette bazı sınırlamalar var, örneğin birden fazla uygulamanın kullanıldığı yerlerde uygulanamayacak olması ya da belleğe alınan sınıflarda meydana gelebilecek değişiklerde yeniden başlatmaya ihtiyaç duyulabilecek olması gibi.

--

--