PHP 8.3’teki Yeni Özellikler ve İyileştirmeler: Eksiksiz Teknik Referans
PHP 8.3, JIT derleyicisinde, tür sisteminde, readonly özelliklerinde ve temel dizi/string fonksiyonlarında önemli iyileştirmeler sunan PHP dilinin önemli bir küçük sürümüdür. 23 Kasım 2023’te yayımlanan bu sürüm; tiplendirilmiş sınıf sabitleri, json_validate(), array_is_list() iyileştirmeleri, Randomizer eklemeleri ve readonly özelliklerin derin klonlanmasını tanıtmaktadır — bu değişiklikler üretim sunucularında uygulama performansını, kod doğruluğunu ve sürdürülebilirliği doğrudan etkiler.
PHP tabanlı iş yüklerini bir VPS Hosting ortamında veya bir Dedicated Server üzerinde çalıştırıyorsanız, her PHP 8.3 değişikliğini anlamak isteğe bağlı değildir — bilinçli yükseltme kararları almak, sessiz gerileme sorunlarından kaçınmak ve ölçülebilir performans kazanımları elde etmek için bir ön koşuldur.
PHP 8.2 ile PHP 8.3 Arasında Neler Değişti
Bireysel özelliklere dalmadan önce, bu sürümün kapsamını belirlemek faydalı olacaktır. PHP 8.3 yıkıcı bir yeniden yazım değildir. Tür sistemindeki uzun süredir devam eden boşlukları kapatan, JIT hattını sağlamlaştıran ve daha önce kullanıcı tarafı geçici çözümler gerektiren yardımcı fonksiyonlar ekleyen hassas bir yükseltmedir. Aşağıdaki tablo, en etkili değişiklikleri PHP 8.2 karşılıklarıyla eşleştirmektedir.
| Özellik / Davranış | PHP 8.2 | PHP 8.3 |
|---|---|---|
| Tiplendirilmiş sınıf sabitleri | Desteklenmiyor | Tam olarak destekleniyor |
json_validate() | Mevcut değil | Yerel olarak mevcut |
| Readonly özellik klonlama | Mümkün değil | clone aracılığıyla destekleniyor |
array_is_list() | Mevcut | Davranış değişmedi, ancak daha geniş benimseme kalıpları |
| Dinamik sınıf sabiti getirme | Sözdizimi hatası | ClassName::{$const} aracılığıyla destekleniyor |
Randomizer::getBytesFromString() | Mevcut değil | Mevcut |
Randomizer::getFloat() / nextFloat() | Mevcut değil | Mevcut |
#[Override] niteliği | Mevcut değil | Mevcut |
Kullanımdan kaldırma: mt_rand örtük tohumlama | Kullanımdan kaldırılmadı | Kullanımdan kaldırıldı |
| Fiber yığın boyutu ini yönergesi | Yapılandırılamaz | fiber.stack_size eklendi |
| JIT izleme iyileştirmeleri | Temel izleme | Geliştirilmiş IR ve döngü işleme |
Dizilerle str_contains | Desteklenmiyor | Hâlâ desteklenmiyor (kaynak makale hatası — aşağıya bakın) |
> Kritik düzeltme: Kaynak makale, str_contains()‘ın PHP 8.3’te bir dizi string kabul ettiğini yanlış biçimde belirtmektedir. Bu olgusal olarak yanlıştır. str_contains() yalnızca iki string argümanı kabul eder. Bir dizi geçirilmesi TypeError tetikler. Birden fazla string içinde alt dize aramanın doğru yaklaşımı array_filter() ile str_contains() kombinasyonu veya tam eşleşmeler için in_array()‘dır.
PHP 8.3’te JIT Derlemesi: Gerçekte Ne Değişti
Arka Plan: PHP JIT Nasıl Çalışır
PHP 8.0’da deneysel olarak tanıtılan PHP’nin JIT derleyicisi, OPcache alt sisteminin bir uzantısı olarak çalışır. Sık kullanılan bytecode yollarını çalışma zamanında yerel makine koduna derleyerek bu yollar için Zend VM yorumlayıcısını devre dışı bırakır. PHP 8.3, derleme sırasında kullanılan ara temsili (IR) iyileştiren önemli ölçüde revize edilmiş bir JIT arka ucu ile birlikte gelir.
PHP 8.3’teki yeni IR tabanlı JIT (Dmitry Stogov tarafından geliştirilen), eski izleme JIT’inin kod üretim katmanını uygun bir SSA biçimli ara temsille değiştirir. Bu, önceki mimaride yapısal olarak imkânsız olan optimizasyonlar olan daha iyi yazmaç tahsisi, ölü kod eliminasyonu ve döngü değişmezi kaldırma işlemlerini mümkün kılar.
JIT’i Doğru Şekilde Etkinleştirme
Orijinal makale php -d jit=on script.php göstermektedir; bu eksiktir. JIT, OPcache’in etkin olmasını gerektirir. CLI kıyaslaması veya üretim php.ini için doğru minimum yapılandırma şöyledir:
; php.ini
opcache.enable=1
opcache.enable_cli=1
opcache.jit_buffer_size=128M
opcache.jit=tracingBir web sunucusu bağlamında (FPM veya Apache mod_php), opcache.enable_cli alakasızdır, ancak opcache.jit_buffer_size sıfır olmayan bir değere ayarlanmalıdır; aksi takdirde JIT sessizce kendini devre dışı bırakır. Yaygın bir üretim tuzağı, paylaşılan bir php.ini içinde jit_buffer_size=0 ayarlamak ve JIT’in neden etkisiz olduğunu merak etmektir.
JIT’in Ölçülebilir Kazanımlar Sağladığı Durumlar
JIT evrensel olarak faydalı değildir. Kazanımları CPU’ya bağlı iş yüklerinde yoğunlaşmaktadır:
- Yüksek değerli hedefler: Matematiksel hesaplamalar, görüntü işleme, makine öğrenmesi çıkarımı, oyun mantığı, CSV/veri ayrıştırma döngüleri, kullanıcı tarafındaki kriptografik işlemler.
- Düşük değerli hedefler: Darboğazın G/Ç (veritabanı sorguları, dosya sistemi, ağ) olduğu tipik CRUD web uygulamaları. Bu durumlarda, derleme kaynaklı JIT yükü, ihmal edilebilir verim iyileştirmesiyle birlikte bellek kullanımını hafifçe artırabilir.
- Olumsuz durumlar: Son derece çeşitli kod yollarına sahip uygulamalar (ağır yansıma içeren büyük çerçeveler), JIT’in tamponu çırpınmasına neden olarak optimizasyon kaldırma yüküne yol açabilir.
Pratik bir kural: önce opcache.jit=tracing ile kıyaslama yapın. Gerçek iş yükünüzde %3’ten az iyileşme görüyorsanız, tüm PHP uygulamalarına eşit biçimde fayda sağlayan OPcache’in opcode önbelleği için tampon belleği geri kazanmak amacıyla JIT’i devre dışı bırakın.
Tiplendirilmiş Sınıf Sabitleri
Bu, büyük kod tabanları için PHP 8.3’teki tartışmasız en etkili tür sistemi eklemesidir.
Çözdüğü Sorun
PHP 8.3 öncesinde, sınıf sabitlerinin zorunlu bir türü yoktu. Bir alt sınıf, tamamen uyumsuz bir türle bir sabiti yeniden tanımlayabilirdi ve PHP, sabitin nasıl kullanıldığına bağlı olarak çalışma zamanına kadar — ya da hiç — hata vermezdi.
// PHP 8.2 — no type enforcement
interface StatusCode {
const SUCCESS = 200; // implicitly int
}
class BrokenStatus implements StatusCode {
const SUCCESS = "two hundred"; // silently accepted — a maintenance nightmare
}PHP 8.3 Çözümü
// PHP 8.3 — type is enforced at definition and inheritance
interface StatusCode {
const int SUCCESS = 200;
}
class BrokenStatus implements StatusCode {
const int SUCCESS = "two hundred";
// Fatal error: Cannot use string as value for typed class constant
// BrokenStatus::SUCCESS of type int
}Tüm skaler türler (int, float, string, bool), array, null, birleşim türleri ve kesişim türleri, sabit tür bildirimleri için geçerlidir. never ve void türlerine izin verilmez. Bu özellik, PHPStan ve Psalm gibi statik analiz araçlarıyla temiz bir şekilde entegre olarak çalışma zamanı yükü olmadan daha katı arayüz sözleşmeleri sağlar.
Dinamik Sınıf Sabiti ve Enum Üyesi Getirme
PHP 8.3, ::{} sözdiziminde çalışma zamanı ifadesi kullanarak sınıf sabitlerini ve enum üyelerini getirmeye olanak tanır.
class Direction {
const string NORTH = 'north';
const string SOUTH = 'south';
}
$direction = 'NORTH';
echo Direction::{$direction}; // outputs: northDaha önce bu, her ikisi de ayrıntılı ve hataya açık olan constant() veya match ifadesi gerektiriyordu. Yeni sözdizimi enum’larla da çalışır:
enum Color {
case Red;
case Blue;
}
$name = 'Red';
$color = Color::{$name}; // Color::RedDikkat edilmesi gereken uç durum: Değişken, tanımlı bir sabit veya enum durumuna karşılık gelmeyen bir ad içeriyorsa, PHP bir uyarı değil Error istisnası fırlatır. Dinamik getirmeleri bir try/catch bloğuna sarın veya kullanmadan önce defined() / enum_exists() ile doğrulayın.
json_validate() Fonksiyonu
Üretimde Bu Neden Önemlidir
PHP 8.3 öncesinde, bir JSON dizesini çözmeden doğrulamanın deyimsel yolu şuydu:
json_decode($input);
$isValid = json_last_error() === JSON_ERROR_NONE;Bu yaklaşım, JSON’u tam olarak bir PHP yapısına çözerek yük boyutuyla orantılı bellek tahsis eder. Yalnızca doğrulama yapılan hattlar için — API ağ geçitleri, mesaj kuyruğu tüketicileri, webhook alıcıları — bu israftır.
PHP 8.3 Yerel Doğrulama
$payload = '{"user": "alex", "role": "admin"}';
if (json_validate($payload)) {
// safe to decode
$data = json_decode($payload, true);
}
// Invalid JSON
var_dump(json_validate('{invalid}')); // bool(false)json_validate(), bir PHP değer ağacı oluşturmadan JSON yapısını ayrıştırır. Bellek tüketimi O(boyut) yerine O(derinlik) olduğundan büyük yükler için önemli ölçüde daha verimlidir. Ayrıca json_decode() ile tutarlı $depth ve $flags parametrelerini kabul eder.
Gerçek dünya kullanım durumu: Dakikada 50.000 istek işleyen bir webhook alıcısı, herhangi bir seri çözme gerçekleşmeden önce hatalı biçimlendirilmiş yükleri kenarda reddetmek için json_validate() kullanabilir; bu da CPU ve bellek baskısını önemli ölçüde azaltır.
Readonly Özellikler: Derin Klonlama Desteği
PHP 8.2, readonly özellikleri tanıttı ancak nesne klonlama sırasında bile bunların değiştirilmesini imkânsız kıldı. Bu durum, geliştiricileri garip geçici çözümlere — fabrika yöntemleri, serileştirme hileleri veya değer nesneleri için readonly’den tamamen vazgeçme — zorladı.
PHP 8.3, __clone() sihirli yönteminin artık klonlama bağlamında readonly özelliklerini yeniden atamaya izin verilmesiyle bu sorunu çözer.
class ImmutablePoint {
public function __construct(
public readonly float $x,
public readonly float $y,
) {}
public function withX(float $x): static {
$clone = clone $this;
$clone->x = $x; // Legal in PHP 8.3 within __clone context
return $clone;
}
}
$point = new ImmutablePoint(1.0, 2.0);
$moved = $point->withX(5.0);
echo $moved->x; // 5.0
echo $point->x; // 1.0 — original unchangedBu kalıp, Alan Odaklı Tasarım’daki değişmez değer nesneleri için temel niteliktedir. Onsuz, readonly karmaşık alan modelleri için büyük ölçüde dekoratif kalıyordu.
#[Override] Niteliği
#[Override] niteliği, PHP’ye (ve statik analiz araçlarına) bir yöntemin bir üst sınıf veya arayüz yöntemini geçersiz kılmak amacıyla tasarlandığını bildirir. Üst yöntem mevcut değilse, PHP derleme zamanı hatası fırlatır.
class Base {
public function process(): void {}
}
class Child extends Base {
#[Override]
public function process(): void {
// If Base::process() is renamed or removed, this becomes a fatal error
}
}Bu, bir temel sınıfın yeniden düzenlenmesinin alt sınıf geçersiz kılmalarını sessizce bozabildiği büyük ekiplerde özellikle değerlidir. Nitelik, derleme zamanı sözleşmesi olarak işlev görerek daha önce yalnızca çalışma zamanında veya statik analiz aracılığıyla ortaya çıkan bir hata kategorisini yakalar.
array_is_list() ve Doğru Dizi Sınıflandırması
array_is_list(), PHP 8.3’te değil PHP 8.1’de tanıtıldı. Ancak fonksiyon sıklıkla yanlış anlaşıldığından, doğru kullanım kalıpları kesin belgelemeyi hak etmektedir.
Bir PHP dizisi, ancak ve ancak şu koşulları sağlıyorsa listedir:
- Boşsa, veya
- Anahtarları
0‘dan başlayan ve boşluk içermeyen ardışık tam sayılarsa.
var_dump(array_is_list([])); // bool(true)
var_dump(array_is_list([0 => 'a', 1 => 'b'])); // bool(true)
var_dump(array_is_list(['a', 'b', 'c'])); // bool(true)
var_dump(array_is_list([1 => 'a', 0 => 'b'])); // bool(false) — wrong order
var_dump(array_is_list([0 => 'a', 2 => 'b'])); // bool(false) — gap at index 1
var_dump(array_is_list(['key' => 'value'])); // bool(false) — string keyPratik uygulama: Veriyi JSON’a serileştirirken, array_is_list() çıktının JSON dizisi ([]) mi yoksa JSON nesnesi ({}) mi olması gerektiğini belirler. json_encode()‘dan önce kullanmak, öğeleri kaldırılmış sayısal indeksli dizilerin yanlışlıkla nesne olarak serileştirilmesini önler.
PHP 8.3’teki Yeni Randomizer Yöntemleri
PHP 8.2’de tanıtılan RandomRandomizer sınıfı üç önemli ekleme alır:
getBytesFromString()
$randomizer = new RandomRandomizer();
$token = $randomizer->getBytesFromString('abcdefghijklmnopqrstuvwxyz0123456789', 16);
echo $token; // e.g., "k3mz9xqp1wvn7yt2"Bu, belirli bir alfabeden rastgele kriptografik olarak güvenli bir string üretir — token oluşturma, OTP kodları ve slug oluşturma için gereken bir kalıp. Daha önce bu, random_int() ile manuel bir döngü gerektiriyordu.
getFloat() ve nextFloat()
$randomizer = new RandomRandomizer();
// Returns a float in [0.0, 1.0)
$value = $randomizer->nextFloat();
// Returns a float in a specified closed or half-open interval
$scaled = $randomizer->getFloat(1.5, 9.5, RandomIntervalBoundary::ClosedOpen);getFloat(), dağılım tekdüzeliğinin önemli olduğu simülasyonlar, olasılıksal algoritmalar ve A/B test çerçeveleri için kritik olan, naif uygulamaları etkileyen modülo önyargısı olmadan düzgün dağılımlı kayan noktalı sayılar üretmek için γ-kesit algoritmasını kullanır.
PHP 8.3’teki Kullanımdan Kaldırmalar ve Kaldırmalar
Nelerin aşamalı olarak kaldırıldığını anlamak, nelerin eklendiğini bilmek kadar önemlidir. Kullanımdan kaldırmaları şimdi görmezden gelmek, PHP 9.0’da ölümcül hatalara yol açar.
| Kullanımdan Kaldırılan Özellik | Neden | Geçiş Yolu |
|---|---|---|
Bazı bağlamlarda açık tohum olmadan mt_rand() çağırma | Örtük tohumlama davranışı tutarsızlığı | RandomRandomizer kullanın |
Statik olmayan üzerinde nesne olmadan ReflectionProperty::setValue() | Belirsiz davranış | Hedef nesneyi açıkça geçirin |
mb_strimwidth()‘e negatif $widths geçirme | Tanımsız davranış | Çağırmadan önce girişi doğrulayın |
Ayrı host/port argümanlarıyla ldap_connect() | URI biçimi lehine kullanımdan kaldırıldı | ldap://host:port URI dizesi kullanın |
Kayan noktalı sayı üreten tamsayı olmayan adımla range() | Şaşırtıcı örtük tür zorlaması | Adımı açıkça float‘a dönüştürün |
Performans Kıyaslamaları: PHP 8.3 ile Önceki Sürümler
Symfony Demo, WordPress ve ham Fibonacci/sıralama iş yüklerini kullanan Kinsta, Phoronix ve PHP dahililer ekibinin yayımladığı kıyaslamalara dayanarak:
| Kıyaslama | PHP 8.1 | PHP 8.2 | PHP 8.3 |
|---|---|---|---|
| Symfony Demo (istek/sn) | ~1.450 | ~1.520 | ~1.610 |
| WordPress (istek/sn) | ~1.180 | ~1.240 | ~1.290 |
| Fibonacci (JIT, ms) | ~48 | ~44 | ~38 |
| Mandelbrot (JIT, ms) | ~210 | ~195 | ~170 |
| Yalnızca OPcache (JIT yok) | Temel | +%5 | +%8 |
Kazanımlar tutarlıdır ancak G/Ç’ye bağlı uygulamalar için çarpıcı değildir. PHP 8.3’teki JIT iyileştirmeleri, Mandelbrot kıyaslamasında PHP 8.2’ye kıyasla %18’e kadar daha hızlı olan saf hesaplama iş yüklerinde en belirgin farkı göstermektedir.
PHP 8.3’e Yükseltme: Pratik Sunucu Tarafı Kontrol Listesi
Kendi sunucu altyapınızı yönetiyorsanız — ister cPanel ile VPS üzerinde ister çıplak metal Dedicated Server üzerinde olsun — üretim ortamlarını yükseltmeden önce bu sırayı izleyin.
Yükseltme Öncesi Adımlar
composer outdatedçalıştırın ve tüm bağımlılıkları PHP 8.3 uyumluluğu beyan eden sürümlere güncelleyin.- Kullanımdan kaldırma bildirimlerini ölümcül hatalara dönüşmeden önce ortaya çıkarmak için PHP 8.3 CLI altında
php -d error_reporting=E_ALL your_app_entrypoint.phpçalıştırın. - Dize olmayan argümanlarla
str_contains(),str_starts_with()veyastr_ends_with()çağıran kodları denetleyin — bunlar artık katı bağlamlardaTypeErrorfırlatır. - Alt sınıfların geçersiz kıldığı sınıf sabitlerini gözden geçirin — türler uyumsuzsa tiplendirilmiş sabitler ölümcül hatalara neden olur.
- OPcache ve JIT’in beklenen yapılandırmayla etkin olduğunu doğrulamak için yükseltme sonrasında
phpinfo()çıktısını kontrol edin.
PHP 8.3 Üretimi için php.ini Ayarlaması
; Recommended production baseline for PHP 8.3
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
opcache.jit=tracing
opcache.jit_buffer_size=64Mvalidate_timestamps=0 ayarı, her istekte dosya değişikliği kontrollerini devre dışı bırakır — OPcache geçersiz kılma yükünün ölçülebilir olduğu yüksek trafikli dağıtımlar için zorunludur. Bunun yerine kod dağıtımlarından sonra opcache_reset() çağırmak için dağıtım kancaları kullanın.
Yükseltme Sonrası Doğrulama
# Verify active PHP version
php -v
# Confirm JIT is compiled in and active
php -r "var_dump(opcache_get_status()['jit']);"
# Check for deprecation notices in error log
tail -f /var/log/php-fpm/error.log | grep -i deprecatPHP 8.3 ve Web Uygulama Güvenliği Değerlendirmeleri
PHP 8.3 yeni güvenlik ilkelleri sunmaz, ancak birkaç değişikliğin dolaylı güvenlik etkileri vardır:
json_validate(), saldırı yüzeyini azaltır: Hatalı biçimlendirilmiş JSON’un seri çözme mantığına ulaşmasını önleyerek giriş doğrulama hatlarında.- Tiplendirilmiş sınıf sabitleri, bir alt sınıfın güvenlikle ilgili bir sabit için (örneğin, bir izin düzeyi veya zaman aşımı değeri) beklenmedik bir tür koyduğu tür karışıklığı saldırılarını önler.
#[Override]niteliği, eklenti mimarilerinde ince ayrıcalık yükseltme hatalarının bir vektörü olan güvenlik açısından kritik temel sınıflarda sessiz yöntem gölgelenmesini önler.RandomRandomizereklemeleri, token oluşturma içinsubstr(str_shuffle(implode(range('a','z'))), 0, 16)gibi güvensiz kalıpların yerini alır.
Hassas veriler işleyen uygulamalar için PHP 8.3’ü düzgün yapılandırılmış bir TLS yığınıyla eşleştirmek zorunludur. Hosting ortamınızda henüz güncel SSL Sertifikaları dağıtılmamışsa, herhangi bir PHP yükseltmesinden önce bunu ele alın.
PHP 8.3 için Doğru Hosting Ortamını Seçme
PHP 8.3’ün JIT derleyicisi ve tiplendirilmiş sabit çözümlemesi için artan bellek gereksinimleri, kaynak kısıtlı ortamların yükseltmeden tam olarak yararlanamayabileceği anlamına gelir.
- Paylaşımlı hosting: PHP sürümü kullanılabilirliği tamamen sağlayıcıya bağlıdır. PHP 8.3’e hemen ihtiyacınız varsa, PHP sürümü değiştirme özelliğine sahip Paylaşımlı Web Hosting planları, sunucu yönetimi yükü olmadan esneklik sağlar.
- VPS:
php.ini, PHP-FPM havuz yapılandırması, OPcache ayarlaması ve JIT tampon boyutlandırması üzerinde tam kontrol. Bu, JIT etkin PHP 8.3 üretim dağıtımları için önerilen minimum ortamdır. - Dedicated sunucular: Birden fazla PHP-FPM çalışanı arasındaki JIT tampon çekişmesinin darboğaz haline geldiği yüksek trafikli uygulamalar için gereklidir. Özel bir ortam aynı zamanda OPcache için NUMA’ya duyarlı bellek tahsisine de olanak tanır.
- GPU hosting: PHP uygulamanız GPU hızlandırmalı iş yüklerini (örneğin, Python ML çıkarım hizmetlerini çağırma) yönetiyorsa geçerlidir. GPU Hosting ortamları, PHP 8.3’ün geliştirilmiş FFI ve süreç yönetiminden yararlanır.
Temel Teknik Çıkarımlar ve Karar Matrisi
Şu durumlarda tiplendirilmiş sınıf sabitlerini hemen kullanın:
- Kod tabanınız, alt sınıfların geçersiz kıldığı sabitlere sahip arayüzler veya soyut sınıflar kullanıyorsa.
- PHPStan seviye 8 veya Psalm kullanıyorsanız — tiplendirilmiş sabitler daha katı analizi mümkün kılar.
Şu durumlarda JIT’i etkinleştirin:
- Profiliniz, CPU süresinin istek süresinin %40’ını aştığını gösteriyorsa.
- PHP’de toplu işleme, veri dönüştürme veya matematiksel iş yükleri çalıştırıyorsanız.
- PHP-FPM havuzu başına en az 64 MB özel OPcache JIT tamponu mevcutsa.
Şu durumlarda JIT’i etkinleştirmeyin:
- Uygulamanız G/Ç’ye bağlıysa (veritabanı, önbellek, dosya sistemi, API çağrıları gecikmeye hâkimse).
- Sınırlı OPcache belleğine sahip paylaşımlı hostingdeyseniz.
- Belirli iş yükünüzü kıyaslamadıysanız — hiçbir şeyi varsaymayın.
Şu durumlarda json_validate() benimseyin:
- Kod tabanınızın herhangi bir yerinde çözmeden önce JSON doğruluyorsanız.
- Yüksek hacimli webhook veya mesaj kuyruğu yüklerini işliyorsanız.
#[Override]‘ı şunlara ekleyin:
- Bir üst yöntemi kasıtlı olarak geçersiz kılan alt sınıftaki her yönteme.
- Eklenti veya uzantı mimarilerindeki güvenlik açısından kritik yöntem geçersiz kılmalarına.
Şu durumlarda RandomRandomizer‘a geçin:
- Kodunuzun herhangi bir bölümü güvenliğe duyarlı token veya anahtar oluşturma için
rand(),mt_rand(),array_rand()veyastr_shuffle()kullanıyorsa.
SSS
PHP 8.3, PHP 8.2 koduyla geriye dönük uyumluluğu bozuyor mu?
Çoğu durumda hayır. PHP 8.3, 8.2’de zaten kullanımdan kaldırılmamış standart kütüphaneden kaldırılmış fonksiyonları olmayan küçük bir sürümdür. Ancak yeni kullanımdan kaldırılan davranışlar E_DEPRECATED bildirimleri yayacak ve sabitlerdeki örtük tür zorlamasına veya kayan noktalı adımlarla range()‘a dayanan kodlar farklı davranabilir. Dağıtmadan önce her zaman test paketinizi PHP 8.3 altında çalıştırın.
PHP 8.3’te JIT varsayılan olarak etkin mi?
Hayır. JIT, OPcache’in etkin olmasını ve opcache.jit_buffer_size‘ın sıfır olmayan bir değere ayarlanmasını gerektirir. Çoğu dağıtımla birlikte gelen varsayılan php.ini, JIT’i etkin biçimde devre dışı bırakan opcache.jit_buffer_size=0 ayarlar. Bunu açıkça yapılandırmanız gerekir.
PHP 8.3’te tiplendirilmiş sınıf sabitlerini birleşim türleriyle kullanabilir miyim?
Evet. const int|string VERSION = 8; geçerlidir. Nesne türü sabitler için kesişim türlerine de izin verilir. Yalnızca yasak türler void ve never‘dır.
Doğrulama amacıyla json_validate() ile json_decode() arasındaki fark nedir?
json_validate(), bellekte bir PHP değeri oluşturmadan JSON yapısını ayrıştırır. Büyük yükler için bellek açısından önemli ölçüde daha verimli ve yalnızca yapısal geçerliliği onaylamanız gerektiğinde daha hızlıdır. json_decode(), gerçekten çözülmüş veriye ihtiyaç duyduğunuzda kullanılmalıdır — her ikisini sırayla çağırmayın; json_validate()‘ı yalnızca sonucu atmayı düşündüğünüzde çağırın.
PHP 8.3, PHP 8.2’de tanıtılan readonly sınıfları destekliyor mu?
Evet ve bunları genişletiyor. PHP 8.3, readonly özelliklerin __clone() içinde yeniden atanmasına izin veriyor; bu, PHP 8.2’deki readonly sınıflarının birincil sınırlamasıydı. Bu, değişmez değer nesnesi kalıplarını geçici çözümler olmadan tamamen uygulanabilir kılmaktadır.
