JIT (Just‑In‑Time) derleyicisi
PHP 8’de eklenen JIT, belirli kod bloklarının derlenip native CPU koduna dönüştürülmesini sağlar. Yöntem şu adımları içerir:
- Opcode toplama – PHP’nin yürütme motoru, çalıştırma sırasında op‑code’ları toplar.
- Analiz – Toplanan kod, JIT hedefi için veri akışı analizi yapılır.
- Kod üretimi – Analizden sonra, op‑code’lar LLVM gibi aracıyla machine‑code’a çevrilir.
- Boşanma – Üretilen kod, JVM benzeri bir ortamda yürütülür.
Bu sürecin en kritik bileşenini JIT,
-d opcache.jit_buffer_size=100M ayarıyla kontrol edilir. Küçük döngüli hesaplamalarda JIT’in azlıklandırılması, bellek kullanımı arttırırken performans kazandırır.
PHP:
<?php
// Basit döngü
$sum = 0;
for ($i = 0; $i < 1e6; $i++) {
$sum += $i;
}
JIT aktifken aynı kod, yaklaşık %30 hız kazanabilir. Ancak I/O ağırlıklı betikler için kayda değer fark yoktur.
Adlandırılmış Argüman ve Varsayılan Değerler
PHP:
function sendMail(string $to, string $subject, string $body = 'Hi') {}
sendMail(to: 'user@example.com', subject: 'Hi');
Nasıl Çalışır?
PHP, fonksiyon çağrısında isimle eşleşen parametreleri doğrudan atar; argüman sırası artık önemli değildir. Bu, okunabilirliği artırır ve kod karışıklığını azaltır.
Constructor Property Promotion
PHP:
class User {
public function __construct(
private string $name,
private int $age
) {}
}
Kavramsal olarak,
__construct içinde private alanları tanımlamamanın yerine, doğrudan yapılandırıcıya eklenir. Bu, sınıf gövdesini sadeleştirir ve readonly ile birleştiğinde veri tutarlılığı sağlar.Union Types & Match İfadeleri
PHP:
function filter(mixed $value): int|string {
return match (true) {
is_int($value) => $value,
is_string($value) => (int)$value,
default => throw new InvalidArgumentException()
};
}
Union type, bir parametrenin birden fazla tip almasını mümkün kılar; match ise
switch’e gömülü güvenli eşleşme sağlar. Bu ikili, tipi doğru kontrol etmek için tasarlanmıştır.Nullsafe Operatörü
PHP:
$user = $session->getUser()?->profile?->avatarUrl;
Eğer
getUser() ya da profile null dönerse, dönen değer doğrudan null olur; -> yerine ?-> kullanılır. Böylece Notice: Trying to get property of non-object hatasını önler.Okunabilir Arrow Functions
PHP:
$nums = [1, 2, 3];
$result = array_map(fn($n) => $n * 2, $nums);
fn sözdizimi, tek satır lambda fonksiyonlar için kullanılır. Değişkenler otomatik olarak use ile geçirildiği için kod sadeleşir.Readonly Properties
PHP:
class Config {
public readonly string $path;
public function __construct(string $path) {
$this->path = $path;
}
}
Bu işaretleme sayesinde nesne oluşturulduktan sonra
path değiştirilemez. Veri bütünlüğü kritik uygulamalarda faydalıdır.Özet
- JIT derleme hızı, JIT boyut ayarı ile denetlenir.
- Adlandırılmış argüman çağrı sırasını esnetir.
- Constructor promotion, sınıf tanımını sıkılaştırır.
- Union types ve match, tip kontrolünü artırır.
- Nullsafe operatörü hatalı nesne erişimini engeller.
- Arrow functions lambda kodunu küçültür.
- Readonly ise nesnenin sadece okunabilirliği garanti eder.
Siz PHP 8’te JIT’i etkinleştirirken hangi koşullarda kullanmayı tercih edersiniz?