PHP 8.3, planlandığı gibi 23 Kasım’da piyasaya sürüldü ve PHP 8.2’nin piyasaya sürülmesinden bu yana birçok yeni özellik ve iyileştirmeyi bünyesinde barındırıyor . Her ne kadar resmi olarak küçük bir sürüm olarak kabul edilse de, 8.3’teki bazı değişiklikler PHP ile çalışmanızı doğrudan etkileyebilir; belki daha hızlı ve daha az hatayla kod yazmanıza yardımcı olabilir.
Gelin hemen konuya dalalım ve bu son sürümle birlikte gelen büyük (ve bazen o kadar da büyük olmayan) değişikliklere bakalım.
PHP 8.3’teki Yeni Özellikler ve İyileştirmeler
Başlıkların çoğunu kaplayan PHP 8.3 özelliklerini keşfederek başlayalım.
- Yazılan Sınıf Sabitleri
- Yeni Bir json_validate() İşlevi
- Salt okunur Özelliklerin Derin Klonlanması
- Yeni #[\Geçersiz Kıl] Özelliği
- Sınıf Sabitlerinin ve Enum Üyelerinin Dinamik Getirilmesi
- Yeni getBytesFromString() Yöntemi
- Yeni getFloat() ve nextFloat() Yöntemleri
Yazılan Sınıf Sabitleri
Sınıf özellikleri için tür bildirme yeteneği PHP 7.4’ten beri bizim için mevcuttur . Bununla birlikte, yıllar içinde PHP yazımında yapılan çok sayıda ince ayara rağmen, şimdiye kadar sabitlere kadar genişletilmedi.
Sınıf sabitleri (aynı zamanda arayüz, özellik ve numaralandırma sabitlerini de içerir) PHP 8.3’te yazılabilir, bu da geliştiricilerin bir sabitin ilk bildiriminin ardındaki amaçtan sapma olasılığını azaltır.
İşte bir arayüz kullanan temel bir örnek:
// Legal:
interface ConstTest {
// Declared type and value are both strings
const string VERSION = "PHP 8.3";
}
// Illegal:
interface ConstTest {
// Type and value mismatch in this initial declaration
const float VERSION = "PHP 8.3";
}
Yazılan sınıf sabitlerinin gerçek değeri, temel bildirimlerden türetilen sınıflarda çalışırken ortaya çıkar. Bir alt sınıf sıklıkla bir sabite yeni bir değer atayabilirken, PHP 8.3, türünün kazara değiştirilmesini ve böylece ilk bildirimle uyumsuz hale gelmesini önlemeye yardımcı olabilir:
class ConstTest {
const string VERSION = "PHP 8.2";
}
class MyConstTest extends ConstTest {
// Legal:
// It's OK to change the value of VERSION here
const string VERSION = "PHP 8.3";
// Illegal:
// Type must be declared if it was specified in the base class
const VERSION = "PHP 8.3";
// Illegal:
// In this case, we can't change the type declared in the
// base class, even if the new type and its value are compatible.
const float VERSION = 8.3;
}
Bir sınıf sabitine atanan türün, birden fazla tür “daraltıldığında” veya başka şekilde uyumlu bir tür kullanıldığında değişebileceğini unutmayın:
class ConstTest {
const string|float VERSION = "PHP 8.2";
}
class MyConstTest extends ConstTest {
// Legal:
// Here, it's OK to narrow the type declaration to string or float
const string VERSION = "PHP 8.3";
const float VERSION = 8.3;
// Legal:
// Value could be an int, but it's compatible with float
const float VERSION = 8;
// Illegal:
// We can't widen the type options here to include int
const string|float|int VERSION = 8;
}
Dönüş değerleri doğrulanırken diğer özellikler için iki tür desteklenir – void
ve never
– sınıf sabiti türleri olarak desteklenmez.
Yeni Bir json_validate()
Fonksiyon
JSON kodlu verilerle çalışırken, onunla bir şey yapmaya çalışmadan önce veri yükünün sözdizimsel olarak geçerli olup olmadığını bilmek güzel bir şey.
PHP’nin önceki sürümlerinde, geliştiriciler bu işlevi kullanmış json_decode()
ve bu işlev JSON verilerini ilişkisel dizilere veya nesnelere dönüştürmeye çalışırken hataları kontrol etmişti. PHP 8.3’ün yeni json_validate()
işlevi, bu dizi veya nesne yapılarını oluşturmak için gereken tüm belleği kullanmadan hata kontrolünü yapar.
Yani geçmişte bir JSON yükünü şöyle doğrulamış olabilirsiniz:
$obj = json_decode($maybeJSON);
if (json_last_error() === JSON_ERROR_NONE) {
// Probably do something with $obj
}
Yukarıdaki örnekte hemen bir şey yapmayacaksanız $obj
, bu yalnızca orijinal JSON yükünün geçerliliğini doğrulamak için kullanılan çok sayıda kaynak anlamına gelir. PHP 8.3’te şöyle bir şey yapabilir ve biraz hafıza ayırabilirsiniz:
if (json_validate($maybeJSON)) {
// Do something with $maybeJSON
}
Not: Zaten decode’un bellek kaynaklarını kullanarak json_validate()
verileri kullanmak ve ardından hemen üzerinden çalıştırmak pek mantıklı değildir . json_decode()
JSON’u bir yere saklamadan veya istek yanıtı olarak teslim etmeden önce doğrulamak için yeni işlevi kullanma olasılığınız daha yüksektir.
readonly
Özelliklerin Derin Klonlanması
Bireysel sınıf özelliklerini PHP 8.1’dereadonly
görüldüğü gibi bildirme yeteneği . PHP 8.2, bu niteliği tüm sınıfa atama olanağını sundu . Ancak birçok geliştirici, bu tür özellikleri içeren sınıflarla çalışırken uygulanan kısıtlamaların yararlı programlamanın önüne geçtiğini hissetti.
Davranışı değiştirmekreadonly
için bir RFC iki öneride bulundu:
readonly
Sınıfların genişletilmesine izin verilmeyen sınıflara izin verreadonly
Klonlama sırasında özelliklerin yeniden başlatılmasına izin ver
Bu, PHP 8.3’e giren ikinci öneridir. Yeni yaklaşım, readonly
özelliklere sahip bir sınıfın örneklerinin sihirli yöntem içinde yeniden başlatılmasına olanak tanır __clone
(içinden çağrılan via işlevleri dahil __clone
).
RFC’deki bu kod örneği, nasıl çalıştığını gösterir:
class Foo {
public function __construct(
public readonly DateTime $bar,
public readonly DateTime $baz
) {}
public function __clone() {
// $bar will get a new DateTime when clone is invoked
$this->bar = clone $this->bar;
// And this function will be called
$this->cloneBaz();
}
private function cloneBaz() {
// This is legal when called from within __clone
unset($this->baz);
}
}
$foo = new Foo(new DateTime(), new DateTime());
$foo2 = clone $foo;
Yeni #[\Override]
Özellik
PHP’de arayüzleri uygularken, programcılar bu arayüzlerde adı geçen yöntemler için ayrıntılı işlevsellik sağlarlar. Bir sınıfın bir örneğini oluştururken programcılar, alt öğede aynı ada ve uyumlu bir imzaya sahip alternatif bir sürüm oluşturarak bir ana yöntemi geçersiz kılabilir.
Sorunlardan biri, programcıların bir arayüz yöntemi uyguladıklarını veya uygulamadıkları halde bir ana yöntemi geçersiz kıldıklarını düşünmeleridir . Alt sınıf yönteminin adındaki bir yazım hatası nedeniyle veya yöntemlerin ana kodda kaldırılması veya yeniden adlandırılması nedeniyle tamamen ayrı bir canavar yaratıyor olabilirler.
PHP 8.3, #[\Override]
programcıların bir yöntemin kod içinde bir kökene sahip olması gerektiğini açıkça belirtmelerine yardımcı olacak özelliği sunar.
İşte temel bir örnek:
class A {
protected function ovrTest(): void {}
}
// This will work because ovrTest()
// can be found in the parent class
class B extends A {
#[\Override]
public function ovrTest(): void {}
}
// This will fail because ovrBest()
// (probably a typo) is not in the parent
class C extends A {
#[\Override]
public function ovrBest(): void {}
}
Sınıf Sabitlerinin ve Enum Üyelerinin Dinamik Getirilmesi
PHP kodundaki diğer özelliklerden farklı olarak, sınıf sabitlerini ve değişken adlarıyla Enum üyelerini getirmek biraz karmaşıktır. PHP 8.3’ten önce bunu constant()
aşağıdaki gibi işlevi kullanarak yapabilirdiniz :
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, yukarıdaki aynı sınıf ve Enum tanımlarını kullanarak, PHP 8.3’ün sabitleri dinamik olarak getirmesiyle aynı sonucu elde edebilirsiniz :
$constantName = 'THE_CONST';
$memberName = 'FirstMember';
echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;
Yeni getBytesFromString()
Yöntem
Hiç önceden onaylanmış bir karakter koleksiyonunu kullanarak rastgele dizeler oluşturmak istediniz mi? getBytesFromString()
PHP 8.3’te Random eklentisine eklenen yöntemle artık bunu kolaylıkla yapabilirsiniz .
Bu yeni yöntem basittir: kaynak malzeme olarak bir dizi karakter iletirsiniz ve bunlardan kaç tanesini kullanmak istediğinizi belirtirsiniz. Yöntem daha sonra dizeden belirtilen uzunluğa ulaşana kadar rastgele bayt seçecektir.
İşte basit bir örnek:
$rando = new Random\Randomizer();
$alpha = 'ABCDEFGHJKMNPQRSTVWXYZ';
$rando->getBytesFromString($alpha, 6); // "MBXGWL"
$rando->getBytesFromString($alpha, 6); // "LESPMG"
$rando->getBytesFromString($alpha, 6); // "NVHWXC"
Rastgele çıktının istenen uzunluğunun giriş dizesinden daha fazla bayta sahip olması mümkündür:
$rando = new Random\Randomizer();
$nums = '123456';
$rando->getBytesFromString($nums, 10); // "2526341615"
Benzersiz karakterlerden oluşan bir giriş dizisiyle, her birinin rastgele sonuç için seçilme şansı eşittir. Ancak karakterler, girdide diğerlerinden daha sık görünmeleri sağlanarak ağırlıklandırılabilir. Örneğin:
$rando = new Random\Randomizer();
$weighted = 'AAAAA12345';
$rando->getBytesFromString($weighted, 5); // "1AA53"
$rando->getBytesFromString($weighted, 10); // "42A5A1AA3A"
Yeni getFloat()
ve nextFloat()
Yöntemler
Ayrıca Random eklentisini genişleten PHP 8.3, rastgele kayan değer değerleri oluşturmak için iki yeni yöntem sunar: getFloat()
ve nextFloat()
.
İşte bir örnek:
$rando = new Random\Randomizer();
// Generate a float value between a minimum
// value of 0 and a maximum value of 5
$rando->getFloat(0,5); // 2.3937446906217
Yöntem getFloat()
ayrıca minimum ve maksimum değerlerden sonra üçüncü bir parametreyi de kabul eder. Bir Random\IntervalBoundary Enum kullanarak, min ve max değerlerinin fonksiyon tarafından döndürülüp döndürülemeyeceği belirlenebilir.
İşte kurallar:
- IntervalBoundary::ClosedOpen: min değeri döndürülebilir, ancak max değeri döndürülemez
- IntervalBoundary::ClosedClosed: hem minimum hem de maksimum döndürülebilir
- IntervalBoundary::OpenClosed: min değeri döndürülmeyebilir, max değeri döndürülemez
- IntervalBoundary::OpenOpen: ne minimum ne de maksimum döndürülemez
getFloat()
Enum’u üçüncü parametre olarak belirtmeden kullanıldığında varsayılan değer IntervalBoundary::ClosedOpen’dır .
Yeni işlev için belgelerde sağlanan yararlı bir örnek , rastgele boylam ve enlem koordinatları oluşturur; burada enlemler -90 ve 90’ı içerebilir, ancak boylam hem -180 hem de 180’i içeremez (aynı oldukları için):
$rando = new Random\Randomizer();
printf(
"Lat: %+.6f Long: %+.6f",
$rando->getFloat(-90, 90, \Random\IntervalBoundary::ClosedClosed),
// -180 will not be used
$rando->getFloat(-180, 180, \Random\IntervalBoundary::OpenClosed),
);
Yeni yöntem aslında 0’dan 1’e kadar değişen rastgele bir değer istemek için nextFloat()
kullanılan yöntemle aynıdır :getFloat()
$rando = new Random\Randomizer();
$rando->nextFloat(); // 0.3767414902847
PHP 8.3’teki Diğer Küçük Değişiklikler
PHP 8.3 ayrıca bir dizi başka yeni işlev ve küçük değişiklikler içerir. Aşağıda ek kaynaklara (varsa) bağlantılarla birlikte bunlardan bahsedeceğiz:
- DOMElement sınıfı için yeni yöntemler:
- IntlCalendar sınıfı için yeni yöntemler:
- Yeni LDAP işlevleri: ldap_connect_wallet() ve ldap_exop_sync().
- Yeni
mb_str_pad()
çok baytlı dize işlevi. - Yeni POSIX işlevleri:
posix_sysconf()
,posix_pathconf()
,posix_fpathconf()
veposix_eaccess()
. - Yeni
ReflectionMethod::createFromMethodName()
yöntem. - Yeni soket işlevi:
socket_atmark()
. - Yeni dize işlevleri:
str_increment()
,str_decrement()
, vestream_context_set_options()
. - Yeni ZipArchive sınıfı yöntemi:
ZipArchive::getArchiveFlag()
. - İzin verilen maksimum yığın boyutunu ayarlamak için yeni INI ayarı:
zend.max_allowed_stack_size
.
PHP 8.3’teki kullanımdan kaldırmalar
PHP’nin her yeni sürümünde, bazı işlevler ve ayarlar sonunda kaldırılmak üzere işaretlenir. Bu özellikler kullanımdan kaldırıldıktan sonra sürekli kullanım için önerilmez ve kod yürütülürken göründüklerinde birçok günlükte bildirim oluşturur.
Ek bilgilere bağlantılarla birlikte PHP 8.3’teki kullanımdan kaldırılanların bir listesi:
- U_MULTIPLE_DECIMAL_SEPARATORS sabiti, U_MULTIPLE_DECIMAL_SEPARATORS lehine kullanımdan kaldırıldı.
- Mt19937
3MT_RAND_PHP
çeşidi kullanımdan kaldırıldı. ReflectionClass::getStaticProperties()
artık null olamaz.- INI ayarları
assert.active
,assert.bail
,assert.callback
,assert.exception
veassert.warning
kullanımdan kaldırıldı. - Arama
get_class()
veget_parent_class()
tartışma olmadan kullanımdan kaldırıldı.
İlginizi çekebilir
https://blog.verilink.com.tr/php_functions-nasil-devre-disi-birakilir-etkinlestirilir/