Η PHP είναι μια γλώσσα δέσμης ενεργειών που χρησιμοποιείται από μεγάλο αριθμό χρηστών για σκοπούς ανάπτυξης Ιστού. Η τελευταία σταθερή και ενημερωμένη έκδοση της PHP, 8.3, κυκλοφόρησε στις 23.11.2023. Υπήρξαν πολλές καινοτομίες και αλλαγές από την PHP 3.x, που κυκλοφόρησε το 2000. Η PHP εξακολουθεί να είναι μια από τις πιο δημοφιλείς γλώσσες ανάπτυξης ιστοσελίδων (web design) που χρησιμοποιούνται από πολύ μεγάλο κοινό. Σε αυτό το άρθρο, θα εξετάσουμε και θα αναλύσουμε τις καινοτομίες και τις αλλαγές στην PHP 8.3 με παραδείγματα κώδικα.

PHP 8.3 Σημαντικές νέες δυνατότητες και βελτιώσεις

Υπάρχουν πολλές σημαντικές καινοτομίες και βελτιώσεις στην PHP 8.3 σε σύγκριση με την προηγούμενη έκδοση PHP, PHP 8.2. Ταυτόχρονα, ορισμένες λειτουργίες έχουν καταργηθεί. Θα εξετάσουμε τώρα τις καινοτομίες και τις βελτιώσεις μία προς μία με παραδείγματα κώδικα.

Δακτυλογραφημένες σταθερές τάξης

Η δήλωση τύπου είναι ένα πολύ σημαντικό χαρακτηριστικό για τους προγραμματιστές που αυξάνει τη σταθερότητα και μειώνει τα ποσοστά σφαλμάτων στην ανάπτυξη ιστού. Η δυνατότητα δήλωσης τύπου για ιδιότητες σε μια κλάση προστέθηκε στην PHP 7.4. Αν και έγιναν πολλές βελτιώσεις σε αυτό το χαρακτηριστικό σε μεταγενέστερες εκδόσεις, αυτή η δυνατότητα δεν ήταν ακόμα διαθέσιμη για σταθερές στην κατηγορία. Με την PHP 8.3, είναι πλέον δυνατή η δήλωση τύπων για σταθερές σε κλάσεις.

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

Ορισμένες δηλώσεις τύπου δεν υποστηρίζονται για σταθερές κλάσης.

Μη υποστηριζόμενες δηλώσεις τύπου για σταθερές κλάσης: void, callable, never

Μια νέα συνάρτηση: json_validate()

Όταν εργαζόμαστε με δεδομένα σε μορφή JSON (δεδομένα με κωδικοποίηση json), πρέπει να επαληθεύσουμε ότι τα εισερχόμενα δεδομένα είναι έγκυρα πριν χρησιμοποιήσουμε τα δεδομένα. Το κάναμε αυτό σε εκδόσεις πριν από την PHP 8.3 χρησιμοποιώντας τις ακόλουθες ή παρόμοιες μεθόδους.

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

Σε αυτό το παλιό παράδειγμα, κατά την επικύρωση δεδομένων JSON, η PHP μπορεί να καταναλώσει σημαντική μνήμη, ανάλογα με το μέγεθος των δεδομένων. Στην PHP 8.3, προστέθηκε μια νέα συνάρτηση PHP που δημιουργεί μια γρήγορη λύση προσανατολισμένη στην απόδοση: json_validate(). Παραθέτουμε το σενάριο χρήσης αυτής της συνάρτησης παρακάτω.

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

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

Ένα νέο χαρακτηριστικό: #[Παράκαμψη]

Κατά την υλοποίηση διεπαφών στην PHP, παρέχουμε λεπτομερή λειτουργικότητα για τις μεθόδους στη διεπαφή. Κατά τη δημιουργία μιας παρουσίας μιας κλάσης, μπορούμε να παρακάμψουμε μια γονική μέθοδο δημιουργώντας μια εναλλακτική έκδοση με το ίδιο όνομα και συμβατή υπογραφή. Αυτό μπορεί να προκαλέσει μεγάλα προβλήματα στο λογισμικό. Εν ολίγοις, το πρόβλημα είναι ότι πιστεύουμε ότι έχουμε παρακάμψει την κύρια μέθοδο ως αποτέλεσμα ενός μικρού τυπογραφικού λάθους που αγνοήθηκε.

Η δυνατότητα PHP 8.3 #[Override] παρέχει μια λύση για αυτό το πρόβλημα. Τώρα ας το δούμε αυτό στο παράδειγμα.

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

Βαθιά κλωνοποίηση Ιδιοτήτων μόνο για ανάγνωση

Η PHP εισήγαγε τη δυνατότητα δήλωσης μεμονωμένων ιδιοτήτων κλάσης ως μόνο για ανάγνωση στην PHP 8.1 και εκχώρησης τους σε ολόκληρη την κλάση στην PHP 8.2. Ωστόσο, οι περισσότεροι προγραμματιστές ιστού θεώρησαν ότι οι περιορισμοί που επιβάλλονται κατά την εργασία με κλάσεις που περιέχουν τέτοιες δυνατότητες εμπόδιζαν την πρακτικότητα στη λογική προγραμματισμού.

Για να αλλάξει αυτό RFC Έγιναν δύο βασικές συστάσεις:

μόνο για ανάγνωση

  1. readonly επιτρέποντας την παράταση τάξεων που δεν επιτρέπεται
  2. readonly επιτρέποντας την επανεκκίνηση των χαρακτηριστικών κατά την κλωνοποίηση

Η δεύτερη πρόταση συμπεριλήφθηκε στην PHP 8.3. Αυτή η νέα προσέγγιση προστέθηκε στην PHP 8.3 readonly στιγμιότυπα μιας κλάσης με ιδιότητεςreadonly ιδιότητες) __clone Επιτρέπει την επανεκκίνηση με τη μαγική του μέθοδο.

Αυτό το παράδειγμα κώδικα από το RFC μπορεί να μας βοηθήσει να κατανοήσουμε πώς λειτουργεί αυτή η νέα μέθοδος:

Δυναμική Ανάκτηση Σταθερών Τάξης και Αριθμών Μελών

Σε αντίθεση με άλλες δυνατότητες στην PHP, η σύλληψη σταθερών κλάσεων και μελών enum με ονόματα μεταβλητών είναι λίγο πιο περίπλοκη. Πριν από την PHP 8.3 θα μπορούσαμε να το κάνουμε όπως το παρακάτω παράδειγμα:

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;

Τώρα, ας πάρουμε τις τιμές χρησιμοποιώντας τους ορισμούς κλάσης και enum στο παραπάνω παράδειγμα στην PHP 8.3:

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

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

Μια νέα μέθοδος: getBytesFromString()

Μπορούμε να πούμε ότι αυτή η μέθοδος ήταν η πιο απροσδόκητη από τις δυνατότητες που προστέθηκαν στην PHP 8.3: Δημιουργία τυχαίου κειμένου χρησιμοποιώντας μια προεγκεκριμένη συλλογή χαρακτήρων.

Αυτή η νέα μέθοδος είναι πολύ απλή και ξεκάθαρη. Δίνουμε μερικούς χαρακτήρες στη μέθοδο ως πόρους και καθορίζουμε πόσους από αυτούς θέλουμε να χρησιμοποιήσουμε. Αυτό είναι όλο! Τώρα η μέθοδός μας θα επιστρέψει αποτελέσματα με τυχαίους χαρακτήρες μέχρι να φτάσει το καθορισμένο μήκος. Τώρα ας το διευκρινίσουμε αυτό με ένα παράδειγμα

$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

Είναι δυνατό η έξοδος να είναι μεγαλύτερη από το συνολικό μήκος των χαρακτήρων που καθορίσαμε. Το κάναμε στο παρακάτω παράδειγμα:

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

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

Αν όλοι οι χαρακτήρες που δίνουμε ως παράμετροι είναι διαφορετικοί, η πιθανότητα για ποιον θα επιλεγεί είναι ίση. Ωστόσο, μπορούμε να κάνουμε περισσότερους από τον ίδιο χαρακτήρα να εμφανίζονται στην έξοδο προσθέτοντας περισσότερους από έναν ίδιους χαρακτήρες στη λίστα υποστηριζόμενων χαρακτήρων μας. Αυτό το δείξαμε στο επόμενο παράδειγμα.

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

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

Νέες μέθοδοι: getFloat() και nextFloat()

Σε αυτήν την καινοτομία, η PHP 8.3 εισάγει δύο νέες μεθόδους που επεκτείνουν την τυχαία επέκταση της PHP: getFloat() και nextFloat().

Ένα παράδειγμα αυτών των μεθόδων:

$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

Εκτός από τις παραπάνω καινοτομίες, η PHP 8.3 έχει δεκάδες άλλες βελτιώσεις και καινοτομίες μικρής κλίμακας. Τα έχουμε παραθέσει μαζί με τα έγγραφα πηγής τους στην παρακάτω λίστα.

Καταργήθηκε στην PHP 8.3

Με κάθε νέα έκδοση της PHP, κάποιος κώδικας επισημαίνεται για κατάργηση. Δεν συνιστάται ποτέ να χρησιμοποιείτε αυτές τις λειτουργίες αφού καταργηθούν πλήρως. Εάν χρησιμοποιείται καταργημένος κώδικας, θα επιστραφεί ένα μήνυμα σφάλματος όταν εκτελεστεί ο κώδικας.

Λίστα καταργήσεων στην PHP 8.3:

PHP 8.3

Σε αυτό το άρθρο, εξετάσαμε τις σημαντικές αλλαγές και καινοτομίες στην PHP 8.3. Για μια πιο λεπτομερή λίστα όλων των αλλαγών στην PHP 8.3 επίσημο ημερολόγιο αλλαγών Σας συνιστούμε να το αναθεωρήσετε. Εάν θέλετε να αναβαθμίσετε τους κωδικούς ή τον ιστότοπό σας από PHP 8.2 σε PHP 8.3, αυτός ο οδηγός μπορεί να είναι χρήσιμος: PHP 8.3 Migration Guide -> https://www.php.net/manual/en/migration83.php

Εάν ανησυχείτε για τις εκδόσεις PHP και τη μετεγκατάσταση, συνιστούμε να δώσετε στη νέα έκδοση λίγο χρόνο για αναβάθμιση σε PHP 8.3.

Πλήρης κάλυψη PHP και JavaScript γλωσσών και σχετικών τεχνολογιών ως Onur Özden Web Çözümleri Λογισμικό Ιστού Προσφέρουμε υπηρεσίες.  Εάν έχετε μια ερώτηση ή αίτημα, μπορείτε να επικοινωνήσετε γρήγορα μαζί μας μέσω του κουμπιού Whatsapp κάτω αριστερά για να λάβετε μια προσφορά.