Type Juggling

O PHP não requer (ou suporta) a definição explícita de tipo na declaração da variável; um tipo de variável é determinado pelo contexto na qual a variável é usada. Quer dizer, se você atribui um valor de string a uma variável var, var se torna uma string. Se você então atribui um valor inteiro a var, ela se torna inteira.

Um exemplo de conversão automática de tipo no PHP é o operador de adição '+'. Se qualquer um dos operandos é um 'double', então todos os operandos são avaliados como 'doubles', e o resultado será um 'double'. Caso contrário, os operandos serão interpretados como inteiros, e o resultado também será um inteiro. Note que isto NÃO muda os tipos dos próprios operandos; a única mudança é em como os operandos são avaliados.

$foo = "0";  // $foo é string (ASCII 48)
$foo++;      // $foo é a string "1" (ASCII 49)
$foo += 1;   // $foo agora é um inteiro (2)
$foo = $foo + 1.3;  // $foo agora é um double (3.3)
$foo = 5 + "10 Porquinhos"; // $foo é inteiro (15)
$foo = 5 + "10 Porquinhos";     // $foo é inteiro (15)

Se os últimos dois exemplos acima parecem incomuns, veja Conversão de Strings.

Se você deseja forçar uma variável a ser avaliada como um certo tipo, veja a seção sobreMoldagem de tipo. Se você deseja mudar o tipo de uma variável, veja settype().

Se você gostaria de testar qualquer um dos exemplos desta seção, você pode cortar e colar os exemplos e inserir a seguinte linha para ver, por você mesmo, o que está acontecendo:

echo "o tipo de \$foo==$foo; é " . gettype ($foo) . "<br>\n";

Nota: O comportamento de uma conversão automática para matriz não é definida no momento.

$a = 1;       // $a é um inteiro
$a[0] = "f";  // $a se torna uma matriz, com $a[0] mantendo "f"

Enquanto o exemplo acima pode parecer que vai claramente resultar em $a se tornar uma matriz, do qual o primeiro elemento é 'f', considere isto:

$a = "1";     // $a é uma string
$a[0] = "f";  // E as compensações de string? O que acontece?

Como o PHP suporta indexação para strings através de compensações usando a mesma sintaxe que a indexação de matrizes, o exemplo acima conduz a um problema: $a deveria se tornar uma matriz com seu primeiro elemento sendo "f", ou "f" deveria se tornar o primeiro caractere da string $a?

Por esta razão, como no PHP 3.0.12 e no PHP 4.0b3-RC4, o resultado desta conversão automática é considerado indefinido. Correções estão, portanto, sendo discutidas.

Moldagem de tipo

Moldagem de tipo no PHP funciona de forma semelhante ao C: o nome do tipo desejado é escrito entre parênteses antes da variável que se quer moldar.

$foo = 10;   // $foo é um inteiro
$bar = (double) $foo;   // $bar é um double

As moldagens permitidas são:

Note que tabulações e espaços são permitidos dentro dos parênteses, assim os exemplos a seguir são funcionalmente equivalentes:

$foo = (int) $bar;
$foo = ( int ) $bar;

Pode não ser exatamente óbvio o que acontece quando ocorre a moldagem entre certos tipos. Por exemplo, o seguinte deve ser notado.

Quando se molda uma variável escalar ou string para uma matriz, a variável se tornará o primeiro elemento da matriz:

$var = 'tchau';
$arr = (array) $var;
echo $arr[0];  // imprime 'tchau'

Quando se molda uma variável escalar ou string para um objeto, a variável se tornará um atributo do objeto; o nome do atributo será 'scalar':

$var = 'tchau';
$obj = (object) $var;
echo $obj->scalar;  // imprime 'ciao'