PHP 7: é já o momento certo para migrar?

Em anos recentes, as pequenas atualizações do PHP ofereceram-nos melhorias significativas na performance da linguagem. A comunidade que existe à volta do PHP tornou-se mais profissional e desenvolveu inúmeras ferramentas que permitiram aos programadores melhorar a utilização da linguagem e a manutenção das suas aplicações. Anunciado como um grande evento, o PHP 7, o sucessor do PHP 5, tem a sua data de lançamento oficial a 12 de Novembro. Quais as novidades por detrás deste grande evento? Vamos então ver o que há por baixo do capô do PHP 7.

(Re)descobrir o artigo «Não, PHP não morreu!!»

PHP 5 para 7: Uma transição confusa

Estarão os informáticos chateados com a matemática? Depois da Microsoft ter efetuado a atualização do Windows 8 para o Windows 10, o PHP decidiu ignorar as regras básicas da aritmética ao passar da versão PHP 5 para a versão 7. No entanto, esta situação bizarra explica-se se voltarmos ao passado. Em 2004, aquando do lançamento do PHP 5, teve inicio o desenvolvimento da versão 6, sendo que o seu grande objetivo seria a integração do Unicode na linguagem, permitindo a standarização dos caracteres especiais. Por exemplo, sem Unicode não poderemos escrever « I ❤ PHP ».

Más decisões e falta de motivação levaram os programadores de PHP a pararem o seu trabalho nesta versão em 2010. Na sua apresentação, Andrei Zmievski revela os detalhes técnicos que o levaram a essa escolha. Os programadores estariam concentrados em melhoramentos mais pragmáticos e integraram-nos em versões 'menores' até 2014.

Quando os programadores de PHP estavam a trabalhar na roadmap da sua versão 'maior', eles começaram a questionar-se sobre que nome haveriam de lhe dar (pode consultar aqui os elementos do debate). Vários artigos e livros foram entretanto lançados, evocando a saída da versão 6, versão que acabaria por ser abortada, levando a que houvesse confusões para os utilizadores que procurariam a documentação da última versão de PHP. Além disso, a comunidade estava ansiosa por acabar com esta aventura definitivamente. É esta a razão pela qual os programadores votaram no nome PHP 7.

Esta nova versão de PHP é o resultado de mais de um ano e meio de trabalho, e é difícil ser exaustivo sobre todas as novidades que ela traz. Vamos então concentrar-nos nos pontos mais importantes.

PHP 7: duas vezes mais rápido que o PHP 5.6.

Haver concorrência é sempre uma boa coisa. Para as suas próprias necessidades, o Facebook criou, em 2011, uma plataforma de execução de PHP de seu nome HHVM, plataforma essa que melhora as performances da linguagem graças a um sistema de compilação "on the fly" (JIT). Inspirados por este projeto, os programadores da comunidade procuraram rapidamente integrar melhoramentos similares diretamente no seio do PHP. Reagrupados com o nome de PHPNG (PHP New Generation), estas otimizações necessitaram de um alteração enorme do código de forma a preparar o terreno para a integração de um mecanismo de JIT para melhorar as performances globais da linguagem. Em condições reais, o PHP 7 é até duas vezes mais rápido que o PHP 5. E se confiarmos nos benchmarks efetuados por Rasmus Lerdorf (o criador de PHP), o PHP 7 atingiu, em Abril deste ano, o mesmo nível de performances que o HHVM ... levando os programadores do HHVM a retomarem o projeto para voltarem à liderança!

Alguns bloggers passaram de imediato da nova versão de PHP para PHPNG. Na realidade, o PHPNG, em que o impacto está longe de "marginal", ele representa apenas uma parte do projeto completo.

Testes efetuados com uma oferta de Alojamento Web Performance 1. Tempos medidos em segundos.

PHP 7: Do PHP 5 para o PHP 7: tudo corre bem ou tudo deixa de funcionar?

A chegada do PHP 7 vai levar a que algumas funcionalidades marcadas como "deprecated" nas versões antigas deixem de funcionar. Numerosas extensões não mantidas foram eliminadas, entre as quais as extensões ereg_* e aextension mysql, a substituir idealmente pela extensão PDO_mysql (o mysqli está igualmente disponível).

Se utiliza extensões não mantidas pelo PHP, em especial aquelas funções que estabelecem ligações a bases de dados específicas, certifique-se que elas providenciam suporte a PHP 7. O PHPNG modifica o funcionamento interno das extensões. Elas devem então ser atualizadas para funcionarem em PHP 7. Está já em curso um protótipo disponível para MongoDB.

Sempre à procura de melhorar as performances, o PHP utiliza ainda uma «abstract syntax tree» (AST) que permite efetuar otimizações do código "on the fly". Este método impõe que a leitura do conteúdo seja uniforme. Com o PHP 5 o compilador lê normalmente da esquerda para a direta, exceto nalguns casos em que a variável é lida da direita para a esquerda. Estas extensões já não existem no PHP 7, todo o código é interpretado da esquerda para a direita.

Vamos pegar no exemplo da variável «$foo->$bar['baz']». Em PHP 5, a interpretação desta variável pode-se escrever «$foo->{$bar['baz']}». No entanto, no PHP 7 a interpretação pode ser escrita como $foo->$bar, com ($foo->$bar)['baz'] a ser interpretado primeiro. Esta alteração não deverá causar um grande impacto nas suas aplicações, embora não fique surpreendido se encontrar erros de sintaxe.

