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üm | PHP 8.4 |
---|---|---|
Basit döngü | 0.30s | 0.29s |
Array find | 0.42s | 0.38s |
Lazy Object başlangıç | 0.10s | 0.001s |
Property hooks 100k döngü | 0.50s | 0.51s |
Rakamlar örnek amaçlıdır; gerçek farklar sunucu ve veri büyüklüğüne göre değişir.
Post A Comment:
0 comments: