A primeira coisa a saber sobre a tipagem do PHP é que ela não é parecida com Java, JavaScript, Python, Ruby, C, C++, C# ou qualquer linguagem que tenha uma tipagem baseada em alguma dessas citadas. A tipagem do PHP é incomparável, e assim como tudo que não pode ser comparado é difícil de ser explicada.
De qualquer forma, a tipagem do PHP é extremamente simples se você apenas confiar na sua intuição. A primeira coisa que você tem que saber sobre a tipagem do PHP é que ela faz malabarismos. É exatamente essa a palavra: malabarismo. E o PHP é um ótimo malabarista, exceto por alguns poucos deslizes fáceis de decorar. O type juggling, traduzido para "malabarismo com tipos" é a habilidade que o PHP tem de tomar decisões intuitivas sobre conversões de tipos. Em termos grosseiros, o PHP decide toda e qualquer tipagem de variáveis em tempo de execução, não compilação (pros pedante aí que tão lendo).
Note bem: tipagem de variáveis. O PHP é multi-paradigma e, ao mesmo tempo, multi-tipagem. Isso pode soar estranho, mas é uma abordagem bastante comum em outros cenários. Frameworks como o ExtJS modificam tanto a tipagem do JavaScript que chegam a mudar o paradigma da linguagem. No PHP, contudo, isso foi implementado no motor inteiro da linguagem, o que torna as coisas bem mais simples. Não falaremos do mundo da tipagem de iteradores e objetos, apenas dos primitivos.
A lista pode ser decorada. É bem menor do que uma lista de tags HTML ou propriedades CSS:
- Tipos primitivões: boolean, integer, float, string, array, object, resource (interno), null.
- Tipos só pra checagem: mixed (default), number (interno), callback.
- Tipos misteriosos e irrelevantes, disponíveis internamente que todo tipo de linguagem também tem: "lista infinita de argumentos representada por $..."
Vamos ver como os tipos primitivos mais incompreendidos do PHP podem ser facilmente inferidos:
É sim ou não. Se is_bool($something)
então $something === true or $something === false
. Muitas expressões do PHP usam isso como retorno, e qualquer operação lógica do PHP ||, &&, etc
também retorna booleano. Enfim, é o bom e velho booleano.
Os operadores ==
e ===
, e seus irmãos !=
e !==
são bem especiais com o tipo booleano. Eles fazem checagens bem específicas, e aí começa o primeiro malabarismo do PHP.
==
considera como booleano falso qualquer inteiro ou float 0
, string ""
(vazia), a string "0"
, uma array vazia e null. É intuitivo, qualquer coisa que pareça com "nada" é false e qualquer coisa que pareça "algo" é true.
Strings são afetadas globalmente pela função setlocale() e comportam-se de acordo com o local definido. Um mbstring.func_overload
torna todas as strings e funções do PHP também multi-byte por padrão, mas isso não é recomendado. Como é comum tratar sistemas legados, há ainda uma forte distinção entre funções ASCII e funções multi-byte mb_
.
Strings `'simples'` são puras e não interpretam nada. Podem ter mais de uma linha. Escapam caracteres com `\`.
Strings `"duplas $interpolam_variaveis {strtoupper($complexas)} com eficiência. Multilinha, escape igual"`.
<<<HEREDOCS
Sempre quebram linha na declaração e no final também. O final não pode ser identado. $interpolam igual
strings duplas mas não "precisam de escape" 'pra nenhuma outra aspa', o que é fenomenal.
HEREDOCS;
<<<'NOWDOCS'
Esses não escapam nada, printam tudo como é, exageradamente puro e estático.
NOWDOCS;
(string) "1" == (bool) true && (string) "" == (bool) false
, então dá pra converter e desconverter entre esses valores seguramente. Digamos, pra formulários.
O PHP faz malabarismos com inteiros. Ele pega qualquer string até o primeiro espaço e tenta tirar um número na conversão. '20 porcos' + '10 galinhas' == '30 animais'
, contudo, '20 porcos' + '10 galinhas' !== '30 animais'
, o que de deixa uma escolha simples.
Não tente converter arrays pra string. Objetos chamam o método __toString() quando convertidos pra string, sempre implemente-os quando houver uma representação textual óbvia do objeto. Não tente converter resources para string.
Índices só podem ser inteiros ou strings e o PHP converte isso. Strings que são inteiros válidos viram inteiros no índice. Floats e booleanos viram inteiros no índice. Nulls viram a string ""
. São sempre inteiros ou strings, se for outra coisa parecida ele converte. O "nada" de outro tipo é a conversão óbvia pro "nada" inteiro ou string. Inteiros e strings não conflitam se forem parecidos, então "1"
e 1
podem existir na mesma array. A útil função array_unique
remove as repetidas baseadas em suas representações em string, o que é bem útil por exemplo para remover objetos repetidos em uma array =)
Arrays são extensos e terão seu próprio PHP Prático.
Objetos primitivos são caixas de coisas por chave de string. $caixa = new stdClass; $caixa->coisa = $umaCoisa;
. Arrays simples que tiverem apenas índices associativos podem ser facilmente utilizadas como um construtor de objetos: $caixa = (object) ['coisa' => $umaCoisa, 'outraCoisa' => $outraCoisa]
. Objetos, assim como arrays, aceitam um belo foreach
e se forem associativos podem ser convertidos pra frente e pra trás seguramente.
Null é qualquer coisa que não foi iniciada, que foi removida com unset()
ou que recebeu $valor = null
em algum momento.
Tudo que for vazio. Zero, string vazia, string zero, toda aquela lista de conversão óbvia do booleano com ==
.
Difere algo que nunca foi iniciado de algo que tem o valor null
. Retorna true se algo já foi iniciado.
TAMBÉM Difere algo que nunca foi iniciado de algo que tem o valor null
. Retorna true se algo já foi iniciado e tem valor null.
Show alganet! esclareceu algumas coisas para mim