Pensando na Web

O que há de novo no PHP 7.4?

Introdução
O que há de novo no PHP 7.4?

A linguagem PHP teve uma enorme evolução nos últimos anos. Na versão 7, o PHP ficou de 2 a 3 vezes mais rápido que a versão anterior. Além disso, inúmeras funcionalidades foram adicionadas ao core da linguagem. Vale destacar também a maturidade do ecossistema PHP composto por inúmeras bibliotecas, frameworks e ferramentas. Ou seja, o PHP como plataforma está cada vez mais maduro e robusto.

E, continuando essa evolução, a próxima versão do PHP estará cheia de novas funcionalidades muito esperadas pelos desenvolvedores como as propriedades tipadas e as arrow functions, só para citar algumas.

Fique de olho nesta série especial de artigos que serão lançados nas próximas semanas para conhecer, com detalhes, as novas funcionalidades da próxima versão PHP!

Este é um artigo vivo e será constantemente atualizado com informações sobre as novas funcionalidades do PHP. Adicione-o aos seus favoritos e visite-o regulamente para saber das novidades!

Quando será lançada a próxima versão?

Antes de saber quais são as novas funcionalidades da próxima versão do PHP, é importante saber qual versão e em que data ela estará disponível para o público.

A linguagem PHP conta com releases anuais e, este ano, será lançada a versão 7.4 da linguagem. Essa versão é o maior release em relação ao número de funcionalidades desde o lançamento da versão 7.0 e abordarei cada uma delas neste artigo.

No mês de junho de 2019 foi disponibilizada a versão alpha 1 do PHP 7.4 para testes. E, no decorrer do ano, serão lançadas outras versões alpha, beta e release candidate antes do lançamento final do PHP 7.4 em novembro de 2019.

É possível ver o planejamento completo dos próximos releases da versão 7.4 em PHP 7.4 releases para saber a data da disponibilização de cada uma das versões.

Executando os códigos do PHP 7.4

Para auxiliar no entendimento do funcionamento de cada uma das funcionalidades do PHP 7.4, sugiro realizar a execução dos códigos de exemplo.

Isso pode ser alcançado de duas maneiras: (1) compilar o código fonte do PHP para a obtenção do binário do interpretador ou (2) utilizar uma imagem Docker com o binário do interpretador já compilado.

Ensinar a compilar o código fonte do PHP está fora do escopo deste artigo e, neste caso, darei preferência para a utilização de uma imagem Docker pela sua praticidade. Caso tenha interesse em aprender a compilar o código fonte do PHP (recomendo!), sugiro assistir o vídeo Compiling PHP from source do Sammy Kaye Powers.

Já que decidi utilizar uma imagem Docker pela praticidade e por ser direto ao ponto, a imagem utilizada foi a phpearth/php:7.4-cli. Ela está disponível em phpearth/docker-php junto com as demais variações.

Essa imagem permite a execução do PHP 7.4 via linha de comando que é o que precisamos para rodar os exemplos deste e dos próximos artigos. E, para facilitar a sua execução sem precisar repetir o comando docker inúmeras vezes, criarei um alias para nos auxiliar.

alias php74='docker run -it --rm -v `pwd`:/app -w /app phpearth/php:7.4-cli php'

Explicando o comando!

O comando anterior será explicado em duas partes. A primeira parte, o comando docker run -it --rm -v `pwd`:/app -w /app phpearth/php:7.4-cli php, é responsável por dizer ao Docker para criar um contêiner utilizando a imagem phpearth/php:7.4-cli e executar o binário php. Ele ainda diz que o contêiner deve executar de forma interativa e com acesso ao terminal (-it), que ele seja removido após a execução (--rm), que realize o mapeamento do diretório atual para o diretório /app do contêiner (-v `pwd`:/app) e, por fim, que o binário seja executado a partir do diretório /app (-w /app). A segunda parte, o comando alias php74='docker run ... php' cria um alias para tornar mais fácil a execução do comando do Docker anterior. Utilizando o alias, a execução ficaria apenas php74 my-php74-script.php.

Para testar se o nosso comando que executa um contêiner Docker com o interpretador do PHP 7.4 funciona corretamente, basta rodar o comando abaixo no seu terminal:

php74 --version

Se o resultado da execução do comando for similar ao texto abaixo, quer dizer que tudo está funcionando corretamente!

PHP 7.4.0alpha1 (cli) (built: Jun 12 2019 21:59:00) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.0alpha1, Copyright (c), by Zend Technologies

