PHP 7.4'e Hızlı Bakış

İzni Burak Demirtaş
5 min readSep 5, 2019

--

Bildiğiniz gibi PHP 7.4 için çalışmalar hala devam ediyor ve bu güne kadar 3 alpha, 3 de beta versiyon yayınlandı. Bugün (5 Eylül) itibariyle RC versiyonlar da yayınlanacak. PHP 7.4 release tarihi için belirtilen gün 28 Kasım 2019. Bu tarihe kadar toplamda 6 adet RC versiyon planlanmış görünüyor. Zamanlamalarla alakalı detaylı bilgiye şuradan da ulaşabilirsiniz.

PHP 7.4

Şimdi PHP 7.4 ile hayatımıza neler girecek bir göz atalım. PHP 7.4 ile gelen yeni özellikleri başlıca olarak şöyle maddelendirebiliriz:

  • Arrow functions
  • Preloading
  • Typed properties (in Classes)
  • Improved type variance
  • Spread operator in Arrays
  • Null assignment operator
  • FFI (for better extension development in PHP)
  • Formatted Numeric Values (Numeric Literal Separator)

Şimdi bu maddeleri kısa kısa inceleyelim, bakalım bizi neler bekliyor!

Arrow Functions

Closure ve Anonymous fonksiyonları PHP’de uzun zamandır kullanıyoruz. Bununla alakalı küçük bir örnek yazalım:

array_map(function(Article $article) {
return $article->title;
}, $articles);

Bu şekilde tek satır olarak kullandığımız, sadece return işlemi yapan fonksiyonları artık Arrow Functions ile şu şekilde kullanabileceğiz:

array_map(fn(Article $article) => $article->title, $articles);

Arrow Functions ile ilgili bilmemizin faydası olacağını düşündüğüm bir kaç bilgiyi de sizinle paylaşayım:

  • Parent scope içerisinde bulunan değişkenlere use anahtar kelimesini kullanmadan direkt olarak Arrow Functions içerisinde erişebiliyoruz.
  • Arrow Functions sadece return işlemi içermeli ve tek bir satırda yazılmalıdır.

Typed Properties (in Classes)

Bu özellik ile artık sınıflar içerisinde tanımladığımız değişkenlere (class variables) tür tanımlaması yapabileceğiz. Şöyle ki:

class Foo
{
public string $foo;
public ?Bar $bar;
}

Burada bazı özel hususlar mevcut. Örneğin; public olarak tanımlanmış bir sınıf değişkenine, herhangi bir yerden erişmemiz mümkün. Ama eğer bu değişkene bir tür tanımlaması yaptıysak ve bu değişken için bir initialize (değer tanımlaması diyebiliriz) yapmadıysak; değişkene erişmeye çalışırken şuna benzer bir hata alacağız:

Fatal error: Uncaught Error: Typed property Foo::$bar  must not be accessed before initialization

Bunun gibi Typed Properties ile gelen bir kaç özel durum daha var. Bu durumlara göz atmak ve Typed Properties için hangi türlerin kullanılabilir olduğunu öğrenmek için buradaki bağlantıdan konu hakkında yazılmış güzel bir yazıya göz atabilirsiniz. Ayrıca şuradan da RFC’ye göz atmanız mümkün.

Improved Type Variance

PHP 7 ile birlikte yazdığımız fonksiyonlar dönüş tipi belirtebileceğimiz bir özellik geldi. Güzel de oldu. Bu özellik ile belli veri tipleri için dönüş tipleri (return types) belirtebiliyorduk.

PHP 7.4 ile bu olay biraz daha geliştirilmiş ve artık covariant dönüş tipi de kullanabileceğiz. Örneklendirecek olursak:

class Foo {}
class Bar extends Foo {}
class A
{
public function covariantReturnTypes(): Foo
{
// your codes
}
}
class B extends A
{
public function covariantReturnTypes(): Bar
{
// your codes
}
}

Buna ek olarak covariant tiplerin kullanımı sadece dönüş tipleri için değil, fonksiyon parametre tipleri için de kullanılabilecek. Şöyle ki:

class A
{
public function contraVariantArguments(ChildType $type)
{
// your codes
}
}
class B extends A
{
public function contraVariantArguments(ParentType $type)
{
// your codes
}
}

Bu geliştirme ile alakalı RFC bağlantısını buraya bırakıyorum.

Null Assignment Operator

Biliyorsunuz PHP 7 ile birlikte hayatımıza null operatörü girmişti. Şu şekilde bir kullanım yapabiliyorduk:

$data['date'] = $data['date'] ?? new DateTime();

Artık bu gibi işlemleri yeni eklenecek Null Assignment Operator ile şu şekilde çok daha kısa yapabileceğiz:

$data[‘date’] ??= new DateTime();

Nasıl? Bence yerinde bir geliştirme olmuş.

Array Spread Operator

Spread operatörünü (…) fonksiyon parametrelerinde kullanabiliyorduk. Artık bu operatör direkt olarak diziler içerisinde de kullanıma uygun hale getirilmiş. Güzel de olmuş. Şöyle bir örnek görelim:

$foo = [1, 2, 3];$bar = [4, 5];$result = [0, ...$foo, ...$bar, 6 ,7];// [0, 1, 2, 3, 4, 5, 6, 7]

Burada dikkat etmemiz gereken bir husus var o da; bu işlemi sadece numeric index key’lere sahip diziler ile yapabiliyor olmamız. Bu da aklınızda bulunsun. Belki ilerleyen zamanlarda tüm key’ler için işlem yapabileceğimiz geliştirmeler yapılabilir. Bu yeniliğin RFC bağlantısını da şöyle bırakayım.

Numeric Literal Separator

PHP 7.4 ile birlikte alt tire (underscore) karakteri ile birlikte uzun numeric ifadeleri daha görsel yazabilmek mümkün olacak. Şöyle bir örnek verelim:

$unformatted = 123456789.12
$formatted = 123_456_789.12

Bu geliştirmenin RFC bağlantısını da şöyle bırakıyorum.

Foreign Function Interface (FFI)

Bu özellik ile bazı core-level özellikleri kullanmak istediğimizde kendi kodumuz üzerinden C kodunu çağırma imkanı bulabileceğiz. Özetle; PHP ile bir PHP extension yazabilecek ve bunu kullanabileceğiz. Bunun için yine de C bilgisi gerekecek çünkü bu tarz bir geliştirmenin hala karışık ve zorlu tarafları var. Sonuçta core-level’da işlem yapacağız ve bu beraberinde C bilgisini gerektirecek. Bu özellik için de bir RFC bağlantısı mevcut. İsterseniz detaylı olarak bir inceleme yapabilirsiniz.

Bu konu çok fazla araştırma veya deneme fırsatı bulduğum bir konu değil maalesef, elimden geldiğince temel bilgi vermeye çalışıyorum. Bu nedenle, bu konu hakkında detaylı bilgisi olan veya kaynak paylaşabilecek kişiler bana ulaşabilirse, yazının bu kısmını güncelleyip daha detaylı ve doğru bilgi verebiliriz diye düşünüyorum.

Preloading

Bu özellikte bir başka core-level özellik. Ve sanırım benim en dikkatimi çeken ve hoşuma giden özelliklerin başında bu geliyor. Bu özellik ile birlikte PHP ile yazdığımız uygulamalarda ciddi performans artışları söz konusu olabilir.

Şimdi bu olayı kısaca ele alalım: PHP ile bir web uygulaması yazdığımızı düşünelim. Bunun için herhangi bir frameworkü kullanıyoruz veya kendimizce bir yapı oluşturmuş ve bunu kullanıyoruz. Server’a gelecek her request için uygulamanızda bulunan gerekli dosyaların sürekli olarak yüklenmesi gerekecek. Bu dosyaları sizin uygulamanızın core dosyaları olarak düşünebilirsiniz. Yani uygulama çalışırken kesinlikle yüklenmesi gereken dosyalar. Çekirdek sınıflar, fonksiyonlar, config dosyaları vs… Tüm bu dosyalar her gelen request için bir daha, bir daha yüklenecek. İşte burada devreye Preloading giriyor!

Preloading, sunucunun en başta istediğiniz dosyaları belleğe almasını ve gelen her request için bu dosyaları direkt olarak bellekten kullanması sağlıyor. Böylece her request için dosyaların tekrar tekrar yüklenmesini beklemek zorunda kalmıyor ve buradan önemli bir performans artışı elde edebiliyoruz.

Burada dikkat edilmesi gereken bir husus var. Eğer Preloading yapmış olduğunuz dosyaların kaynağı veya içeriği değişirse, sunucunun yeniden başlatılması gerekiyor. Daha sonrasında dosyalar yeni halleriyle tekrar belleğe alınabilir.

Bu konu ile alakalı şu yazıyı okuyarak daha detaylı bilgi sahibi olabilirsiniz. RFC’yi incelemek isteyenleri de şöyle alabiliriz.

Bu yazmış olduğum maddelerin yanı sıra gelen bazı yeni özellikler ve metotlar var. Bunların yanı sıra artık desteklenmeyecek ve deprecated olan şeylerde var. Ben en önemli gördüğüm özelliklere kısaca değinmek istediğim için bu detaylara değinmedim ama siz aşağıdaki bağlantı üzerinden benim bu yazıyı yazarken faydalandığım ve çok daha fazla detay bulunan yazıyı okuyabilirisiniz.

Kısaca ve dilim, elim döndüğünce PHP 7.4 ile gelen yeni özellikleri aktarmaya çalıştım. Eminim yanlışlarım veya eksiklerim olmuştur. Bu tarz şeyler gördüğünüzde, beni hemen uyarırsanız memnun olurum. Birlikte daha doğru, daha iyi bilgiyi bir araya getirebiliriz! Şimdiden teşekkürler.

Sağlıcakla ve kodla kalın!

--

--

İzni Burak Demirtaş

nam-ı diğer Buki. 👨🏻‍💻 Sr. Software Engineer @Jotform — #php #golang #javascript #reactnative — Co-Founder at HaberSistemim & MemleketApp