PHP 7.4.22 Released!
Yayında!
PHP 8.0, PHP dili için önemli bir güncellemedir.
Optimizasyonlar ve yeni özellikler: Adlandırılmış Değişkenler, Union Types, Attributes, Kurucularda Özellik Tanımı, Match İfadesi, Nullsafe Operatorü, JIT(Anında Derleme) yanında tip sistemi, hata işleme ve tutarlılıkta iyileştirmeler içerir.

Adlandırılmış Değişkenler RFC

PHP 7
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
PHP 8
htmlspecialchars($string, double_encode: false);
  • Opsiyonel parametreleri atlayabiliyor ve yalnızca zorunlu olanları belirtebiliyorsunuz.
  • Parametrelerin sırası önemli değil ve kendi kendilerini dokümante ediyorlar.

Attributes RFC Doc

PHP 7
class PostsController
{
   
/**
     * @Route("/api/posts/{id}", methods={"GET"})
     */
   
public function get($id) { /* ... */ }
}
PHP 8
class PostsController
{
   
#[Route("/api/posts/{id}", methods: ["GET"])]
   
public function get($id) { /* ... */ }
}

PHPDoc yorum satırları yerine PHP sözdizimi ile yapılandırılmış metadata kullanılabiliyor.

Kurucularda Özellik Tanımı RFC Doc

PHP 7
class Point {
  public
float $x;
  public
float $y;
  public
float $z;

  public function
__construct(
   
float $x = 0.0,
   
float $y = 0.0,
   
float $z = 0.0
 
) {
   
$this->x = $x;
   
$this->y = $y;
   
$this->z = $z;
  }
}
PHP 8
class Point {
  public function
__construct(
    public
float $x = 0.0,
    public
float $y = 0.0,
    public
float $z = 0.0,
  ) {}
}

Sınıfların özelliklerini tanımlamak için daha az kodlama yapılabiliyor.

Union types RFC Doc

PHP 7
class Number {
 
/** @var int|float */
 
private $number;

 
/**
   * @param float|int $number
   */
 
public function __construct($number) {
   
$this->number = $number;
  }
}

new
Number('NaN'); // Ok
PHP 8
class Number {
  public function
__construct(
    private
int|float $number
 
) {}
}

new
Number('NaN'); // TypeError

Değişken türlerinin kombinasyonu için PHPDoc açıklamaları yerine çalışma zamanında doğrulanan birleşim türleri (union types) tanımlamaları kullanılabiliyor.

Match İfadesi RFC Doc

PHP 7
switch (8.0) {
  case
'8.0':
   
$result = "Oh no!";
    break;
  case
8.0:
   
$result = "This is what I expected";
    break;
}
echo
$result;
//> Oh no!
PHP 8
echo match (8.0) {
 
'8.0' => "Oh no!",
 
8.0 => "This is what I expected",
};
//> This is what I expected

Yeni match ifadesi switch'e çok benzer ve aşağıdaki özelliklere sahiptir:

  • Match bir ifadedir, sonucu bir değişkende saklanabilir veya döndürülebilir.
  • Match'in karşılıkları tek satır ifadeleri destekler ve break; kullanılması gerekmez.
  • Match katı (strict) tip karşılaştırma yapar.

Nullsafe Operatorü RFC

PHP 7
$country null;

if (
$session !== null) {
 
$user = $session->user;

  if (
$user !== null) {
   
$address = $user->getAddress();
 
    if (
$address !== null) {
     
$country = $address->country;
    }
  }
}
PHP 8
$country = $session?->user?->getAddress()?->country;

Null koşulları için kontroller yazmak yerine yeni Nullsafe operatörüyle çağrı zinciri oluşturabilirsiniz. Oluşturduğunuz zincirdeki herhangi bir parça hatalı değerlendirilirse tüm zincirin işlevi durur ve null olarak değerlendirilir.

Daha Akıllı String ve Sayı Karşılaştırmaları RFC

PHP 7
0 == 'foobar' // true
PHP 8
0 == 'foobar' // false

Sayısal string karşılaştırılırken PHP 8 sayısal olarak karşılaştırır. Aksi halde sayı bir string'e çevrilir ve string olarak karşılaştırılır.

Dahili İşlevler için Tutarlı Hata Türleri RFC

PHP 7
strlen([]); // Warning: strlen() expects parameter 1 to be string, array given

array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0
PHP 8
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given

array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0

Artık dahili işlevlere gönderilen parametreler doğrulanamazsa Error exception fırlatıyorlar.

Just-In-Time Derlemesi (JIT)

PHP 8, iki JIT derleme motoru sunuyor. Tracing JIT, ikisi arasında en yetenekli olanı. Karşılaştırmalarda yaklaşık 3 kat daha iyi performans ve uzun süre işlem yapan bazı uygulamalarda 1,5–2 kat iyileşme gösteriyor. Normal uygulamalarda performansı PHP 7.4 ile aynı.

PHP 8 performasına JIT katkısının karşılaştırması

Just-In-Time compilation

Tip sistemi ve hata işlemede iyileştirmeler

  • Aritmetik/bitsel operatörler için daha katı tip denetimi RFC
  • Soyut özellikli metodlar için doğrulama RFC
  • Sihirli metodlar için doğru işaretlemeler RFC
  • Yeniden sınıflandırılan motor hataları RFC
  • Uyumsuz metod işaretleri için fatal error RFC
  • @ operatörü artık önemli hataları susturmuyor
  • Private methodlarda kalıtımlar RFC
  • Mixed tipi RFC
  • Static return tipi RFC
  • Dahili işlevler için tip açıklamaları E-posta konusu
  • Eklentiler için özkaynak türleri(resources) yerine opak nesneler: Curl, Gd, Sockets, OpenSSL, XMLWriter ve XML.

Diğer PHP sözdizimi düzenlemeleri ve iyileştirmeleri

  • Parametre ve closure listelerinin sonunda virgül kullanılabilmesi RFC RFC
  • Değişken atamasına gerek olmayan hataların yakalanabilmesi RFC
  • Değişken sözdizimlerinde iyileştirmeler RFC
  • İsim alanındaki tanımları tek bir belirteç olarak değerlendirme RFC
  • Throw deyimi artık bir ifade (expression) RFC
  • Nesnelerde ::class kullanılabilmesi RFC

Yeni Sınıflar, Arayüzler ve Fonksiyonlar

To Top