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.
- Os requisitos de sintaxe Heredoc e Nowdoc são mais relaxados
- Permitir vírgula à direita em chamadas de função e método
- Opção para fazer json_encode e json_decode lançar exceções em erros
- Referências in list()
- 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:
- O token final não precisa mais ser a primeira string da linha.
- O token final pode ser indentado com espaços ou tabulações
- 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 …
- O número exato de espaços / guias usados no token final será retirado do conteúdo dentro da expressão heredoc / nowdoc.
- 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 ..
- Você pode adicionar mais expressões após o token final sem erros
- 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 chamejson_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!