Em uma linguagem fracamente tipada, existe um tipo de conversão para remover a ambigüidade em operações tipadas, quando de outra forma o compilador / interpretador usaria a ordem ou outras regras para fazer uma suposição de qual operação usar.
Normalmente, eu diria que o PHP segue esse padrão, mas, dos casos que verifiquei, o PHP se comportou de maneira contraintuitiva em cada um deles.
Aqui estão esses casos, usando JavaScript como um idioma de comparação.
Concatenação de Cordas
Obviamente, isso não é um problema no PHP porque existem operadores separados de concatenação de string ( .
) e de adição ( +
).
var a = 5;
var b = "10"
var incorrect = a + b; // "510"
var correct = a + Number(b); // 15
Comparação de sequências
Muitas vezes, em sistemas de computador, "5" é maior que "10" porque não o interpreta como um número. Não é assim no PHP, que, mesmo que ambos sejam strings, perceba que são números e elimina a necessidade de um elenco):
JavaScriptconsole.log("5" > "10" ? "true" : "false"); // true
PHP echo "5" > "10" ? "true" : "false"; // false!
Digitação de assinatura de função
O PHP implementa uma verificação de tipos simples em assinaturas de função, mas infelizmente é tão falho que provavelmente raramente é utilizável.
Pensei que poderia estar fazendo algo errado, mas um comentário nos documentos confirma que tipos internos diferentes de matriz não podem ser usados em assinaturas de função PHP - embora a mensagem de erro seja enganosa.
PHPfunction testprint(string $a) {
echo $a;
}
$test = 5;
testprint((string)5); // "Catchable fatal error: Argument 1 passed to testprint()
// must be an instance of string, string given" WTF?
E diferentemente de qualquer outra linguagem que conheço, mesmo se você usar um tipo que entenda, null não poderá mais ser passado para esse argumento ( must be an instance of array, null given
). Que estupidez.
Interpretação booleana
[ Editar ]: este é novo. Eu pensei em outro caso, e novamente a lógica é invertida do JavaScript.
JavaScriptconsole.log("0" ? "true" : "false"); // True, as expected. Non-empty string.
PHP echo "0" ? "true" : "false"; // False! This one probably causes a lot of bugs.
Então, em conclusão, o único caso útil em que consigo pensar é ... (drumroll)
Tipo de truncagem
Em outras palavras, quando você tem um valor de um tipo (digamos, string) e deseja interpretá-lo como outro tipo (int) e deseja forçá-lo a se tornar um dos conjuntos de valores válidos nesse tipo:
$val = "test";
$val2 = "10";
$intval = (int)$val; // 0
$intval2 = (int)$val2; // 10
$boolval = (bool)$intval // false
$boolval2 = (bool)$intval2 // true
$props = (array)$myobject // associative array of $myobject's properties
Não consigo ver o que o upcasting (para um tipo que engloba mais valores) realmente ganharia você.
Então, embora eu não concorde com o uso proposto da digitação (você está essencialmente propondo a digitação estática , mas com o ambiguidade que somente se fosse força-cast em um tipo seria um erro - o que causaria confusão), eu acho que é uma boa pergunta, porque aparentemente o elenco tem muito pouca finalidade em PHP.