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 verilecekifade ? 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
ifadesi42
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 istersenizint|float $number
olarak da tanımlayabilirsiniz. Böylece bu değişkene hemint
hemfloat
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)
yerinefoo('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 öncesindetrue
olarak dönmekteyken artıkfalse
olarak dönecek. - Yeni
match
operatörü: Daha önceswitch
vecase
kullanarak yaptığımız toplu karşılaştırmalar,match
ile daha kısa bir yazımla yapılabilecek. - Yeni
str_contains
fonksiyonu: Daha öncestrpos
ile metnin içerisinde bir ifade geçmiyorsafalse
, 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
‘lerdeException
‘lar için değişken tanımlamaya gerek kalmayacak.catch (\Exception $e)
yerinecatch (\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ı.