Manipulação de tipos

O PHP não requer (ou suporta) a definição de tipo explicita na declaração de variáveis: o tipo de uma variável é determinado pelo contexto em que a variável é utilizada. Isto significa que, se você assimila um valor string para a variável var, var se torna uma string. Se você então assimila um valor inteiro para var, ela se torna um inteiro.

Um exemplo da conversão automática do PHP é o operador de adição '+'. Se qualquer um dos operadores for float, então todos os operadores são avaliados como floats, e o resultado será um float. De outra forma, se os operadores forem interpretados como inteiros então o resultado será um inteiro. Note que isso NÃO muda os tipos dos operadores: apenas muda em como esses operadores são avaliados.

$foo = "0";  // $foo é string (ASCII 48)

$foo += 2;   // $foo é agora um inteiro (2)
$foo = $foo + 1.3;  // $foo é agora um float (3.3)
$foo = 5 + "10 Little Piggies"; // $foo é inteiro (15)
$foo = 5 + "10 Small Pigs";     // $foo é inteiro (15)

Se os últimos dois exemplos lhe parecerem estranhos, veja Conversão de strings.

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

Se quiser testar qualquer um dos exemplo desta seção, você pode usar a função var_dump().

Nota: O comportamento de uma conversão automática para array é atualmente indefinida.

$a = "1";     // $a é uma string
$a[0] = "f";  // E com relação aos índices da string? O que acontece?

Desde que o PHP suporta indexação de strings através de offsets utilizando a mesma sintaxe da indexação de arrays, o exemplo acima nos deixa um problema: $a se tornou um array sendo o primeiro elemento "f", ou será que "f" se tornou o primeiro caracter da string $a ?

Por essa razão, como no PHP 3.0.12 e PHP 4.0b3-RC4, o resultado dessa conversão automática é considerada como indefinida. Correções, entretanto, estão sendo discutidas.

Moldando Tipos - Type Casting

A moldagem de tipos no PHP funciona como no C: o nome de um tipo desejado é escrito entre parênteses antes da variável em que se deseja a moldagem.

$foo = 10;   // $foo é um inteiro
$bar = (float) $foo;   // $bar é um número de ponto flutuante

As moldagens permitidas são:

Nota: Em vez de moldar uma variável para string, você também pode circundar a variável entre aspas.

Note que tabulações e espaços são permitidos dentro dos parênteses, então o seguinte são funcionalmente equivalentes:

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

Pode não ser tão óbvio o que exatamente ocorre quando se molda entre certos tipos. Para mais informações, veja essas seções:

Quando moldando ou forçando a conversão de um array para string, o resultado será a palavra Array. Quando moldando ou forçando o tipo de um objeto para string, o resultado será a palavra Object.

Quando moldando de uma variável escalar ou string para um array, a variável se torna o primeiro elemento do array:

$var = 'ciao';
$arr = (array) $var;
echo $arr[0];  // outputs 'ciao'

Quando moldando de uma variável escalar ou string para um objeto, a variável se torna um atributo do objeto: o nome do atributo se chamará 'scalar':

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