PHP 8.3: Yenilikler ve Son Sürümde Neler Değişti?

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.

  1. Yazılan Sınıf Sabitleri
  2. Yeni Bir json_validate() İşlevi
  3. Salt okunur Özelliklerin Derin Klonlanması
  4. Yeni #[\Geçersiz Kıl] Özelliği
  5. Sınıf Sabitlerinin ve Enum Üyelerinin Dinamik Getirilmesi
  6. Yeni getBytesFromString() Yöntemi
  7. 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 – voidve 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:

  1. readonlySınıfların genişletilmesine izin verilmeyen sınıflara izin ver
  2. readonlyKlonlama 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:

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:

İlginizi çekebilir

https://blog.verilink.com.tr/php_functions-nasil-devre-disi-birakilir-etkinlestirilir/

0 Shares:
Ayrıca beğenebilirsiniz
Devamını Oku

İframe Nedir?

iFrame, “inline frame” kelimelerinin kısaltması olan ve bir web sayfasının içerisine başka bir web sayfasını veya farklı bir…
Devamını Oku

Mod Security Nedir ?

ModSecurity, web uygulamalarının güvenliğini sağlamak için kullanılan bir açık kaynak kodlu bir web uygulama güvenlik modülüdür. ModSecurity, HTTP…