Thiago Lopes
Thiago Lopes, Desenvolvedor at Umbler

A nova versão do PHP 7.3 recém foi lançada e já está disponível na Umbler!

Um dos lançamentos mais aguardados do ano pela comunidade de desenvolvedores PHP do mundo finalmente foi anunciado! Na semana passada a comunidade PHP recebeu a ótima notícia de que a versão 7.3 do PHP, queridinho dos devs, teve sua Release General Availability antecipada do dia 13 para 6 de dezembro.

O PHP 7.3 já vinha sendo testado desde o lançamento da versão Alpha 1, em junho de 2018 e traz correções de bugs, novas implementações e também tornará alguns métodos obsoletos. Confira abaixo as principais mudanças:

Atribuições de referências em list()

O PHP tem atribuição de list() e atribuição por referência há muito tempo. No entanto, até agora não era possível usar a atribuição de referência com list(). A versão 7.3 traz uma sintaxe que permite isso.

Um fato interessante é que as solicitações para esta implementação são de aproximadamente 18 anos atrás, como podemos ver neste e neste request.

A nova sintaxe ficou da seguinte forma:

$array = [1, 2];
list($a, &$b) = $array;

Que é equivalente a fazer:

$array = [1, 2];
$a = $array[0];
$b =& $array[1]

Também é possível usar essa nova abordagem para listas aninhadas. A especificação completa pode ser vista na documentação oficial do PHP.

Permitir trailing comma em chamadas de função e método

Permitir uma “vírgula à direita” em chamadas de função torna mais conveniente acrescentar argumentos em muitos contextos em que é comum chamar uma função com muitos argumentos.

Isso é útil para o VCS (GIT, TFS, SVN, CVS, etc…), pois as linhas individuais na lista podem ser modificadas, adicionadas ou removidas sem precisar tocar em linhas não relacionadas que estejam no final da lista. O que significa que inserir parâmetros adicionais às chamadas evitará tocar na linha anterior para adicionar uma nova vírgula, que seria ruim para o histórico do controle de versão. Alguns exemplos de uso dessa nova sintaxe são:

Inicializando um array

$foo = [
'foo',
'bar',
];

Chamando um método

unset(
$foo,
$bar,
$baz,
);

Passando parâmetros para um template engine

echo $twig->render(
'index.html',
compact(
'title',
'body',
'comments',
)
);

Mais exemplos de uso podem ser encontrados na Wiki oficial do PHP.

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

O PHP tem duas funções para lidar com JSON: json_decode () e json_encode().

Infelizmente, nenhum têm um tratamento de erros ideal. O json_decode() retorna NULL dá erro, mas NULL também é um resultado válido se decodificar o JSON “null”. Só é possível saber se ocorreu um erro chamando json_last_error() ou json_last_error_msg(), que retorna o estado de erro global.

Essa situação não é a ideal e lançar exceções é uma alternativa melhor, pois:

  • não haveria confusão entre valores de erro e resultados corretos;
  • nenhum estado global desatualizado;
  • nenhuma execução de programa após o erro ser lançado a menos que explicitamente tratado e;
  • mensagens de erro seriam ordenadamente rastreáveis à sua origem.

No entanto, alterar imediatamente o comportamento padrão dessas funções para lançar exceção seria um problema significativo de compatibilidade com versões anteriores. Por outro lado, produzir um Warning não é ideal para erros previsíveis que não sejam bugs ou erro de sintaxe (como decodificação JSON quando é uma entrada do usuário).

Na versão 7.3 temos a adição de uma nova flag (JSON_THROW_ON_ERROR) de opção para json_decode(). Quando passado essa flag, o comportamento de erro dessas funções é alterado. O estado de erro global não é modificado e uma exception do tipo JsonException é lançada.

Função is_countable()

No PHP 7.2 foi adicionado um Warning ao tentar contar objetos incontáveis e, a partir disso, todos devs foram forçados a procurar e alterar seu código para evitar esse Warning. Um código parecido com o seguinte começou a ser utilizado para evitar este Warning:

if (is_array($foo) || $foo instanceof Countable) {
return count($foo);
}

Foi então proposta a criação de método que retorne TRUE ou FALSE para indicar se um objeto é contável. A sintaxe ficou da seguinte forma:

if (is_countable($foo)) {
// $foo é countable
}

Mais exemplos de uso podem ser encontrados na Wiki oficial do PHP.

Sintaxe mais flexibilidade para o Heredoc e Nowdoc

As sintaxes rígidas do heredoc e nowdoc faz com que eles sejam evitados pelos desenvolvedores, pois seu uso no código pode parecer feio e prejudicar a legibilidade. Foram introduzidas duas alterações às atuais sintaxes heredoc e nowdoc para melhorar esta questão:

  • Para permitir que o marcador de fechamento seja indentado, e;
  • Para remover o novo requisito de linha após o marcador de fechamento

Por exemplo:

Anteriormente, o código precisava ser:

<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}

E agora pode ser (detalhe para a indentação):

<?php
class foo {
   public $bar = <<<EOT
   bar
   EOT;
}

Mais mudanças foram feitas na sintaxe, como a necessidade de quebrar a linha após o marcador de fechamento. Todas as mudanças realizadas neste sentido podem ser conferidas diferentemente na RFC do PHP.

Além do que comentamos, a nova versão do PHP traz outras features, correções de bugs e também a depreciação de alguns métodos. A lista de métodos que foram marcados para serem removidos em futuras versões, você pode encontrar aqui.

Disponibilidade do PHP 7.2 e 7.3 na Umbler

Não era só a comunidade de desenvolvedores PHP que estava aguardando esse lançamento desde o seu anúncio. Nós aqui na Umbler estávamos com tudo pronto, só esperando a GA para disponibilizar a nova versão em todos os serviços da plataforma.

A partir de hoje os clientes Umbler podem criar ambientes e atualizar a versão de seu PHP para 7.3 diretamente em nosso painel, em segundos!

E aí, gostou da novidade? Já está usando o PHP 7.3 em seus projetos?
Conte pra gente quais as funcionalidades que você mais gostou, deixe seu comentário!

Thiago Lopes
Thiago Lopes, Desenvolvedor Umbler

Crie sua conta e ganhe até R$ 20 em créditos para testar os sites e e-mails!

Cadastre-se na Umbler sem compromisso ;)