PHP 8.4, geliştirici deneyimini artırmayı, kodu daha okunaklı hâle getirmeyi ve performansı iyileştirmeyi hedefleyen bir sürümdür.

PHP 8.4 Yenilikleri ve Performans İyileştirmeleri: Kod Örnekleri ve Benchmark Testleriyle

PHP 8.4, geliştirici deneyimini artırmayı, kodu daha okunaklı hâle getirmeyi ve performansı iyileştirmeyi hedefleyen bir sürümdür. Bu yazıda, PHP 8.4’ün öne çıkan özelliklerini kod örnekleri ve benchmark testleriyle detaylı olarak anlatıyoruz.

1. Property Hooks (Özellik Kancaları)

Açıklama: PHP 8.4 ile artık her özellik için manuel getter/setter yazmak zorunda değilsiniz. Property hooks sayesinde bir özelliğin okunması veya yazılması sırasında otomatik işlemler yapabilirsiniz. Bu sayede kod daha okunaklı ve bakımı kolay hâle gelir.

Önceki Yöntem:

class User {
    private string $name;

    public function setName(string $name): void {
        $this->name = $name;
    }

    public function getName(): string {
        return $this->name;
    }
}

$user = new User();
$user->setName("Batuhan");
echo $user->getName();

PHP 8.4 ile Property Hooks:

class User {
    public string $name {
        get => $this->name;          
        set => $this->name = strtoupper($value); 
    }
}

$user = new User();
$user->name = "Batuhan";
echo $user->name; // Çıktı: BATUHAN

Benchmark Örneği:


class Test {
    public string $name {
        get => $this->name;
        set => $this->name = strtoupper($value);
    }
}

$start = microtime(true);
$test = new Test();
for ($i = 0; $i < 100000; $i++) {
    $test->name = "test";
    $a = $test->name;
}
$end = microtime(true);
echo "Property hooks benchmark: " . ($end - $start) . " saniye\n";

2. Asimetrik Görünürlük (Asymmetric Visibility)

Açıklama: Özelliğin sadece okunabilir, ama yazılamaz olmasını sağlar. Böylece veri güvenliği ve kapsülleme güçlenir.

PHP 8.4 Örneği:


class Coffee {
    private(set) string $flavor = 'Pumpkin Spice';
}

$coffee = new Coffee();
echo $coffee->flavor; // OK: Pumpkin Spice
$coffee->flavor = 'Mocha'; // Hata: Cannot assign to private(set) property

3. Zincirleme new Çağrısı

Açıklama: Nesne oluşturma ve metod zincirlerini daha kısa ve okunaklı yazmayı sağlar.


// Önceki Yöntem
$coffee = new Coffee();
echo $coffee->getFlavor()->getSize();

// PHP 8.4
echo (new Coffee())->getFlavor()->getSize();

4. Yeni Dizi Fonksiyonları

Açıklama: Array işlemleri artık daha okunaklı ve fonksiyonel hâle geldi. array_find, array_all ve array_any gibi fonksiyonlar sayesinde filtreleme ve kontrol işlemleri kısaldı.


$numbers = [1, 2, 3, 4, 5];

$firstEven = array_find($numbers, fn($n) => $n % 2 === 0);
echo $firstEven; // 2

$key = array_find_key($numbers, fn($n) => $n > 3);
echo $key; // 3

$allPositive = array_all($numbers, fn($n) => $n > 0);
var_dump($allPositive); // true

$anyEven = array_any($numbers, fn($n) => $n % 2 === 0);
var_dump($anyEven); // true

Benchmark Örneği:


$numbers = range(1, 1000000);

$time_old = microtime(true);
foreach ($numbers as $n) {
    if ($n % 2 === 0) break;
}
$time_old = microtime(true) - $time_old;

$time_new = microtime(true);
$firstEven = array_find($numbers, fn($n) => $n % 2 === 0);
$time_new = microtime(true) - $time_new;

echo "Array işlemleri süresi:\n";
echo "Eski yöntem: {$time_old} saniye\n";
echo "PHP 8.4 array_find(): {$time_new} saniye\n";

5. Multibyte Destekli trim

Açıklama: Çok baytlı karakterler içeren dizelerde doğru trim işlemi sağlar.


$str = " こんにちは ";
echo mb_trim($str); // Çıktı: "こんにちは"

6. json_validate()

Açıklama: JSON doğrulama işlemi artık tek satırda yapılabilir ve okunaklıdır.


$json = '{"name": "Batuhan"}';
if(json_validate($json)) {
    echo "Geçerli JSON!";
} else {
    echo "Hatalı JSON!";
}

7. Readonly Constructor Özellikleri

Açıklama: Constructor’da readonly özellikler tanımlayarak nesne oluşturulduktan sonra değiştirilemez değerler oluşturabilirsiniz. DTO ve yapılandırma sınıflarında oldukça kullanışlıdır.


class Point {
    public function __construct(
        public readonly float $x,
        public readonly float $y
    ) {}
}

$p = new Point(5, 10);
echo $p->x; // 5
$p->x = 7; // Hata

8. Lazy Objects (Tembel Nesneler)

Açıklama: Büyük nesnelerde bellek kullanımını optimize eder. Nesne sadece ihtiyaç duyulduğunda oluşturulur.


class Expensive {
    public function __construct() {
        echo "Nesne oluşturuldu\n";
    }
}

$lazy = new LazyObject(fn() => new Expensive());
echo "Henüz nesne oluşturulmadı\n";
$lazy->doSomething(); // Burada nesne oluşturulur

Benchmark Örneği:


$start = microtime(true);
$heavy = new Expensive();
$end = microtime(true);
echo "Normal nesne: " . ($end - $start) . " saniye\n";

$start = microtime(true);
$lazy = new LazyObject(fn() => new Expensive());
$end = microtime(true);
echo "Lazy nesne: " . ($end - $start) . " saniye\n";

9. Özet Benchmark Tablosu

ÖzellikÖnceki SürümPHP 8.4
Basit döngü0.30s0.29s
Array find0.42s0.38s
Lazy Object başlangıç0.10s0.001s
Property hooks 100k döngü0.50s0.51s

Rakamlar örnek amaçlıdır; gerçek farklar sunucu ve veri büyüklüğüne göre değişir.

Önceki Yazı
Şuan okuğunuz yazı en son yazıdır.
Sonrası Yazı
Önceki Kayıt
Batuhan Pol

Batuhan P.

12'li yaşlarda tanıştığım bu sektöre şuanla beraber olmak üzere 10 yıldır sürdürmekteyim. Küçük yaşlarda milyonların girdiği projeler yapsamda çocukluk aklım ve imkanlar dolayısıyla erken biten maceralar oldu. Şimdi ise yerlerinde başkaların yaptığı projeler var. Yoksa bende milyoner olurdum heralde :)

Post A Comment:

0 comments: