PHP 8 alpha 1

In uscita il 26 Novembre 2020!

PHP 8.0: gli aggiornamenti


Indice


1. Modifiche di retro-incompatibilità
2. Nuove features
3. Modifiche ai moduli SAPI
4. Funzionalità deprecate
5. Funzioni cambiate
6. Nuove funzioni
7. Nuove classi ed interfacce
8. Estensioni rimosse
9. Altre modifiche alle estensioni
10. Nuove costanti globali
11. Supporto Windows
12. Altre modifiche
13. Performance migliorata


1. Modifiche di retro-incompatibilità

    - Novità più importanti:
  • I metodi con lo stesso nome delle classe non sono più interpretati come costruttori. Il metodo __costrunct() deve sempre essere usato.
  • È stata rimossa la possibilità di chiamare metodi non statici in modo statico.
  • Rimosso il cast (unset).
  • Rimossa la direttiva ini track_errors. Questo significa che $php_errormsg non è più disponibile. Invece può essere utilizzato error_get_last().
  • Rimossa la possibilità di definire le costanti case-insensitive. Il terzo argomento per define() potrebbe non essere più "true". L'accesso alle costanti indefinite ora darà sempre un "Error exception". Precedentemente, l'accesso a queste costanti veniva segnalato con un "warning" ed erano interpretate come stringhe.
  • Rimossa la possibilità di specificare un autoloader usando la funzione __autoload(). Invece dovrà essere usato spl_autoload_register()
  • Rimosso l'argomento $errcontext per la gestione degli errori personalizzati.
  • Rimosso create_function(). Dovranno essere usate le funzioni anonime.
  • Rimosso each(). Al suo posto si userà foreach o ArrayIterator.
  • Rimossa la possibilità di separare $this dalle "closures" che sono state create da un metodo, usando Closure::fromCallable() o ReflectionMethod::getClosure().
  • Rimossa anche la possibilità di separare $this dalle "closures" che contenevano l'uso di $this.
  • Rimossa la possibilità di usare array_key_exists() con gli oggetti. Bisognerà usare isset() o property_exists().
  • Il comportamento di array_key_exists() riguarderà il tipo chiave/parametro con isset() e il normale accesso all'array. Tutti i tipi di chiave ora usano la solita coercizione e gli array/oggetti generano un TypeError.
  • Qualsiasi array che ha "numero n" come prima chiave numerica userà n+1 per la prossima chiave. Anche se n è negativo.
    Documentazione: https://wiki.php.net/rfc/negative_array_index
  • Il error_reporting ora è E_ALL. Precedentemente escludeva E_NOTICE and E_DEPRECATED.
  • display_startup_errors ora sono abilitati di default.
  • Usare elementi "parent" dentro ad una classe che non ha elementi "parent" ora risulterà in un errore fatale.
  • L'operatore @ non "silenzierà" più gli errori fatali (E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR, E_PARSE). La gestione degli errori che prevedono che error_reporting sia 0 quando viene usato @, dovrebbe avvenire con:

    // Codice rimpiazzato
    function my_error_handler($err_no, $err_msg, $filename, $linenum) {
    if (error_reporting() == 0) {
    return; // Silenziato
    }
    // ...
    }

    // con
    function my_error_handler($err_no, $err_msg, $filename, $linenum) {
    if (!(error_reporting() & $err_no)) {
    return; // Silenziato
    }
    // ...
    }

    In aggiunta, è necessario fare attenzione che i messaggi di errore non vengano visualizzati in ambienti di produzione, che possono causare perdite di informazioni. Bisogna assicurarsi che display_errors-Off viene utilizzato in combinazione con la registrazione degli errori.
  • Errori di ereditarietà dovuti a metodi incompatibili (violazioni LSP) genereranno sempre un errore irreversibile. In precedenza veniva generato un "warning" in certi casi.
    Documentazione: https://wiki.php.net/rfc/lsp_errors
  • La precedenza dell'operatore di concatenazione è cambiata rispetto al bitshifts, all'addizione e alla sottrazione.
  • Documentazione: https://wiki.php.net/rfc/concatenation_precedence
  • Gli argomenti con un valore predefinito che viene risolto in null in fase di esecuzione non contrassegneranno in modo implicito il tipo di argomento come nullable. Bisognerà utilizzare un esplicito tipo di nullable o un esplicito valore di default null.

    // Codice rimpiazzato
    function test(int $arg = CONST_RESOLVING_TO_NULL) {}

    // con
    function test(?int $arg = CONST_RESOLVING_TO_NULL) {}

    // o
    function test(int $arg = null) {}

  • - Un certo numero di "warnings" sono stati convertiti in "Error exceptions":
  • Tentativo di scrivere una proprietà in un non-object. Precedentemente questo metodo creava un oggetto stdClass null, false e a stringa vuota.
  • Tentativo di associare un elemento ad un array dove la chiave PHP_INT_MAX era già in uso.
  • Tentativo di usare un tipo invalido (array od oggetto) come chiave array o stringa offset.
  • Tentativo di scrivere in un indice di array con valore scalare.
  • Tentativo di "spacchettare" un non-array.

  • - Un certo numero di "notices" sono stati convertiti a "warnings":
  • Tentativo di leggere una variabile indefinita.
  • Tentativo di leggere una proprietà indefinita.
  • Tentativo di leggere una proprietà di un non-object.
  • Tentativo di accedere ad un indice array di un non-array.
  • Tentativo di convertire un array in stringa.
  • Tentativo di usare una risorsa come chiave array.
  • Tentativo di usare null, un booleano o un float come stringa offset.
  • Tentativo di leggere una stringa offset out-of-bounds.
  • Tentativo di assegnare una stringa vuota ad una stringa offset.
  • Documentazione: https://wiki.php.net/rfc/engine_warnings
  • Tentare di assegnare bytes multipli a una stringa offset genererà un warning.
  • Caratteri inaspettati nei files src (come un bytes null fuori dalla stringa) generano un ParseError anzichè un warning.
  • Le eccezioni non rilevate ora passeranno attraverso il "clean shutdown", il che significa che i "destructors" verrano chiamati in causa dopo un'eccezione non rilevata.
  • Gli errori fatali "Only variables can be passed by reference" vengono ritardati durante la fase di esecuzione e vengono convertiti in "Cannot pass parameter by reference".
  • Alcuni notices "Only variables should be passed by reference" sono stati convertiti a "Cannot pass parameter by reference".
  • Il nome generato per le classi anonime è stato cambiato. Ora includerà il nome del primo "parent" o della prima interfaccia:

    new class extends ParentClass {};
    // -> ParentClass@anonymous
    new class implements FirstInterface, SecondInterface {};
    // -> FirstInterface@anonymous
    new class {};
    // -> class@anonymous

    Il nome mostrato sopra verrà sempre seguito da un null byte o un suffisso personale.
  • La dichiarazione di un parametro obbligatorio dopo uno facoltativo è deprecata. Come eccezione, dichiarare un parametro nel form "Type $param = null" prima di uno richiesto continua ad essere permesso, perché questo metodo è stato a volte utilizzato per ottenere tipi nullable nelle versioni PHP precedenti.

    function test($a = [], $b) {} // Deprecato
    function test(Foo $a = null, $b) {} // Concesso

  • I riferimenti ai metodi non assoluti (Non-absolute trait method) devono essere inequivocabili:

    class X {
    use T1, T2 {
    func as otherFunc;
    }
    function func() {}
    }

    Se sia T1::func() e sia T2::func() esistevano, il codice veniva tranquillamente accettato e la funzione si riferiva a T1::func. Ora invece verrà generato un errore fatale poichè T1::func o T2::func hanno bisogno di essere dichiarate esplicitamente.
  • La dichiarazione dei metodi astratti definiti in "traits" ora vengono verificati in base al metodo della classe implementata:

    trait MyTrait {
    abstract private function neededByTrait(): string;
    }
    class MyClass {
    use MyTrait;
    // Errore perchè c'è un ritorno di errore non corrispondente
    private function neededByTrait(): int { return 42; }
    }

    Documentazione: https://wiki.php.net/rfc/abstract_trait_method_validation
  • Le funzioni disabilitate ora vengono trattate esattamente come funzioni non esistenti. Chiamando una funzione disabilitata verrà segnalata come sconosciuta e ridefinire una funziona disabilitata ora sarà possibile.
  • data: i stream wrappers non sono più "scrivibili".
  • Gli operatori aritmetici e bitwise +, -, *, /, **, %, <<, >>, &, |, ^, ~, ++, -- ora passeranno attraverso un TypeError quando un operando è un array, una risorsa o un oggetto non sovraccaricato. L'unica eccezione in merito è l'operazione di fusione array + array, che rimane supportata. Documentazione: https://wiki.php.net/rfc/arithmetic_operator_type_checks
  • Il cast sulle stringhe ora si comporterà sempre in modo indipendente dalle impostazioni locali.
    Documentazione: https://wiki.php.net/rfc/locale_independent_float_to_string
  • Rimosso il supporto per le parentesi graffe deprecate per l'accesso offset.
    Documentazione: https://wiki.php.net/rfc/deprecate_curly_braces_array_access

  • - COM:
  • Rimossa la possibilità di importare costanti case-insensitive dai tipi di libreria. Il secondo argomento di com_load_typelib() non sarà più false; com.autoregister_casesensitive non sarà più disabilitato; i markers case-insensitive in com.typelib_file vengono ignorati.

  • - Date:
  • mktime() e gmmktime() ora richiedono almeno un argomento. time() può essere usato per ottenere l'attuale timestamp.

  • - dom:
  • Rimosse le classe non implementate da ext/dom che non avevano alcun comportamento e non contenevano test data. Queste classi inoltre vengono rimosse dall'ultima versione DOM:
  • DOMNameList
  • DomImplementationList
  • DOMConfiguration
  • DomError
  • DomErrorHandler
  • DOMImplementationSource
  • DOMLocator
  • DOMUserDataHandler
  • DOMTypeInfo

  • - Enchant:
  • enchant_broker_list_dicts(), enchant_broker_describe() e enchant_dict_suggest() ora ritorneranno un array vuoto invece di null.
  • enchant_broker_init() ora ritornerà un oggetto EnchantBroker piuttosto che una risorsa. I controlli dei valori restituiti che utilizzano is_resource() devono essere sostituiti con "false".
  • enchant_broker_request_dict() e enchant_broker_request_pwl_dict() ora ritorneranno un oggetto EnchantDictionary piuttosto che una risorsa.

  • - Exif:
  • Rimosso read_exif_data(). exif_read_data() dovrà invece essere usato.

  • - Filtri:
  • I flags FILTER_FLAG_SCHEME_REQUIRED e FILTER_FLAG_HOST_REQUIRED per il filtro FILTER_VALIDATE_URL sono stati rimossi. Lo schema e l'host sono sempre obbligatori.
  • I source INPUT_REQUEST e INPUT_SESSION per filter_input() sono stati rimossi. Questi non erano mai stati implementati e il loro uso sfociava sempre in un warning.

  • - GD:
  • L'estensione GD ora usa oggetti per sottolineare la struttura dati per immagini, piuttosto che per le risorse. Questi oggetti sono completamente "opachi", ovvero non hanno alcun metodo.
  • La deprecata funzione image2wbmp() è stata rimossa.
    Documentazione: https://wiki.php.net/rfc/image2wbmp
  • Le funzioni deprecate png2wbmp() e jpeg2wbmp() sono state rimosse.
    Documentazione: https://wiki.php.net/rfc/deprecate-png-jpeg-2wbmp
  • Il parametro di default $mode di imagecropauto() non accetta più -1. IMG_CROP_DEFAULT dovrà essere usato invece.

  • - GMP:
  • gmp_random() è stato rimosso. Uno tra gmp_random_range() o gmp_random_bits() dovrà essere usato invece.

  • - Iconv:
  • Le implementazioni iconv() che non indicavano idoneamente "errno" in caso di errore non sono più supportate.

  • - Intl:
  • La deprecata costante INTL_IDNA_VARIANT_2003 è stata rimossa.
    Documentazione: https://wiki.php.net/rfc/deprecate-and-remove-intl_idna_variant_2003
  • La deprecata costante Normalizer::NONE è stata rimossa.
  • Le costanti IntlDateFormatter::RELATIVE_FULL, IntlDateFormatter::RELATIVE_LONG, IntlDateFormatter::RELATIVE_MEDIUM, e IntlDateFormatter::RELATIVE_SHORT sono state aggiunte.

  • - LDAP:
  • La deprecata funzione ldap_sort è stata rimossa.

  • - Mbstring:
  • La direttiva mbstring.func_overload è stata rimossa. Le relative costanti MB_OVERLOAD_MAIL, MB_OVERLOAD_STRING, e MB_OVERLOAD_REGEX sono state anche rimosse. Infine le voci "func_overload" e "func_overload_list" in mb_get_info() sono state rimosse.
  • mb_parse_str() non può essere più usato senza specificare un array di risultati.
  • Un numero di deprecate mbregex sono state rimosse. La lista sottostante illustra quali funzioni dovranno invece essere usate:

  • * mbregex_encoding() -> mb_regex_encoding()
    * mbereg() -> mb_ereg()
    * mberegi() -> mb_eregi()
    * mbereg_replace() -> mb_ereg_replace()
    * mberegi_replace() -> mb_eregi_replace()
    * mbsplit() -> mb_split()
    * mbereg_match() -> mb_ereg_match()
    * mbereg_search() -> mb_ereg_search()
    * mbereg_search_pos() -> mb_ereg_search_pos()
    * mbereg_search_regs() -> mb_ereg_search_regs()
    * mbereg_search_init() -> mb_ereg_search_init()
    * mbereg_search_getregs() -> mb_ereg_search_getregs()
    * mbereg_search_getpos() -> mb_ereg_search_getpos()
    * mbereg_search_setpos() -> mb_ereg_search_setpos()

  • Il modificatore 'e' per mb_ereg_replace() è stato rimosso. mb_ereg_replace_callback() dovrà essere usato invece.
  • Un argomento di tipo non-string di mb_ereg_replace() sarà ora interpretato come stringa invece di ASCII codepoint. Il comportamento precedente può essere ripristinato con una chiamata esplicita a chr().
  • L'argomento per mb_strpos(), mb_strrpos(), mb_stripos(), mb_strripos(), mb_strstr(), mb_stristr(), mb_strrchr() e mb_strrichr() ora può essere vuoto.
  • Il parametro $is_hex, che non era usato internamente, è stato rimosso da mb_decode_numericentity().
  • Il comportamento ereditario di passare la codifica come terzo argomento invece di un offset per la funzione mb_strrpos() function è stata rimossa, fornendo invece un offset 0 esplicito con la codifica come quarto argomento.

  • PCRE:
  • Quando si passano sequenze di escape non valide, non vengono più interpretate come valori letterali. Questo comportamento richiedeva in precedenza il modificatore X, che ora è ignorato.

  • PDO:
  • La gestione degli errori di default è stata cambiata da "silent" a "exceptions". Consulta https://www.php.net/manual/en/pdo.error-handling.php per i dettagli sulle modifiche e su come impostare questo attributo.
  • Documentazione: https://wiki.php.net/rfc/pdo_default_errmode
  • Il metodo PDOStatement::setFetchMode() ora accetta il seguente procedimento:

  • PDOStatement::setFetchMode($mode, $classname, $params)

    PDO_ODBC:
  • La direttiva php.ini pdo_odbc.db2_instance_name è stata rimossa.

  • Reflection:
    I metodi:

    ReflectionClass::newInstance($args)
    ReflectionFunction::invoke($args)
    ReflectionMethod::invoke($object, $args)

    sono stati cambiati a:

    ReflectionClass::newInstance(...$args)
    ReflectionFunction::invoke(...$args)
    ReflectionMethod::invoke($object, ...$args)

    I codici che devono essere compatibili sia con PHP 7 e PHP 8 possono usare il seguente procedimento per essere compatibili con entrambe le versioni:

    ReflectionClass::newInstance($arg = null, ...$args)
    ReflectionFunction::invoke($arg = null, ...$args)
    ReflectionMethod::invoke($object, $arg = null, ...$args)

  • Il metodo ReflectionType::__toString() ora ritornerà una rappresentazione completa di debug del tipo, e non è più deprecato. In particolare il risultato includerà un "indicatore nullability" per i tipi nullable. Il formato del ritorno di valore non è stabile e potrebbe cambiare tra le versioni differenti di PHP.
  • I metodi Reflection export() sono stati rimossi.
  • I seguenti metodi ora possono ritornare informazioni riguardanti i valori di di default dei parametri delle funzioni interne: ReflectionParameter::isDefaultValueAvailable() ReflectionParameter::getDefaultValue() ReflectionParameter::isDefaultValueConstant() ReflectionParameter::getDefaultValueConstantName()
  • ReflectionMethod::isConstructor() e ReflectionMethod::isDestructor() ora ritornano sempre true per i metodi di interfacce `__construct` e `__destruct`. In precedenza questo sarebbe stato solamente true per i metodi di classe e traits.

  • - Socket:
  • I deprecati flags AI_IDN_ALLOW_UNASSIGNED e AI_IDN_USE_STD3_ASCII_RULES per socket_addrinfo_lookup() sono stati rimossi.

  • - SPL:
  • SplFileObject::fgetss() è stato rimosso.
  • SplHeap::compare($a, $b) ora specifica un metodo "signature". Ereditare classi che implementano questo metodo ora dovranno usare un metodo "signature" compatibile.
  • SplDoublyLinkedList::push() ora ritorna "void" invece di true.
  • SplDoublyLinkedList::unshift() ora ritorna "void" invece di true.
  • SplQueue::enqueue() ora ritorna "void" invece di true.
  • spl_autoload_register() passerà sempre attraverso un TypeError o un argomento invalido, quindi il secondo argomento $do_throw viene ignorato e un "notice" sarà emesso se questo viene settato su false.

  • - Standard:
  • assert() non valuterà più gli argomenti di stringa, invece saranno trattati come qualunque altro argomento. assert($a == $b) dovrebbe invece essere usato al posto di assert('$a == $b'). La direttiva ini assert.quiet_eval e le costanti ASSERT_QUIET_EVAL sono state rimosse, difatti non provocheranno più alcun effetto.
  • parse_str() non può essere più usato senza specificare un risultato di array.
  • fgetss() è stato rimosso.
  • Il filtro string.strip_tags è stato rimosso.
  • Gli argomenti di strpos(), strrpos(), stripos(), strripos(), strstr(), strchr(), strrchr(), e stristr() ora saranno sempre interpretati come stringa. In precedenza le non-string erano interpretate come ASCII codepoint. Una esplicita chiamata chr() può essere usata per ripristinare il precedente comportamento.
  • L'argomento per strpos(), strrpos(), stripos(), strripos(), strstr(), stristr() e strrchr() può essere vuoto.
  • La lunghezza di argomento per substr(), substr_count(), substr_compare() e iconv_substr() può ora essere null. I valori Null si comporteranno come se non fosse stata fornita una lunghezza di argomento e pertanto restituiranno il resto della stringa invece di una stringa vuota.
  • La lunghezza di argomento per array_splice() può ora essere null. I valori Null si comportano in modo identico alla omissione di argomento, rimuovendo così tutto dall'offset alla fine dell'array.
  • L'argomento args di vsprintf(), vfprintf(), e vprintf() ora deve essere un array. In precedenza qualsiasi tipo veniva accettato.
  • L'opzione 'salt' del password_hash() non è più supportata. Se viene utilizzata verrà generato un warning e verrà ignorata. Un 'generated salt' viene invece usato.
  • La funzione quotemeta() ritornerà una stringa vuota se viene passata una stringa vuota. In precedenza veniva ritornato false.
  • hebrevc() è stato rimosso.
  • convert_cyr_string() è stato rimosso.
  • money_format() è stato rimosso.
  • ezmlm_hash() è stato rimosso.
  • restore_include_path() è stato rimosso.
  • get_magic_quotes_gpc() e get_magic_quotes_gpc_runtime() sono stati rimossi.
  • FILTER_SANITIZE_MAGIC_QUOTES è stato rimosso.
  • Chiamare implode() con i parametri di un ordine inverso ($pieces, $glue) non è più supportato.
  • parse_url() ora distinguerà le queries assenti/vuote e i frammenti:

    http://example.com/foo => query = null, fragment = null
    http://example.com/foo? => query = "", fragment = null
    http://example.com/foo# => query = null, fragment = ""
    http://example.com/foo?# => query = "", fragment = ""

    In precedenza tutti i casi risultavano in query e frammenti null.
  • var_dump() e debug_zval_dump() ora stamperanno i numeri a virgola usando serialize_precision invece della precisione. In una configurazione di default, questo significa che i numeri a virgola ora sono stampati con una precisione accurata da queste funzioni di debugging.
  • Se l'array ritornato da __sleep() contiene proprietà non esistenti, queste vengono ignorate. Precedentemente, tali proprietà sarebbero state serializzate anche se avessero avuto un valore NULL.
  • Le impostazioni locali predefinite all'avvio sono ora sempre "C". Non vengono ereditate impostazioni locali dall'ambiente di default. In precedenza, LC_ALL era settato su "C", mentre LC_CTYPE era ereditato dall'ambiente. Tuttavia alcune funzioni non rispettano l'ereditarietà locale senza una esplicita chiamata a setlocale(). Quest'ultima ora è sempre richiesta se desideri apportare modifiche ai componenti locale di default.

  • - Sysvmsg:
  • msg_get_queue() ora ritornerà un oggetto SysvMessageQueue invece che una risorsa. I controlli dei valori restituiti che utilizzano is_resource() devono essere sostituiti con la presenza di "false".

  • - Sysvsem:
  • sem_get() ora ritornerà un oggetto SysvSemaphore invece che una risorsa. I controlli dei valori restituiti che utilizzano is_resource() devono essere sostituiti con la presenza di "false".

  • - Sysvshm:
  • sem_get() ora ritornerà un oggetto SysvSharedMemory invece che una risorsa. I controlli dei valori restituiti che utilizzano is_resource() devono essere sostituiti con la presenza di "false".

  • - tidy:
  • L'uso del parametro $use_include_path, che non è stato usato internamente, è stato rimosso da tidy_repair_string().

  • - XML:
  • xml_parser_create(_ns) ora ritornerà un oggetto XmlParser invece di una risorsa. I controlli dei valori restituiti che utilizzano is_resource() devono essere sostituiti con la presenza di "false". La funzione xml_parser_free() non avrà più effetto, invece l'istanza XmlParser viene automaticamente distrutta se essa non ha più riferimenti.

  • - XMLWriter:
  • Le funzioni XMLWriter ora accettano e restituiscono, rispettivamente, oggetti XMLWriter anziché risorse.

  • - Zip:
  • ZipArchive::OPSYS_Z_CPM è stato rimosso al posto di ZipArchive::OPSYS_CPM

  • - Zlib:
  • gzgetss() è stato rimosso.
  • inflate_init() ora ritornerà un oggetto InflateContext invece che una risorsa. I controlli dei valori restituiti che utilizzano is_resource() devono essere sostituiti con la presenza di "false".
  • deflate_init() ora ritornerà un oggetto DeflateContext invece che una risorsa. I controlli dei valori restituiti che utilizzano is_resource() devono essere sostituiti con la presenza di "false".


  • 2. Nuove features

    - Importanti:
  • Aggiunto il supporto per gli "union types".
    Documentazione: https://wiki.php.net/rfc/union_types_v2
  • Aggiunto WeakMap.
    Documentazione: https://wiki.php.net/rfc/weak_maps
  • Aggiunta la classe ValueError.
  • Un numero qualsiasi di parametri di funzione può ora essere sostituito da un parametro "variadic", purché i tipi siano compatibili. Ad esempio, il seguente codice è ora consentito:

    class A {
    public function method(int $many, string $parameters, $here) {}
    }
    class B extends A {
    public function method(...$everything) {}
    }
    "static" può ora essere usato come tipo di ritorno:
    class Test {
    public function create(): static {
    return new static();
    }
    }

    Documentazione: https://wiki.php.net/rfc/static_return_type
  • Ora è possibile adottare il "fetch" sul nome di una classe di un oggetto usando `$object::class`. Il risultato è lo stesso di `get_class($object)`.
    Documentazione: https://wiki.php.net/rfc/class_name_literal_on_object
  • Il nuovo "and instanceof" può essere usato con le espressioni arbitrarie, usando `new (expression)(...$args)` and `$obj instanceof (expression)`.
    Documentazione: https://wiki.php.net/rfc/variable_syntax_tweaks
  • Applicati importanti fixies alla sintassi delle variabili. ad esempio scrivere `Foo::BAR::$baz` ora è concesso.
    Documentazione: https://wiki.php.net/rfc/variable_syntax_tweaks
  • Aggiunta l'interfaccia Stringable, che è automaticamente implementata se una classe definisce un metodo __toString().
    Documentazione: https://wiki.php.net/rfc/stringable
  • I Traits possono ora definire i metodi privati astratti.
    Documentazione: https://wiki.php.net/rfc/abstract_trait_method_validation
  • `throw` può essere usata ora come espressione.
    Documentazione: https://wiki.php.net/rfc/throw_expression
  • Una opzionale virgola finale ora è concessa per le liste di parametri.
    Documentazione: https://wiki.php.net/rfc/trailing_comma_in_parameter_list
  • E' possibile ora scrivere `catch (Exception)` per fare il "catch" su una eccezione senza memorizzarla in una variabile.
    Documentazione: https://wiki.php.net/rfc/non-capturing_catches
  • Aggiunto il supporto per i "tipi misti".
    Documentazione: https://wiki.php.net/rfc/mixed_type_v2
  • Aggiunto il supporto per gli attributi.
    Documentazione: https://wiki.php.net/rfc/attributes_v2
  • Aggiunto il supporto per i costruttori.
    Documentazione: https://wiki.php.net/rfc/constructor_promotion

  • - Date:
  • Aggiunti DateTime::createFromInterface() e DateTimeImmutable::createFromInterface().

  • - Enchant:
  • enchant_dict_add()
  • enchant_dict_is_added()
  • LIBENCHANT_VERSION macro

  • dom:
  • Introdotti DOMParentNode e DOMChildNode con nuove API trasversali e di manipolazione. Documentazione: https://wiki.php.net/rfc/dom_living_standard_api

  • - Opcache:
  • Se le impostazioni ini opcache.record_warnings sono abilitate, opcache registrerà avvisi in fase di compilazione per riprodurli alla successiva inclusione, anche se il tutto proviene dalla cache.

  • - OpenSSL:
  • Aggiunto il supporto per "Cryptographic Message Syntax" (CMS) (RFC 5652) composto da funzioni di crittografia, decrittografia, firmatura, verifica e lettura. L'API è simile all'API per le funzioni PKCS #7 ma con l'aggiunta di nuove costanti di codifica: OPENSSL_ENCODING_DER, OPENSSL_ENCODING_SMIME e OPENSSL_ENCODING_PEM.

  • - Standard:
  • printf() e annessi ora supportano gli identificatori di formato %h e %H. Questi sono gli stessi di %g e %G, ma usano sempre "." come separatore decimale, piuttosto che determinarlo attraverso il LC_NUMERIC locale.
  • printf() e annessi ora supportano l'utilizzo di "*" come larghezza o precisione, nel caso in cui larghezza/precisione vengono passati come argomento a printf. Tutto questo inoltre permette di usare la precisione -1 con %g, %G, %h e %H. Per esempio, il codice seguente può essere utilizzato per riprodurre la formattazione della virgola predefinita di PHP:

  • printf("%.*H", (int) ini_get("precision"), $float);
    printf("%.*H", (int) ini_get("serialize_precision"), $float);

  • proc_open() ora supporta i descrittori pseudo-terminali (PTY). I seguenti vengono attribuiti (stdin, stdout e stderr) allo stesso PTY:

  • printf("%.*H", (int) ini_get("precision"), $float);
    printf("%.*H", (int) ini_get("serialize_precision"), $float);

    Zip:
  • Estensione aggiornata alla versione 1.19.0.
  • Nuova proprietà ZipArchive::lastId per ottenere il valore di indice dell'ultima voce aggiunta.
  • Un errore può essere controllato dopo che un archivio è stato chiuso usando una proprietà ZipArchive::status, ZipArchive::statusSys o il metodo ZipArchive::getStatusString().
  • L'opzione remove_path di ZipArchive::addGlob() e ::addPattern() viene ora trattata come prefisso di stringa arbitraria (per coerenza con l'opzione add_path), mentre in precedenza era considerata come nome della directory.
  • Features opzionali di compressione/crittografia ora sono elencate in phpinfo.


  • 3. Modifiche ai moduli SAPI

  • CGI e FPM ora useranno CONTEXT_DOCUMENT_ROOT per esaminare i files .user.ini, se sono definiti. D'altra parte, DOCUMENT_ROOT verrà sempre usato. Tutto questo migliora il supporto per Apache mod_userdir e mod_alias.


  • 4. Funzionalità deprecate

    - Importante:
  • Chiamare get_defined_functions() con $exclude_disabled settato su false è deprecato. get_defined_functions() non includerà più funzioni disabilitate.

  • - Enchant:
  • enchant_broker_set_dict_path e enchant_broker_get_dict_path non sono più disponibili in libenchant 1.5 o in libenchant-2
  • enchant_dict_add_to_personal, bisogna usare enchant_dict_add invece
  • enchant_dict_is_in_session, bisogna usare enchant_dict_is_added invece
  • enchant_broker_free e enchant_broker_free_dict
  • Costanti ENCHANT_MYSPELL e ENCHANT_ISPELL

  • PGSQL / PDO PGSQL:
  • La costante PG_VERSION_STR ha ora lo stesso valore di PG_VERSION, che viene deprecata.

  • -Zip:
  • Usare un file vuoto come ZipArchive è deprecato. Libzip 1.6.0 non accetta più file vuoti come validi archivi zip. Tutte le soluzioni verranno rimosse nella prossima versione.
  • L'API procedurale di Zip è deprecata. Bisogna usare ZipArchive.

  • - Reflection:
  • ReflectionFunction::isDisabled() è deprecata, come non è più possibile creare una ReflectionFunction per una funzione disabilitata. Questo metodo ora ritorna sempre false.
  • ReflectionParameter::getClass(), ReflectionParameter::isArray(), e ReflectionParameter::isCallable() sono deprecati. ReflectionParameter::getType() e le API ReflectionType devono invece essere utilizzate.


  • 5. Funzioni cambiate

    - Reflection:
  • I risultati di ReflectionClass::getConstants e ReflectionClass::getReflectionConstants possono ora essere filtrati con un parametro `$filter`. 3 nuove costanti sono state aggiunte per essere utilizzate con questo parametro:

  • ReflectionClassConstant::IS_PUBLIC
    ReflectionClassConstant::IS_PROTECTED
    ReflectionClassConstant::IS_PRIVATE

    - Zip: I metodi ZipArchive::addGlob e ZipArchive::addPattern accettano più valori negli argomenti di "options" degli array:
  • flags
  • comp_method
  • comp_flags
  • env_method
  • enc_password
  • I metodi ZipArchive::addEmptyDir, ZipArchive::addFile e aZipArchive::addFromString ora hanno nuovi argomenti "flags". Questo permette di gestire la codifica dei nomi (ZipArchive::FL_ENC_*) e la sostituzione della voce (ZipArchive::FL_OVERWRITE).
  • ZipArchive::extractTo ora ripristina l'ora di modifica dei files.


  • 6. Nuove funzioni

    - Importanti:
  • Aggiunta la funzione get_resource_id($resource), che ritorna lo stesso valore di (int) $resource.

  • - OpenSSL:
  • Aggiunto openssl_cms_encrypt() che crittografa il messaggio nel file con i certificati e restituisce il risultato al file fornito.
  • Aggiunto openssl_cms_decrypt() che decripta il messaggio S/MIME nel file e restituisce il risultato al file fornito.
  • Aggiunto openssl_cms_read() che esporta il file CMS a un array di certificati PEM.
  • Aggiunto openssl_cms_sign() che firma il messaggio MIME nel file con un certificato e una chiave e restituisce il risultato al file fornito.
  • Aggiunto openssl_cms_verify() che verifica che il blocco di dati sia intatto, colui che firma sia veramente chi dice di essere e ritorna i certificati dei firmatori.

  • - PCRE:
  • Aggiunto preg_last_error_msg(), che ritorna un messaggio "human-readable" per l'ultimo errore PCRE. Complementa preg_last_error(), che ritorna un "integer enum" invece.

  • - SQLite3:
  • Aggiunto SQLite3::setAuthorizer() e le rispettive costanti di classe per settare una "userland callback" che autorizza se si può effettuare o no un'azione sul database. Consulta https://github.com/php/php-src/pull/4797.

  • - Standard:
  • Aggiunte le funzioni:

    str_contains(string $haystack, string $needle): bool
    str_starts_with(string $haystack, string $needle): bool
    str_ends_with(string $haystack, string $needle): bool

    Queste controllano se $haystack contiene, inizia o termina con $needle.
    Documentazione: https://wiki.php.net/rfc/str_contains
    Documentazione: https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions
  • Aggiunta la funzione fdiv(), che esegue una divisione a virgola espresse dalla semantica IEEE 754. La divisione per zero è considerata ben definita e restituirà uno tra Inf, -Inf o NaN.
  • Aggiunta la funzione get_debug_type(), che ritorna un tipo utile per i messaggi di errore. Diverso per gettype(), che utilizza tipi di nomi canonici, ritorna nomi di classi per oggetti e indica il tipo di risorsa per le risorse. Documentazione: https://wiki.php.net/rfc/get_debug_type

  • - Zip:
  • ZipArchive::setMtimeName e ZipArchive::setMtimeIndex per settare il tempo di modifica di una voce.
  • ZipArchive::setProgressCallback per fornire aggiornamenti durante la chiusura dell'archivio.
  • ZipArchive::setCancelCallback per consentire l'annullamento durante la chiusura dell'archivio.
  • ZipArchive::replaceFile per sostituire il contenuto di una voce.
  • ZipArchive::isCompressionMethodSupported per controllare le features di compressione opzionale.
  • ZipArchive::isEncryptionMethodSupported per controllare le features di crittografia opzionale.


  • 7. Nuove classi ed interfacce

    - Tokenizer:
  • La nuova classe PhpToken aggiunge una interfaccia object-based al tokenizer. Garantirà una rappresentazione più uniforme ed ergonomica, come anche una memoria più veloce ed efficiente. Documentazione: https://wiki.php.net/rfc/token_as_object


  • 8. Estensioni rimosse

    - XML-RPC:
  • L'estensione xmlrpc è stata disaggregata e spostata al PECL.
    Documentazione: https://wiki.php.net/rfc/unbundle_xmlprc


  • 9. Altre modifiche alle estensioni

    - CURL:
  • L'estensione CURL ora richiede almeno libcurl 7.29.0.
  • curl_init() ora ritornerà un oggetto CurlHandle invece che una risorsa. I controlli dei valori restituiti che utilizzano is_resource() devono essere sostituiti con la presenza di "false". La funzione curl_close() non avrà più effetto, invece l'istanza CurlHandle viene automaticamente distrutta se essa non ha più riferimenti.
  • curl_multi_init() ora ritornerà un oggetto CurlMultiHandle, invece che una risorsa. I controlli dei valori restituiti che utilizzano is_resource() devono essere sostituiti con la presenza di "false". La funzione curl_multi_close() non avrà più effetto, invece l'istanza CurlMultiHandle viene automaticamente distrutta se essa non ha più riferimenti.
  • curl_share_init() ora ritornerà un oggetto CurlShareHandle anzichè una risorsa. I controlli dei valori restituiti che utilizzano is_resource() devono essere sostituiti con la presenza di "false". La funzione curl_share_close() non avrà più effetto, invece l'istanza CurlShareHandle viene automaticamente distrutta se essa non ha più riferimenti.
  • Il deprecato parametro `$version` di curl_version() è stato rimosso.

  • - Enchant:
  • L'estensione enchant ora usa libenchant-2 di default quando disponibile. La versione 1 di libenchant è sempre supportata ma è deprecata e potrebbe essere rimossa in futuro.

  • - GD:
  • Il parametro $num_points di imagepolygon(), imageopenpolygon() e imagefilledpolygon() ora è funzionale, per esempio queste funzioni possono essere chiamate sia con 3 o 4 argomenti. Se l'argomento viene omesso, viene calcolato come count($points)/2.
  • La funzione imagegetinterpolation() per ottenere il metodo di interpolazione corrente è stata aggiunta.

  • - JSON:
  • L'estensione JSON non può essere più disabilitata ed è sempre parte integrale di qualsiasi piattaforma PHP.

  • - MBString:
  • La tabella dati Unicode è stata aggiornata alla versione 13.0.0.

  • - MBString:
  • Quando mysqlnd non è usato (che è una opzione di default raccomandata), la versione minima supportata libmysqlclient ora è la 5.1.

  • - MBString:
  • Le estensioni PGSQL e PDO PGSQL ora richiedono almeno libpq 9.1.


  • 10. Nuove costanti globali

    - Filtro:
  • FILTER_VALIDATE_BOOL è stato modificato come FILTER_VALIDATE_BOOLEAN. Il nuovo nome è da preferire e da usare come tipo di nome canonico.


  • 11. Supporto Windows

    - Standard:
  • Le funzioni di esecuzione di programma (proc_open(), exec(), popen() etc.) tramite la shell ora eseguiranno `%comspec% /s /c "$commandline"`, che ha lo stesso effetto di eseguire `$commandline` (senza virgolette aggiuntive).

  • - php-test-pack:
  • Il test runner è stato rinominato da run-test.php a run-tests.php, per corrispondere al suo nome in php-src.


  • 12. Altre modifiche

  • Gli obbiettivi EBCDIC non sono più supportati, anche se era improbabile che ci stavano lavorando in primo luogo.


  • 13. Performance migliorata

  • Un compilatore Just-In-Time (JIT) è stato aggiunto alle estensioni opcache.
  • array_slice() su un array senza gap non analizzerà l'intero array per trovare l'offset iniziale. Questo ridurrà il tempo di esecuzione della funzione su grandi offset e piccole lunghezze.
  • strtolower() ora adotta una implementazione SIMD quando usa il "C" LC_CTYPE locale (che è di default).

E' tutto, gente!

Come abbiamo potuto constatare, il più famoso linguaggio back-end al mondo sta per cambiare radicalmente: nuove funzioni/classi/interfacce, estensioni rimosse, funzionalità deprecate e altro ancora! Insomma, c'è molto da imparare!
Ci tengo a precisare che questo articolo è stato tradotto dall'inglese in pochissime ore, pertanto invito chiunque a suggerirmi delle modifiche e/o segnalarmi degli errori qualora ci fossero. Tuttavia alcuni termini sono impossibili da tradurre; la programmazione è un linguaggio universale e tale deve rimanere: tradurre in italiano comporterebbe solo confusione.

A presto, GG-CREATOR.


« Articolo successivo:
I database
» Articolo precedente:
HTML6