Novas Funcionalidades

PHP Core

Argumentos nomeados

O suporte para Argumentos nomeados foi adicionado.

Atributos

Suporte para Atributos foi adicionado.

Promoção de propriedade do construtor

Suporte para promoção de propriedade do construtor (declarando propriedades na assinatura do construtor) foi adicionado.

União de Tipos

O suporte para união de tipos foi adicionado.

Expressão Match

O suporte para expressões match foi adicionado.

Operador Nullsafe

Suporte para o nullsafe operador (?->) foi adicionado.

Outros novos recursos

  • A classe WeakMap foi adicionada.

  • A classe ValueError foi adicionada.

  • Qualquer número de parâmetros de função agora pode ser substituído por um argumento variádico, desde que os tipos sejam compatíveis. Por exemplo, o seguinte código agora é permitido:

    <?php
    class A {
         public function method(int $many, string $parameters, $here) {}
    }
    class B extends A {
         public function method(...$everything) {}
    }
    ?>
  • static (como em "vinculação estática tardia") agora pode ser usado como um tipo de retorno:

    <?php
    class Test {
         public function create(): static {
              return new static();
         }
    }
    ?>
  • Agora é possível buscar o nome da classe de um objeto usando $object::class. O resultado é o mesmo que get_class($object).

  • new e instanceof agora podem ser usados com expressões arbitrárias, usando new (expression)(...$args) e $obj instanceof (expression).

  • Algumas correções de consistência na sintaxe da variável foram aplicadas, por exemplo, escrever Foo::BAR::$baz agora é permitido.

  • Adicionada interface Stringable, que é implementada automaticamente se uma classe definir um método __toString().

  • As Traits agora podem definir métodos privados abstratos. Tais métodos devem ser implementados pela classe que usa o trait.

  • throw agora pode ser usado como uma expressão. Isso permite usos como:

    <?php
    $fn = fn() => throw new Exception('Exception in arrow function');
    $user = $session->user ?? throw new Exception('Must have user');
  • Uma vírgula final opcional agora é permitida nas listas de parâmetros.

    <?php
    function functionWithLongSignature(
        Type1 $parameter1,
        Type2 $parameter2, // <-- Esta vírgula agora é permitida.
    ) {
    }
  • Agora é possível escrever catch (Exception) para capturar uma exceção sem armazená-la em uma variável.

  • O suporte para tipo mixed foi adicionado.

  • Os métodos privados declarados em uma classe pai não impõem mais nenhuma regra de herança nos métodos de uma classe filha (com exceção dos construtores privados finais). O exemplo a seguir ilustra quais restrições foram removidas:

    <?php
    class ParentClass {
        private function method1() {}
        private function method2() {}
        private static function method3() {}
        // Lança um aviso, pois "final" não tem mais efeito:
        private final function method4() {}
    }
    class ChildClass extends ParentClass {
        // Todos os itens a seguir agora são permitidos, mesmo que os modificadores não sejam
        // o mesmo que para os métodos privados na classe pai.
        public abstract function method1() {}
        public static function method2() {}
        public function method3() {}
        public function method4() {}
    }
    ?>
  • get_resource_id() foi adicionado, o que retorna o mesmo valor que (int) $resource. Ele fornece a mesma funcionalidade em uma API mais clara.

  • O InternalIterator foi adicionado.

Data e hora

DOM

DOMParentNode e DOMChildNode com novas APIs de travessia e manipulação foram adicionadas.

Filtro

FILTER_VALIDATE_BOOL foi adicionado como um alias para FILTER_VALIDATE_BOOLEAN. O novo nome é preferido, pois usa o nome do tipo canônico.

FPM

Adicionada uma nova opção pm.status_listen que permite obter o status de um terminal diferente (por exemplo, porta ou arquivo UDS), o que é útil para obter o status quando todos os filhos estão ocupados atendendo a solicitações de execução longa.

Hash

Os objetos HashContext agora podem ser serializados.

LDAP

ldap_count_references() foi adicionado, o que retorna o número de mensagens de referência em um resultado de pesquisa.

OPcache

Se a configuração ini opcache.record_warnings estiver habilitada, o OPcache gravará avisos em tempo de compilação e os reproduzirá na próxima inclusão, mesmo que seja servido do cache.

