Introdução ao PHP 7: o que há de novo e o que acabou
Publicados: 2022-03-11Um dos eventos mais emocionantes de 2015 no mundo PHP foi o lançamento do PHP 7, 10 anos após o lançamento da última versão principal, PHP 5. Com um grande passo à frente, o PHP 7 apresenta muitos novos recursos e atualizações de desempenho .
No entanto, também remove funcionalidades antigas e obsoletas, o que introduz algumas quebras de compatibilidade, dificultando a migração de aplicativos mais antigos para a nova versão. Este guia deve servir como um tour rápido sobre o que esperar se você planeja mover seus aplicativos existentes, ou construir novos, em cima do PHP 7.
Mas espere, para onde foi o PHP 6?
Se você não tem trabalhado com PHP ultimamente, você pode se perguntar o que aconteceu com o PHP 6, por que pular do PHP 5 para o PHP 7? Bem, para encurtar a história, o PHP 6 foi um fracasso. A principal característica da versão 6 era o suporte nativo para caracteres Unicode, já que o PHP é usado principalmente no desenvolvimento da web e a web precisa de Unicode, então a mudança para trazer o Unicode para o PHP fazia sentido.
A ideia era trazer suporte completo ao Unicode para o próprio núcleo. Ele teria trazido recursos estendidos para a linguagem, desde a capacidade de usar emojis bobos como nomes de variáveis e funções, até a poderosa funcionalidade de string internacional. Por exemplo, quando outro idioma usa letras maiúsculas e minúsculas de forma diferente do inglês, ou quando um nome em caracteres chineses precisa ser convertido para inglês.
Infelizmente, este plano ambicioso provou ser um problema maior do que o previsto. Grande parte da base de código teve que ser portada para suportar Unicode para extensões principais e importantes, o que se mostrou tedioso e complicado. Isso atrasou o desenvolvimento de outros recursos da linguagem, frustrando muitos desenvolvedores PHP no processo. Surgiram obstáculos adicionais, o que resultou em menos interesse em desenvolver um suporte nativo a Unicode, levando ao abandono do projeto.
Como recursos, como livros e artigos, foram escritos para PHP 6 e seu suporte a Unicode, a nova versão seria renomeada para PHP 7 para evitar confusão.
Enfim, chega de morar no passado triste, vamos ver o que o PHP 7 traz para a festa.
Batalha de desempenho, PHP 7 vs. PHP 5
Com praticamente todas as atualizações, pequenas atualizações de desempenho são esperadas. No entanto, desta vez o PHP traz uma melhoria significativa em relação às versões anteriores, tornando o desempenho puro um dos recursos mais atraentes do PHP 7. Isso faz parte do projeto “PHPNG”, que aborda os componentes internos do próprio Zend Engine.
Ao refatorar estruturas de dados internas e adicionar uma etapa intermediária à compilação de código na forma de uma Árvore de Sintaxe Abstrata (AST), o resultado é um desempenho superior e uma alocação de memória mais eficiente. Os próprios números parecem muito promissores; benchmarks feitos em aplicativos do mundo real mostram que o PHP 7 é duas vezes mais rápido que o PHP 5.6, em média, e resulta em 50% menos consumo de memória durante as solicitações, tornando o PHP 7 um forte rival do compilador HHVM JIT do Facebook. Dê uma olhada neste infográfico da Zend que descreve o desempenho de alguns CMS e Frameworks comuns.
A diminuição no consumo de memória também permite que máquinas menores lidem melhor com as solicitações, juntamente com a oportunidade de construir micro serviços em torno do PHP. As mudanças internas, em particular a implementação do AST, também abrem possibilidades para futuras otimizações que podem impulsionar ainda mais o desempenho. Uma nova implementação interna de um compilador JIT está sendo considerada para versões futuras.
Açúcar Sintático PHP 7
O PHP 7 vem com novos recursos de sintaxe. Embora não estendam os recursos da linguagem em si, eles fornecem uma maneira melhor ou mais fácil de tornar seu código mais agradável de escrever e agradável aos olhos.
Declarações de Importação de Grupo
Agora, podemos agrupar declarações de importação para classes originárias do mesmo namespace em uma única linha de use
. Isso deve ajudar a alinhar as declarações de maneira significativa ou simplesmente salvar alguns bytes em seus arquivos.
use Framework\Module\Foo; use Framework\Module\Bar; use Framework\Module\Baz;
Com o PHP 7 podemos usar:
use Framework\Module\{Foo, Bar, Baz};
Ou, se você preferir um estilo de várias linhas:
use Framework\Module{ Foo, Bar, Baz };
Operador de coalescência nulo
Isso resolve um problema comum na programação PHP, onde queremos atribuir um valor a uma variável de outra variável, se esta estiver realmente definida, ou fornecer um valor diferente para ela. É comumente usado quando trabalhamos com entrada fornecida pelo usuário.
Pré-PHP 7:
if (isset($foo)) { $bar = $foo; } else { $bar = 'default'; // we would give $bar the value 'default' if $foo is NULL }
Depois do PHP 7:
$bar = $foo ?? 'default';
Isso também pode ser encadeado com várias variáveis:
$bar = $foo ?? $baz ?? 'default';
Operador de nave espacial
O operador nave espacial <=>
permite uma comparação de três vias entre dois valores, não apenas indicando se são iguais, mas também qual é o maior, na desigualdade retornando 1,0 ou -1.
Aqui podemos tomar ações diferentes dependendo de como os valores diferem:
switch ($bar <=> $foo) { case 0: echo '$bar and $foo are equal'; case -1: echo '$foo is bigger'; case 1: echo '$bar is bigger'; }
Os valores comparados podem ser inteiros, floats, strings ou mesmo arrays. Verifique a documentação para ter uma ideia de como os diferentes valores são comparados entre si. [https://wiki.php.net/rfc/combined-comparison-operator]
Novos recursos no PHP 7
Mas é claro que o PHP 7 também traz novas e excitantes funcionalidades.
Tipos de parâmetros escalares e dicas de tipo de retorno
O PHP 7 estende as declarações de tipo anteriores de parâmetros em métodos (classes, interfaces e arrays) adicionando os quatro tipos escalares; Inteiros ( int
), floats ( float
), booleanos ( bool
) e strings ( string
) como tipos de parâmetros possíveis.
Além disso, podemos opcionalmente especificar quais métodos e funções de tipo retornam. Os tipos suportados são bool , int , float , string , array , callable , name of Class or Interface , self e parent ( para métodos de classe )
class Calculator { // We declare that the parameters provided are of type integer public function addTwoInts(int $x, int $y): int { return $x + $y; // We also explicitly say that this method will return an integer } }
As declarações de tipo permitem a construção de aplicações mais robustas e evitam passar e retornar valores errados de funções. Outros benefícios incluem analisadores de código estático e IDEs, que fornecem uma melhor visão sobre a base de código se houver DocBlocks ausentes.
Como o PHP é uma linguagem de tipagem fraca, certos valores para tipos de parâmetro e retorno serão convertidos com base no contexto. Se passarmos o valor “3” em uma função que tenha um parâmetro declarado do tipo int
, o interpretador o aceitará como um inteiro e não lançará nenhum erro. Se você não quiser isso, você pode habilitar strict mode
adicionando uma diretiva declare
.
declare(strict_types=1);
Isso é definido por arquivo, pois uma opção global dividiria os repositórios de código entre aqueles que são construídos com rigor global e aqueles que não são, resultando em um comportamento inesperado quando combinamos o código de ambos.
Exceções do mecanismo
Com a adição de exceções de mecanismo, erros fatais que resultariam no encerramento do script podem ser detectados e tratados facilmente.
Erros como chamar um método inexistente não encerram o script, em vez disso, eles lançam uma exceção que pode ser tratada por um bloco try catch, o que melhora o tratamento de erros para seus aplicativos. Isso é importante para certos tipos de aplicativos, servidores e daemons, pois erros fatais exigiriam que eles fossem reiniciados. Testes no PHPUnit também devem se tornar mais úteis, pois erros fatais eliminam todo o conjunto de testes. Exceções, em vez de erros, seriam tratadas por caso de teste.
O PHP 7 adiciona várias novas classes de exceção baseadas no tipo de erro que pode ser encontrado. Para manter a compatibilidade entre as versões, foi adicionada uma nova interface Throwable
que pode ser implementada a partir de exceções de mecanismo e exceções de usuário. Isso foi necessário para evitar exceções de mecanismo para estender a classe de exceção básica, resultando em exceções de captura de código mais antigas que não existiam antes.
Antes do PHP 7, isso teria encerrado o script com um erro fatal:
try { thisFunctionDoesNotEvenExist(); } catch (\EngineException $e) { // Clean things up and log error echo $e->getMessage(); }
Aulas anônimas
Classes anônimas são primas de funções anônimas que você pode usar em uma instância simples de curto prazo. As classes anônimas são facilmente criadas e usadas como um objeto regular. Aqui está um exemplo dos documentos.
Pré-PHP 7
class MyLogger { public function log($msg) { print_r($msg . "\n"); } } $pusher->setLogger( new MyLogger() );
Com classe anônima:
$pusher->setLogger(new class { public function log($msg) { print_r($msg . "\n"); } });
Classes anônimas são úteis em testes de unidade, particularmente em simular objetos e serviços de teste. Isso nos ajuda a evitar bibliotecas e estruturas de simulação pesadas, criando um objeto simples que fornece a interface que queremos simular.
Funções CSPRNG
Duas novas funções para gerar string e inteiros criptograficamente seguros foram adicionados.

random_bytes(int $len);
Retorna uma string aleatória com comprimento $len
.
random_int(int $min, int $max);
Retorna um número entre $min
e $max
.
Sintaxe de escape de ponto de código Unicode
Ao contrário de muitas outras linguagens, antes do PHP 7, o PHP não tinha como escapar de um codepoint Unicode em literais de string, . Essa funcionalidade adiciona a sequência de escape \u
para produzir esses caracteres usando seu codepoint UTF-8. Isso é melhor do que inserir os caracteres diretamente, permitindo um melhor manuseio de caracteres invisíveis, bem como de caracteres que possuem a mesma representação gráfica, mas diferem em significado.
echo "\u{1F602}"; // outputs ‚
Observe que isso quebra o código existente com a sequência \u
porque altera o comportamento.
Geradores são atualizados
Os geradores em PHP também obtêm alguns recursos adicionais interessantes. Agora, os geradores têm uma instrução de retorno que pode ser usada para permitir a saída de um valor final após a iteração. Isso pode ser usado para verificar se o gerador foi executado sem erros e permite que o código que chamou o gerador lide com vários cenários adequadamente.
Além disso, os geradores podem retornar e gerar expressões de outros geradores. Isso permite que eles dividam operações complexas em unidades mais simples e modulares.
function genA() { yield 2; yield 3; yield 4; } function genB() { yield 1; yield from genA(); // 'genA' gets called here and iterated over yield 5; return 'success'; // This is a final result we can check later } foreach (genB() as $val) { echo "\n $val"; // This will output values 1 to 5 in order } $genB()->getReturn(); // This should return 'success' when there are no errors.
Expectativas
As expectativas são um aprimoramento da função assert()
, mantendo a compatibilidade com versões anteriores. Eles permitem declarações de custo zero no código de produção e fornecem a capacidade de lançar exceções personalizadas quando a declaração falha, o que pode ser útil durante o desenvolvimento.
assert()
torna-se uma construção de linguagem no PHP 7. Asserções devem ser usadas para propósitos de depuração apenas em ambientes de desenvolvimento e teste. Para configurar seu comportamento, são fornecidas duas novas diretivas.
-
zend.assertions
-
1
: gerar e executar código (modo de desenvolvimento) (valor padrão) -
0
: gera o código, mas salta em tempo de execução -
-1
: não gera código tornando-o custo zero (modo de produção)
-
-
assert.exception
-
1
: lança quando a asserção falha, seja lançando o objeto fornecido como exceção ou lançando um novo objeto AssertionError se a exceção não foi fornecida -
0
: use ou gere um Throwable como descrito acima, mas apenas gere um aviso com base nesse objeto em vez de jogá-lo (compatível com o comportamento do PHP 5)
-
Preparando-se para passar do PHP 5 para o PHP 7
A introdução de uma versão principal traz a oportunidade de alterar/atualizar funcionalidades mais antigas ou até mesmo removê-las se forem consideradas muito antigas ou estiverem obsoletas por algum tempo. Essas alterações podem introduzir quebras de compatibilidade em aplicativos mais antigos.
Outro problema que surge desses saltos de versão é que bibliotecas e estruturas importantes das quais você depende podem ainda não ter sido atualizadas para oferecer suporte à versão mais recente. A equipe do PHP tentou tornar as novas alterações o mais compatível possível com versões anteriores e permitir que a migração para a nova versão fosse o mais simples possível. Aplicativos mais novos e atualizados devem achar mais fácil migrar para a nova versão, enquanto aplicativos mais antigos podem ter que decidir se os benefícios superam o custo, possivelmente optando por não atualizar.
A maioria das pausas são pequenas e podem ser atenuadas facilmente, enquanto outras podem exigir mais esforço e tempo. Basicamente, se você tiver avisos de depreciação em seu aplicativo antes de instalar o PHP 7, provavelmente receberá erros que interromperão o aplicativo até que seja corrigido. Você foi avisado, certo?
SAPIs e extensões antigas
Mais importante, SAPIs antigos e obsoletos foram removidos como a extensão mysql
(mas você não deveria estar usando isso em primeiro lugar, certo?). Para obter uma lista completa de extensões e recursos removidos, você pode verificar este RFCs aqui e aqui.
Além disso, outros SAPIs estão sendo portados para o PHP 7.
Sintaxe de variável uniforme
Esta atualização fez algumas mudanças em favor da consistência para construções de variável variável. Isso permite expressões mais avançadas com variáveis, mas introduz mudanças de comportamento em alguns outros casos, conforme mostrado abaixo.
// old meaning // new meaning $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz'] $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz'] $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
Isso quebraria o comportamento dos aplicativos que acessam valores como este. Por outro lado, você pode fazer algumas coisas legais como esta:.
// Nested () foo()(); // Calls the return of foo() $foo->bar()(); // IIFE syntax like JavaScript (function() { // Function body })(); // Nested :: $foo::$bar::$baz
Etiquetas de estilo antigo removidas
As tags de abertura/fechamento <% ... %>
, <%= ... %>
, <script language="php"> ... </script>
são removidas e não são mais válidas. Substituí-los pelos válidos deve ser fácil, mas o que você está fazendo usando-os de qualquer maneira, esquisito?
Nomes inválidos para classes, interfaces e características
Resultantes de adições como classes de parâmetros e tipos de retorno, interfaces e características não podem mais ter os seguintes nomes:
- bool
- int
- flutuador
- corda
- nulo
- verdadeiro
- falso
Eles causam interrupções nos aplicativos e bibliotecas existentes que os utilizam, mas devem ser fáceis de corrigir. Além disso, embora não causem nenhum erro e sejam válidos, os seguintes não devem ser usados, pois são reservados para uso futuro:
- recurso
- objeto
- misturado
- numérico
Abster-se de usá-los deve poupar o trabalho de alterá-los no futuro.
Para obter uma lista completa de alterações que podem quebrar a compatibilidade, consulte este documento.
Você também pode usar o php7cc, que verifica seu código e pode detectar quaisquer problemas potenciais que possam surgir se você mudar para o PHP 7. Mas é claro que não há maneira melhor do que instalar o PHP 7 e ver por si mesmo.
Possíveis problemas de compatibilidade com PHP 7
Compatibilidade de Infraestrutura PHP 7
Muitos serviços de hospedagem começaram a adicionar suporte para PHP 7. Esta é uma boa notícia para provedores de hospedagem compartilhada, pois os ganhos de desempenho permitirão aumentar o número de sites de clientes em seu hardware, reduzindo suas despesas operacionais e aumentando suas margens. Quanto aos próprios clientes, eles não devem esperar muito aumento nessas condições, mas, para ser justo, a hospedagem compartilhada não é uma escolha orientada para o desempenho de qualquer maneira.
Por outro lado, os serviços que oferecem servidores privados virtuais ou servidores dedicados colherão todos os benefícios desse aumento de desempenho. Alguns serviços de PaaS, como o Heroku, ofereceram suporte ao PHP 7 desde o início, mas outros serviços, como o AWS Beanstalk e o OpenShift da Oracle, estão ficando para trás. Verifique o site do seu provedor de PaaS para ver se o PHP 7 já é suportado ou se o suporte está chegando em um futuro próximo.
Obviamente, os provedores de IaaS permitem que você assuma o controle do hardware e instale o PHP 7 (ou compile, se for mais do seu agrado). Os pacotes PHP 7 já estão disponíveis para os principais ambientes IaaS.
Compatibilidade de Software PHP 7
Além da compatibilidade de infraestrutura, você também precisa estar atento a possíveis problemas de compatibilidade de software. Sistemas populares de gerenciamento de conteúdo como WordPress, Joomla e Drupal adicionaram suporte para PHP 7 em seus últimos lançamentos. Os principais frameworks como Symfony e Laravel também desfrutam de suporte total.
No entanto, é hora de uma palavra de cautela. Esse suporte não se estende a código de terceiros na forma de complementos, plug-ins, pacotes ou o que quer que seu CMS ou framework os chame. Eles podem sofrer de problemas de compatibilidade e é sua responsabilidade garantir que tudo esteja pronto para o PHP 7.
Para repositórios ativos e mantidos, isso não deve ser um problema. No entanto, repositórios mais antigos e sem manutenção sem suporte ao PHP 7 podem tornar todo o seu aplicativo inutilizável.
O futuro do PHP
O lançamento do PHP 7 removeu código antigo e obsoleto e abriu caminho para novos recursos e atualizações de desempenho no futuro. Além disso, espera-se que o PHP obtenha otimizações de desempenho adicionais em breve. Apesar de ter algumas quebras de compatibilidade com versões anteriores, a maioria dos problemas são fáceis de resolver.
Bibliotecas e frameworks estão agora migrando seus códigos para o PHP 7, disponibilizando assim as versões mais recentes. Convido você a experimentar e ver os resultados por si mesmo. Talvez seu aplicativo já seja compatível e esteja esperando para usar e se beneficiar do PHP 7.