Nesta aula, você aprenderá os conceitos básicos de programação orientada a objetos (POO) em PHP. POO é um paradigma que organiza o código em torno de entidades chamadas objetos, que possuem propriedades (dados) e métodos (comportamentos). A classe é o molde que define a estrutura e o comportamento dos objetos.

Dominar classes e objetos é essencial para escrever código modular, reutilizável e de fácil manutenção. Vamos começar definindo uma classe simples e evoluindo até a criação de objetos funcionais.

Definindo classes

Em PHP, uma classe é definida com a palavra-chave class, seguida pelo nome da classe (geralmente em PascalCase). As classes podem conter propriedades (variáveis) e métodos (funções). A sintaxe básica é:

<?php
class NomeDaClasse {
    // propriedades e métodos
}
?>

Exemplo: uma classe Carro que representa um veículo com características como marca, modelo e ano.

<?php
class Carro {
    public $marca;
    public $modelo;
    public $ano;
}
?>

Note que as propriedades são declaradas com visibilidade (public, protected ou private). public significa que podem ser acessadas de fora da classe.

Propriedades e métodos

Propriedades são variáveis que armazenam o estado do objeto. Métodos são funções que definem o comportamento. Ambos podem ter modificadores de acesso. Vamos adicionar métodos à classe Carro:

<?php
class Carro {
    public $marca;
    public $modelo;
    public $ano;

    public function exibirDetalhes() {
        return "{$this->marca} {$this->modelo} ({$this->ano})";
    }

    public function ligar() {
        return "O carro está ligado.";
    }
}
?>

Observe o uso de $this dentro do método para acessar as propriedades da instância. Métodos podem receber parâmetros e retornar valores.

$this

A pseudo-variável $this é uma referência ao objeto atual (a instância da classe). Ela é usada dentro dos métodos para acessar propriedades e métodos do mesmo objeto. Sem $this, não seria possível distinguir entre variáveis locais e propriedades da classe.

Exemplo: método que define a marca usando um parâmetro:

public function setMarca($marca) {
    $this->marca = $marca;
}

Se não usássemos $this, a variável $marca dentro do método se referiria apenas ao parâmetro, não à propriedade. $this é obrigatório para referenciar propriedades e métodos da instância.

Instanciando

Instanciar é criar um objeto a partir de uma classe. Usa-se a palavra-chave new. Cada objeto tem seu próprio conjunto de propriedades, independente de outros objetos da mesma classe.

<?php
$carro1 = new Carro();
$carro1->marca = 'Toyota';
$carro1->modelo = 'Corolla';
$carro1->ano = 2020;

echo $carro1->exibirDetalhes(); // Toyota Corolla (2020)

$carro2 = new Carro();
$carro2->marca = 'Honda';
$carro2->modelo = 'Civic';
$carro2->ano = 2021;

echo $carro2->exibirDetalhes(); // Honda Civic (2021)
?>

Após instanciar, podemos acessar propriedades e chamar métodos usando o operador ->. Cada objeto mantém seus próprios valores.

Boas práticas

Nomeie classes com PascalCase (ex: MinhaClasse). Declare propriedades com visibilidade explícita (public, protected ou private). Use $this consistentemente dentro de métodos. Prefira métodos getters e setters para acessar propriedades privadas ou protegidas.

Referências

Exercícios

  1. Crie uma classe Pessoa com propriedades públicas nome e idade. Adicione um método apresentar() que retorna uma string como "Olá, meu nome é João e tenho 25 anos.". Instancie um objeto e exiba o resultado.
  2. ✓ Resposta:
    <?php
    class Pessoa {
        public $nome;
        public $idade;
    
        public function apresentar() {
            return "Olá, meu nome é {$this->nome} e tenho {$this->idade} anos.";
        }
    }
    
    $pessoa = new Pessoa();
    $pessoa->nome = 'João';
    $pessoa->idade = 25;
    echo $pessoa->apresentar();
    ?>
  3. Adicione um método envelhecer() na classe Pessoa que incrementa a idade em 1. Crie um objeto, chame o método e exiba a nova idade.
  4. ✓ Resposta:
    <?php
    class Pessoa {
        public $nome;
        public $idade;
    
        public function apresentar() {
            return "Olá, meu nome é {$this->nome} e tenho {$this->idade} anos.";
        }
    
        public function envelhecer() {
            $this->idade++;
        }
    }
    
    $pessoa = new Pessoa();
    $pessoa->nome = 'Maria';
    $pessoa->idade = 30;
    $pessoa->envelhecer();
    echo $pessoa->idade; // 31
    ?>
  5. Crie uma classe Produto com propriedades privadas nome e preco. Adicione métodos públicos getNome(), setNome($nome), getPreco() e setPreco($preco). Instancie um objeto, defina valores e exiba-os.
  6. ✓ Resposta:
    <?php
    class Produto {
        private $nome;
        private $preco;
    
        public function getNome() {
            return $this->nome;
        }
    
        public function setNome($nome) {
            $this->nome = $nome;
        }
    
        public function getPreco() {
            return $this->preco;
        }
    
        public function setPreco($preco) {
            $this->preco = $preco;
        }
    }
    
    $prod = new Produto();
    $prod->setNome('Notebook');
    $prod->setPreco(3500.00);
    echo $prod->getNome() . ' custa R$ ' . $prod->getPreco();
    ?>
  7. Defina uma classe Calculadora com um método estático soma($a, $b) que retorna a soma. (Dica: use public static function). Chame o método sem instanciar a classe.
  8. ✓ Resposta:
    <?php
    class Calculadora {
        public static function soma($a, $b) {
            return $a + $b;
        }
    }
    
    echo Calculadora::soma(5, 3); // 8
    ?>
  9. Crie uma classe Livro com propriedades titulo e autor. Adicione um método exibir() que retorna "Título: [titulo], Autor: [autor]". Instancie dois objetos com valores diferentes e exiba as informações de cada um.
  10. ✓ Resposta:
    <?php
    class Livro {
        public $titulo;
        public $autor;
    
        public function exibir() {
            return "Título: {$this->titulo}, Autor: {$this->autor}";
        }
    }
    
    $livro1 = new Livro();
    $livro1->titulo = 'Dom Casmurro';
    $livro1->autor = 'Machado de Assis';
    echo $livro1->exibir();
    
    $livro2 = new Livro();
    $livro2->titulo = '1984';
    $livro2->autor = 'George Orwell';
    echo $livro2->exibir();
    ?>