Teknik Detaylar

Merhaba PHP 8: Modern PHP 8.x Çağı

← Teknik Detaylar
2020-12-09 ~ 2026-06-21 · 8 dk okuma
Merhaba PHP 8: Modern PHP 8.x Çağı
Bu yazıyı yapay zekâ ile tartış
Sayfayı kopyala

💡 Özet (TL;DR):

  • Tarihsel Önemi: 26 Kasım 2020'de yayınlanan PHP 8.0, dilin modernleşme sürecindeki en büyük dönüm noktalarından biridir ve günümüz modern PHP 8.x (8.1, 8.2, 8.3, 8.4+) ekosisteminin temelini atmıştır.
  • Devrim Niteliğindeki Yenilikler: Adlandırılmış Değişkenler (Named Arguments), Attributes (Özellikler), Constructor Property Promotion, Union Types, Match İfadesi, Nullsafe Operatörü ve JIT (Just-In-Time) Derleyicisi.
  • 2026 Güncellemesi: PHP 8.1, 8.2, 8.3 ve 8.4 sürümleriyle gelen Enums, Readonly sınıflar, Property Hooks ve Asymmetric Visibility gibi yenilikler, PHP'yi modern ve güçlü bir tip güvenli dile dönüştürmüştür.

26 Kasım 2020 tarihinde yayınlanan yeni sürümle birlikte PHP 7.4.13 sürümünden stabil PHP 8.0 sürümüne geçmiş olduk. Versiyon değişikliği major olduğu için birçok yenilik ve iyileştirmeyi beraberinde getirdi.

PHP 7'de çalışan bir kodu PHP 8.0'a aktarmak çok zor olmasa da, daha eski versiyonlardan geçişler için daha fazla düzeltme yapmanız gerekebilir. Zira 8.0 versiyonunda artık yer almayan fonksiyon ve özelliklerin bir bölümü zaten 7.x sürümlerinde de kaldırılmış veya uyarı vermeye başlamıştı.


PHP 8.0 Öne Çıkan Yenilikler Tablosu

ÖzellikPHP 7.x ÖncesiPHP 8.0 ve SonrasıFaydası
Constructor Property PromotionAyrı sınıf özellikleri + atamalarTek satırda tanım ve atamaBoilerplate kodu azaltır.
Match ExpressionHantal ve gevşek switch bloklarıKatı tip kontrolü yapan temiz matchHataları önler, değer döner.
Nullsafe Operatorİç içe geçmiş if ($x !== null)$session?->user?->nameNull Pointer hatalarını önler.
Named ArgumentsPozisyona bağlı parametre sırasıparam: $value kullanımıOkunabilirliği artırır.
Union TypesSadece PHPDoc ile tip belirtimiint|float $numberÇalışma zamanı tip güvenliği sağlar.

PHP 8.0 ile Neler Değişti?

PHP 8.0 sürüm sayfasında yer aldığı sırayla öne çıkan yeniliklere bir bakalım:

Adlandırılmış Değişkenler (Named Arguments)

Python'da kullandığımız ve büyük rahatlık sağlayan Adlandırılmış Değişkenler özelliği, artık PHP içinde kullanılabilir.

Adlandırılmış değişkenler özelliği, fonksiyonlara parametrelerin belirli bir sırayla gönderilmesi zorunluluğunu ortadan kaldırıp adları ile gönderilmesini sağlıyor. Bu durum kodun okunabilirliğini ve anlaşılırlığını artırdığı gibi geliştiricinin işini de çok kolaylaştırıyor.

// Pozisyonlu değişkenler kullanma
array_fill(0, 100, 50);

// Adlandırılmış değişkenler kullanma
array_fill(start_index: 0, num: 100, value: 50);

Özellikler (Attributes)

Diğer dillerde Ek Açıklamalar (Annotations) olarak da bilinen Özellikler (Attributes), eski tip doc bloklarını ayrıştırmak zorunda kalmadan meta veriler eklemeye izin veriyor.

Eskiden PHP sadece string tipinde yorum bloklarına izin veriyordu. PHP topluluğu bu sorunu aşmak için yorumların içinde @route gibi pseudo karakterleri kullanarak ayrıştırma yöntemleri geliştirmişti. PHP 8.0 Attribute özelliği ile birlikte bu soruna doğal ve performanslı bir çözüm getirmiş oldu.