Novas funcionalidades do PHP 7.4

Agora que sabemos que o PHP está em evolução constante, que se trata de uma plataforma sólida e robusta, que a próxima versão será lançada em breve (novembro de 2019) e que podemos testá-la facilmente utilizando uma imagem Docker, só nos resta resta saber quais são as novas funcionalidades. Vamos lá?

Typed Properties

As propriedades tipadas ou typed properties é uma das funcionalidades mais esperadas do PHP 7.4. Ela permite a tipagem de propriedades de uma classe e representa uma melhoria no sistema de tipos da linguagem PHP.

class User
{
    public int $id;
    public string $nome;
    private bool $isAdmin = false;
}

O assunto de propriedades tipadas é um pouco extenso. Por este motivo, estou preparando um artigo específico sobre o assunto chamado Propriedades Tipadas no PHP 7.4 que ficará disponível em breve!

Arrow Functions

As arrow functions é outra funcionalidade muito esperada no PHP 7.4. Ela permite representar uma closure - uma função anônima que possui conhecimento do escopo externo - de uma forma reduzida.

Neste exemplo - até a versão 7.3 - definimos uma closure de forma bastante verbosa e tornando explícito o conhecimento da variável $factor por parte da função.

$numbers = [1, 2, 3, 4, 5];
$factor = 2;

// deve-se deixar claro quais variáveis do escopo
// externo a função terá acesso através de `use`
$newNumbers = array_map(function ($i) use ($factor) {
    return $i * $factor;
}, $numbers);

print_r($newNumbers); // [2, 4, 6, 8, 10]

Essa funcionalidade ajudará a tornar o código mais expressivo, principalmente em situações que se faz o uso regular de funções anônimas. Vale lembrar também que é permitido apenas uma linha em uma arrow function.

Com a nova sintaxe das arrow functions é possível reduzir o boilerplate para a criação de uma closure e o escopo externo é conhecido de forma automática pela função (sem a necessidade do use).

$numbers = [1, 2, 3, 4, 5];
$factor = 2;

// o escopo externo é importado automaticamente para a função
$newNumbers = array_map(fn($i) => $i * $factor, $numbers);

print_r($newNumbers); // [2, 4, 6, 8, 10]

O assunto de arrow functions é um outro assunto interessante que merece um artigo próprio que será publicado dentro de algumas semanas.

Spread Operator em Arrays

O PHP possui suporte ao argument unpacking desde a versão 5.6 da linguagem. A funcionalidade permite o "desempacotamento" de um array (ou um Traversable) em uma lista de argumentos utilizando o spread operator. Veja o exemplo abaixo:

function sum($a, $b) {
    return $a + $b;
}

// utiliza o spread operator (...) para desempacotar
// um array como uma lista de argumentos
$numbers = [3, 5];
echo sum(...$numbers); // 8

Porém, a utilização do spread operator não era permitido na definição de arrays a partir de outro array. Ao tentar utilizar esta abordagem, o PHP acusará um erro de sintaxe.

// a utilização do spread operator para definir um novo
// array a partir de outro array não é suportado
$someNumbers = [2, 3, 4];
$numbers = [1, ...$someNumbers, 5];
print_r($numbers);
// PHP Parse error:  syntax error, unexpected '...' (T_ELLIPSIS), expecting ']'

A partir da versão 7.4 será introduzida a funcionalidade que permite a utilização do spread operator (...) na definição de um array através do unpacking dos valores de outro array ou um Traversable. Veja o exemplo abaixo:

// utiliza o spread operator na definição de um array
// a partir de outro array
$someNames = ['Bob', 'Carol'];
$names = ['Alice', ...$someNames, 'Daniel', 'Elisa'];
print_r($names);
// ['Alice', 'Bob', 'Carol', 'Daniel', 'Elisa'];

Essa funcionalidade ajudará a tornar o código mais expressivo e é mais uma excelente adição para a linguagem. Vale lembrar que esta funcionalidade não está disponível para arrays com chaves em string.

O assunto de spread operator in array expression é um outro assunto interessante que merece um artigo próprio que será publicado dentro de algumas semanas.

Operador de atribuição null coalescing

O PHP possui suporte ao operador null coalesce desde a versão 7.0 da linguagem. A funcionalidade permite verificar se uma variável foi definida e se não é nula. Em caso positivo, utiliza-se o valor da variável para uma atribuição e, caso contrário, utiliza-se um valor padrão.

O exemplo abaixo ilustra como lidávamos com este problema antes da existência dessa funcionalidade.

// $data['name'] = 'John';

// verifica se a variável foi definida utilizando a função isset
$name = isset($data['name']) ? $data['name'] : 'anonymous';
echo $name; // anonymous

Com a introdução do operador ?? ficou muito mais fácil lidar com este problema. O código fica muito mais claro e legível além de ser menos propenso a erros.

// $data['name'] = 'John';

// verifica se a variável foi definida e não é nula
// utilizando o operador null coalesce
$name = $data['name'] ?? 'anonymous';
echo $name; // anonymous

E, como evolução do operador de null coalesce, no PHP 7.4 estará disponível o operador de atribuição null coalesce ??=. Esta funcionalidade é a união do operador de null coalesce com o operador de atribuição.

// verifica se uma variável está definida e não é nula e atribui seu valor
// para si própria e, caso contrário, atribui um valor padrão
$data['comments']['username'] = $data['comments']['username'] ?? 'anonymous';

E, ao utilizar o operador de atribuição null coalesce, é muito mais prático alcançar o mesmo objetivo.

$data['comments']['username'] ??= 'anonymous';

Outras funcionalidades

Muitas outras funcionalidades também importantes foram adicionadas ao PHP 7.4. São elas: FFI (foreign function interface), preloading, numeric literal separator, covariant returns and contravariant parameters, weak references e alguns outras se tornaram obsoletas.

E, como disse anteriormente, este é um artigo vivo e vou escrevendo sobre as novas funcionalidades no decorrer da semana seja como uma seção neste artigo ou como um artigo separado para funcionalidades que mereçam mais destaque.

O que virá no futuro?

Apesar de o PHP 7.4 só ficar "pronto" em novembro de 2019 - o artigo está sendo escrito em junho de 2019 -, o seu desenvolvimento entrará em feature freeze em breve. Isso significa que novas funcionalidades não poderão ser mais adicionadas até o lançamento final ficando apenas permitido correções de bugs.

Isso nos deixa mais confortáveis para conhecer as novas funcionalidades do PHP 7.4 pois sabemos que mais nenhuma será adicionada e nos permite começar a pensar no que virá a ser o PHP 8.0.

Nos canais internos de comunicação sobre o PHP já estão sendo discutidas as novas funcionalidades que virão no PHP 8.0 como a tão esperada JIT ou Just-In-Time Compiler. A compilação just-in-time permite a compilação do um programa em tempo de execução. Para mais informações sobre a implementação veja a RFC sobre JIT.

Conclusão

É importante conhecer como a plataforma e o ecossistema da linguagem PHP evolui. Isso permite que você, como profissional, esteja em alinhamento com futuro da linguagem além de ser um diferencial competitivo.

Conhecer o processo de lançamento e as funcionalidades que estarão disponíveis nas próximas versões do PHP te colocará em uma posição estratégica e te permitirá saber como poderá evoluir sua aplicação e decidir com propriedade a escolha do PHP como plataforma.

E, por fim, te ajudará a ter uma visão de alto nível e a contribuir com a evolução da linguagem.

Não esqueça que este é um artigo vivo e continuará sendo atualizado com detalhes sobre as novas funcionalidades em uma seção neste artigo ou como um artigo separado para funcionalidades com mais relevância.

Espero que você realmente tenha gostado de ler este artigo e te convido para comentá-lo através da seção de comentários logo abaixo, pelo Twitter - o meu usuário é @marcelgsantos - ou por e-mail enviando um e-mail para marcelgsantos@gmail.com.

Um abraço e até o próximo artigo! ;)


Workshop

Depois do grande sucesso que foi esse artigo sobre as novidades do PHP 7.4 (ele teve mais de 2.000 visualizações até o momento), decidi criar um workshop para aqueles ou aquelas que quiserem se aprofundar mais no assunto e de forma prática.

O workshop será de 4h e acontecerá no dia 01/10, terça-feira, no Centro de Treinamento da Novatec em São Paulo (ao lado da estação de metrô Carandiru). Para mais informações, acesse bit.ly/workshop-php74.

Utilize o cupom PHP74 e ganhe 10% de desconto na sua inscrição. Nos vemos por lá! ;)

Autor

Marcel dos Santos

Desenvolvedor web interessado em HTML, CSS, JavaScript, Elm, PHP, Laravel, Symfony, FP, Linux e código aberto. Formado em SI pela EACH-USP, organizador do FEMUG-SP e evangelista PHPSP. Curte viajar!

Ver Comentários
Artigo Anterior

Aprendendo HTML, a linguagem da web