Temel Özellikler
PHP 8.5’in öne çıkan ana özellikleri şunlar:
URI Uzantısı (URI Extension)
Pipe Operatörü (|>)
Clone With – klonlama sırasında özellikleri değiştirme
#[\NoDiscard] Özniteliği
Sabit ifadelerde closure’lar ve birinci sınıf callable’lar
Kalıcı cURL Paylaşılan Handle’lar (Persistent cURL Share Handles)
Her biri sırayla ele alalım.
1. URI Uzantısı (URI Extension)
PHP 8.5 ile birlikte standart kütüphaneye “her zaman erişilebilir” bir URI uzantısı eklenmiş durumda. Bu, hem RFC 3986 hem de WHATWG URL standartlarına uygun bir şekilde URİ/URL’lerle çalışmayı sağlıyor.
Neden önemli?
Önceki sürümlerde URL/URI handling için sıklıkla parse_url() kullanılıyordu, fakat bu fonksiyonun bazı sınırlamaları ve standartlara uygun olmadığı yönünde eleştiriler vardı. Yeni uzantı, daha güvenli, daha standart uyumlu ve daha sınıf-tabanlı (object-oriented) API sunuyor.
<?php
use Uri\Rfc3986\Uri;
$uri = new Uri('https://www.example.com:443/path/to/page?query=123#fragment');
// Host bilgisini al
echo $uri->getHost();
// Örnek çıktı: example.com
// Varsayılan port değeri varsa kaldır
if ($uri->getPort() === 443 && $uri->getScheme() === 'https') {
$uri = $uri->withPort(null);
}
// Yeni URI’yi metin halinde al
echo $uri->toString();
// Örnek çıktı: https://www.example.com/path/to/page?query=123#fragment
?>
Yukarıdaki kodda, Uri\Rfc3986\Uri sınıfı kullanılarak bir URL parçalarına ayrılıyor, port kontrolü yapılıyor ve gerekirse URI üzerinde değişiklik yapılıyor.
Dikkat Edilmesi Gerekenler
Bu uzantı yalnızca Uri\Rfc3986\Uri sınıfını değil, Uri\WhatWg\Url gibi browser tabanlı standartlara (WHATWG) uygun sınıfları da sunuyor.
Kodunuzu migrate ederken eskiden parse_url() kullandığınız yerlerde bu yeni sınıfları değerlendirmek mantıklı olabilir.
Immutable (değişmez) URI nesneleri tasarımı tercih edilmiş: URI üzerinde değişiklik yapmak için withXxx() benzeri yöntemler kullanılıyor.
2. Pipe Operatörü (|>)
PHP 8.5 ile gelen en dikkat çekici sözdizimi yeniliklerinden biri de pipe operatörüdür. |> operatörü sayesinde, bir değer soldan başlayarak birçok callable’a ardışık olarak gönderilebilir — yani “iş akışı (pipeline)” gibi.
Ne işe yarar?
Normalde birçok fonksiyonu iç içe çağırmak ya da ara değişkenlere atamak gerekirdi ve kod bazen okunaksız olabilirdi. Pipe operatörü sayesinde:
Kod daha soldan-sağa okunur (işlem akışı daha net)
Ara değişkenler veya derin iç içe fonksiyon çağrıları azalabilir
Fonksiyon zinciri daha sade yazılabilir
Kullanım Örneği
Önce klasik tarz:
<?php
$title = ' PHP 8.5 Released ';
$slug = strtolower(
str_replace('.', '',
str_replace(' ', '-',
trim($title)
)
)
);
echo $slug;
// Çıktı: php-85-released
?>
PHP 8.5 ile pipe operatörü kullanımı:
<?php
$title = ' PHP 8.5 Released ';
$slug = $title
|> trim(...)
|> (fn($str) => str_replace(' ', '-', $str))
|> (fn($str) => str_replace('.', '', $str))
|> strtolower(...);
echo $slug;
// Çıktı: php-85-released
?>
Yukarıdaki örnekte |> operatörü ile değer adım adım işleniyor: önce trim, sonra str_replace, sonra strtolower… Okunması ve takibi daha kolay.
Sınırlamalar & Notlar
Pipe operatöründe kullanılan callable’lar tek parametreli olmalı. Yani sağdaki callable, soldan gelen değeri ilk parametre olarak almalı.
Referansla parametre almak isteyen fonksiyonlarla uyumsuz olabilir — örneğin array_pop(&$array) gibi.
Operatör önceliği (precedence) önemli: matematiksel işlemlerden sonra gelir, kıyaslama (==, ===) gibi işlemlerden önce gelir gibi. Parantezle kesinleştirmek gerekebilir.
3. Clone With – Klonlama Sırasında Özellik Güncelleme
PHP 8.5 ile birlikte obje klonlama sırasında özelliklerini güncelleme imkânı sunulmuş durumda. Yani, bir nesneyi klonlarken (“with-er” deseni) bazı özellikleri değiştirerek yeni bir nesne oluşturabilirsiniz.
Neden?
readonly sınıflar ya da genel olarak immutable nesnelerle çalışırken, “bir nesnenin sadece birkaç özelliği değişse de yeni bir nesneyle devam etmek” yaygın desenlerden biridir. Önceki sürümlerde bu çoğu zaman elle yapılmak zorunda idi. Şimdi dil desteğiyle kolaylaştırılmış.
Kullanım Örneği
<?php
readonly class Color
{
public function __construct(
public int $red,
public int $green,
public int $blue,
public int $alpha = 255,
) {}
}
$blue = new Color(79, 91, 147);
// Önceki sürümde “withAlpha” benzeri yardımcı metod:
$transparentBlue = new Color(
$blue->red,
$blue->green,
$blue->blue,
128
);
// PHP 8.5 ile:
$transparentBlue2 = clone($blue, ['alpha' => 128]);
// Kullanımı:
var_dump($transparentBlue2->alpha); // 128
?>
Yukarıdaki örnekte clone($object, ['alpha' => 128]) sözdizimiyle, yeni bir nesne oluşturulurken sadece alpha özelliği değiştirilmiş oluyor.
Dikkat Edilecekler
Bu özellik yalnızca klonlama sırasında (“clone”) geçerli; klasik clone $object kullanımından farklıdır.
Desteklenen sınıf türleri ve özelliklerin ulaşılabilirliği (visibility, readonly vs) göz önünde bulundurulmalı.
Bu desen, immutable (değiştirilemez) nesnelerle çalışırken oldukça avantajlıdır.
4. #[\NoDiscard] Özniteliği
PHP 8.5 ile, bir fonksiyon ya da metodun dönüş değerinin kullanılmadan bırakılması durumunda uyarı verilmesini sağlayan #[\NoDiscard] özniteliği gelmiştir.
Neden?
Bazı API’lerde, fonksiyonun dönüş değerini kullanmamak bir hata anlamına gelebilir (örneğin bir sonuç döndüren işlem ve sonucu ihmal etmek). Bu öznitelik sayesinde, dönüş değerini kullanmayı unuttuğunuzda derleme ya da çalışma zamanı uyarısı alabilirsiniz — bu API güvenliğini ve kod kalitesini artırır.
Kullanım Örneği
<?php
#[\NoDiscard]
function getPhpVersion(): string
{
return 'PHP 8.5';
}
// Kullanımı:
getPhpVersion();
// Uyarı: getPhpVersion() fonksiyonunun döndürdüğü değer kullanılmalı ya da (void) ile kast edilmeli
// Kullanım doğru biçimde:
$version = getPhpVersion();
echo $version;
// Ya da dönüş değeri bilinçli olarak kullanılmayacaksa:
(void) getPhpVersion();
?>
Yukarıdaki kodda, getPhpVersion() fonksiyonu #[\NoDiscard] ile işaretlendiği için, sonucu kullanılmadan çağrılırsa uyarı çıkar. Bu sayede unuttuğunuz önemli dönüş değerleri gözden kaçmaz.
Dikkat Edilecekler
Eğer dönüş değeri bilinçli olarak kullanılmıyorsa (void) ile çalışma yapılabilir; bu sayede uyarı engellenmiş olur.
Bu öznitelik kod analiz araçlarıyla (PHPStan, Psalm gibi) uyumlu kullanılmalı ve kodun tüm akışında dönüş değerlerinin gözden kaçırılmaması hedeflenmelidir.
5. Sabit İfadelerde Closure’lar ve Birinci Sınıf Callables
PHP 8.5 ile sabit ifadelerde (constant expressions) static closure’lar ve birinci sınıf (first-class) callable’lar kullanılabilmeye başlanmıştır.
Ne anlam ifade ediyor?
Önceden, sabit (const) ya da attribute parametrelerinde sadece belirli değerler (“primitive” gibi) kullanılabiliyordu.
Artık closure veya callable referansı da sabit ifadelerde yer alabiliyor; bu da ileri seviye metaprogramlama, attribute kullanımı ve yapılandırma tabanlı çözümler için fayda sağlıyor.
Kullanım Örneği
<?php
final class PostsController
{
#[AccessControl(static function (
Request $request,
Post $post,
): bool {
return $request->user === $post->getAuthor();
})]
public function update(
Request $request,
Post $post,
): Response {
// ...
}
}
?>
Yukarıdaki örnekte attribute parametresi olarak bir static closure verilmiş durumda — artık bu tip kullanım, PHP 8.5 ile sabit ifadelerde geçerli.
Dikkat Edilecekler
Bu özellik, özellikle attribute-tabanlı kütüphaneler ya da meta-programlama yapan kütüphaneler için oldukça fayda sağlar.
Kodun okunabilirliği açısından closure’ların sabit ifadelerde kullanılması dikkat gerektirebilir; aşırı kullanım kodu karmaşıklaştırabilir.
6. Kalıcı cURL Paylaşılan Handle’lar (Persistent cURL Share Handles)
PHP 8.5, birden fazla istek (request) arasında paylaşılabilecek cURL “share handle” desteği sunar. Bu, özellikle yüksek trafikli uygulamalarda aynı host’a yapılan bağlantıların tekrar tekrar kurulmasını önleyerek performans avantajı sağlar.
Kullanım Örneği
<?php
// PHP 8.4 ve öncesinde:
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
$ch = curl_init('https://php.net/');
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_exec($ch);
// PHP 8.5 ile:
$sh = curl_share_init_persistent([
CURL_LOCK_DATA_DNS,
CURL_LOCK_DATA_CONNECT,
]);
$ch = curl_init('https://php.net/');
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_exec($ch);
?>
Yukarıdaki örnekte curlshareinit_persistent() fonksiyonu kullanılarak, aynı paylaşım seçeneklerine sahip bir handle bulunduğu takdirde yeniden kullanılabiliyor — bu da bağlantı kurulum yükünü düşürür.
Dikkat Edilecekler
Bu özellik özellikle SAPI (Server API) bazında çok sayıda istek alan uygulamalarda fayda sağlar.
Paylaşılan handle kullanırken thread-safety, bağlantı temizliği gibi konular göz önünde tutulmalı.
Mevcut sisteminizin bu özelliği desteklediğinden emin olmanız gerekir (örneğin uygun cURL sürümü, SAPI kullanım şekli vb).
Diğer Geliştirmeler
PHP 8.5 yalnızca yukarıdaki büyük özellikleri getirmiyor; ayrıca dilin genel kalitesi ve kullanım deneyimi açısından birçok iyileştirme ve yeni küçük özellik de içeriyor. İşte öne çıkanlar:
<?php
$events = ['a','b','c'];
$first = array_first($events); // 'a'
$last = array_last($events); // 'c'
?>
Fatal hatalarda (execution time exceeded gibi) artık geri izleme (backtrace) dahil ediliyor.
#[\Override] özniteliği artık sınıf özelliklerinde uygulanabiliyor.
#[\Deprecated] özniteliği artık trait ve sabit (constant) tanımları için de kullanılabilir.
Statik özellikler (static properties) artık asimetrik görünürlüklere (asymmetric visibility) sahip olabilir.
Yapılandırma (constructor) property promotion ile birlikte final olarak işaretlenebilme desteği geldi.
Closure::getCurrent() metoduyla anonim fonksiyon içinde (closure) mevcut closure’a erişim.
setcookie() ve setrawcookie() artık “partitioned” key parametresini destekliyor.
Yeni geterrorhandler() ve getexceptionhandler() fonksiyonları eklendi.
DOM API tarafında Dom\Element::getElementsByClassName() ve Dom\Element::insertAdjacentHTML() metotları eklendi.
Yeni grapheme_levenshtein() fonksiyonu eklendi (metin karşılaştırmaları için).
Uyumluluk ve Geriye Dönük (Backward) Kırılmalar
Her büyük sürüm gibi PHP 8.5 de bazı uyumluluk kırılmaları ve kullanım dışı (deprecated) durumlar içeriyor. Geçiş yaparken bu noktaların göz önünde olması önemli.
Önemli Kaldırılan / Kullanımdan Düşürülenler
Backtick operatörü (`command`) artık shell_exec() için alias olarak kullanımdan düşürülmüş sayılıyor.
(boolean), (integer), (double), (binary) gibi cast isimleri deprecated oldu; artık (bool), (int), (float), (string) kullanılmalı.
disable_classes INI ayarı kaldırıldı.
Bir case bloğunun ; ile bitirilmesi (yalnızca : yerine) deprecated hale geldi.
null’u dizi offset olarak kullanmak ya da arraykeyexists() içinde null kullanmak deprecated oldu.
class_alias() ile “array” ve “callable” adlarının sınıf alias’ı olarak kullanılması artık mümkün değil.
Magic yöntemler sleep() ve wakeup() yumuşak şekilde deprecated oldu; onun yerine serialize() ve unserialize() öneriliyor.
NAN değerinin başka tiplere casting edilmesi artık bir uyarı verebilir.
Dizi olmayan bir değerin (örneğin null dışında) [] ya da list() ile açılması artık uyarı veriyor.
Float veya float-görünümlü string değerlerinin int’e cast edilmesi durumunda uyarı verilecek durumda.
Geçiş Tavsiyeleri
Mevcut kod tabanınızda (integer) vs gibi eski cast biçimleri varsa bunları (int) biçimine çevirmek iyi bir adım olacaktır.
parse_url() ve benzeri kendi URL parsing kodlarını yeni URI uzantısına yönlendirmek ileride güvenlik ve bakım açısından avantajlı olur.
Kullanmadığınız dönüş değerleri varsa #[\NoDiscard] uyarıları ile karşılaşma ihtimaliniz olabilir; dönüş değerlerini ya kullanın ya (void) ile kast edin.
Üçüncü taraf kütüphaneler (composer paketleri) PHP 8.5 uyumluluğuna sahip mi kontrol edin — özellikle pipe operator ya da clone() yeniliklerini kullanan kütüphaneler olabilir.
Sonuç
PHP 8.5, yalnızca bazı yeni sözdizimi sunmakla kalmıyor; aynı zamanda dilin okunabilirliği, geliştirici deneyimi ve yaklaşımı açısından önemli adımlar atıyor. URI uzantısı ile URL/URI işlemleri daha standartlar-uyumlu hale geliyor; pipe operatörü ile daha fonksiyonel, akıcı kod yazımı mümkün kılınıyor; clone-with deseni ve #[\NoDiscard] gibi özellikler de modern kodlama alışkanlıklarını destekliyor.
Eğer sen de PHP ile aktif olarak çalışıyorsan (senin gibi — PHP kullandığını belirtmiştin), bu sürüme geçişi düşünmek için oldukça iyi bir zaman. Yeni özellikler kodlarını sadeleştirme, daha güvenli ve bakımı kolay hale getirme açısından fırsatlar sunuyor.