OpenSSL

Adicionado suporte de sintaxe de mensagem criptográfica (CMS) (» RFC 5652) composto de funções para criptografia, descriptografia, assinatura, verificação e leitura. A API é semelhante à API para funções PKCS #7 com a adição de novas constantes de codificação: OPENSSL_ENCODING_DER, OPENSSL_ENCODING_SMIME e OPENSSL_ENCODING_PEM:

  • openssl_cms_encrypt() criptografa a mensagem no arquivo com os certificados e gera o resultado no arquivo fornecido.
  • openssl_cms_decrypt() que descriptografa a mensagem S/MIME no arquivo e envia os resultados para o arquivo fornecido.
  • openssl_cms_read() que exporta o arquivo CMS para uma matriz de certificados PEM.
  • openssl_cms_sign() que assina a mensagem MIME no arquivo com um certificado e uma chave e gera o resultado no arquivo fornecido.
  • openssl_cms_verify() que verifica se o bloco de dados está intacto, o signatário é quem diz ser e retorna os certificados dos signatários.

Expressões Regulares (Compatíveis com Perl)

preg_last_error_msg() foi adicionada, que retorna uma mensagem legível por humanos para o último erro PCRE. Ela complementa preg_last_error(), que retorna um valor de enumeração inteiro.

Reflection

SQLite3

SQLite3::setAuthorizer() e respectivas constantes de classe foram adicionados para definir um callback userland que será usado para autorizar ou não uma ação no banco de dados.

Biblioteca padrão

  • str_contains(), str_starts_with() e str_ends_with() foram adicionados, que verificam se haystack contém, começa com ou termina com needle, respectivamente.

  • fdiv() foi adicionado, que executa uma divisão de ponto flutuante sob a semântica IEEE 754. A divisão por zero é considerada bem definida e retornará um de Inf, -Inf ou NaN.

  • get_debug_type() foi adicionado, o que retorna um tipo útil para mensagens de erro. Ao contrário de gettype(), ele usa nomes de tipo canônico, retorna nomes de classe para objetos e indica o tipo de recurso para recursos.

  • printf() e amigos agora suportam os especificadores de formato %h e %H. Estes são os mesmos que %g e %G, mas sempre use "." como o separador decimal, em vez de determiná-lo por meio da localidade LC_NUMERIC.

  • printf() e amigos agora suportam o uso de "*" como largura ou precisão, caso em que a largura/precisão é passada como um argumento para printf. Isso também permite usar a precisão -1 com %g, %G, %h e %H. Por exemplo, o código a seguir pode ser usado para reproduzir a formatação de ponto flutuante padrão do PHP:

    <?php
    printf("%.*H", (int) ini_get("precision"), $float);
    printf("%.*H", (int) ini_get("serialize_precision"), $float);
    ?>
  • proc_open() agora suporta descritores pseudo-terminal (PTY). O seguinte anexa stdin, stdout e stderr ao mesmo PTY:

    <?php
    $proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
    ?>
  • proc_open() agora suporta descritores de pares de sockets. O seguinte anexa um par de sockets distinto a stdin, stdout e stderr:

    <?php
    $proc = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
    ?>

    Ao contrário dos pipes, os sockets não sofrem com problemas de bloqueio de E/S no Windows. No entanto, nem todos os programas podem funcionar corretamente com soquetes stdio.

  • As funções de classificação agora são estáveis, o que significa que os elementos de comparação igual manterão sua ordem original.

  • array_diff(), array_intersect() e suas variações agora podem ser usadas com um único array como argumento. Isso significa que usos como os seguintes agora são possíveis:

    <?php
    // OK, mesmo que $excludes esteja vazio:
    array_diff($array, ...$excludes);
    // OK, mesmo que $arrays contenha apenas um único array:
    array_intersect(...$arrays);
    ?>
  • O parâmetro flag de ob_implicit_flush() foi alterado para aceitar um bool em vez de um int.

Tokenizador

PhpToken adiciona uma interface baseada em objeto ao tokenizer. Ele fornece uma representação mais uniforme e ergonômica, além de ser mais eficiente em termos de memória e mais rápido.

Zip