PHP is een scripttaal die door een groot aantal gebruikers wordt gebruikt voor webontwikkelingsdoeleinden. De nieuwste stabiele en bijgewerkte versie van PHP, 8.3, werd uitgebracht op 23.11.2023. Er zijn veel innovaties en veranderingen geweest sinds PHP 3.x, uitgebracht in 2000. PHP is nog steeds een van de meest populaire webontwikkelingstalen (webdesign) die door een zeer groot publiek worden gebruikt. In dit artikel zullen we de innovaties en veranderingen in PHP 8.3 onderzoeken en analyseren met codevoorbeelden.

PHP 8.3 Belangrijke nieuwe functies en verbeteringen

Er zijn veel belangrijke vernieuwingen en verbeteringen in PHP 8.3 vergeleken met de vorige PHP-versie, PHP 8.2. Tegelijkertijd zijn sommige functies verouderd. We zullen nu de innovaties en verbeteringen één voor één onderzoeken met codevoorbeelden.

Getypte klasseconstanten

Het declareren van het type is een zeer belangrijke functie voor ontwikkelaars die de stabiliteit verhoogt en het foutenpercentage bij webontwikkeling vermindert. Type-declaratiefunctie voor eigenschappen in een klasse is toegevoegd in PHP 7.4. Hoewel er in latere versies veel verbeteringen aan deze functie zijn aangebracht, was deze functie nog steeds niet beschikbaar voor constanten in de klasse. Met PHP 8.3 is het nu mogelijk om typen voor constanten in klassen te declareren.

// 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
}

Sommige typedeclaraties worden niet ondersteund voor klasseconstanten.

Niet-ondersteunde typedeclaraties voor klasseconstanten: void, callable, never

Een nieuwe functie: json_validate()

Wanneer we werken met gegevens in JSON-indeling (json-gecodeerde gegevens), moeten we verifiëren dat de binnenkomende gegevens geldig zijn voordat we de gegevens gebruiken. We deden dit in versies vóór PHP 8.3 met behulp van de volgende of vergelijkbare methoden.

// 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
}

In dit oude voorbeeld kan PHP bij het valideren van JSON-gegevens aanzienlijk geheugen verbruiken, afhankelijk van de grootte van de gegevens. In PHP 8.3 is een nieuwe PHP-functie toegevoegd die een prestatiegerichte snelle oplossing creëert: json_validate(). We hebben hieronder het gebruiksscenario van deze functie geïllustreerd.

// PHP 8.3'te JSON verisini doğrulama
$data = $json_decode($maybeJSON);

if (json_validate($maybeJSON)) {
    // $data ile gerçekleştirilecek işlemler
}

Een nieuwe functie: #[Overschrijven]

Bij het implementeren van interfaces in PHP bieden we gedetailleerde functionaliteit voor de methoden in de interface. Bij het maken van een instantie van een klasse kunnen we een bovenliggende methode overschrijven door een alternatieve versie te maken met dezelfde naam en compatibele handtekening. Dit kan grote problemen in de software veroorzaken. Kortom, het probleem is dat we denken dat we de hoofdmethode hebben overschreven als gevolg van een kleine, over het hoofd geziene typefout.

PHP 8.3 #[Override]-functie biedt een oplossing voor dit probleem. Laten we dit nu in het voorbeeld bekijken.

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 {}
}

Diep klonen van alleen-lezen eigenschappen

PHP introduceerde de mogelijkheid om individuele klasse-eigenschappen als alleen-lezen te declareren in PHP 8.1 en deze toe te wijzen aan de hele klasse in PHP 8.2. De meeste webontwikkelaars waren echter van mening dat de beperkingen die werden opgelegd bij het werken met klassen die dergelijke functies bevatten, de praktische programmeerlogica in de weg stonden.

Om dit te veranderen RFC Er werden twee belangrijke aanbevelingen gedaan:

alleen-lezen

  1. readonly waardoor klassen worden toegestaan die niet mogen worden uitgebreid
  2. readonly waardoor functies opnieuw kunnen worden gestart tijdens het klonen

De tweede suggestie was opgenomen in PHP 8.3. Deze nieuwe aanpak is toegevoegd aan PHP 8.3 readonly instances van een klasse met eigenschappenreadonly eigenschappen) __clone Hiermee kan het opnieuw worden opgestart met zijn magische methode.

