Skip to content

Instantly share code, notes, and snippets.

@fhferreira
Forked from alganet/tipagem_primitiva.md
Last active December 16, 2015 18:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fhferreira/5476823 to your computer and use it in GitHub Desktop.
Save fhferreira/5476823 to your computer and use it in GitHub Desktop.

PHP Prático: Tipagem Primitiva

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:

boolean

É 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.

string

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.

array

Í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.

object

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

Null é qualquer coisa que não foi iniciada, que foi removida com unset() ou que recebeu $valor = null em algum momento.

Estrutura empty()

Tudo que for vazio. Zero, string vazia, string zero, toda aquela lista de conversão óbvia do booleano com ==.

Estrutura isset()

Difere algo que nunca foi iniciado de algo que tem o valor null. Retorna true se algo já foi iniciado.

Estrutura is_null()

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.

@fhferreira
Copy link
Author

Parabéns, ótimo conteúdo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment