PHP 8.4, Laravel uygulamalarınızı yazma biçiminizi ve optimizasyonunuzu değiştiren yeni özellikler sunuyor. Öne çıkan özellikler arasında property hooks, asymmetric visibility, yeni array fonksiyonları ve gizli performans iyileştirmeleri yer alıyor. Bu yenilikler, kodunuzu daha sade hale getiriyor ve uygulamalarınızın performansını artırıyor.
Deploynix, PHP 8.4’ü kutudan çıkar çıkmaz destekliyor. Yeni bir sunucu oluşturduğunuzda PHP 8.4 seçeneğini seçtiğinizde, OPcache, JIT derleme ve kullanılabilir tüm yeni özelliklerle optimize edilmiş bir üretim sürümü yükleniyor.
Bu makale, üretimdeki Laravel geliştiricileri için önemli olan PHP 8.4 özelliklerini ele alarak pratik örnekler ve performans etkilerini inceleyecektir.
Property Hooks: Boş kod olmadan Hesaplanan Özellikler
Property Hooks: Boş kod olmadan Hesaplanan Özellikler
Property hooks, PHP 8.4’ün en önemli özelliğidir. Sınıf özellikleri üzerinde get ve set davranışlarını doğrudan tanımlamanıza izin vererek, birçok durumda getter ve setter metotlarına olan ihtiyacı ortadan kaldırır.
PHP 8.4 Öncesi
PHP 8.4 Öncesi
class Invoice
{
private float $subtotal;
private float $taxRate;
public function __construct(float $subtotal, float $taxRate)
{
$this->subtotal = $subtotal;
$this->taxRate = $taxRate;
}
public function getTotal(): float
{
return $this->subtotal * (1 + $this->taxRate);
}
public function setSubtotal(float $value): void
{
if ($value 0) {
throw new InvalidArgumentException('Subtotal cannot be negative');
}
$this->subtotal = $value;
}
}
PHP 8.4 ile Property Hooks
PHP 8.4 ile Property Hooks
class Invoice
{
public float $total {
get => $this->subtotal * (1 + $this->taxRate);
}
public float $subtotal {
set {
if ($value 0) {
throw new InvalidArgumentException('Subtotal cannot be negative');
}
$this->subtotal = $value;
}
}
public function __construct(
public float $subtotal,
public float $taxRate,
) {}
}
Laravel Uygulamaları Üzerindeki Etkisi
Laravel Uygulamaları Üzerindeki Etkisi
Property hooks, Laravel’in çeşitli alanlarında öne çıkar:
Eloquent accessors ve mutators: Laravel’in kendi accessor/mutator sistemi (Attribute::make()) vardır, ancak property hooks, Eloquent model olmayan value object’ler ve DTO’lar için PHP’ye özgü bir alternatif sunar.
Form Request nesneleri: Doğrulanmış girişlerden değer türeten hesaplanan özellikler ekleyin:
class CreateOrderRequest extends FormRequest
{
public float $totalWithTax {
get => $this->validated('subtotal') * (1 + $this->validated('tax_rate'));
}
}
Service sınıfları: Hesaplanmış sonuçlar için şu anda getter metotları kullanan service sınıflarını temizleyin.
Performans Değerlendirmesi
Performans Değerlendirmesi
Property hooks, metot çağrılarıyla karşılaştırıldığında önemsiz bir aşırı yük sunar. PHP motoru bunları normal özellik erişimi ile benzer şekilde optimize eder; bu nedenle, açık getter metotları yerine kullanmanın performans açısından herhangi bir cezası yoktur.
Asimetrik Görünürlük: Kamu Okuma, Özel Yazma
Asimetrik Görünürlük: Kamu Okuma, Özel Yazma
Asimetrik görünürlük, bir özelliğin okunma ve yazılma seviyelerini ayarlamanıza olanak tanır. En yaygın olanı, kamuya açık olarak okunabilir ancak yalnızca sınıf içinde ayarlanabilen bir özelliktir.
PHP 8.4 Öncesi
PHP 8.4 Öncesi
class Deployment
{
private string $status = 'pending';
public function getStatus(): string
{
return $this->status;
}
public function markAsComplete(): void
{
$this->status = 'complete';
}
}
PHP 8.4 ile Asimetrik Görünürlük
PHP 8.4 ile Asimetrik Görünürlük
class Deployment
{
public private(set) string $status = 'pending';
public function markAsComplete(): void
{
$this->status = ;
}
}
$deployment = new Deployment();
echo $deployment->status; // Çalışıyor: 'pending'
$deployment->status = ; // Hata: Özel (set) özelliği değiştirilemez
Laravel Uygulamaları Üzerindeki Etkisi
Laravel Uygulamaları Üzerindeki Etkisi
Bu özellikle yararlanabilen durumlar:
Event nesneleri: Laravel’deki olaylar, dinleyiciler tarafından değiştirilemeyecek verilerle iletilir:
class OrderPlaced implements ShouldBroadcastNow
{
public function __construct(
public private(set) Order $order,
public private(set) float $total,
) {}
}
Dinleyiciler $event->order ve $event->total öğelerini okuyabilir, ancak bunları değiştiremez. Bu, bir dinleyicinin, sonraki dinleyicilerin bağımlı olduğu bir olay verisini yanlışlıkla değiştirmesini önler.
Data Transfer Objects: Uygulamanızın katmanları arasında geçen DTO’lar, değişmezlik garantilerinden faydalanır:
class ServerMetrics
{
public function __construct(
public private(set) float $cpuUsage,
public private(set) float $memoryUsage,
public private(set) float $diskUsage,
) {}
}
Configuration nesneleri: Bir kez ayarlanıp birçok kez okunması gereken uygulama konfigürasyonları.
Yeni Array Fonksiyonları
Yeni Array Fonksiyonları
PHP 8.4, array_map, array_filter veya manuel döngüler gerektiren yaygın desenleri değiştiren birkaç array fonksiyonu ekler.
array_find()
array_find()
Bir callback ile eşleşen ilk öğeyi döner:
$servers = [
['name' => , => ],
[=> , => ],
[=> , => ],
];
$stopped = array_find($servers, fn($server) => $server[] === );
// ['name' => 'db-1', 'status' => 'stopped']
Daha önce, collect($servers)->first(fn($s) => ...) kullanmanız gerekiyordu ya da bir döngü yazıyordunuz. array_find(), basit aramalar için Collections örneği oluşturmadan daha az yük getiren bir yerleşik işlevdir.
array_find_key()
array_find_key()
Callback ile eşleşen ilk öğenin anahtarını döner:
$key = array_find_key($servers, fn($server) => $server[] === );
// 1
array_any() ve array_all()
array_any() ve array_all()
Bir koşulu karşılayan herhangi bir veya tüm öğelerin varlığını kontrol eder:
$allRunning = array_all($servers, fn($s) => $s[] === );
// false
$anyRunning = array_any($servers, fn($s) => $s[] === );
// true
Bu, basit diziler için collect($items)->every(...) ve collect($items)->contains(...) kalıplarını yönetmenin yerini alır ve Collection aşamasını önler.
Performans Etkisi
Performans Etkisi
Sıkça dizileri işleyen hot paths (middleware, istek işleme, veri dönüşüm boru hatları) için yerel array fonksiyonları, Collection tabanlı muadillerine göre ölçülebilir ölçüde daha hızlıdır. Collection nesnesi oluşturma, üzerinde metot çağırma ve çöp toplama işleminin her biri, saniyede binlerce kez çalıştırıldığında birikir.
Bu, tüm Collection kullanımını değiştirmek anlamına gelmez. Laravel Collections, karmaşık veri dönüşümleri için okunabilirliği artıran akıcı bir API sunar. Ancak performansa duyarlı kodda basit kontroller için yerel array fonksiyonları daha iyi bir seçimdir.
Lazy Nesneler
Lazy Nesneler
PHP 8.4, yerleşik lazy nesne başlatımını ReflectionClass::newLazyProxy() ve ReflectionClass::newLazyGhost() yöntemleri aracılığıyla tanıtır. Çoğu Laravel geliştiricisi bunları doğrudan kullanmayabilir, ancak framework ve paketlerde önemli iyileştirmelere olanak tanır.
Pratikte, service container çözümü, Eloquent model hidrasyonu ve bağımlılık enjeksiyonu daha tembel hale getirilebilir, nesne kullanılmadan önce pahalı başlatmaların ertelendiği anlamına gelir.
Laravel’in hizmet konteyneri, birçok bağlamada zaten tembel çözümleme uygular, ancak PHP 8.4’ün yerel desteği bunu daha verimli ve tutarlı hale getirir. PHP 8.3’ten 8.4’e geçiş yaparken uygulama kodunuzda hiçbir değişiklik yapmadan, uygulamanız hizmet konteyneri çözümlemesinden daha hızlı faydalanır.
JIT İyileştirmeleri
JIT İyileştirmeleri
PHP 8.4, PHP 8.0’da tanıtılan Just-In-Time derleyicisini geliştirmeye devam ediyor. JIT’in izleme modu 8.4’te daha stabil ve yaygın kalıplar için daha iyi makine kodu üretiyor.
JIT, Laravel için Ne Yapar?
JIT, Laravel için Ne Yapar?
JIT, sıkça çalıştırılan PHP kodunu yerel makine koduna derleyerek Zend VM yorumlayıcısını atlar. CPU yoğun işlemler için – string işleme, matematiksel hesaplamalar, veri serileştirmesi, şifreleme gibi – JIT önemli hız artışları sağlar.
Tipik Laravel web uygulamaları için JIT’in etkisi ılımandır (%5-15 iyileştirme) çünkü çoğu zaman I/O (veritabanı sorguları, API çağrıları, dosya okumaları) için beklenir. Ancak belirli iş yüklerinde iyileştirme dikkate değerdir:
- Veri işleyen kuyruk işçileri: CPU yoğun işleme, JIT’ten doğrudan faydalanır.
- Rapor oluşturma: Büyük veri kümesi toplama ve biçimlendirme.
- Resim işleme: PHP mantığı ile desteklenen GD veya Imagick işlemleri.
- API yanıtı serileştirmesi: Büyük Eloquent koleksiyonlarının JSON’a dönüştürülmesi.
Üretimde JIT’i Etkinleştirme
Üretimde JIT’i Etkinleştirme
Deploynix tarafından yönetilen PHP 8.4 sunucularında OPcache varsayılan olarak etkinleştirilmiştir. JIT’i etkinleştirmek için:
opcache.jit_buffer_size=opcache.jit=
Arka Planda Performans İyileştirmeleri
Başlıca özelliklerin ötesinde, PHP 8.4, performansı artıran motor içi mikro optimizasyonları içerir:
Daha Hızlı String İşlemleri
İçsel string işleme, özellikle birleştirme ve karşılaştırma işlemleri için daha verimlidir. Laravel uygulamaları geniş ölçüde string işleme gerçekleştirdiği için (şablon oluşturma, URL oluşturma, sorgu hazırlama), bu ölçülebilir iyileşmelere dönüşür.
Azaltılmış Bellek Kullanımı
PHP 8.4’te birkaç iç veri yapısı daha az bellek verimli hale getirilmiştir. Her PHP-FPM çalışanı, biraz daha az bellek kullanır; bu da aynı sunucuda daha fazla çalışan çalıştırma ya da her istekte bellek baskısını azaltmanızı sağlar.
Limitli RAM’e (2-4 GB) sahip bir Deploynix yönetimli sunucuda, bu iyileştirme anlamlıdır. Eğer her çalışanın bellek kullanımında %5’lik bir azalma olursa, ek bir çalışan sığdırabilir; bu da eşzamanlı istek kapasitesini artırır.
Daha Hızlı Sınıf Yükleme
Otomatik yükleme ve sınıf çözümü, PHP 8.4’te daha hızlıdır; bu da daha fazla service sağlayıcısı ve büyük kod tabanına sahip Laravel uygulamalarına fayda sağlar. Her isteğin başlatılma süresi (veya bir kuyruk işçisinin başlangıcı) azaltılır.
Deploynix ile PHP 8.4’e Geçiş
Mevcut bir sunucuda PHP 8.3 çalıştırıyorsanız, Deploynix üzerinden PHP 8.4’e geçmek oldukça basittir. Yeni sunucular kurarken sadece PHP 8.4’ü gereksinim listesinden seçmeniz yeterlidir.
Güncellemeden önce uyumluluğu kontrol etmek için:
8.4’te Kaldırılan Kullanım Dışı Özellikler
Önceki PHP sürümlerinde kullanım dışı bırakılan birkaç özellik PHP 8.4’te kaldırılmıştır. Laravel uygulamaları için en alakalı olanı:
- Dolaylı nullable türleri:
function foo(string $bar = null) biçiminde yazılırken, artık function foo(?string $bar = null) şeklinde yazılması gerekmektedir. Statik analiz araçlarınızı (PHPStan, Larastan) çalıştırın ve hataları bulun.
- Bazı LDAP işlevleri: Uygulamanız LDAP kimlik doğrulaması kullanıyorsa, uyumluluğu kontrol edin.
Composer Bağımlılığı Uyumluluğu
Bağımlılığı olumsuz etkileyen paketleri belirlemek için composer why-not php 8.4 (Composer eklentisi ile veya manuel olarak kontrol ederek) çalıştırın. Çoğu iyi bakılan Laravel paketi PHP 8.4’ü desteklemektedir, ancak bir üretim sunucusunu güncellemadan önce kontrol edin.
Geçişten Önce Test Etme
En güvenli yaklaşım:
- CI/CD hattınızı PHP 8.4 ile test etmek üzere güncelleyin
- PHP 8.4 üzerinde tam test suite’inizi çalıştırın
- Herhangi bir kullanım dışı veya uyumluluk sorununu giderin
- PHP 8.4’te çalışan bir test sunucusuna dağıtım yapın
- Smoke testler çalıştırın ve işlevselliği doğrulayın
- Üretim sunucunuzu PHP 8.4’e geçirin
Benchmarks: PHP 8.3’e Karşı PHP 8.4
Bir Deploynix yönetimli Hetzner sunucusunun (4 vCPU, 8 GB RAM) üzerinde tipik bir Laravel SaaS uygulamasını çalıştırarak:
Metrik
PHP 8.3
PHP 8.4
İyileşme
İstek/saniye
520
575
+10.6%
Ortalama yanıt süresi
19.2ms
17.4ms
-9.4%
P99 yanıt süresi
58ms
51ms
-12.1%
Çalışan başına bellek
42MB
39MB
-7.1%
Soğuk başlatma süresi
12ms
10ms
-16.7%
Bu iyileşmeler, herhangi bir kod değişikliği gerektirmeden kazanılmıştır. PHP 8.4’ün yeni özellikleriyle daha temiz ve daha verimli kod yazmanın yanı sıra, bu güncellemeyi yapmak oldukça mantıklıdır.
Pratik Benimseme Stratejisi
PHP 8.4’ten faydalanmak için uygulamanızı yeniden yazmanız gerekmiyor. İşte makul bir benimseme stratejisi:
- Runtime’ı güncelleyin: Ücretsiz performans iyileştirmelerinden hemen yararlanın
- Yeni kodda yeni özellikleri kullanın: Yeni sınıflar yazarken, clarity artıracak property hooks, asymmetric visibility ve yerel array fonksiyonlarını kullanın
- Parça parça yeniden düzenleyin: Mevcut sınıfları değiştirirken, PHP 8.4 özelliklerinin kodu sadeleştirip sadeleştirmediğini değerlendirin
- Tek başına yeniden düzenleme yapmayın: Mevcut kod işlerse ve okunaklıysa bırakın. Eski tarz getterlar ile property hooks arasındaki performans farkı uygulama seviyesinde önemsenmeyecek kadar küçüktür.
Sonuç
PHP 8.4, üretimdeki Laravel uygulamaları için anlamlı bir güncellemedir. Ücretsiz performans iyileştirmeleri (%10-15 daha hızlı istekler, her çalışan için %7 daha az bellek) kod yazmadan önce bile güncellemeyi haklı çıkarıyor. Property hooks, asymmetric visibility ve yerel array fonksiyonları ise yeni kodunuzu daha temiz ve niyetli hale getiriyor.
Kaynak: Orijinal Makale


