Bu yazıda PHP 8.0 hakkında kesinleşen ve tartışılan yeni özellikler hakkında bilgiler vereceğim. PHP 7.0’ın çıkışı özellikle performans iyileştirmeleriyle dikkatleri üzerine çekmiş, ve hatta Facebook’un yayınladığı performans odaklı HHVM isimli PHP motoruna olan talebi de azaltmıştı. PHP 8.0 da en az PHP 7.0 kadar konuşulacak yeni özelliklerle geliyor.

PHP8’de beklenen en büyük yenilik JIT derlemesi. Yaklaşık iki ay önce, PHP’nin JIT taslağı, PHP geliştiricileri tarafından oylandı ve kabul edildi. Buna göre PHP8’e JIT’in uygulanacak olması kesinleşti. PHP’nin geliştiricisi Zend firması, halihazırda PHP8’e ve yeni JIT motorununun geliştirmesine başladı bile.

Şimdi bu yeni JIT özelliğinden bahsedelim. JIT, bazı programlama dillerinde de kullanılan bir çalıştırma yöntemidir. Normalde PHP’nin mevcut (mesela 7.0) sürümünün bir yorumlayıcı programı olur ve verilen kaynak kodunu okuduktan sonra bunu PHP motorunun anlayabileceği bir bytecode’a çevirir ardından bunu da yorumlayarak çıktısını verir. Ancak JIT ile her defasında aynı işlemin yapılması yerine, yorumlanması için oluşturulmuş olan mevcut bytecode’u Assembly’e yani işlemcinin anlayacağı dile çevirir ve kaynak kodun tekrar okunmasına gerek duyulmadığı süre boyunca aynı makine kodunun çıktısını vermeye devam eder. Bu sayede bir kodun yorumlanması için gereken bu süreç içerisinde tüketilen sistem kaynaklarından tasarruf edilmiş olur ve tabiki kodun çalışma süresi azaltılır.

PHP’nin temellerini atan iki geliştiriciden biri olan Zeev Suraski, PHP 7.0 ile PHP 8.0’ın bir karşılaştırmasını yaptığı video hazırlamış. Buradan ikisi arasındaki performansı daha iyi anlayabilirsiniz.

PHP 8.0’a JIT dışında beklenen yeni deprecation’lar ve düzenlemeler şunlar:

  • Üçlü karşılaştırma operatörlerinden (ifade ? bir : iki) parantezsiz olarak fazladan ifade eklenimi kaldırılacak. ifade ? bir : iki ? üç : dört yerine yalnızca parantezli kullanımına izin verilecek ifade ? bir : (iki ? üç : dört); bu sayede olası yanlış anlaşılmaların önüne geçilecek ve kodun okunabilirliği artacak.
  • Birleştirme operatörünün önceliği değiştiriliyor. Mevcut davranışta birleştirme yapılırken soldan sağa doğru öncelik verilirken, yeni davranışta toplama ve çıkarma işlemleri tıpkı diğer aritmetik işlemler gibi daha yüksek önceliğe sahip olacak. Örneğin "3" . "5" + 7 ifadesi 42 yerine "312" değerine eşit olacak.
  • Birden fazla tür belirtimi desteği (Union Types) gelecek. Örneğin bir class içerisinde int $number tanımladığımızı varsaydığımız değişkeni isterseniz int|float $number olarak da tanımlayabilirsiniz. Böylece bu değişkene hem int hem float türünde değer tanımlanabilir.
  • Diziler (array) negatif index ile başlatılabilecek. Örneğin: $coord[-4] = ...
  • İsimlendirilmiş argümanlar: Fonksiyon çağırırken, parametrelere pozisyonları yerine parametre isimlerine göre argüman eklemek mümkün hale gelecek. Fonksiyonlar foo('deneme', false, false, 1) yerine foo('deneme', number: 1) şeklinde çağrılabilecek. Böylece gereksiz yere argüman eklemeye gerek kalmayacak ve kodun okunabilirliği artmış olacak.
  • Attributes: Bu özellik sayesinde sınıflara, method’lara, fonksiyon ve parametrelerine metadata tanımlamak mümkün olacak. Daha sonra Reflection API ile girilen bu metadata’lara ulaşılabilecek. Sınıflar, method’lar, fonksiyon ve parametreleri dahil pek çok alanda kullanılabilir olacak.
  • Numara karşılaştırmaları artık daha doğru sonuç verecek. Öncesinde numara ile string karşılaştırıldığı zaman sayısal olmayan string’ler (strict olarak karşılaştırılmıyorsa) gözardı edilirdi. Mesela var_dump(0 == "foobar") PHP8 öncesinde true olarak dönmekteyken artık false olarak dönecek.
  • Yeni match operatörü: Daha önce switch ve case kullanarak yaptığımız toplu karşılaştırmalar, match ile daha kısa bir yazımla yapılabilecek.
  • Yeni str_contains fonksiyonu: Daha önce strpos ile metnin içerisinde bir ifade geçmiyorsa false, geçiyorsa int ile karşılaştırıyorken, artık sadece boolean döndürecek olan bu fonksiyonu kullanabileceğiz.
  • Yeni nullsafe operatörü (?->): Bir nesneden porperty çağırken sürekli nesnenin null olup olmadığını kontrol etmeye gerek kalmadan $obj?->foo?->bar şeklinde çağırmak mümkün olacak. Böylece nesnelerden birisi null ise hata vermek yerine değer direkt null dönmüş olacak.
  • try/catch‘lerde Exception‘lar için değişken tanımlamaya gerek kalmayacak. catch (\Exception $e) yerine catch (\Exception) olarak kullanıma izin verilecek.
  • Kullanıcı fonksiyonlarındaki TypeError, dahili fonksiyonlar için de geçerli olacak. Daha önce dahili fonksiyondan tür hatası yerine null ya da sadece uyarı mesajı döndürülüyordu.
  • JSON modülü sürekli aktif olarak gelecek. Daha önce PHP JSON modülünündeki kodlar ücretsiz olmayan bir lisansa sahip olduğu için bazı Linux dağıtımlarında bu modül PHP ile birlikte kurulu olarak gelmiyordu. Bu lisans sorunu çözüldüğü için artık PHP8’de modül sürekli aktif olarak gelececek.

PHP’nin gelişimi sürdükçe, PHP 8.0 için planlanan yeni özellikler tartışılmaya ve çıkartılmaya başlanacaktır. Çıkış tarihi ise 26 Kasım 2020 olarak planlandı.