Olá Gilson,
O PHP faz um teste sim, ele antes tenta fazer uma conversão para o tipo definido e caso não seja possível converter ele retorna uma exceção TypeError
:
function exibeMensagem(string $mensagem)
{
echo $mensagem;
}
// Funciona
$int = 123;
exibeMensagem($int);
// Não funciona
$array = ['aaa', 'bbb'];
exibeMensagem($array);
É possível você definir que o PHP seja mais estrito e retorne um erro sempre que o tipo for diferente, sem tentar a conversão antes:
// Essa linha diz ao php para ser mais rígido com os tipos
declare(strict_types=1);
function exibeMensagem(string $mensagem)
{
echo $mensagem;
}
// Funciona
$string = "Olá";
exibeMensagem($string);
// Não funciona
$int = 123;
exibeMensagem($int);
// Não funciona
$array = ['aaa', 'bbb'];
exibeMensagem($array);