O que há de novo nas mudanças do PHP 7.3

,

Este é um documento ativo (até que o PHP 7.3 seja liberado como geralmente disponível) sobre mudanças e novos recursos a serem esperados no PHP 7.3, com exemplos de código, RFCs relevantes e a lógica por trás deles, em sua ordem cronológica.

  1. Os requisitos de sintaxe Heredoc e Nowdoc são mais relaxados
  2. Permitir vírgula à direita em chamadas de função e método
  3. Opção para fazer json_encode e json_decode lançar exceções em erros
  4. Referências in list()
  5. Função is_countable() introduzida

Os requisitos de sintaxe Heredoc e Nowdoc são mais relaxados

A sintaxe Heredoc e Nowdoc, que ajudou a usar sequências de várias linhas, tinha requisitos rígidos que o identificador final deveria ser a primeira string aparecendo em uma nova linha.

Por exemplo:

 

$foo = <<<IDENTIFIER
the crazy dog jumps over the lazy fox
"foo" bar;
IDENTIFIER

Aqui, o último IDENTIFIER deve ser a primeira cadeia em uma nova linha para que isso funcione. Além disso, não deve haver outros caracteres após o último IDENTIFIER (além de um ponto e vírgula, que é opcional).

O RFC para PHP 7.3 sugeriu remover o requisito acima com o objetivo de tornar o código mais legível. Antes desse RFC, era preciso quebrar o recuo usado no restante do código, para que os tokens de doc aqui / agora possam ser usados.

A RFC sugere fazer essas alterações na sintaxe heredoc/nowdoc:

  1. O token final não precisa mais ser a primeira string da linha.
  2. O token final pode ser indentado com espaços ou tabulações
  3. Os caracteres de espaço em branco (espaço ou tabulação) não devem ser misturados. Se você fizer isso, você receberá um erro de análise: recuo inválido – guias e espaços não podem ser misturados .. na linha …
  4. O número exato de espaços / guias usados no token final será retirado do conteúdo dentro da expressão heredoc / nowdoc.
  5. Se o número de caracteres de espaço em branco usados no token final for maior que qualquer um dos caracteres de espaço em branco da expressão, você receberá o erro de Análise: Nível de recuo do corpo inválido (esperando um nível de recuo de pelo menos). . conectados ..
  6. Você pode adicionar mais expressões após o token final sem erros
  7. Aqui está um exemplo de snippet que aproveita esse novo recurso sem violar as regras recém-aplicadas:

 

$foo = ['foo', 'bar', <<<EOT
baz
- hello world! --
ahoy
EOT, 'qux', 'quux'
];

var_dump($foo);

a saída seria:

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 como os espaços em branco usados na declaração heredoc não foram incluídos na saída var_dump (), e continuamos a adicionar mais elementos à matriz $ foo após o token EOT.

RFC, discussão Externals.io, Implementação

Impacto de compatibilidade com versões anteriores

Contanto que você não tenha nenhuma string literal heredox/nowdoc que contenha o mesmo token que o primeiro caractere positivo em uma linha, você foi bem sucedido.

$foo = <<<HELLO
  HELLO_WORLD <-- this will not terminate the string literal
  HELLOWORLD <-- this one will not either.
  HELLO WORLD<-- this one will
HELLO;

Se você tiver alguma sintaxe heredoc / nowdoc semelhante à acima, observe que com o PHP 7.3, o PHP assume que o HELLO encerra o literal da string e lançará um erro na próxima linha. Nas versões anteriores, o HELLO WORLD não é considerado o token final do heredoc. Obrigado a / u / ImSuperObjective2 no reddit por apontar isso.

Permitir vírgula à direita em chamadas de função e método

Esta é uma mudança simples, que sugere a permissão de vírgulas à direita em chamadas de função e método. Isso não afeta as declarações.

Por exemplo, a seguinte sintaxe seria permitida:

// regular functions.
foo('bar', 'baz',); // Observe a vírgula à direita depois de 'baz'.

No pré-PHP-7.3, o trecho acima gera um erro

PHP Parse error:  syntax error, unexpected ')' in .. on line ..

Você não pode usar mais de uma vírgula no final ou usar vírgulas para ignorar argumentos – a vantagem dessa alteração é principalmente para aquelas funções com parâmetros variadic. Essa alteração também torna a sintaxe da matriz (que permite que as vírgulas à direita já sejam consistentes).

Note que você não pode usar isto em declarações de função/método; isto está errado:

