# 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](https://www.linkedin.com/in/joannacss). 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 [BlueSky](https://bsky.app/profile/kaiquegarcia.dev) é aberta.

<center> ![Piscadinha](https://media.giphy.com/media/HiDfhTFGZ4geI/giphy.gif) </center>

> 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
<?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
<?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é!!**
