PHP 8.5’teki yenilikler
(stitcher.io)- PHP 8.5, pipe operatörü, clone with, yeni URI ayrıştırıcısı gibi çeşitli özellikleri içeren büyük bir güncelleme sürümü
- Pipe operatörü, fonksiyon çağrı zincirlerini basitleştirerek okunabilirliği ve bakım kolaylığını artırır
- Clone with özelliği, nesne kopyalanırken özellik değerlerinin aynı anda değiştirilebilmesini sağlar; ancak bazı readonly özellikler için kısıtlamalar vardır
#[NoDiscard],(void)cast, closure sabit ifadeleri desteği, fatal error backtrace çıktısı gibi geliştirici kolaylığı sağlayan özellikler güçlendirildi- Dizi işleme, özellik doğrulama, standart dışı cast’lerin kaldırılması gibi ayrıntılı iyileştirmeler ve geriye dönük uyumlulukla ilgili değişiklikler içeren bir sürüm
Başlıca yeni özellikler
-
Pipe operatörü (
|>) ile bir fonksiyonun sonucunu doğrudan bir sonraki fonksiyona aktaran zincirleme kod yazımı mümkün- İç içe fonksiyon çağrıları yerine veriyi adım adım dönüştüren bir yapı sunar
- Örnek kodda
trim,str_replace,strtolowergibi işlevler sıralı şekilde bağlanır
-
Clone with sayesinde nesne kopyalanırken özellik değerleri aynı anda değiştirilebilir
- Örnek
Booksınıfındaclone($this, ['title' => $title])biçiminde kullanılır - Ancak dışarıdan readonly özellikler kopyalanırken
public(set)erişim belirleyicisi gerekir
- Örnek
-
#[NoDiscard]niteliği ve(void)cast eklendi- Dönüş değerinin yok sayılması durumunda uyarı üreten fonksiyonlar işaretlenebilir
(void)cast kullanılarak bu uyarı bastırılabilir
-
Closure iyileştirmeleri ile sabit ifadeler içinde closure ve first-class callable object kullanılabilir
- Örnekte bunlar
#[SkipDiscovery(static function (...))]biçiminde nitelik içinde tanımlanır - Bu closure’lar mutlaka
staticolarak tanımlanmalı ve dış değişkenlere erişemez
- Örnekte bunlar
-
Fatal error backtrace çıktısı özelliği eklendi
- Daha önce gösterilmeyen stack trace bilgisi artık hata mesajına dahil edilerek hata ayıklamayı kolaylaştırır
Dizi ve URI ile ilgili özellikler
-
array_first()vearray_last()fonksiyonları eklendi- Dizinin ilk ve son öğesini basitçe döndürür
- Mevcut
array_key_first()vearray_key_last()ile yapılan daha karmaşık erişim yöntemlerinin yerini alır
-
Yeni bir URI ayrıştırıcısı eklendi
Uri\Rfc3986\Urisınıfı üzerindengetHost(),getScheme(),getPort()gibi metotlar sunar- URI işleme ve analizini basitleştirir
Özellik ve doğrulama ile ilgili işlevler
#[DelayedTargetValidation]niteliği kullanıma sunuldu#[Override]gibi bazı niteliklerin doğrulama zamanını derleme zamanından çalışma zamanına ertelemek mümkün- Amaç, geriye dönük uyumluluk sorunlarını hafifletmek
Diğer küçük değişiklikler
- Statik özelliklerde asimetrik görünürlük (asymmetric visibility) desteği
- Sınıf dışı sabitlere de nitelik (attribute) eklenebilir
- Constructor property promotion, final özellikler için de kullanılabilir
#[\Override]niteliği, özelliklere de uygulanabilirDom\Element::$outerHTMLözelliği eklendi- Exif eklentisi, HEIF/HEIC görsellerini destekler
filter_var()çağrılarındaFILTER_THROW_ON_FAILUREbayrağı eklendi
Kaldırılan ve uyumsuz değişiklikler
- Standart dışı cast adları
(boolean),(integer)vb. kullanımdan kaldırıldı - Backtick (
``) kullanımınınshell_exec()için takma ad olması kullanımdan kaldırıldı - Sabit yeniden tanımlama özelliği kullanımdan kaldırıldı
disabled_classesini ayarı kaldırıldı- Tüm değişiklik ve kaldırma listesi PHP 8.5 yükseltme belgesinde görülebilir
Genel özet
- PHP 8.5, kod okunabilirliği, hata ayıklama, nitelik işleme, dizi manipülasyonu gibi alanlarda genel geliştirme deneyimini iyileştiren bir sürüm
- Pipe operatörü ve URI ayrıştırıcısı, gerçek dünya kodlarını sadeleştirmede doğrudan etkili
- Nitelik doğrulamasının ertelenmesi, yeni dizi fonksiyonları ve backtrace çıktısı bakım kolaylığı ve kararlılığı artıran değişiklikler
- Bazı standart dışı sözdizimleri ve ayarların kaldırılması nedeniyle kod temizliği gerekebilir
- Genel olarak bu sürümün odağında dil tutarlılığını güçlendirmek ve geliştirici deneyimini iyileştirmek var
1 yorum
Hacker News yorumu
Ben hâlâ PHP'yi seviyorum
23 yıl önce PHP için şifreleme yazılımı yaptım ve hâlâ gayet iyi çalışıyor
Hâlâ bir PHP bülteni yürütüyorum ve topluluk da hâlâ güçlü
Python ya da Node.js de kullanıyorum ama hızlı ve basit işler için sonunda yine PHP'ye dönüyorum
Yalnız, PHP 5'ten sonra dilin çok daha karmaşık hâle gelmesi iki ucu keskin bir kılıç gibi
Python 2'den 3'e geçerken PHP 5.2→5.3 ve 5.6→7.0 yönünde evrildi
Namespace'ler, PSR0 autoloading, parser iyileştirmeleri gibi adımlarla hız ve yapı büyük ölçüde gelişti
Her güncellemede uyumluluğu bozmadan kademeli iyileştirmeler yaptı; uyarılar ve shim'ler sağlayarak eski sürümlerin korunmasını da mümkün kıldı
PHP 6'nın iptal edilmesinin nedeni string işleme değişikliğiydi; sonuçta bunun akıllıca bir karar olduğunu düşünüyorum
Uzun süre geçimimi sağlayan bir dil ve topluluğa saygı duyan bir projeydi
Karmaşık yazmak mümkün ama şart değil
2000'lerin ortasında Zend ile ilgili araçlarla uğraşmıştım; oldukça uğraştırıcı olduğunu hatırlıyorum
PSR'leri öğrenip güvenlik ve özellikleri hesaba katınca çok daha istikrarlı ve güçlü bir dil hâline geldi
PHP 5 sonrası evrim etkileyici ama bununla birlikte artan karmaşıklık sorunu da var
Eski sürümlerle öğrenenler için modern codebase'ler yabancı geliyor ve takip etmesi zor olabiliyor
Bu topluluk için bir güç olsa da, geri dönmek isteyen geliştiriciler için bir engel oluşturuyor
10 yıl boyunca C++ kullandım ama bugün modern PHP, modern C++ kodundan çok daha kolay okunuyor
Sadelik hedefi kaybolmuş gibi; sadece özellikler üst üste ekleniyor
Özellikle web alanı çok hızlı değişiyor; ayak uydurmazsan geride kalıyorsun
PHP özellikle ilk web sitesini yapan acemiler tarafından çok kullanılan bir dil olduğu için, değişim diğer dillere kıyasla daha sert hissediliyor olabilir
Birçok insanın PHP'den utanma eğilimi var ama bende yok
Dil hakkında çok şey bilmiyorum ama harika projeler olduğunu biliyorum
Bugün en sevdiğim PHP projesi BookStack; aile vikisi olarak kullanıyorum
İyi yönetilen PHP stack'leriyle kurulmuş çok sayıda site hâlâ var
2021~2023 arasında production PHP kullandım; dilin kendisinden çok sorun eski codebase'ler ve düşük maaş düzeyi idi
PHP 4 döneminden kalma çok fazla miras kod var ve veri erişim kalıpları da birbirinden farklı olduğu için bakım zorlaşıyor
Ama PHP 8'e geçiş sırasında kod kalitesi büyük ölçüde iyileşti
Yeni bir proje başlatacak olsam PHP'yi seçmezdim ama modern bir Laravel projesi için memnuniyetle çalışırım
Ama yeni başlayanların güvenlik kavramları olmadan kolayca kullanabilmesi nedeniyle SQL injection gibi sorunlar çok yaşandı; bu yüzden de “güvensiz dil” itibarı oluştu
Laravel gibi framework'lerle birlikte çok daha istikrarlı ve olgun bir ortam sunuyor
Gitar çalmak ya da şiir yazmak gibi; herkes yapabilir ama iyi yapmak zordur
Koda doğrudan bakarak öğrenmek ve radyo/müzik sunucusunu self-host etmek eğlenceli
PHP güncellendikçe daha karmaşık bir dil oldu
Hâlâ web merkezli bir dilken neden böyle evrildiğini merak ediyorum
Sonuçta geleneksel nesne yönelimli dillerin benzer bir yöne yakınsadığını düşünüyorum
Sadece web için bir dil olsa bile gelişmek için yeterince sebep var. Geliştirici deneyimini iyileştirmek her zaman değerli
array_first(), array_last() kullanışlı ama pipe operator bakım yapılabilirliğini zedeleyebilir
Yalnızca unary function'ları desteklediği için karmaşık fonksiyonlarda tersine hata üretmeye daha açık olabilir
PHP 8.5 duyurusundaki en ilginç şey, dilin istikrarı ve olgunluğu
PHP'nin GTA6'dan önce array_first, array_last, fatal error stack trace eklemesi şaşırtıcı
PHP'ye sürekli yeni fonksiyonlar ve sözdizimi eklenmesi uzun vadede bakım maliyetini artırıyor
resmî sürüm notlarına bakınca bazı özelliklerin değeri belirsiz görünüyor
parse_url()ile örtüşüyorResmî PHP 8.5 sürüm notları
Pipe operator örnekleri, çoğu dilde geçici değişken kullanılarak yapılan sıradan yaklaşımı atlıyor
URL ayrıştırma örneği de
parse_url()ile doğrudan karşılaştırılmamışparse_url()standartlara tam uymaz ve göreli URL'leri işlemede zayıftırYeni
uri()fonksiyonu daha temiz görünüyor; partial function application eklendiğinde pipe chain'ler daha okunabilir olacaktırPHP CLI'da **backtick(
) ile shell_exec() çağırırdım**, artık deprecated oldumkdir $dirname` gibi şeyleri sık kullanırdımShell metacharacter injection riski nedeniyle PHP'nin
mkdir()ya dapcntl_exec()fonksiyonlarını kullanmak gerekir