Curso POO com PHP: #1 - Introdução à programação Orientada a Objetos

·

5 min read

E ai escoteiro, tudo bem!? Seja muito bem-vindos a mais um curso abordando conceitos de desenvolvimento de software. Dessa vez vamos abordar um dos paradigmas de programação mais utilizados em todo o mundo, a programação orientada a objetos.

Nesse curso você aprenderá detalhes de Orientação a Objetos como: Classes, Objetos, Herança, Polimorfismo, Encapsulamento, Abstração e muito mais. E ai, empolgado? Então vamos nessa. 😎

Era uma vez um código mal estruturado...

Em nosso curso introdutório de PHP você conheceu diversos tipos de dados suportados pelo PHP, esses dados podem ser utilizados para organizar diversas informações em diferentes tipos de sistemas. Vamos a um exemplo:

<?php

$veiculo = "Toyota Corolla";
$motorizacao = 1.8;
$velocidadeMaxima = 200;
$veiculoZeroKm = true;

function exibirInformacoes($veiculo, $motorizacao, $velocidadeMaxima) {
    echo "O veículo {$veiculo} {$motorizacao} alcança {$velocidadeMaxima} km/h";
}

exibirInformacoes($veiculo, $motorizacao, $velocidadeMaxima);

Para exemplos simples como esse código acima não tem nenhum problema, mas existem diversos cenários em que precisamos ter uma estrutura de dados mais concisa.

Talvez nesse momento você esteja lembrando do post sobre Arrays, quando falamos de Arrays Associativos e talvez esteja pensando que organizar esses dados com Arrays Associativos seja uma boa ideia.

<?php

$informacoesVeiculo = [
    "veiculo" => "Toyota Corolla",
    "motorizacao" => 1.8,
    "velocidadeMaxima" => 200,
    "veiculoZeroKm" => true
];

function exibirInformacoes(array $informacoesVeiculo) {
    printf(
        "O veículo %s %.1f alcança %d km/h", 
        $informacoesVeiculo['veiculo'],
        $informacoesVeiculo['motorizacao'],
        $informacoesVeiculo['velocidadeMaxima']
    );
}

exibirInformacoes($informacoesVeiculo);

