Εν συντομία: Η PHP 8.0 (Νοέμβριος 2020) έφερε ονομασμένα ορίσματα, attributes, union types, match, τον τελεστή nullsafe και έναν μεταγλωττιστή JIT. Ακολούθησαν ετησίως: η 8.1 με enums και fibers, η 8.2 με κλάσεις readonly, η 8.3 με τυποποιημένες σταθερές κλάσεων, η 8.4 με property hooks και η 8.5 με τελεστή pipe και επέκταση URI. Κάθε έκδοση αποσύρει και παλαιότερα στοιχεία. Στην αναβάθμιση μετρούν γι' αυτό οι δοκιμές και για την ασφάλεια μετρά κυρίως η λειτουργία ενός υποστηριζόμενου κλάδου με ενημερωμένο επίπεδο patch.
Τα νέα της PHP 8 με μια ματιά
Ο πίνακας συνοψίζει τα βασικά σημεία των σελίδων εκδόσεων του php.net. Οι ημερομηνίες πρώτης κυκλοφορίας σύμφωνα με το php.net.
| Έκδοση | Κυκλοφόρησε | Σημαντικότερα νέα | Επιλογή αποσύρσεων και ασυμβατοτήτων |
|---|---|---|---|
| 8.0 | 26.11.2020 | ονομασμένα ορίσματα, attributes, Constructor Property Promotion, union types, match, ?->, JIT |
το 0 == 'foobar' είναι πλέον false, σφάλματα τύπων αντί για προειδοποιήσεις |
| 8.1 | 25.11.2021 | enums, ιδιότητες readonly, First-Class Callables strlen(...), new σε αρχικοποιητές, intersection types, never, fibers |
– |
| 8.2 | 08.12.2022 | κλάσεις readonly, τύποι DNF, null/false/true ως τύποι, επέκταση Random, σταθερές σε traits, #[\SensitiveParameter] |
απόσυρση δυναμικών ιδιοτήτων |
| 8.3 | 23.11.2023 | τυποποιημένες σταθερές κλάσεων, #[\Override], json_validate(), mb_str_pad(), php -l για πολλά αρχεία |
– |
| 8.4 | 21.11.2024 | property hooks, ασύμμετρη ορατότητα, #[\Deprecated], νέο API DOM με HTML5, BcMath\Number, array_find(), lazy objects |
απόσυρση παραμέτρων με σιωπηρή δυνατότητα null· IMAP, OCI8, PDO_OCI, pspell στο PECL |
| 8.5 | 20.11.2025 | τελεστής pipe, επέκταση URI, Clone With, #[\NoDiscard], array_first()/array_last() |
απόσυρση του τελεστή backtick, αφαίρεση του disable_classes |
PHP 8.0 και 8.1: το μεγάλο βήμα
Η PHP 8.0 έκανε τη γλώσσα αισθητά αυστηρότερη και πιο εκφραστική. Σύμφωνα με τη σελίδα έκδοσης, οι εσωτερικές συναρτήσεις ρίχνουν πλέον σταθερά TypeError ή ValueError, αντί να εμφανίζουν μόνο προειδοποιήσεις. Οι συγκρίσεις μεταξύ αριθμών και συμβολοσειρών ακολουθούν καθαρότερους κανόνες.
<?php
// PHP 8.0: το match συγκρίνει αυστηρά και δεν χρειάζεται break
$status = 404;
echo match (true) {
$status >= 500 => 'Serverfehler',
$status >= 400 => 'Anfragefehler',
default => 'in Ordnung',
};
// PHP 8.0: τελεστής nullsafe
$land = $bestellung?->kunde?->adresse?->land;
Η PHP 8.1 έφερε enums, δηλαδή τύπους απαρίθμησης με σταθερές τιμές, και ιδιότητες readonly, που μπορούν να οριστούν μόνο μία φορά:
<?php
enum Rolle: string {
case Leser = 'leser';
case Redakteur = 'redakteur';
case Admin = 'admin';
}
final class Benutzer {
public function __construct(
public readonly string $name,
public readonly Rolle $rolle,
) {}
}
$b = new Benutzer('Erika', Rolle::from('redakteur'));
Το Rolle::from() ρίχνει σφάλμα για άγνωστες τιμές. Αυτό εμποδίζει να περάσουν ως ρόλος τυχαίες συμβολοσειρές από φόρμες. Όποιος χρειάζεται αντί για σφάλμα μια κενή τιμή, χρησιμοποιεί το Rolle::tryFrom(), που επιστρέφει null για άγνωστες τιμές.
Νέα στην 8.1 είναι επίσης τα fibers, μια βάση για ταυτόχρονες διαδικασίες, πάνω στην οποία χτίζονται βιβλιοθήκες ασύγχρονης επεξεργασίας. Στην κανονική λειτουργία ενός ιστότοπου δεν γίνονται πολύ αντιληπτά, σε σύγχρονα frameworks και ουρές όμως ναι.
PHP 8.2 και 8.3: τακτοποίηση και ασφάλιση
Η PHP 8.2 απέσυρε τις δυναμικές ιδιότητες. Όποιος αναθέτει σε ένα αντικείμενο μια μη δηλωμένη ιδιότητα, λαμβάνει μια ειδοποίηση· με το #[\AllowDynamicProperties] αυτό μπορεί να επιτραπεί για επιμέρους κλάσεις. Παλαιότερα plugins παράγουν γι' αυτό συχνά πολλά μηνύματα στο log.
Για την ασφάλεια ενδιαφέρουν η νέα επέκταση Random, της οποίας ο προεπιλεγμένος randomizer χρησιμοποιεί σύμφωνα με τη σελίδα έκδοσης κρυπτογραφικά ασφαλή γεννήτρια τυχαίων αριθμών, και το attribute #[\SensitiveParameter], που κρύβει τιμές όπως οι κωδικοί πρόσβασης στα stacktraces. Περισσότερα για ασφαλείς τυχαίες τιμές στη σελίδα Ασφαλείς τυχαίοι αριθμοί και tokens στην PHP.
Η PHP 8.3 πρόσθεσε τυποποιημένες σταθερές κλάσεων, το attribute #[\Override] κατά των τυπογραφικών λαθών στην παράκαμψη μεθόδων και το json_validate(), που ελέγχει JSON χωρίς να το αποκωδικοποιεί πλήρως.
PHP 8.4 και 8.5: σύγχρονα εκφραστικά μέσα
Η PHP 8.4 εισήγαγε property hooks, δηλαδή λογική απευθείας στις ιδιότητες, και ασύμμετρη ορατότητα όπως public private(set). Προστέθηκαν ένα νέο API DOM με υποστήριξη HTML5 και συναρτήσεις όπως array_find(), array_any() και array_all(). Σύμφωνα με τη σελίδα έκδοσης, οι επεκτάσεις IMAP, OCI8, PDO_OCI και pspell μεταφέρθηκαν από τον πυρήνα στο PECL. Εφαρμογές που χρησιμοποιούν για παράδειγμα IMAP χρειάζονται τότε ξεχωριστό πακέτο.
Η PHP 8.5 έφερε τον τελεστή pipe, που αλυσοδένει κλήσεις από αριστερά προς τα δεξιά:
<?php
$slug = ' Neue Produkte 2026 '
|> trim(...)
|> strtolower(...)
|> (fn(string $s): string => str_replace(' ', '-', $s));
// Αποτέλεσμα: "neue-produkte-2026"
Νέα είναι και μια επέκταση URI, που αναλύει διευθύνσεις σύμφωνα με το RFC 3986 και το πρότυπο WHATWG URL. Αυτό σχετίζεται με την ασφάλεια, επειδή οι ανομοιόμορφα αναλυμένοι URLs είναι γνωστή αιτία παρακαμφθέντων ελέγχων. Ο τελεστής backtick ως συντομογραφία του shell_exec() έχει αποσυρθεί, η ρύθμιση disable_classes αφαιρέθηκε. Όποιος τη χρησιμοποιούσε, πρέπει να προσαρμόσει τη θωράκισή του.
Νέα, αναβαθμίσεις και PHP2Shell
Οι νέες λειτουργίες γλώσσας δεν κλείνουν ευπάθειες στον διερμηνέα. Απέναντι στο PHP2Shell βοηθά μόνο το τρέχον επίπεδο patch του εκάστοτε κλάδου: 8.5.12, 8.4.27, 8.3.36 ή 8.2.35. Για την PHP 8.1 και 8.0 δεν υπάρχουν πλέον επίσημες ενημερώσεις. Όποιος έχει κολλήσει εκεί, πρέπει να αναβαθμίσει και σε αυτό βοηθούν λίγο τα νέα, πολύ όμως οι ασυμβατότητες.
Ένας ασφαλής δρόμος αναβάθμισης σε πέντε βήματα:
- Ορίστε την έκδοση-στόχο, σύμφωνα με τις απαιτήσεις συστήματος του κατασκευαστή και με τον κύκλο κυκλοφορίας.
- Φέρτε τις εξαρτήσεις μέσω Composer και τα plugins σε συμβατές εκδόσεις.
- Ελέγξτε τον κώδικα με στατική ανάλυση και δοκιμές απέναντι στην έκδοση-στόχο.
- Δοκιμάστε σε περιβάλλον δοκιμών με αντίγραφο δεδομένων παραγωγής και αξιολογήστε τα logs για αποσύρσεις.
- Μεταβείτε, επανεκκινήστε όλες τις διεργασίες PHP και τεκμηριώστε την κατάσταση.
Υπόβαθρο για τους τύπους προσφέρει η σελίδα Το σύστημα τύπων της PHP.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Έλεγχος συμβατότητας: Αναλύουμε τον κώδικα και τις επεκτάσεις σας για ασυμβατότητες με την έκδοση-στόχο.
- Εκτέλεση της αναβάθμισης: Με τη μετάβαση σε υποστηριζόμενη έκδοση PHP ανεβάζουμε τις εφαρμογές δοκιμασμένες.
- Προσαρμογή της θωράκισης: Αντικαθιστούμε αφαιρεμένες ρυθμίσεις όπως το
disable_classesμε αποτελεσματικές εναλλακτικές. - Διατήρηση επιπέδου patch: Μετά την αναβάθμιση κρατάμε τον κλάδο ενημερωμένο και τεκμηριώνουμε κάθε επανεκκίνηση.
Συχνές ερωτήσεις
Ποια έκδοση της PHP 8 πρέπει να χρησιμοποιώ σήμερα;
Για νέα έργα την PHP 8.4 ή 8.5, επειδή υποστηρίζονται για τον μεγαλύτερο χρόνο: η 8.4 έως το τέλος του 2028, η 8.5 έως το τέλος του 2029. Καθοριστικό είναι τι υποστηρίζει η εφαρμογή σας σύμφωνα με τις απαιτήσεις συστήματος του κατασκευαστή. Η PHP 8.2 λήγει στις 31 Δεκεμβρίου 2026.
Τι χαλάει συχνότερα στη μετάβαση από την PHP 7.4 στην PHP 8;
Συχνά πρόκειται για αυστηρότερους ελέγχους τύπων: οι εσωτερικές συναρτήσεις ρίχνουν στην PHP 8 TypeError ή ValueError αντί να εμφανίζουν μόνο προειδοποιήσεις. Προσέχουμε και τις αλλαγμένες συγκρίσεις μεταξύ αριθμών και συμβολοσειρών. Η στατική ανάλυση και οι δοκιμές αποκαλύπτουν τα περισσότερα εκ των προτέρων.
Κάνει ο JIT τον ιστότοπό μου ταχύτερο;
Συνήθως ελάχιστα. Σύμφωνα με τη σελίδα έκδοσης της PHP 8.0, η απόδοση τυπικών εφαρμογών ιστού βρίσκεται περίπου στο επίπεδο της PHP 7.4, ενώ υπολογιστικά απαιτητικές εργασίες μπορούν να ωφεληθούν σημαντικά. Από την PHP 8.4 ο JIT είναι από προεπιλογή απενεργοποιημένος.
Ποια νέα βοηθούν την ασφάλεια;
Μεταξύ άλλων η νέα επέκταση Random στην PHP 8.2 με κρυπτογραφικά ασφαλή προεπιλογή, το attribute SensitiveParameter κατά των κωδικών πρόσβασης στα stacktraces, τα enums και οι ιδιότητες readonly για πιο σαφή δεδομένα, καθώς και τα συνεπέστερα σφάλματα τύπων από την PHP 8.0.