İçindekiler
PHP hakkındaki önyargıların çoğu PHP 5 döneminden kalma. PHP 8.0 ile başlayan seri, dili hem daha hızlı hem de çok daha düzenli hâle getirdi. Aşağıda eski projelerde sık gördüğüm kalıpları ve bunların PHP 8'deki karşılıklarını topladım.
1. Nullsafe operatörü ?->
Eskiden:
$sehir = null;
if ($siparis !== null && $siparis->musteri() !== null && $siparis->musteri()->adres() !== null) {
$sehir = $siparis->musteri()->adres()->sehir;
}
PHP 8.0 ile:
$sehir = $siparis?->musteri()?->adres()?->sehir;
Zincirin herhangi bir halkası null olursa ifadenin tamamı null döner.
2. match ifadesi
switch yerine kullanılabilen, değer döndüren ve katı karşılaştırma (===) yapan bir yapı:
$etiket = match ($durum) {
'beklemede', 'hazirlaniyor' => 'İşlemde',
'kargoda' => 'Yolda',
'teslim' => 'Teslim edildi',
default => throw new UnexpectedValueException($durum),
};
break unutma riski yoktur. Hiçbir koşul eşleşmezse ve default tanımlı değilse UnhandledMatchError fırlatır. Yani sessizce yanlış bir değerle devam etmez.
3. Yapıcıda özellik tanımlama (constructor promotion)
Eskiden:
class Kullanici {
private string $ad;
private string $eposta;
public function __construct(string $ad, string $eposta) {
$this->ad = $ad;
$this->eposta = $eposta;
}
}
Şimdi:
class Kullanici {
public function __construct(
private string $ad,
private string $eposta,
) {}
}
4. İsimli argümanlar
htmlspecialchars($metin, double_encode: false);
setcookie('oturum', $id, httponly: true, secure: true, samesite: 'Lax');
Ortadaki isteğe bağlı parametreleri doldurmak zorunda kalmazsınız. Kod da kendini belgeler hâle gelir.
5. readonly özellikler ve sınıflar
PHP 8.1 readonly özellikleri, 8.2 ise readonly sınıfları getirdi:
final readonly class Para {
public function __construct(public int $kurus, public string $doviz) {}
}
Bir kez atanan değer bir daha değiştirilemez. Değer nesneleri (value object) için idealdir.
6. Enum'lar
PHP 8.1 ile gelen gerçek numaralandırmalar, sihirli string'lerin yerini alır:
enum SiparisDurumu: string {
case Beklemede = 'beklemede';
case Kargoda = 'kargoda';
case Teslim = 'teslim';
public function etiket(): string {
return match ($this) {
self::Beklemede => 'İşlemde',
self::Kargoda => 'Yolda',
self::Teslim => 'Teslim edildi',
};
}
}
$d = SiparisDurumu::from($satir['durum']); // geçersiz değerde hata verir
7. String yardımcıları
Yıllarca strpos(...) !== false yazdık. Artık:
str_contains($url, 'utm_');
str_starts_with($yol, '/yonetim');
str_ends_with($dosya, '.pdf');
8. Birleşik türler ve daha katı kurallar
function bul(int|string $id): ?Kullanici { /* ... */ }
Daha az bilinen ama önemli bir değişiklik de karşılaştırma kurallarıdır. PHP 8'den önce 0 == "abc" ifadesi true dönerdi. Şimdi false döner. Bu değişiklik eski kodda beklenmedik davranışlara yol açabilir ama yıllardır süren bir güvenlik ve mantık hatası kaynağını kapattı.
Geçiş yaparken
Eski bir projeyi PHP 8'e taşıyacaksanız:
- Önce hata günlüğünde
Deprecateduyarılarına bakın; bunlar bir sonraki sürümde hataya dönüşecek şeylerdir. - PHPStan ya da Psalm gibi statik analiz araçları, kodu çalıştırmadan tür hatalarını bulur.
- Rector, eski kalıpları otomatik olarak yeni sözdizimine çevirebilir. Yine de değişiklikleri tek tek gözden geçirin.
Yeni özelliklerin hepsini bir anda kullanmak zorunda değilsiniz. Ama match, nullsafe operatörü ve enum'lar ilk haftadan farkını gösterir.
Yorumlar
Henüz yorum yok. İlk yorumu siz yazın.