
Sintaxe
- Suavizar os requisitos de sintaxe Heredoc e Nowdoc
- Suporte para vírgulas à direita em chamadas de função e método
- Links na
list()
Recursos preteridos (preteridos)
image2wbmp()
descontinuada- Os sinalizadores
FILTER_FLAG_SCHEME_REQUIRED
e FILTER_FLAG_HOST_REQUIRED
ao usar FILTER_VALIDATE_URL
- Registrar constantes independentes obsoletas
Novos recursos
- Lançamento de exceção opcional para erros nas
json_decode
json_encode
e json_decode
- Adicionando a função
is_countable()
- Adicionando as funções
array_key_first()
e array_key_last()
Alterações
- Migrando do PCRE para o PCRE2
Suavizar os requisitos de sintaxe Heredoc e Nowdoc
Heredoc e Nowdoc exigiram colocar o identificador de fechamento em primeiro lugar em uma nova linha.
Um exemplo:
$foo = <<<IDENTIFIER the crazy dog jumps over the lazy fox "foo" bar; IDENTIFIER
Aqui, o IDENTIFIER
fechamento deve ser o primeiro caractere da nova linha para que isso funcione. Além disso, não deve haver outros caracteres após o identificador de fechamento (exceto ;
que é opcional).
O RFC para PHP 7.3 sugere a remoção desses requisitos para melhorar a legibilidade do código. Primeiro de tudo, para adicionar recuo ao usar identificadores heredoc/nowdoc
.
Lista completa de alterações na sintaxe heredoc/nowdoc
:
- O identificador de fechamento não precisa ser o primeiro caractere na sequência.
- O identificador de fechamento é recuado com espaços ou tabulações.
- Recuo (espaços ou tabulações) não deve ser misturado. Se você fizer isso, receberá o
Parse error: Invalid indentation - tabs and spaces cannot be mixed in .. on line ..
- O número exato de espaços / guias usados antes do identificador de fechamento será removido de cada linha da expressão
heredoc/nowdoc
. - Se o número de caracteres de indentação usados antes do identificador de fechamento for maior do que em qualquer uma das linhas da expressão, você receberá um
Parse error: Invalid body indentation level (expecting an indentation level of at least ..) in .. on line ..
- várias expressões após o identificador de fechamento funcionará sem erros
Aqui está um trecho que tira proveito dos novos recursos sem violar novas regras:
$foo = ['foo', 'bar', <<<EOT baz - hello world! -- ahoy EOT, 'qux', 'quux' ]; var_dump($foo);
A saída será:
array(5) { [0]=> string(3) "foo" [1]=> string(3) "bar" [2]=> string(29) "baz - hello world! -- ahoy" [3]=> string(3) "qux" [4]=> string(4) "quux" } `
Observe que o recuo usado na declaração usando heredoc
não heredoc
exibido na saída de var_dump()
e continuamos a listar os elementos da matriz após o identificador EOT
.
RFC , discussão sobre Externals.io , implementação
Impacto na compatibilidade com versões anteriores
Até você usar um conjunto de identificadores de caracteres heredox/nowdoc
idênticos ao início de uma linha, você estará em um cavalo.
$foo = <<<HELLO HELLO_WORLD <-- HELLOWORLD <-- HELLO WORLD <-- HELLO;
Se você tem heredoc/nowdoc
sintaxe heredoc/nowdoc
semelhante à descrita acima, observo que, com o PHP 7.3, o PHP aceitará o primeiro literal HELLO
e lançará um erro na próxima linha. Nas versões anteriores, o HELLO WORLD
não HELLO WORLD
percebido como um identificador final para o heredoc. Obrigado / u / ImSuperObjective2 com reddit por apontar isso
Suporte para vírgulas à direita em chamadas de função e método
Essa é uma alteração simples que permite o uso de vírgulas finais em chamadas e métodos de função. Isso não afeta a declaração.
Por exemplo, a seguinte sintaxe será possível:
Nas versões anteriores ao PHP-7.3, o snippet acima gera um PHP Parse error: syntax error, unexpected ')' in .. on line ..
Você não pode usar mais de uma vírgula no final ou vírgulas para pular argumentos. Isso é principalmente uma alteração para uma função com parâmetros variáveis. Também com novas edições, a sintaxe da matriz parecerá mais consistente.
Observe que você não pode usar esse recurso nas declarações de função / método; isto está errado:
function foo($bar, $baz, ) {
RFC , discussão sobre Externals.io , implementação
Impacto na compatibilidade com versões anteriores
Nada. O código existente continuará funcionando. Se você tiver chamadas de função que aceitem parâmetros variáveis, adicione vírgulas à direita nesses locais por conveniência. Mas usá-los em todos os lugares é obviamente demais.
Links na list()
A função list()
é útil para atribuir valores rapidamente a variáveis de uma matriz. Antes do PHP 7.3, não era possível especificar uma variável por referência. Antes do PHP 7.3, o seguinte trecho levava a um erro fatal:
$arr = ['apple', 'orange']; list($a, &$b) = $arr; $b = 'banana'; echo $arr[1];
É impossível referir-se a variáveis non-referencable
: list($a, &$b) = [12, 14];
dará Fatal error: Cannot assign reference to non referencable value in .. on line ..
RFC , discussão sobre Externals.io , implementação
Impacto na compatibilidade com versões anteriores
Não. Em vez de usar list()
para preencher várias variáveis, sugiro que você use objetos de valor para simplificar as coisas. Eles ainda serão passados por referência, mas tornarão seu código muito mais limpo.
image2wbmp()
descontinuada
image2wbmp()
função image2wbmp()
da extensão GD é usada para image2wbmp()
imagens no formato WBMP (Wireless Bitmap). No PHP 7.3, ele é preterido em favor da função imagewbmp()
.
Se você usar image2wbmp()
, substitua o nome da função por imagewbmp
e tudo ficará bem! Mais de 5,500 image2wbmp()
no github e mais de 39,300 imagewbmp()
. Parece que a equipe de desenvolvimento do PHP está retirando recursos menos usados para minimizar o impacto.
RFC , discussão sobre Externals.io , implementação
Impacto na compatibilidade com versões anteriores
Se você usar a função image2wbmp()
, substitua a chamada por imagewbmp
. Aproveite a automação que pode mudar isso para você.
Os sinalizadores FILTER_FLAG_SCHEME_REQUIRED
e FILTER_FLAG_HOST_REQUIRED
ao usar FILTER_VALIDATE_URL
Este é um movimento para a frente. Quando você usa filter_var($var, FILTER_VALIDATE_URL)
, há dois sinalizadores adicionais que podem ser configurados para garantir uma verificação rigorosa da URL: FILTER_FLAG_SCHEME_REQUIRED
e FILTER_FLAG_HOST_REQUIRED
.
A partir do PHP 5.2.1, esses dois sinalizadores são aplicados implicitamente, independentemente de estarem definidos ou não.
Se o seu código usar esses sinalizadores, exclua-os e tudo ficará bem. Atualmente, existem mais de 5.000 resultados de pesquisa no github usando-os.
RFC , discussão sobre Externals.io , implementação
Impacto na compatibilidade com versões anteriores
Como esses dois sinalizadores foram descontinuados, você verá uma notificação como:
Deprecated: filter_var(): explicit use of FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED is deprecated in ...
Tudo o que você precisa fazer é remover as duas bandeiras, como eles FILTER_VALIDATE_URL
estão implícitos ao usar FILTER_VALIDATE_URL
.
Registrar constantes independentes obsoletas
A função define()
permite declarar uma constante no modo que não diferencia maiúsculas de minúsculas. Você deve declarar explicitamente uma constante com distinção entre maiúsculas e minúsculas passando o terceiro parâmetro da função true
. Esse não é o comportamento padrão e provavelmente não é consistente com a capacidade de declarar constantes por meio da palavra-chave const
.
define('Foo', 'Bar', true);
O código acima lançará uma notificação de obsolescência: Descontinuado: Deprecated: define(): Declaration of case-insensitive constants is deprecated in ...
Além disso, ao tentar acessar constantes declaradas no Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
( FOO
), você verá um aviso bastante útil: Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
RFC , discussão sobre Externals.io , implementação
Impacto na compatibilidade com versões anteriores
Você terá que ir para o código base, onde constantes independentes de registro são declaradas e subsequentemente corretas. É extremamente improvável que haja problemas com isso, porque é bastante trabalhoso capturar todos os casos de uso, mas, como resultado, o código se tornará mais claro.
Não encontrei nenhum exemplo desse uso no github, mas pelo menos o Drupal e o WordPress (dois projetos PHP bastante antigos e maduros) têm constantes que não diferenciam maiúsculas de minúsculas.
Lançamento de exceção opcional para erros nas json_decode
json_encode
e json_decode
Um dos meus favoritos. Por todos esses anos, json_encode()
e json_decode()
silêncio quanto a erros em variáveis PHP ou strings json, o que levou ao código que foi marcado. Este caso foi até na famosa crítica do PHP: um fractal de design deficiente .
json_decode
retorna nulo para entrada inválida, enquanto nulo é um objeto absolutamente verdadeiro para JSON decodificado. Essa função não é confiável, a menos que você chame json_last_error
toda vez que a usar.
Levou 6 anos após a publicação no blog e tivemos a oportunidade de receber um erro sobre falhas do json:
try { json_decode("{", false, 512, JSON_THROW_ON_ERROR); } catch (\JsonException $exception) { echo $exception->getMessage();
O novo \JsonException
é um descendente de \Exception
, bem como a constante JsonException
e a própria JsonException
estão no espaço de nomes global.
Eu recomendo que você comece a usar esse recurso. Existem bibliotecas de terceiros, como daverandom / exception-json , que implementam funcionalidades semelhantes para as versões 7.2 e inferiores do PHP. Com a aparência dessa função no núcleo do PHP, você pode remover este pacote e toneladas de código de modelo feio com a chamada json_last_error()
em todos os lugares onde você trabalha com o json.
RFC , discussão sobre Externals.io , implementação
Impacto na compatibilidade com versões anteriores
Nada se você não estiver usando sua própria exceção e / ou constante com os mesmos nomes.
Adicionando a função is_countable()
O PHP 7.2 possui muitas funções obsoletas e com erros. Se você estiver no PHP 7.2. call count()
usando uma variável não- countable
, o PHP exibirá um aviso sobre isso. Nas edições gerais, havia uma proposta para verificar a variável resultante como countable
antes de usá-la em count()
.
countable
-variable é uma matriz ou objeto que implementa a interface \Countable
. Como muitos códigos padrão serão usados durante a verificação, o PHP 7.3 introduziu uma nova função is_countable()
, que verifica a variável quanto a ... bem ... a possibilidade de usar count()
.
Eu escrevi um polyfile para is__countable () se você deseja começar a usar esse recurso agora.
RFC , discussão sobre Externals.io , implementação
Impacto na compatibilidade com versões anteriores
Até que sua própria função is_countable()
seja is_countable()
, não haverá problemas.
Adicionando as funções array_key_first()
e array_key_last()
No PHP, existem 75 funções diferentes para trabalhar com matrizes, mas até agora não houve uma maneira fácil de obter a primeira e a última chave de uma matriz sem alterar o ponteiro da matriz ou iterar sobre todas as chaves (via array_keys()
) e obter o primeiro / último valor.
Duas novas funções array_key_first()
, array_key_first()
e array_key_last()
permitindo que você faça isso.
O RFC também sugeriu a adição de array_value_first()
e array_value_last()
, mas esta parte não passou na votação.
RFC , discussão sobre Externals.io , implementação
Impacto na compatibilidade com versões anteriores
Se você não declarou suas próprias array_key_first()
e array_key_last()
, não há problema.
Migrando do PCRE para o PCRE2
O PHP usa expressões regulares compatíveis com Perl ou, em breve, PCRE na biblioteca para trabalhar com expressões regulares. Desde o PHP 7.2, a versão 8.x da Biblioteca Legada do PCRE foi usada, e no PHP 7.3 o PCRE2 já será usado. Observe que o PCRE2 é considerado uma nova biblioteca, embora seja amplamente compatível com o PCRE (8.x).
A nova biblioteca é mais agressiva na validação de padrões e pode levar a erros no código existente. O seguinte trecho será inválido no PHP 7.3:
preg_match('/[\w-.]+/', '');
O PHP emitirá um aviso Warning: preg_match(): Compilation failed: invalid range in character class at offset 3
.
O problema com o padrão: para que isso funcione, o hífen deve ser movido para o final ou escapado.
preg_match('/[\w\-.]+/', '');
O código acima funcionará bem, não apenas no PHP 7.3, mas também nas versões mais antigas. No novo padrão, o hífen é escapado -
para \-
. Esse é o problema mais comum que você pode encontrar ao resolver problemas de compatibilidade.
Esta é uma mudança bem pequena, mas há uma chance de que tudo dê errado. A mensagem de erro indica a posição exata do caractere na expressão regular. Certifique-se de verificar cuidadosamente seu código. Verifique suas expressões regulares quanto à compatibilidade com a sintaxe PCRE2 através do Regex Buddy
ou outro software similar. Consulte a descrição da sintaxe PCRE2 e da sintaxe herdada do PCRE para obter mais informações.
RFC , discussão sobre Externals.io , implementação
Impacto na compatibilidade com versões anteriores
Como o PCRE2 é mais exigente e rigoroso quanto aos modelos, algumas das chamadas preg_match()
e similares podem não funcionar. A correção varia de simplesmente atualizar o modelo (por exemplo, hífens de escape) até reescrever modelos. Verifique se todos os seus testes foram aprovados.