// PHP 7.x öncesi (PHPDoc / Annotations)
class PostsController
{
    /**
     * @Route("/api/posts/{id}", methods={"GET"})
     */
    public function get($id) { /* ... */ }
}
// PHP 8.0 sonrası (Native Attributes)
class PostsController
{
    #[Route("/api/posts/{id}", methods: ["GET"])]
    public function get($id) { /* ... */ }
}

Kurucularda Özellik Tanımları (Constructor Property Promotion)

İşte geliştiricilerin hayatını kolaylaştıracak, hem daha az hem de daha anlaşılır koda olanak sağlayan özelliklerden biri daha. PHP 8.0 ile birlikte sınıf özelliklerini doğrudan kurucu (constructor) parametreleri içerisinde tanımlayıp aynı zamanda erişim belirtecini atayabiliyoruz.

Eskiden özellik tanımları metod tanımlarının dışında sınıfın en başında yapılır, başlangıç değerinin atanması ise kurucu içerisinde gerçekleştirilirdi. PHP 8.0 bu tanımlamayı kısaltsa da eski yöntemi mecburi kılmıyor.

// PHP 7.x sürümü
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.0 sürümü
class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}

Birleşik Değişken Tipleri (Union Types)

Birden fazla tipe sahip olabilecek değişkenleri sadece PHPDoc yorumları ile değil, çalışma zamanında doğrulanacak doğal birleşik değişken tipi tanımları ile yapabiliyoruz.

// PHP 7.x sürümü
class Number {
  /** @var int|float */
  private $number;

  /**
   * @param float|int $number
   */
  public function __construct($number) {
    $this->number = $number;
  }
}
// PHP 8.0 sürümü
class Number {
  public function __construct(
    private int|float $number
  ) {}
}

Match İfadesi (Match Expression)

Match ifadesi, switch yapısına çok benzer ancak daha temiz ve güçlü alternatifler sunar:

  • Match bir ifadedir; sonucu bir değişkende saklanabilir veya doğrudan döndürülebilir.
  • Match kolları tek satır ifadeleri destekler ve break; kullanılması gerekmez.
  • Match katı (strict, ===) tip karşılaştırması yapar.
// switch kullanımı (Gevşek tip karşılaştırması yapar)
switch (8.0) {
  case '8.0':
    $result = "Oh no!";
    break;
  case 8.0:
    $result = "This is what I expected";
    break;
}
echo $result; // Çıktı: Oh no!
// match kullanımı (Katı tip karşılaştırması yapar)
echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
}; // Çıktı: This is what I expected

Nullsafe Operatörü (Nullsafe Operator)

Geliştiricilerin işini çok kolaylaştıracak, gereksiz kod yığınlarını ortadan kaldıracak faydalı bir özellik. Artık null kontrolleri için iç içe if koşulları yazmak yerine yeni eklenen Nullsafe operatörünü (?->) kullanabiliyoruz.

// PHP 7.x öncesi
$country = null;
if ($session !== null) {
  $user = $session->user;
  if ($user !== null) {
    $address = $user->getAddress();
    if ($address !== null) {
      $country = $address->country;
    }
  }
}
// PHP 8.0 nullsafe operator
$country = $session?->user?->getAddress()?->country;

Daha Akıllı Metin ve Sayı Karşılaştırmaları (Saner String to Number Comparisons)

Eski sürümlerde metin ve sayı tipinde iki değişken karşılaştırılırken metin tipindeki değişkenin değeri sayıya çevriliyor ve karşılaştırma iki sayı arasında yapılıyordu. Bu durum, metin değişkenin içeriğinin gerçekten sayı olmadığı durumlarda hatalı sonuçlar verebiliyordu.

PHP 8.0 ile birlikte metin tipli değişkenin içeriği gerçekten sayısal bir değer değilse, sayı tipindeki değişken metin türüne çevrilip metinsel karşılaştırma yapılır.

0 == 'foobar' // PHP 7.x öncesinde true dönerdi
0 == 'foobar' // PHP 8.0 sonrasında false döner

Just-In-Time Derlemesi (JIT) (Just-In-Time Compilation)

PHP 8, Function JIT ve Tracing JIT adında iki JIT derleme motoru sunuyor. Tracing JIT, karşılaştırmalarda yaklaşık 3 kat daha iyi performans gösterirken uzun işlem süreli bazı arka plan uygulamalarında (CPU yoğunluklu işler) 1.5 - 2 kat performans iyileşmesi sağlıyor. Normal web uygulamalarındaki performansı ise PHP 7.4 ile benzer seviyede.

Mixed Tipi

