- 1. JIT (Just-In-Time) Derleyici
- 2. Named Arguments (İsimlendirilmiş Argümanlar)
- 3. Constructor Property Promotion
- 4. Match İfadesi (Match Expression)
- 5. Nullsafe Operator (?->)
- 6. Union Types
- 7. Attributes (Annotations)
- 8. PHP 8.1 ile Gelen Enums
- 9. Readonly Properties (PHP 8.1)
- 10. Performans ve Tip Sistemi İyileştirmeleri
- PHP 8'e Geçiş — Dikkat Edilmesi Gerekenler
- Sonuç: PHP 8 Modern Bir Dil
PHP 8, dilin son 15 yıldaki en kapsamlı güncellemesidir. Kasım 2020'de yayınlanan bu majör sürüm; JIT derleyici, named arguments, match ifadesi, union types, nullsafe operatör ve attributes gibi özelliklerle PHP'yi modern dil standartlarına taşıdı. PHP 8.1, 8.2 ve 8.3 güncellemeleri ise temeli daha da güçlendirdi. Eğer hâlâ PHP 7.x kullanıyorsanız, sadece "modaya uymak" için değil; performans, güvenlik ve sürdürülebilirlik için PHP 8'e geçişi düşünmelisiniz.
Bu yazıda PHP 8 ile gelen en önemli yenilikleri kod örnekleriyle inceleyeceğiz. Her özelliğin gerçek hayatta neye yaradığını da net olarak göstereceğiz.
1. JIT (Just-In-Time) Derleyici
PHP 8'in en çok konuşulan yeniliği JIT derleyicidir. Geleneksel olarak PHP kodu çalıştırılırken önce opcode'a çevriliyor, sonra Zend VM tarafından yorumlanıyordu. JIT bunu değiştiriyor: kod doğrudan x86 makine koduna çevrilip CPU'da çalıştırılıyor.
Pratik etkisi: Matematiksel yoğun işlemlerde, ML benzeri hesaplamalarda ve döngülerde belirgin hızlanma sağlar. Ancak çoğu web uygulamasında (CRUD odaklı, I/O ağırlıklı) etki sınırlıdır çünkü darboğaz veritabanı veya ağ olur, CPU değil. PHP'yi C extension'larsız oyun motoru veya görüntü işleme için kullanmak isteyenler için ise devrim niteliğindedir.
JIT varsayılan olarak kapalıdır. Aktifleştirmek için php.ini'de opcache.jit_buffer_size ve opcache.jit ayarlarını yapılandırmanız gerekir.
2. Named Arguments (İsimlendirilmiş Argümanlar)
Çok parametreli fonksiyonlarda kod okunabilirliği ve esneklik açısından devrim yapan özellik:
// PHP 7 ve öncesi
htmlspecialchars($string, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
// PHP 8
htmlspecialchars($string, double_encode: false);
Sadece değiştirmek istediğiniz parametreyi geçersiniz, diğerleri varsayılan değerlerinde kalır. Aynı zamanda parametre sırasını da değiştirebilirsiniz. Bu özellik özellikle çok parametreli kütüphane fonksiyonlarında ve config dizilerinde kod kalitesini ciddi şekilde artırır.
3. Constructor Property Promotion
OOP yazarken her gün karşılaştığımız tekrarı ortadan kaldıran sade bir özellik:
// 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,
) {}
}
DTO (Data Transfer Object), Value Object ve basit modeller artık 3-4 satıra sığar. Boilerplate kod yazma yükü ciddi azalır.
4. Match İfadesi (Match Expression)
Klasik switch ifadesinin modern ve güvenli halidir. Üç önemli farkı vardır: strict (===) karşılaştırma yapar, değer döndürür, ve break ifadesi gerektirmez:
// PHP 7 - switch
$message = '';
switch ($status) {
case 200:
case 201:
$message = 'Başarılı';
break;
case 404:
$message = 'Bulunamadı';
break;
case 500:
$message = 'Sunucu hatası';
break;
default:
$message = 'Bilinmeyen';
}
// PHP 8 - match
$message = match($status) {
200, 201 => 'Başarılı',
404 => 'Bulunamadı',
500 => 'Sunucu hatası',
default => 'Bilinmeyen',
};
Hem daha kısa, hem daha güvenli (strict tip karşılaştırma), hem de unutulan break'ler nedeniyle oluşan fall-through hatalarını ortadan kaldırır.
5. Nullsafe Operator (?->)
Zincirleme null kontrollerinin sonu:
// PHP 7
$country = null;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->getCountry();
}
}
// PHP 8
$country = $user?->getAddress()?->getCountry();
Zincir herhangi bir noktada null dönerse, ifade güvenle null olur ve hata fırlatmaz. Doctrine, Eloquent veya başka ORM kullanırken eksik ilişkilerle uğraşırken hayat kurtarır.
6. Union Types
Bir parametre veya dönüş değeri birden fazla tip kabul edebilir:
// PHP 8
function formatId(int|string $id): string {
return (string) $id;
}
function findUser(int $id): User|null {
// ...
}
Önceden bu durumlar için PHPDoc'ta @param int|string yazılır, sonra runtime'da manuel tip kontrolü yapılırdı. Şimdi dil seviyesinde yapılıyor. PHP 8.0'da null için union type yazılır (User|null), PHP 8.1+ ise ?User shorthand'i de geçerlidir.
7. Attributes (Annotations)
Java ve C#'tan tanıdığımız annotation/attribute sistemi PHP 8 ile geldi. Önceden DocBlock yorumlarına yazılan metadata artık dil seviyesinde:
// PHP 7 - PHPDoc annotation
/**
* @Route("/api/posts/{id}", methods={"GET"})
*/
public function get($id) { /* ... */ }
// PHP 8 - native attribute
#[Route('/api/posts/{id}', methods: ['GET'])]
public function get($id) { /* ... */ }
Symfony, Doctrine ve Laravel gibi büyük framework'lerin tamamı attribute sistemine geçti. Statik analiz araçları artık metadata'yı string parsing yapmadan, doğrudan PHP'nin reflection API'si ile okuyabiliyor.
8. PHP 8.1 ile Gelen Enums
PHP 8.1 ile dile asıl enum desteği geldi (PHP 8.0'da hâlâ class const ile sahte enum yazılıyordu):
enum OrderStatus: string {
case Pending = 'pending';
case Approved = 'approved';
case Shipped = 'shipped';
case Delivered = 'delivered';
case Cancelled = 'cancelled';
public function label(): string {
return match($this) {
self::Pending => 'Beklemede',
self::Approved => 'Onaylandı',
self::Shipped => 'Kargoya Verildi',
self::Delivered => 'Teslim Edildi',
self::Cancelled => 'İptal Edildi',
};
}
}
Tip güvenli, metod tanımlanabilen, interface implement edebilen enum'lar — büyük projelerde domain modellemeyi çok daha temiz hale getiriyor.
9. Readonly Properties (PHP 8.1)
Bir property bir kez set edildikten sonra değiştirilemez hale gelir. Immutable Value Object yazımını dil seviyesinde destekler:
class Money {
public function __construct(
public readonly int $amount,
public readonly string $currency,
) {}
}
$price = new Money(100, 'TRY');
$price->amount = 200; // Error: Cannot modify readonly property
PHP 8.2 ile birlikte readonly class de geldi — sınıfın tüm property'leri tek satırda readonly oldu.
10. Performans ve Tip Sistemi İyileştirmeleri
Kod tarafında görünmeyen ama her uygulamada hissedilen iyileştirmeler:
- str_contains(), str_starts_with(), str_ends_with(): Sonunda native string fonksiyonları (PHP 8.0).
- Daha akıllı tip karşılaştırması:
0 == 'foo'artıkfalsedönüyor (öncedentrue'ydu, çok büyük bir hata kaynağıydı). - Daha tutarlı hata mesajları: Internal fonksiyonlar artık Warning yerine TypeError fırlatıyor, hatalar erken yakalanıyor.
- Weak Maps: Memory leak riski olmadan object reference saklayabilen yapı.
- Performans: Genel olarak PHP 7'ye göre %10-20 daha hızlı (JIT olmadan bile), bellek kullanımı düşük.
PHP 8'e Geçiş — Dikkat Edilmesi Gerekenler
Var olan bir PHP 7 projesini PHP 8'e taşırken karşılaşacağınız konular:
- Deprecated özellikler: PHP 8'de bazı eski özellikler kaldırıldı veya hata üretiyor. Örneğin
$GLOBALSüzerinde yazma kısıtlandı. - Tip karşılaştırması değişti: Sayı-string karşılaştırmaları artık daha katı. Var olan kodda gizli hataları açığa çıkarabilir.
- Internal fonksiyon imzaları: Bazı fonksiyonların imzaları sıkılaştı.
strposhaystack/needle null kabul etmiyor artık. - Üçüncü parti kütüphaneler: Composer.json'da yer alan paketlerin PHP 8 desteğini doğrulayın.
- WordPress projeleri: WordPress 6.6+ ile PHP 8.0-8.3 desteklenir ama bazı eklentiler hâlâ uyumsuz olabilir.
Geçiş öncesi Rector gibi otomatik refactor araçları ve PHPStan ile statik analiz yapmanızı öneririz.
Sonuç: PHP 8 Modern Bir Dil
PHP 8, "PHP eski moda" diyenlere verilmiş en güzel cevaptır. JIT, named arguments, match, enums, readonly properties, attributes — bunların hepsi modern dillerin yıllardır sunduğu özellikler ve artık PHP'de de var. Üstelik PHP 8.x sürüm serisi her yıl yeni özellikler ekliyor; 8.3 ile typed class constants, json_validate() ve dynamic class constant fetch geldi.
Eğer hâlâ PHP 7.x üzerinde duran bir projeniz varsa, sadece güvenlik nedeniyle bile yükseltmeyi düşünmelisiniz — PHP 7.4 desteği Kasım 2022'de tamamen sona erdi. Yeni proje başlatıyorsanız, PHP 8.3 veya 8.4 ile başlayın.
YazılımPark olarak PHP 8 ile modern, performanslı ve güvenli özel yazılım çözümleri geliştiriyoruz. Kurumsal CRM, bayi paneli, randevu sistemi veya API entegrasyonu ihtiyacınız varsa bizimle iletişime geçin.
PHP geçişi veya özel yazılım için danışmanlık mı arıyorsunuz? WhatsApp veya telefon ile uzmanlarımıza ulaşın.