PHP 7.4 - Evolução do Sistema de Tipos

Publicado em 02 de outubro de 2018 às 18:59

PHP LINGUAGEM

 

Os últimos anos foram de extrema importância para o PHP, afinal, somente quatorze anos após a sua versão 5.0, uma nova versão principal foi finalmente lançada! O PHP 7.4 chegou e vem trazendo muitos novos recursos de linguagem e um impressionante ganho de desempenho.

Com a introdução de tipos escalares e tipos de retorno, o PHP 7 ampliou o poder do sistema de tipos do PHP. No entanto, atualmente não é possível declarar os tipos de propriedades de classe, forçando os desenvolvedores a usar os métodos getter e setter para impor contratos de tipo. Isso requer desenvolvimento desnecessário, torna o uso menos ergonômico e prejudica o desempenho. Este RFC resolve esse problema introduzindo suporte para declarações de tipo de propriedade.

Neste artigo, vou falar um pouco sobre as principais mudanças propostas para esta nova versão. Confira o código abaixo sem a RFC:

 

class User {
   /** @var int $id */
   private $id;
   /** @var string $name */
   private $name;

   public function __construct(int $id, string $name) {
       $this->id = $id;
       $this->name = $name;
   }

   public function getId(): int {
       return $this->id;
   }
   public function setId(int $id): void {
       $this->id = $id;
   }

   public function getName(): string {
       return $this->name;
   }
   public function setName(string $name): void {
       $this->name = $name;
   }
}

 

O mesmo código a partir da nova RFC:

 

class User {

   public int $id;

   public string $name;

 

   public function __construct(int $id, string $name) {

       $this->id = $id;

       $this->name = $name;

   }

}


 

Principais diferenças entre a RFC que foi declinada e a atual (que foi aprovada):

Os tipos em propriedades foram propostos anteriormente e foram recusadas. A nova proposta, vem com duas grandes diferenças que acreditamos abordar a maior parte das preocupações em relação à proposta anterior:

  • Tipos em propriedades estáticas são suportados. O suporte para tipos de propriedades estáticas não foi incluído no RFC anterior, devido a problemas de implementação, criando uma inconsistência no PHP. Sob o novo tipo de proposta, as declarações podem ser adicionadas às propriedades estáticas, com a mesma semântica das propriedades normais.

  • Referências às propriedades com tipo são suportadas. A proposta anterior não permitia referências a propriedades com tipo, devido à dificuldade de impor o tipo se a propriedade fosse modificada indiretamente por meio da referência. A nova proposta permite tomar referências às propriedades com tipo e aplicará o tipo declarado mesmo se a modificação ocorrer por meio de uma referência.

Tipos suportados

As declarações de tipo de propriedade suportam todas as declarações de tipo suportadas pelo PHP. Para mais detalhes acesse o link, com exceção de void e callable.

O tipo void não é suportado, porque não é útil e tem semântica pouco clara. Sob uma interpretação estrita, as propriedades do tipo void não podem ser lidas nem escritas, pois não há como construir um valor do tipo void no PHP. Sob uma interpretação mais flexível (consistente com o fato de que permitimos o uso dos valores de retorno de funções void), uma propriedade do tipo void só poderia manter o valor nulo. Como as duas variantes não parecem ser úteis, não permitimos propriedades vazias.

O tipo callable (Método, função) não é suportado, porque seu comportamento depende do contexto.