Dit codevoorbeeld van de RFC kan ons helpen begrijpen hoe deze nieuwe methode werkt:

Dynamisch ophalen van klasseconstanten en Enum-leden

In tegenstelling tot andere functies in PHP is het vastleggen van klasseconstanten en enum-leden met variabelenamen iets ingewikkelder. Vóór PHP 8.3 konden we dit doen zoals in het onderstaande voorbeeld:

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;

Laten we nu de waarden ophalen met behulp van de klasse- en enum-definities in het bovenstaande voorbeeld in PHP 8.3:

$constantName = 'THE_CONST';
$memberName = 'FirstNumber';

echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;

Een nieuwe methode: getBytesFromString()

We kunnen zeggen dat deze methode de meest onverwachte was van de functies die in PHP 8.3 zijn toegevoegd: het genereren van willekeurige tekst met behulp van een vooraf goedgekeurde verzameling tekens.

Deze nieuwe methode is heel eenvoudig en duidelijk. We geven enkele tekens aan de methode als bronnen en specificeren hoeveel ervan we willen gebruiken. Dat is alles! Nu zal onze methode resultaten retourneren met willekeurige tekens totdat deze de opgegeven lengte bereikt. Laten we dit nu verduidelijken met een voorbeeld

$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

Het is mogelijk dat de uitvoer langer is dan de totale lengte van de tekens die we hebben opgegeven. Dit hebben we gedaan in het onderstaande voorbeeld:

$generateRandomString = new Random\Randomizer();
$allowedChars = '123456';

$generateRandomString->getBytesFromString($allowedChars, 8) // "47384252" - rastgele gelen veri

Als alle karakters die we als parameters opgeven verschillend zijn, is de kans dat er één wordt geselecteerd gelijk. We kunnen echter meer van hetzelfde karakter in de uitvoer laten verschijnen door meer dan één van hetzelfde karakter toe te voegen aan onze lijst met ondersteunde karakters. We hebben dit in het volgende voorbeeld laten zien.

$generateRandomString = new Random\Randomizer();
$allowedChars = 'AAAAA12345';

$generateRandomString->getBytesFromString($allowedChars, 5) // "4AA12" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 8) // "38A19AA5" - rastgele gelen veri

Nieuwe methoden: getFloat() en nextFloat()

Bij deze innovatie introduceert PHP 8.3 twee nieuwe methoden die de willekeurige extensie van PHP uitbreiden: getFloat() en nextFloat().

Een voorbeeld van deze methoden:

$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

Kleine innovaties en verbeteringen in PHP 8.3

Naast bovenstaande innovaties kent PHP 8.3 nog tientallen andere kleinschalige verbeteringen en innovaties. We hebben ze samen met hun brondocumenten in de onderstaande lijst vermeld.

Verouderd in PHP 8.3

Bij elke nieuwe versie van PHP wordt bepaalde code gemarkeerd voor beëindiging. Het wordt nooit aanbevolen om deze functies te gebruiken zodra ze volledig zijn verouderd. Als verouderde code wordt gebruikt, wordt er een foutmelding weergegeven wanneer de code wordt uitgevoerd.

Lijst met beëindigingen in PHP 8.3:

PHP 8.3

In dit artikel hebben we de belangrijke veranderingen en innovaties in PHP 8.3 besproken. Voor een meer gedetailleerd overzicht van alle wijzigingen in PHP 8.3 officiële changelog Wij raden u aan deze te beoordelen. Als u uw codes of site wilt upgraden van PHP 8.2 naar PHP 8.3, kan deze handleiding nuttig zijn: PHP 8.3 Migratiehandleiding -> https://www.php.net/manual/en/migration83.php

Als je je zorgen maakt over PHP-versies en migratie, raden we je aan de nieuwe versie enige tijd te geven om te upgraden naar PHP 8.3.

Volledige dekking van PHP en JavaScript talen en gerelateerde technologieën als Onur Özden Web Çözümleri Websoftware Wij bieden diensten.  Heeft u een vraag of verzoek, dan kunt u via de Whatsapp-knop linksonder snel contact met ons opnemen voor een offerte.