Bazen bir fonksiyonun döndüreceği bir değer veya gönderilecek parametrenin tipi değişkenlik gösterebilir. PHP 8 ile gelen mixed tipi; array, bool, callable, int, float, null, object, resource ve string tiplerinin tamamını kapsar.

function foo(mixed $bar): mixed {}

Objeler Üzerinde ::class Özelliğinin Kullanımı

Eskiden bir objenin sınıf ismini öğrenmek için get_class() metodunu çağırmak zorundaydık. Artık sınıflara $foo::class şeklinde doğrudan ulaşabiliyoruz.

Değişkensiz Hata Ayıklama (Non-capturing Catches)

Eskiden catch bloğu ile hata ayıklama yaparken yakalanan hatayı kullanmasak bile bir değişkene atamamız gerekiyordu. PHP 8.0 ile birlikte bu zorunluluk ortadan kalktı:

try {
    // Hatalı işlem
} catch (Exception) {
    Log::error("Something went wrong");
}

Yeni Yardımcı Metotlar: str_contains(), str_starts_with(), str_ends_with()

Eskiden bir string içerisinde arama yaparken veya başını/sonunu kontrol ederken strpos veya substr gibi dolaylı metotlar kullanıyorduk. PHP 8 ile birlikte artık native yardımcı fonksiyonlarımız var:

str_contains("Modern PHP", "PHP"); // true
str_starts_with("Modern PHP", "Mod"); // true
str_ends_with("Modern PHP", "PHP"); // true

2026 Güncellemesi: PHP 8.1, 8.2, 8.3 ve 8.4 ile Gelen Modern Özellikler

PHP 8.0'ın açtığı modernleşme yolculuğu, sonraki minor sürümlerle daha da güçlendi. Günümüz (2026) modern PHP dünyasında en çok kullanılan ve dili tamamen değiştiren yenilikleri kısaca inceleyelim:

PHP 8.1 Yenilikleri

  • Enums (Numaralandırmalar): PHP'ye nihayet yerleşik Enum desteği geldi:
    enum Status: string {
        case Pending = 'pending';
        case Active = 'active';
        case Archived = 'archived';
    }
    
  • Readonly Properties: Sadece bir kez değer atanabilen ve sonrasında değiştirilemeyen özellikler tanımlamamızı sağlar:
    class User {
        public function __construct(
            public readonly string $username
        ) {}
    }
    

PHP 8.2 Yenilikleri

  • Readonly Classes: Sınıf içindeki tüm özellikleri otomatik olarak readonly yapar ve dinamik özellik eklenmesini engeller:
    readonly class Configuration {
        public function __construct(
            public string $apiToken,
            public string $environment
        ) {}
    }
    
  • DNF Types (Disjunctive Normal Form): Union (Birlik) ve Intersection (Kesişim) tiplerini bir arada kullanabilmemizi sağlar:
    public function process((HasId & HasName) | null $entity) { /* ... */ }
    

PHP 8.3 Yenilikleri

  • Typed Class Constants: Sınıf sabitlerine tip tanımı ekleyebilme özelliği geldi:
    class APIClient {
        public const string BASE_URL = 'https://api.example.com';
    }
    
  • json_validate() Fonksiyonu: Bir string'in geçerli bir JSON olup olmadığını belleği yormadan doğrular:
    if (json_validate($jsonString)) {
        $data = json_decode($jsonString);
    }
    

PHP 8.4 Yenilikleri

  • Property Hooks (Özellik Kancaları): C# ve Kotlin benzeri, getter ve setter metotlarını doğrudan sınıf özelliği üzerinde tanımlama özelliği geldi:
    class User {
        public string $name {
            set => trim($value);
            get => ucfirst($this->name);
        }
    }
    
  • Asymmetric Visibility (Asimetrik Görünürlük): Bir özelliğin okunma (get) ve yazılma (set) yetkilerini ayrı ayrı belirleme olanağı sağlandı:
    class Product {
        // Dışarıdan okunabilir (public), sadece sınıf içinden değiştirilebilir (private)
        public private(set) string $sku;
    }
    

Bu Yazıda Yapılan Değişiklikler
  • 11.05.2022: Yazı özeti düzenlendi.
  • 21.06.2026: Yazı "Modern PHP 8.x Çağı" olarak güncellendi, JIT paragrafındaki tekrarlar kaldırıldı, kod renklendirmeleri eklendi, PHP 8.1, 8.2, 8.3 ve 8.4 sürümlerinin getirdiği devrim niteliğindeki modern PHP özellikleri eklendi.