PHP çok büyük bir kullanıcı kitlesi tarafından web geliştirme amaçlı kullanılan bir betik dili. PHP’nin en son stabil ve güncel sürümü 8.3, 23.11.2023 tarihinde yayınlandı. 2000’de yayınlanan PHP 3.x sürümünden bu yana çok fazla yenilik getirildi ve değişiklikler oldu. PHP hala çok büyük bir kitle tarafından kullanılan en popüler web geliştirme (web tasarım) dilleri arasında. Bu yazımızda PHP 8.3 sürümündeki yenilikleri ve değişimleri kod örnekleriyle inceleyip analiz edeceğiz.
-
1
PHP 8.3 Yeni Büyük Özellikler ve Geliştirmeler
- 1.1 Typed Class Constants (Tür Bildirilen Sınıf Sabitleri)
- 1.2 Yeni Bir Fonksiyon: json_validate()
- 1.3 Yeni Bir Özellik: #[\Override]
- 1.4 readonly Özelliklerinin Derin Klonlanması
- 1.5 Sınıf Sabitlerinin ve Sayılama Üyelerinin Dinamik Getirilmesi (Dynamic Fetching of Class Constants and Enum Members)
- 1.6 Yeni Bir Metod: getBytesFromString()
- 1.7 Yeni Metotlar: getFloat() ve nextFloat()
- 2 PHP 8.3'teki Küçük Yenilik ve Geliştirmeler
- 3 PHP 8.3'te Kullanımdan Kaldırılanlar
- 4 PHP 8.3
PHP 8.3 Yeni Büyük Özellikler ve Geliştirmeler
PHP 8.3’te bir önceki PHP sürümü PHP 8.2’ye kıyasla birçok büyük yenilik ve geliştirme var. Aynı zamanda bazı özellikler ise kullanımdan kaldırıldı (deprecated). Yenilikler ve geliştirmeleri şimdi tek tek kod örnekleriyle inceleyeceğiz
Typed Class Constants (Tür Bildirilen Sınıf Sabitleri)
Tür bildirmek (declare type) web geliştirmede stabiliteyi arttıran, hata oranlarını düşüren geliştiriciler için çok önemli bir özellik. Sınıftaki (class) özellikler (property) için tür bildirme özelliği PHP 7.4’te eklendi. Bu özellikte sonraki sürümlerde birçok geliştirme yapılmasına rağmen bu özellik hala sınıftaki sabitlerde (constant) kullanılamıyordu. PHP 8.3 ile artık sınıftaki sabitler için tür bildirme mümkün.
// Doğru kullanım:
class MyClass {
// Bildirilen tür ve değer aynı
const string VERSION = "PHP 8.3"; // değer string
}
// Hatalı kullanım:
class MyClass {
// Bildirilen tür ile değer farklı
const int VERSION = "PHP 8.3"; // değer string
}
// Hatalı kullanım:
class MyClass {
// Bildirilen tür sınıf sabitleri için desteklenmiyor
const void VERSION = "PHP 8.3"; // değer string
}
Bazı tür bildirimleri sınıf sabitleri için desteklenmez.
Sınıf sabitleri için desteklenmeyen tür bildirimleri: void
, callable
, never
Yeni Bir Fonksiyon: json_validate()
JSON formatındaki verilerle (json-encoded data) çalışırken veriyi kullanmadan önce gelen verinin geçerli olduğunu doğrulamamız gerekir. Bunu PHP 8.3’ten önceki sürümlerde aşağıdaki gibi veya benzer yöntemlerle yapıyorduk.
// PHP 8.3'ten önceki sürümlerde JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_last_error() === JSON_ERROR_NONE) {
// $data ile gerçekleştirilecek işlemler
}
Bu eski örnekte JSON verisini doğrularken PHP, verinin büyüklüğüne göre değişmekle beraber kayda değer bellek tüketebilir. PHP 8.3’te ise performans odaklı hızlı çözüm yaratan yeni bir PHP fonksiyonu eklendi: json_validate(). Bu fonksiyonun kullanım senaryosunu altta örnekledik.
// PHP 8.3'te JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_validate($maybeJSON)) {
// $data ile gerçekleştirilecek işlemler
}
Yeni Bir Özellik: #[\Override]
PHP’de arayüzleri uygularken (implementing interfaces) arayüzdeki yöntemler için detaylı işlevsellik sağlarız. Bir sınıfın örneğini (instance of class) oluştururken aynı isme ve uyumlu imzaya sahip alternatif bir sürüm oluşturarak ana yöntemi geçersiz kılabiliriz (override a parent method). Bu durum yazılımda büyük sorunlar ayol açabilir. Kısaca, sorun ana yöntemi gözden kaçan küçük bir yazım hatası (typo) sonucu geçersiz kıldığımızı sanmamız.
PHP 8.3 #[\Override] özelliği (attribute) bu sorun için çözüm sunar. Şimdi örnekte bunu görelim.
class A {
protected function myOverrideFunc(): void {}
// Doğru kullanım
// Bu örnek çalışacak
// Üstteki sınıfta ilgili method var ve geçersiz kılındı
class B extends A {
#[\Override]
public function myOverrideFunc(): void {}
// Hatalı kullanım
// Bu örnek çalışmayacak, çünkü ana sınıfta method yok
// Muhtemelen gözden kaçan bir yazım hatası
class C extends A {
#[\Override]
public function myOverrideFunction(): void {}
}
readonly Özelliklerinin Derin Klonlanması
PHP, bireysel sınıf özelliklerini (ndividual class properties) PHP 8.1’de readonly şeklinde bildirme, PHP 8.2’de ise bunu tüm sınıfa atama imkanı sundu. Fakat web geliştiricilerin (web developer) çoğu bu tür özellikleri içeren sınıflarla çalışırken uygulanan limitlemelerin programlama mantığında pratikliğin önüne geçtiğini düşünüyordu.
Bunu değiştirmek için RFC ile iki ana öneride bulunuldu:
readonly
readonly
sınıfların genişletilmesine izin verilmeyen sınıflara izin vermekreadonly
klonlama sırasında özelliklerin yeniden başlatılmasına izin vermek
2.ci öneri PHP 8.3’te yer buldu. PHP 8.3’e eklenen bu yeni yaklaşım, readonly
özelliklerine sahip bir sınıfın örneklerinin (instances of a class with readonly
properties) __clone
sihirli metotuyla (magic method) yeniden başlatılmasına olanak sağlar.
RFC’deki bu kod örneği, bu yeni metotun nasıl çalıştığını anlamamıza yardımcı olabilir:
Sınıf Sabitlerinin ve Sayılama Üyelerinin Dinamik Getirilmesi (Dynamic Fetching of Class Constants and Enum Members)
PHP’deki diğer özelliklerden farklı olarak, sınıf sabitlerini (class constants) ve sayılama üyelerini (enum members) değişken isimleriyle çekmek biraz daha karmaşıktır. PHP 8.3’ten önce bunu aşağıdaki örnekteki gibi yapabiliyorduk:
class Foo {
public function __construct(
public readonly DateTime $bar,
public readonly DateTime $baz
) {}
public function __clone() {
// Klon çağrıldığında $bar yeni bir DateTime alacak
$this->bar = clone $this->bar;
// Ardından bu metod çağrılacak
$this->cloneBaz();
}
private function cloneBaz() {
// Bu __clone içinden çağrıldığından dolayı doğru bir kullanımdır
unset($this->baz);
}
}
$foo = new Foo(new DateTime(), new DateTime());
$foo2 = clone $foo;
class MyClass {
public const THE_CONST = 9;
}
enum MyEnum: int {
case FirstMember = 9;
case SecondMember = 10;
}
$constantName = 'THE_CONST';
$memberName = 'FirstMember';
echo constant('MyClass::' . $constantName);
echo constant('MyEnum::' . #memberName)->value;
Şimdi PHP 8.3’te üstteki örnekteki sınıf ve enum tanımlamalarını kullanarak değerleri alalım:
$constantName = 'THE_CONST';
$memberName = 'FirstNumber';
echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;
Yeni Bir Metod: getBytesFromString()
PHP 8.3’te eklenen özellikler arasında en beklenmeyen olanı bu metod idi diyebiliriz: Önceden onaylanmış bir karakter koleksiyonunu (pre-approved collection of characters) kullanarak rastgele metin oluşturmak.
Bu yeni yöntem çok basit ve net. Kaynak olarak bazı karakterleri metota veririz ve bunlardan kaç tanesini kullanmak istediğimizi belirtiriz. Hepsi bu kadar! Artık metotumuz belirtilen uzunluğa ulaşana kadar rastgele karakterler ile sonuç döndürecek. Şimdi bunu bir örnekle netleştirelim
$generateRandomString = new Random\Randomizer();
$allowedChars = 'ABCDEFGHJKMNPQRSTVWXYZ';
$generateRandomString->getBytesFromString($allowedChars, 6) // "MBDSFD" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 6) // "DJSDKA" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 4) // "SDLA" - rastgele gelen veri
Çıktının belirttiğimiz karakterlerin toplam uzunluğundan daha uzun olması mümkün. Aşağıdaki örnekte bunu gerçekleştirdik:
$generateRandomString = new Random\Randomizer();
$allowedChars = '123456';
$generateRandomString->getBytesFromString($allowedChars, 8) // "47384252" - rastgele gelen veri
Parametre olarak verdiğimiz karakterlerin hepsinin farklı olması halinde hangisinin seçileceği olasılığı eşittir. Ancak desteklenen karakter listemize aynı karakterden birden fazla ekleyerek çıktıda daha fazla görünmesini sağlayabiliriz. Bir sonraki örnekte bunu gösterdik.
$generateRandomString = new Random\Randomizer();
$allowedChars = 'AAAAA12345';
$generateRandomString->getBytesFromString($allowedChars, 5) // "4AA12" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 8) // "38A19AA5" - rastgele gelen veri
Yeni Metotlar: getFloat() ve nextFloat()
PHP 8.3 sunduğu bu yenilikte PHP’nin random uzantısını (extension) genişleten iki yeni metot sunar: getFloat() ve nextFloat().
Bu metotlarla alakalı bir örnek:
$generateRandomNumber = new Random\Randomizer();
// Rastgele ondalıklı (float) bir rakam oluştur
// Değer 0 ile 5 arasında olsun
$generateRandomNumber->getFloat(0,5); // 2.483929 - rastgele gelen veri
// 0 ile 1 arasında rastgele ondalıklı bir rakam oluştur
$generateRandomNumber->nextFloat(); // 0.4828258 rastgele gelen veri
PHP 8.3'teki Küçük Yenilik ve Geliştirmeler
PHP 8.3’te üstteki yeniliklerin yanı sıra onlarca farklı küçük çaplı geliştirme ve yenilik daha var. Bunları aşağıdaki listede kaynak dökümanlarıyla beraber sıraladık.
- DOMElement sınıfı (class) için yeni metotlar (method):
DOMElement::getAttributeNames()
,DOMElement::insertAdjacentElement()
,DOMElement::insertAdjacentText()
,DOMElement::toggleAttribute()
,DOMNode::contains()
,DOMNode::getRootNode()
,DOMNode::isEqualNode()
DOMNameSpaceNode::contains() veMParentNode::replaceChildren()
. - IntlCalendar sınıfı için yeni metotlar:
IntlCalendar::setDate()
,IntlCalendar::setDateTime()
,IntlGregorianCalendar::createFromDate()
veIntlGregorianCalendar::createFromDateTime()
. - Yeni LDAP işlevleri (functions): ldap_connect_wallet() ve ldap_exop_sync().
- Yeni
mb_str_pad()
çok baytlı dize işlevi (multi-byte string function). - Yeni POSIX işlevleri:
posix_sysconf()
,posix_pathconf()
,posix_fpathconf()
veposix_eaccess()
. - Yeni metot:
ReflectionMethod::createFromMethodName()
- Yeni soket işlevi (socket function):
socket_atmark()
. - Yeni string (metin) işlevleri:
str_increment()
,str_decrement()
, vestream_context_set_options()
. - Yeni ZipArchive sınıfı metotu:
ZipArchive::getArchiveFlag()
. - İzin verilen maksimum yığın boyutunu (max allowed stack size) ayarlamak için yeni php.ini ayarı:
zend.max_allowed_stack_size
.
PHP 8.3'te Kullanımdan Kaldırılanlar
PHP’nin her yeni sürümünde, bazı kodlar kullanımdan kaldırılmak üzere işaretlenir. Bu özellikler tamamen kullanımdan kaldırılınca kullanılması asla önerilmez. Kullanımdan kaldırılan bir kodun kullanılması halinde kod yürütüldüğünde bir hata mesajı döndürülür.
PHP 8.3’teki kullanımdan kaldırılanların listesi:
- U_MULTIPLE_DECIMAL_SEPARATORS sabiti (constant) kullanımdan kaldırıldı.
- Mt19937
3MT_RAND_PHP
çeşidi (variant) kullanımdan kaldırıldı. ReflectionClass::getStaticProperties()
artık null olamaz (no longer nullable).- PHP.ini ayarları
assert.active
,assert.bail
,assert.callback
,assert.exception
veassert.warning
kullanımdan kaldırıldı. get_class()
veget_parent_class()
kullanımdan kaldırıldı.
PHP 8.3
Bu yazıda PHP 8.3’taki önemli değişiklikleri ve yenilikleri inceledik. PHP 8.3 sürümündeki tüm değişikliklerin daha ayrıntılı listesi için resmi değişiklik günlüğünü (official changelog) incelemenizi öneririz. Kodlarınızı veya sitenizi PHP 8.2’den PHP 8.3’e yükseltmek istiyorsanız bu rehber işinize yarayabilir: PHP 8.3’e Geçiş Rehberi -> https://www.php.net/manual/en/migration83.php
Eğer PHP sürümleri ve geçiş hakkında endişeliyseniz, PHP 8.3’e geçmek için yeni sürüme biraz zaman tanımanızı öneririz.
Onur Özden Web Çözümleri olarak PHP ve JavaScript dilleri ve alakalı teknolojiler kapsamında tam kapsamlı Web Yazılım hizmetleri sunuyoruz. Bir sorunuz veya talebiniz varsa, teklif almak için sol alttaki Whatsapp butonundan bize hızlı bir şekilde ulaşabilirsiniz.