Outra alteração importante, e pensamos tratar-se de uma boa novidade, os "fatals erros" retornados pela linguagem são apenas enviados agora em casos excecionais. Isto significa que poderá agora tratar este tipo de erros diretamente na aplicação, evitando o comportamento padrão do PHP. Aqueles que lidam com estes erros sabem do que falo!

Finalmente, o PHP inclui agora novas palavras reservadas. Tenha em atenção que não poderá utilizar os seguintes nomes para nomear as suas 'classes, namespaces ou traits': int, foat, bool, string, true, false, null, resource, object, scalar, mixed, numeric. Numerosos frameworks PHP tem wrappers à volta de alguns tipos de dados como as cadeias de caracteres (strings) e devem ser adaptados.

Os pontos invocados não representam todos os problemas de compatibilidade com o PHP 5.6 mas penso que cobrem os mais importantes. Pode encontrar a lista completa no website do PHP http://php.net/manual/en/migration70.php). Mesmo com todas as precauções acauteladas, nada melhor do que efetuar um teste na sua infraestrutura de pré-produção.

Graças aos tipos de parâmetros escalares, evite erros fatais.

A list das novas funcionalidades de PHP 7 é longa e providencia todas as informações às pessoas que se queixam que o PHP é perigoso devido a ser uma linguagem dinâmica. Pela primeira vez na sua histórica, o PHP integra agora variáveis estáticas.

Já estou a imaginar reações de pânico daqueles que pensam que esta alteração terá impacto no código existente. Podem ficar calmos, tratam-se de funcionalidades facultativas acessíveis apenas a quem a escrita "strict" é obrigatória! A utilização de variáveis estáticas permitem ao compilador PHP efetuar otimizações que são impensáveis sem conhecer de antemão o tipo de variável. Por além disso, se está à procura da melhor estrutura de dados, sugiro que veja a excelente conferência de Patrick Allaert. Portanto, quais são as novidades?

Tratam-se na realidade de duas novidades: o «scalar type declarations» e o «return type declarations». Para o primeiro, trata-se da definição do que é esperado nos argumentos de uma função. Se o valor esperado pela função está corretamente formatado, uma exceção é retornada pela linguagem. Por exemplo, se definir uma função que permite dividir dois números inteiros, pode agora escrevê-la como no exemplo em baixo-

Código:

Resultado:

A funcionalidade «return type declarations» permite declarar o formato esperado pela resposta da sua função. Como o anterior, obterá uma exceção se um valor incorreto é retornado pela função.

Código:

Resultado:

Os puristas do "static typing" dirão que a possibilidade de providenciar uma string completa de caracteres deverá retornar em erro e poderão ficar desapontados pelas novas funcionalidades ... Mas uma vez mais, o PHP 7 permite ao programador definir o seu nível de rigor! Desta forma, ao adicionar a linha «declare(strict_types=1) ;» no inicio do ficheiro, o PHP devolverá igualmente uma exceção. Ela funciona corretamente para a escrita das mensagens devolvidas por uma função, mas igualmente para os seus argumentos!

Código:

Resultado:

Estas novas funcionalidades permitem ao compilador otimizar o funcionamento da linguagem, e parece-me uma pena deixá-las de parte. No entanto, não necessita de rescrever todo o seu código para passar para a versão 7, uma vez que a escrita dinâmica faz igualmente parte desta versão e em alguns casos dá jeito.
Esqueci-me: O PHP 7 suporta caracteres Unicode no seio das strings de caracteres. Herdado do projeto abortado de PHP 6, esta nova funcionalidade faz o PHP entrar na era dos pequenos 🐈.

CMS e Framework: quem já está pronto?

Muitos programadores utilizam CMS ou frameworks para se concentraram melhor nos seus projetos. Para migrar para o PHP 7 e beneficiar das inovações descritas, é necessário aguardar que essas frameworks sejam atualizadas. Não deverá demorar muito na medida em que o PHP não incluirá mais funcionalidades do que aquelas que já estão na versão Beta desta Julho, desenvolvida pelas equipas que mantém os principais CMS e Frameworks.
Algumas equipas já anunciaram estar prontas para migrar para o PHP 7. Encontraremos, entre essas equipas, a equipa do Symfony, pronta desde Agosto nas versões 2.3, 2.6, 2.7 e a futura relase 3.0, tal como a equipa do Zend Framework, pronta desde a versão 2.4+ ou ainda a equipa do Wordpress, compatível desde a versão 4.3 disponibilizada desde Agosto.

Outras equipas estão na calha:
• O Drupal integrará o suporte do PHP 7 na sua versão 8, estando a sua saída eminente (a segunda release candidate saiu a 21 de Outubro;
• O Joomla não suporta na sua versão atual o PHP 7 (graças à classe String), mas a versão 3.5 será compatível;
• O Prestashop não anunciou nada a propósito do suporte ao PHP 7, mas a versão 1.6.1.2, a quarta release candidate saiu nos últimos dias e instala-se sem problemas com o PHP 7.

O ano 2015 será provavelmente o ano da mudança para a linguagem PHP, uma vez que a performance ganha com a versão 7 permite-lhe concorrer com numerosas linguagens de programação na categoria da velocidade. PHP 7 integra igualmente funcionalidades esperadas por inúmeros programadores. No entanto, e contrariamente ao que aconteceu na migração do PHP 4 para PHP 5, as quebras na linguagem não causam tanto impacto, ao migrar não necessitará de rever as suas aplicações de A a Z! Portanto, está talvez na altura de começar a pensar na migração...