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'