PHP, como a maioria de nós sabe, tem digitação fraca . Para quem não sabe, o PHP.net diz:
O PHP não requer (ou suporta) definição explícita de tipo na declaração de variável; o tipo de uma variável é determinado pelo contexto em que a variável é usada.
Ame ou odeie, o PHP relança variáveis on-the-fly. Portanto, o seguinte código é válido:
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
O PHP também permite converter explicitamente uma variável, assim:
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
Isso é legal ... mas, para a minha vida, não consigo conceber uma razão prática para fazer isso.
Não tenho problemas com digitação forte em linguagens que o suportam, como Java. Tudo bem, e eu entendo completamente. Além disso, estou ciente - e compreendo perfeitamente a utilidade do - dica de tipo nos parâmetros de função.
O problema que tenho com a conversão de tipos é explicado pela citação acima. Se o PHP puder trocar tipos à vontade , poderá fazê-lo mesmo depois de forçar a conversão de um tipo; e pode fazê-lo on-the-fly quando você precisar de um determinado tipo em uma operação. Isso torna válido o seguinte:
$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"
Então qual é o objetivo?
Veja este exemplo teórico de um mundo em que a conversão de tipos definida pelo usuário faz sentido no PHP :
- Você força a variável de conversão
$foo
comoint
→(int)$foo
. - Você tenta armazenar um valor de sequência na variável
$foo
. - PHP lança uma exceção !! ← Isso faria sentido. De repente, existe o motivo da conversão do tipo definido pelo usuário!
O fato de o PHP mudar as coisas conforme necessário torna vago o ponto de conversão do tipo definido pelo usuário. Por exemplo, os dois exemplos de código a seguir são equivalentes:
// example 1
$foo = 0;
$foo = (string)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
// example 2
$foo = 0;
$foo = (int)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
Um ano depois de fazer essa pergunta, adivinhe quem se viu usando a tipografia em um ambiente prático? Sinceramente.
O requisito era exibir valores monetários em um site para um menu de restaurante. O design do site exigia que os zeros à direita fossem aparados, para que a exibição tivesse a seguinte aparência:
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
A melhor maneira que encontrei para fazer isso foi lançar a variável como um float:
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
O PHP apara os zeros à direita do flutuador e, em seguida, o altera novamente como uma string para concatenação.
(string)
elencos em todos os lugares ?
$intval.'bar'
lança uma exceção, eu ainda discordo. Isso não lança uma exceção em nenhum idioma. (Todos os idiomas que eu conheço executam uma conversão automática ou a .toString()
). Se você está dizendo que $intval = $stringval
lança uma exceção, está falando de uma linguagem fortemente tipada. Eu não quis parecer rude, então, desculpe se eu fiz. Eu apenas acho que vai contra o que todo desenvolvedor está acostumado e é muito, muito menos conveniente.