PHP para Iniciantes: Classes e Objetos - Introdução

Está preparado(a) para mergulhar em águas profundas? Afinal, estou prestes a abordar um assunto gigantesco e polêmico no universo da computação... E dito isso, vamos começar pelo começo: você sabe de onde vem os termos Classes e Objetos?

Mesmo para quem nunca lidou com programação, refletir sobre o que é um objeto é até um pouco fácil. Por exemplo, a tela por onde você está lendo ou ouvindo esse artigo já é um objeto, não é mesmo? Seja um relógio, celular, tablet, laptop, notebook, monitor, TV, retroprojetor... O que seja. Você está lendo ou ouvindo essas letrinhas em algum lugar e intuitivamente sabe que isso é um objeto porque você consegue interagir com ele e realizar certos objetivos a partir disso. Ou seja, todo objeto tem um objetivo ou propósito. Objetos sem funções são apenas decorativos, não é? Nesse caso, ainda assim, tem uma: decorar.

Pensar dessa forma nos ajuda a compreender rapidamente o conceito de objetos... E se eu te disser que também ajuda a entender classes? Deixe-me te fazer uma provocação e por favor, não responda com um soco:

Só existe um modelo do dispositivo que você está usando agora no mundo?

Pois é, provavelmente não... A menos que você tenha inventado um e não mostrou a ninguém ainda... Se for o caso, vamos fingir que não, beleza?

O fato de existir outros modelos, significa dizer que há várias implementações distintas do mesmo objeto. O que significa que, mesmo tendo várias funções em comum, há variedades. Mais uma provocação:

O seu dispositivo é o único do modelo que você possui?

Outra vez, não. As empresas produzem em larga escala para vender em massa, o que significa que, mesmo tendo tantas variações nos modelos, também há objetos "iguais".

Calma aí, Kiko, onde você quer chegar?

Eu quero que você comece a pensar nas coisas sempre como "modelos" e "objeto". Eu tenho certeza que você pode encontrar vários cenários da vida onde dá para aplicar isso. Até na biologia, se você parar para pensar na anatomia humana como um "modelo" e cada indivíduo como "objetos".

Então, ao vir para a computação, muitas vezes você vai precisar fazer esse exercício mental para estruturar seus projetos, transformando uma definição em classe (o modelo) e, a partir dessa definição, criando seus objetos. É um exercício muito legal e que requer prática para aperfeiçoar.

Mas olha, toma muito cuidado: não basta só praticar para chegar a perfeição. Você precisa praticar do jeito certo. Se você ficar repetindo erros, criará o erro perfeito, apenas isso. Se quiser se desenvolver seriamente no universo da computação, você precisará, em algum momento, estudar a fundo os paradigmas que inventaram há muitos anos atrás. O que estamos falando agora se chama Programação Orientada a Objetos, que apesar do termo surgir apenas em 1995, por Alan Key, suas práticas já eram pensadas em 1967 na linguagem Simula 67, criada por Ole-Johan Dahl e Kristen Nygaard.

Um tempão, não é mesmo? 54 anos atrás os caras já estavam tentando deixar nossos códigos redondinhos... E eu tenho certeza que algum matemático já tinha pensado nisso mas deixou o conceito só na álgebra.

De qualquer forma, aqui estamos nós com o paradigma muito bem mastigado para qualquer um quebrar a cabeça e aprender. O que não falta na internet é exemplos diferenciados sobre o que é Classe e o que é Objeto. Esse dos dispositivos eu inventei agora imaginando sobre como deixar a compreensão mais fácil baseado no que você, leitor(a), possui... Mas se você preferir exemplos gastronômicos, tem o clássico exemplo da fôrma de bolo.

Classe será a fôrma, pois é ali que você vai incluir os atributos que criam o objeto. No caso de um bolo, basta que a fôrma seja o recipiente onde você insere os ingredientes... Então todo bolo produzido sai com o mesmo formato, mas não necessariamente com o mesmo sabor.

Objeto será o bolo produzido. Cada objeto pode ter ingredientes diferentes, sabores diferentes e cores diferentes. E depois você ainda pode decorar com mais coisas por cima, fazendo ainda mais distinções de uma instância para outra.

Esse exemplo não é genial?! Foi com ele que eu aprendi POO de verdade na faculdade, com a minha primeira inspiração acadêmica, a Joanna Cecilia. Eu sempre a vi como uma gênio na universidade. Sinceramente, se você apoia as mulheres fodas da computação, vai lá no perfil dela agora e adiciona. Se algum dia ela ler isso, é isso que tu é mesmo, Jô. FODA!

E voltando dessa seção espontanea de marketing pessoal, INFELIZMENTE eu não estou aqui para te ensinar POO. Veja quantos parágrafos você já leu sem falar nada de PHP. Pois é... POO é um conteúdo muito extenso e que com certeza nos afastaria do estudo da linguagem em si. Eu recomendo que pesquise, por fora, e estude sobre isso. Aqui iremos focar no PHP, fechado?!

Tá, Kiko, então o que vai ser abordado nessa seção?

O de sempre: sintaxe, semântica, como escrever uma classe, como escrever um objeto... E algumas coisas mais loucas, tipo visibilidade, propriedades dinâmicas (que ficará depreciado no PHP 8.1 e em breve não será mais aceito na linguagem), métodos mágicos, abstrações, implementações, extensões, final (que você só vai entender no artigo), interfaces e clonagem de objetos.

Uou...................

A gente poderia até ir além e quebrar a cabeça pensando em Reflection, mas isso não é coisa de iniciante. Se algum dia precisar lidar com isso e tiver dúvidas, minha DM no Twitter é aberta.

Piscadinha

Ok, Kiko, então essa introdução não vai falar nada de PHP?!

Tá bom, tá bom... Só para não dizer que não falamos nada... No PHP, todo objeto é uma referência. Isso signficia que suas variáveis não clonam nenhum objeto. Se você atribuir "o mesmo objeto" em duas variáveis distintas, elas terão a mesma referência.

<?php

$objetoInicial = new stdClass;
$objetoDois = $objetoInicial;
$objetoTres = $objetoDois;

$objetoTres->nome = "Joanna";

var_dump($objetoDois->nome); // string(Joanna)
var_dump($objetoInicial->nome); // string(Joanna)

Então, se você cria uma função que recebe um objeto, qualquer alteração que fizer nele irá refletir na variável que colocaram na chamada dessa função (exceto se instanciaram o objeto na chamada, daí não teria variável).

<?php

function botaJoanna(object $objetoInterno): void
{
    $objetoInterno->nome = "Joanna";
}

$objetoExterno = new stdClass;
botaJoanna($objetoExterno);

var_dump($objetoExterno->nome); // string(Joanna)

Então fique esperto(a). Se você encontrar algum código PHP onde o indivíduo usou o operador de referência (&) em um objeto, pode apresentar esse artigo pra esse(a) desenvolvedor(a), pois o que ele fez foi completamente desnecessário... Ainda que, falando em funções, pareça ser bem melhor encontrar rapidamente uma identificação clara de referência do que precisar analisar o tipo de dado que está recebendo... Então não xingue ele(a), apenas veja se ele(a) sabia disso aí, beleza?

Aliás, nunca xingue ninguém por qualquer coisa, mesmo que seja um erro. O primeiro passo para aprender é errar. Se você abomina isso, o errado é você. Falou?!

E por hoje é só! Curtiu? Comenta e compartilha! Os primeiros artigos desse tópico serão bem curtos, porque vou escrever guias do estilo "how-to". Mas depois entraremos nos assuntos bem loucos! Não perca, hein?

Inté!!