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.