function foo($bar, $baz, ) { // nah, you can't do this.
}

RFC, discussão Externals.io, Implementação

Impacto de compatibilidade com versões anteriores

Nenhum – seu código existente continuará funcionando. Se você tem alguma chamada de função que aceita parâmetros variadic e acredita que você poderia fazer um diffs mais limpo com isso, sugiro que você vá em frente e adicione vírgulas à direita das chamadas. Se você colocar uma vírgula à direita para cada chamada de função, você está claramente exagerando.

Opção para fazer json_encode e json_decode lançar exceções em erros

Este é um dos meus favoritos. Por todos esses anos, json_encode () e json_decode () foram silenciosos sobre erros nas variáveis PHP fornecidas ou na string JSON. Isso era propenso a código com bugs porque nem todo mundo conhece esse caso extremo. Isso foi até criticado no famoso post PHP: Um Fractal design ruim .

json_decode retorna nulo para entrada inválida, mesmo que null seja também um objeto perfeitamente válido para o decodificação de JSON – esta função é completamente não confiável, a menos que você também chame json_last_error toda vez que usá-lo.

Levamos 6 anos desde o post do blog, mas agora temos uma opção para fazer o PHP lançar um erro nas falhas de operação do JSON:

try {
  json_decode("{", false, 512, JSON_THROW_ON_ERROR);
}
catch (\JsonException $exception) {
  echo $exception->getMessage(); // echoes "Syntax error"
}

A nova \ JsonException é uma subclasse de \ Exception, e ambas as constantes JSON_THROW_ON_ERROR e JsonException são declaradas no namespace global.

Eu recomendo que você comece a usar esse recurso. Existem contributed libraries, como daverandom/exceptional-json, que trouxeram funcionalidades semelhantes até o PHP 7.2. Com este recurso agora no núcleo PHP, você pode remover este pacote ou toneladas de boilerplate code que chamam json_last_error toda vez que você faz uma operação JSON.

RFC, discussão Externals.io, Implementação

Impacto de compatibilidade com versões anteriores

Nenhum, a menos que você tenha declarado sua própria exceção e/ou constantes com nomes conflitantes.

Referências in list()

O list() é útil para atribuir rapidamente uma variável de uma matriz de variáveis. Até o PHP 7.3, não foi possível atribuir as variáveis por referência. Antes do PHP 7.3, o seguinte trecho causaria um erro fatal:

$arr = ['apple', 'orange'];
list($a, &$b) = $arr;
$b = 'banana';
echo $arr[1];
// Fatal error: [] and list() assignments cannot be by reference in .. on line ..

Com o PHP 7.3, você poderá fazê-lo e a saída do echo $ arr [1]; será “banana”! Imagine minions felizes de Meu Malvado FAvorito. A sintaxe [$ a, & $ b] = $ arr também terá esse recurso, é claro.

Você ainda não pode referenciar variáveis não referenciáveis:list($a, &$b) = [12, 14]; will throw Fatal error: Cannot assign reference to non referencable value in .. on line ..

Minor nitpick: enquanto “referenciável” é uma grafia aceitável, “referenciável” é muito mais usada.

RFC, discussão Externals.io, Implementação

Impacto de compatibilidade com versões anteriores

Nenhum. Em vez de usar a atribuição list() para preencher várias variáveis, sugiro que você use objetos de valor para tornar as coisas mais limpas. Eles serão passados de qualquer maneira por referência e farão seu código muito mais limpo.

Função is_countable() introduzida

O PHP 7.2 desaprovou muitas funções e casos de uso com bugs. No PHP 7.2, se você chamar count() em uma variável que não seja “contável”, o PHP mostrará um aviso sobre isso. Uma solução comum era verificar se a variável determinada é “contável” antes de chamar count() nela.

Uma variável “contável” é uma matriz ou um objeto cuja classe implementa a interface \Countable. Como pode haver muito boilerplate code, o PHP 7.3 agora tem a nova função is_countable() que retorna se a variável passada for … bem … contável.

Eu coloquei um polyfill para is_countable() se você quiser usar isso no código do pré-PHP.7.3

RFC, discussão Externals.io, Implementação

Impacto de compatibilidade com versões anteriores

A menos que você tenha declarado sua função is_countable, não haverá problemas.

AUTOR ORIGINAL:  Ayesh Karunaratne,  freelance PHP/Drupal Web Developer

ARTIGO ORIGINAL: Upgrade PHP 7.3

Obrigado por enviar o seu comentário minha jóia!