#4 PHP 7 – Type Hints

Como se sabe, o PHP é uma linguagem fracamente tipada, que não se preocupa muito com os tipos de dados. Uma mesma variável pode receber valores diferentes a qualquer momento. Uma hora ela pode ser string, duas linhas depois se tornar um array e por aí vai.

O PHP 7 introduziu recursos de tipagem, que vão permitir definir o tipo de valor que uma variável vai receber, checando se o valor recebido é compatível com o tipo de valor especificado para a variável ou até mesmo o tipo de dados que uma função irá retornar.

No PHP 5 esse recurso ja funcionava, mas, somente com arrays e objetos, no PHP 7 adicionaram o suporte a float, int, string e boolean.

Para que a verificação do tipo de dado funcione é preciso ativa-lá através da opção strict_types, que deve estar ativa.

declare(strict_types=1);

A seguir temos um código de uma função que imprime um texto na tela a partir de um valor passado como parâmetro. Esse valor deve ser uma string, e, caso não seja, será retornado um erro do tipo “Uncaught TypeError”, ao invés de imprimir o valor na tela.

declare(strict_types=1);

function ShowText(string $text){
  echo 'The variable is: ' . $text;
}

ShowText("Type Hints PHP 7");

Na primeira linha ativamos a verificação de tipos, em seguida criamos a função, e logo depois chamamos a execução da função.

Repare que na declaração da função a variável recebeu o tipo de dado antes de ser declarada: string $text. Se o tipo não tivesse sido informado, ela aceitaria qualquer valor e não retornaria nenhum erro do tipo “Uncaught TypeError“.

Além do PHP fazer a validação do valor passado para a variável, ele também faz uma tentativa de conversão do valor passado para o tipo especificado, o que chamamos de “Coercive Type Hints”.

Veja no exemplo abaixo que a função vai receber 2 parâmetros, um inteiro e uma string, e mesmo passando a variável que deveria ser um número inteiro como string, não será retornado um erro do tipo “Uncaught TypeError”, pois o PHP vai converter a string em inteiro.

function SendMessage(int $code, string $message)
{
    echo $code. ' - ' .$message;
}


SendMessage(404, "File Not Found");
SendMessage("200", "OK");


Veja bem que na primeira chamada da função “SendMessage” os valores das variáveis foram passados corretamente, mas na segunda as duas variáveis foram passadas como string. Devendo a primeira variável ser um número inteiro, o PHP tentou fazer a conversão, e, como ela foi bem sucedida, não foi retornado nenhum erro.

Essa conversão pode causar perda de precisão nos dados e até mesmo a perda de dados. Veja um exemplo onde os parâmetros devem ser número inteiros (int), mas os valores passados são decimais (float).

function Sum(int $x, int $y)
{
    return $x + $y;
}
add(97.234, 61.53);

Como o tipo de variável foi definido como int, o PHP vai tentar fazer a conversão, logo os valores deixarão de ser 97.234 e 61.53 para ser 97 e 61, respectivamente. O valor retornado então não será 158.764, mas sim 158.

Return Type Hints

Assim como é possível determinar o tipo de valor das variáveis e parâmetros de uma função, também é possível determinar o tipo de valor retornado por uma função. A regra é a mesma da apresentada acima para as variáveis e parâmetros, mudando somente a sintaxe de escrita da função.

function Divide(int $x, int $y): int {
  return $x / $y;
}
Divide(6,3);
Divide(8,3);

A função acima simplesmente retorna o valor da divisão entre 2 número inteiros, sendo que o retorno deve ser um número inteiro.

Duas chamadas à função Divide foram feitas, na primeira são passados os valores 6 e 3, que dividos dão 2, um valor inteiro que corresponde ao tipo de valor que a função deve retornar. Já a segunda chamada, que usou os valores 8 e 3, vai retornar um erro, pois o valor da divisão não inteiro, e sim um float (2,66666667).

Conclusão

Mesmo com essa implementação de tipagem de dados, ainda há um nível de inconsistência e perda de informação, mas de qualquer forma já é uma evolução. Vamos aguardar e ver o que futuras versões do PHP trarão de novidades e maior consistência em relação a tipagem de dados.