De fato já temos uma organização melhor das informação que são relacionadas ao mesmo veículo. Ao invés de termos várias variáveis soltas, temos um Array onde cada chave está associada a uma informação, e tanto em relação a legibilidade do código quanto em relação a organização já tivemos um ganho significativo, mas, apesar de a função exibirInformacoes esperar receber um Array como parâmetro, não temos como garantir que o Array passado terá o formato que de fato precisamos (a menos que façamos várias validações, o que na maioria das vezes não é nem um pouco interessante.

Exemplo:

<?php

$informacoesVeiculo = [
    "Meu Array, minhas regras",
];

function exibirInformacoes(array $informacoesVeiculo) {
    printf(
        "O veículo %s %.1f alcança %d km/h", 
        $informacoesVeiculo['veiculo'],
        $informacoesVeiculo['motorizacao'],
        $informacoesVeiculo['velocidadeMaxima']
    );
}

exibirInformacoes($informacoesVeiculo);

O código acima não gerará Fatal Error, porque mesmo que o Array informado não tenha o formato que esperamos, ele ainda assim é um Array, então ele satisfaz a tipagem do parâmetro da função. Porém o comportamento da função não será o esperado.

Até aqui pudemos entender o problema, mas qual seria a solução para organizar essas informações?

Objetos

Quando analisamos o mundo a nossa volta, podemos ver que as informações geralmente são organizadas de maneiras mais complexas. Por exemplo:

Uma pessoa tem um nome, sobrenome, gênero, data de nascimento, peso, altura, etc... Um carro tem uma marca, modelo, ano de fabricação, motorização, etc... Um computador tem um processador, uma quantidade de memória, SSD, etc...

E se formos analisar de uma maneira mais minuciosa, muitas vezes um objeto é formado por outros objetos, como é o caso do computador que é formado por diversos componentes que também tem suas características.

Quando analisamos elementos do mundo real e os convertemos para a realidade de código, nos deparamos com um dos principais conceitos da Programação Orientada a Objetos, a Abstração.

No mundo real os objetos são formados a partir de Moldes, Modelos, Plantas, etc... E na Programação Orientada a Objetos não é diferente, porém aqui os nossos moldes ou plantas são chamadas de Classes.

Classes

Como visto anteriormente, uma classe é um molde que define como um objeto deve ser. É na classe que informamos todas as propriedades e métodos dos nossos futuros objetos.

  • Propriedades: São as características que um objeto pode ter, como por exemplo: peso, altura, comprimento, velocidade, nome, etc...
  • Métodos: São as ações que um objeto podem executar, como por exemplo: Falar, andar, voar, crescer, etc...

Beleza, até aqui é bem simples entender, certo? Mas como ficaria isso em formato de código PHP?

Como exemplo vamos criar uma classe que representa um carro.

<?php

class Carro {
    public $modelo = "Toyota Corolla";
    public $motorizacao = 1.8;
    public $ano = 2022;
    public $velocidadeMaxima = 200;
}

Vamos analisar item a item o código acima e entender como ele funciona

  1. Primeiro temos a palavra reservada class, ela sempre deve ser utilizada precedendo o nome da classe, ela indica ao PHP que a estrutura de dados a seguir é uma classe.

  2. Em sequência temos o nome da classe. O nome da classe, por convenção, deve sempre iniciar com uma letra maiúscula e deve seguir o padrão PascalCase.

  3. Assim como os blocos IF, WHILE, FUNCTION, etc... o bloco CLASS também é delimitado por uma par de chaves e tudo que existir dentro desse bloco fará parte da classe.

  4. Como vimos, uma classe é formada por propriedade e métodos, no exemplo acima ainda não temos métodos, mas já declaramos nossas primeiros propriedades. As propriedades são basicamente variáveis que existem dentro do escopo da classe e elas (assim como os métodos) podem ter visibilidade public, protected e private, mas não falaremos sobre visibilidade nesse momento.

Ok, já temos nossa classe, mas como podemos utiliza-la em nossos códigos?

Vamos a mais um exemplo:

<?php

class Carro {
    public $modelo = "Toyota Corolla";
    public $motorizacao = 1.8;
    public $ano = 2022;
    public $velocidadeMaxima = 200;
}

$carro = new Carro;

echo "O veículo {$carro->modelo} {$carro->motorizacao} alcança {$carro->velocidadeMaxima} km/h";

No exemplo acima nós criamos uma variável chamada $carro e atribuímos a ela uma nova instância da classe Carro ou seja um Objeto do tipo Carro.

Instanciar, é nome dado ao ato de criar um novo Objeto a partir de uma Classe, e para isso sempre usamos a palavra reservada new.

Uma vez que a variável $carro tenha recebido uma nova instância da classe Carro, todos as propriedades e métodos podem ser acessadas por meio do "->", sempre seguindo o padrão $nomeDoObjeto->nomeDaPropriedade.

Mas, será que é possível alterar os valores de dentro da classe a partir do objeto instanciado?

<?php

class Carro {
    public $modelo = "Toyota Corolla";
    public $motorizacao = 1.8;
    public $ano = 2022;
    public $velocidadeMaxima = 200;
}

$carro = new Carro;

// Alterando o valor do modelo do veículo
$carro->modelo = "Toyota Corolla XEI";

echo "O veículo {$carro->modelo} {$carro->motorizacao} alcança {$carro->velocidadeMaxima} km/h";

No bloco acima, após a instanciação do objeto $carro, alteramos o valor da propriedade $modelo atribuindo a ela o valor "Toyota Corolla XEI".

Por hora é isso, espero que tenha curtido. No próximo post falaremos um pouco sobre encapsulamento e entenderemos como funcionam aquelas palavrinhas public, protected e private. Até lá.