Um dos eventos mais emocionantes em 2015 no mundo do PHP foi o lançamento do PHP 7, 10 anos após o lançamento da última versão principal, o 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, tornando mais difícil 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.
Se você não tem trabalhado com PHP recentemente, 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. O principal recurso 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 do Unicode, então a mudança para trazer o Unicode para o PHP fez sentido.
A ideia era trazer suporte completo para Unicode para o próprio núcleo. Isso teria trazido recursos estendidos para a linguagem, desde a capacidade de usar emojis bobos como nomes de variáveis e funções, até uma poderosa funcionalidade de string internacional. Por exemplo, quando outro idioma usa letras maiúsculas e minúsculas de maneira diferente do inglês, ou quando um nome em caracteres chineses precisa ser convertido para o inglês.
Infelizmente, esse 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 importantes e centrais, o que se revelou tedioso e complicado. Isso desacelerou o desenvolvimento de outros recursos da linguagem, frustrando muitos Desenvolvedores PHP no processo. Obstáculos adicionais apareceram, o que resultou em menos interesse em desenvolver um suporte nativo para Unicode, levando ao abandono do projeto.
Como recursos, como livros e artigos, foram escritos para o PHP 6 e seu suporte a Unicode, a nova versão seria renomeada para PHP 7 para evitar confusão.
De qualquer forma, o suficiente sobre o passado triste, vamos ver o que o PHP 7 traz para a festa.
Com virtualmente 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 absoluto um dos recursos mais atraentes do PHP 7. Isso vem como parte do projeto “PHPNG”, que aborda os aspectos internos do próprio Zend Engine.
Ao refatorar as estruturas de dados internas e adicionar uma etapa intermediária à compilação do 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 por cento menos consumo de memória durante as solicitações, tornando o PHP 7 um forte rival para o compilador HHVM JIT do Facebook. Dê uma olhada neste infográfico da Zend que descreve o desempenho de alguns CMS e frameworks .
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 microsserviços em torno do PHP. As mudanças internas, em particular a implementação de AST, também abrem possibilidades para otimizações futuras que podem levar o desempenho ainda mais longe. Uma nova implementação interna de um compilador JIT está sendo considerada para versões futuras.
O PHP 7 vem com novos recursos de sintaxe. Embora não ampliem 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.
o que são componentes em angular
Agora, podemos agrupar declarações de importação para classes originadas do mesmo namespace em um único use
linha. Isso deve ajudar a alinhar as declarações de maneira significativa ou simplesmente salvar alguns bytes em seus arquivos.
use FrameworkModuleFoo; use FrameworkModuleBar; use FrameworkModuleBaz;
Com o PHP 7, podemos usar:
use FrameworkModule{Foo, Bar, Baz};
Ou, se você preferir um estilo de várias linhas:
use FrameworkModule{ Foo, Bar, Baz };
Isso resolve um problema comum na programação PHP, onde queremos atribuir um valor a uma variável de outra variável, se a última estiver realmente definida, ou fornecer um valor diferente para ela. É comumente usado quando trabalhamos com entradas fornecidas 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 }
Após PHP 7:
$bar = $foo ?? 'default';
Isso também pode ser encadeado com uma série de variáveis:
$bar = $foo ?? $baz ?? 'default';
O operador da nave permite uma comparação tripla entre dois valores, indicando não só se são iguais, mas também qual é o maior, na desigualdade, retornando 1,0 ou -1.
Aqui, podemos realizar 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, flutuantes, 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]
Mas é claro que o PHP 7 também traz funcionalidades novas e interessantes com ele.
O PHP 7 estende as declarações de tipo de parâmetros anteriores em métodos (classes, interfaces e arrays) adicionando os quatro tipos escalares; Inteiros (int
), flutuantes (float
), booleanos (bool
) e strings (string
) como possíveis tipos de parâmetro.
Além disso, podemos especificar opcionalmente quais métodos de tipo e funções retornam. Os tipos suportados são bool , int , flutuador , corda , matriz , exigível , nome de Classe ou Interface , auto e pai (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 aplicativos mais robustos e evitam passar e retornar valores errados das funções. Outros benefícios incluem analisadores de código estático e IDEs, que fornecem uma visão melhor sobre a base de código se houver DocBlocks ausentes.
Como o PHP é uma linguagem fracamente digitada, certos valores para parâmetros e tipos de retorno serão lançados com base no contexto. Se passarmos o valor “3” em uma função que tem um parâmetro declarado do tipo int
, o interpretador o aceitará como um inteiro e não lançará nenhum erro. Se não quiser isso, você pode ativar strict mode
adicionando um declare
diretiva.
declare(strict_types=1);
Isso é definido em uma base por arquivo, como uma opção global dividiria os repositórios de código para aqueles que são construídos com rigor global em e aqueles que não são, resultando em um comportamento inesperado quando combinamos o código de ambos.
Com a adição de exceções de mecanismo, erros fatais que teriam resultado no encerramento do script podem ser detectados e manipulados 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 porque, de outra forma, erros fatais exigiriam que eles reiniciassem. Os testes no PHPUnit também devem se tornar mais utilizáveis à medida que erros fatais derrubam todo o conjunto de testes. Exceções, em vez de erros, seriam tratadas por caso de teste.
O PHP 7 adiciona uma série de novas classes de exceção com base no tipo de erros que podem ser encontrados. Para manter a compatibilidade entre as versões, um novo Throwable
interface foi adicionada e pode ser implementada a partir de exceções do mecanismo e do usuário. Isso foi necessário para evitar exceções de mecanismo para estender a classe de exceção base, resultando em exceções de captura de código mais antigas que não existiam antes.
Antes do PHP 7, isso encerraria o script com um erro fatal:
try { thisFunctionDoesNotEvenExist(); } catch (EngineException $e) { // Clean things up and log error echo $e->getMessage(); }
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 normal. Aqui está um exemplo dos documentos.
Pré-PHP 7
class MyLogger { public function log($msg) { print_r($msg . '
'); } } $pusher->setLogger( new MyLogger() );
Com classe anônima:
$pusher->setLogger(new class { public function log($msg) { print_r($msg . '
'); } });
Classes anônimas são úteis em testes de unidade, particularmente em objetos e serviços de teste de simulação. Isso nos ajuda a evitar bibliotecas e estruturas de simulação pesada, criando um objeto simples que fornece a interface que desejamos simular.
Duas novas funções para gerar strings e inteiros criptograficamente seguros foram adicionadas.
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
.
Ao contrário de muitas outras linguagens, antes do PHP 7, o PHP não tinha como escapar de um ponto de código Unicode em strings literais. Essa funcionalidade adiciona o escape u
seqüência para produzir tais 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 têm a mesma representação gráfica, mas diferem no significado.
echo 'u{1F602}'; // outputs ‚
Observe que isso quebra o código existente com u
seqüência porque muda o comportamento.
Os geradores em PHP também tê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 manipule vários cenários de maneira apropriada.
Além disso, os geradores podem retornar e produzir 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 '
$val'; // This will output values 1 to 5 in order } $genB()->getReturn(); // This should return 'success' when there are no errors.
As expectativas são uma melhoria para assert()
função, mantendo a compatibilidade com versões anteriores. Eles permitem asserções de custo zero no código de produção e fornecem a capacidade de lançar exceções personalizadas quando a asserção falha, o que pode ser útil durante o desenvolvimento.
tutorial do servidor web raspberry pi
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, foram fornecidas duas novas diretivas.
zend.assertions
1
: gerar e executar código (modo de desenvolvimento) (valor padrão)0
: gera o código, mas pula em torno dele em tempo de execução-1
: não gera código, tornando-o custo zero (modo de produção)assert.exception
1
: lançar quando a asserção falhar, lançando o objeto fornecido como exceção ou lançando um novo AssertionError objeto se a exceção não foi fornecida0
: use ou gere um Lançável conforme descrito acima, mas apenas gere um aviso com base nesse objeto em vez de lançá-lo (compatível com o comportamento do PHP 5)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 mudanças podem introduzir interrupções na compatibilidade em aplicativos mais antigos.
Outro problema que surge de tais saltos de versão é que bibliotecas e estruturas importantes das quais você depende podem ainda não ter sido atualizadas para suportar a versão mais recente. A equipe do PHP tentou fazer as novas alterações o mais compatíveis com as 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 mudar 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 interrupções são pequenas e podem ser atenuadas facilmente, enquanto outras podem exigir mais esforço e tempo. Basicamente, se você teve avisos de depreciação em seu aplicativo antes de instalar o PHP 7, provavelmente obterá erros que interromperão o aplicativo até serem corrigidos. Você foi avisado, certo?
Mais importante ainda, SAPIs antigos e obsoletos foram removidos como o mysql
extensão (mas você não deveria estar usando isso em primeiro lugar, certo?). Para 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.
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 no 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 interromperia o comportamento dos aplicativos que acessam valores como este. Por outro lado, você pode fazer coisas legais como esta :.
// Nested () foo()(); // Calls the return of foo() $foo->bar()(); // IIFE syntax like JavaScript (function() { // Function body })(); // Nested :: $foo::$bar::$baz
As tags de abertura / fechamento ,, ...
são removidos e não são mais válidos. Substituí-los por outros válidos deve ser fácil, mas o que você está fazendo com eles, esquisito?
Resultante de adições como parâmetros e classes de tipos de retorno, interfaces e características não podem mais ter os seguintes nomes:
Isso causa interrupções nos aplicativos e bibliotecas existentes que os utilizam, mas devem ser fáceis de corrigir. Além disso, embora eles não causem nenhum erro e sejam válidos, os seguintes não devem ser usados, pois estão reservados para uso futuro:
Abster-se de usá-los deve poupar você do trabalho de alterá-los no futuro.
Para uma lista completa de mudanças que poderiam quebrar a compatibilidade, verifique este documento .
Você também pode usar php7cc , que verifica seu código e pode detectar qualquer problema potencial que possa surgir se você mudar para o PHP 7. Mas é claro, não há maneira melhor do que instalar o PHP 7 e ver por si mesmo.
Muitos serviços de hosting começaram a adicionar suporte para PHP 7. Esta é uma boa notícia para os provedores de hospedagem compartilhada, pois os ganhos de performance permitirão aumentar o número de sites clientes em seu hardware, reduzindo suas despesas operacionais e aumentando suas margens. Quanto aos próprios clientes, eles não devem esperar um grande impulso 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 virtuais privados ou servidores dedicados colherão todos os benefícios desse aumento de desempenho. Alguns serviços PaaS, como Heroku, eram compatíveis com PHP 7 no início, mas outros serviços, como AWS Beanstalk e Oracle's OpenShift, estão ficando para trás. Verifique o site do seu provedor de PaaS para ver se o PHP 7 já é compatível ou se o suporte chegará 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 do PHP 7 já estão disponíveis para os principais ambientes IaaS.
Além da compatibilidade da infraestrutura, você também precisa estar ciente dos 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 lançamentos mais recentes. Frameworks importantes como Symfony e Laravel também contam com suporte total.
No entanto, é hora de uma palavra de cautela. Esse suporte não se estende a códigos de terceiros na forma de complementos, plug-ins, pacotes ou o que quer que seu CMS ou estrutura 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 lançamento do PHP 7 removeu o código antigo e obsoleto e abriu o 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 haver algumas quebras de compatibilidade com versões anteriores, a maioria dos problemas é fácil de resolver.
dentro da função anônima, use jquery para selecionar a div do rodapé. ele tem um id de 'rodapé'.
Bibliotecas e frameworks estão migrando seus códigos para PHP 7, disponibilizando as últimas versões. Eu encorajo 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.
Relacionado: A lista dos 10 erros mais comuns que os desenvolvedores de PHP cometem