Curso POO com PHP: #3 - Construtores e Destrutores

Se você está lendo isso, jovem escoteiro, é porque você tá curtindo o conteúdo e isso me deixa muito feliz! 😊 Na aula de hoje vamos destrinchar um pouco mais a anatomia de uma classe em PHP e vamos aprender como funcionam os famosos métodos Construtores e Destrutores. E ai, vamos nessa?

Construtores

O método construtor é um método especial que é executado automaticamente (sem que aja intervenção do programador) toda vez que um novo objeto é instanciado a partir de uma classe.

Estruturalmente falando o método construtor é exatamente igual a qualquer outro método da classe, as diferenças são:

  • Esse método precisa obrigatoriamente ser chamado de __construct()
  • Ele é executado automaticamente no momento da instanciação.

Veja o exemplo abaixo:

<?php

class Carro {
    private $velocidade = 0;
    private $velocidadeMaxima = 0;

    public function __construct($velocidade)
    {
        $this->velocidadeMaxima = $velocidade;
    }

    public function acelerar() {        
        if ($this->velocidade + 10 <= $this->velocidadeMaxima) {
            $this->velocidade += 10;
        }
    }

    public function frear() {
        if ($this->velocidade - 10 >= 0) {
            $this->velocidade -= 10;
        }
    }

    public function obterVelocidadeAtual()
    {
        return $this->velocidade;
    }
}

$carro = new Carro(20);
$carro->acelerar();
$carro->acelerar();
$carro->acelerar();

echo $carro->obterVelocidadeAtual();

Como o método construtor é executado automaticamente no momento da instanciação, é nesse momento que passamos os parâmetros para o mesmo.

No exemplo acima, o código $carro = new Carro(20); executa o método __construct passando para ele o valor 20. Assim sendo, a propriedade $velocidadeMaxima receberá esse valor, visto que é isso que a função construtora (nesse exemplo) faz.

Na vida real, a partir de molde podemos criar vários objetos. Na Programação Orientada a Objetos é a mesma coisa. Uma classe pode dar origem a quantos objetos você precisar. Veja o exemplo abaixo:

<?php

class Carro {
    private $velocidade = 0;
    private $velocidadeMaxima = 0;

    public function __construct($velocidade)
    {
        $this->velocidadeMaxima = $velocidade;
    }

    public function acelerar() {        
        if ($this->velocidade + 10 <= $this->velocidadeMaxima) {
            $this->velocidade += 10;
        }
    }

    public function frear() {
        if ($this->velocidade - 10 >= 0) {
            $this->velocidade -= 10;
        }
    }

    public function obterVelocidadeAtual()
    {
        return $this->velocidade;
    }
}

$celta = new Carro(140);
$celta->acelerar();
$celta->acelerar();

$corolla = new Carro(200);
$corolla->acelerar();
$corolla->acelerar();
$corolla->acelerar();

echo "Velocidade Celta: " . $celta->obterVelocidadeAtual() . PHP_EOL;
echo "Velocidade Corolla: " . $corolla->obterVelocidadeAtual();

Perceba que no exemplo acima criamos dois objetos, porém cada um recebe dados diferentes no construtor e são completamente independentes. Apesar de terem sidos criados a partir da mesma classe, o que acontece em um objeto não reflete no outro.

Destrutores

O método destructor é um método especial que é executado automaticamente (sem que aja intervenção do programador) toda vez que um objeto deixar de existir.

<?php

class Carro {
    private $velocidade = 0;
    private $velocidadeMaxima = 0;

    public function __construct($velocidade)
    {
        $this->velocidadeMaxima = $velocidade;
    }

    public function __destruct()
    {
        $arquivo = "veiculo_" . uniqid() . ".txt";
        $conteudo = $this->velocidade;

        file_put_contents($arquivo, $conteudo);
    }

    public function acelerar() {        
        if ($this->velocidade + 10 <= $this->velocidadeMaxima) {
            $this->velocidade += 10;
        }
    }

    public function frear() {
        if ($this->velocidade - 10 >= 0) {
            $this->velocidade -= 10;
        }
    }

    public function obterVelocidadeAtual()
    {
        return $this->velocidade;
    }
}

$celta = new Carro(140);
$celta->acelerar();
$celta->acelerar();

$corolla = new Carro(200);
$corolla->acelerar();
$corolla->acelerar();
$corolla->acelerar();

echo "Velocidade Celta: " . $celta->obterVelocidadeAtual() . PHP_EOL;
echo "Velocidade Corolla: " . $corolla->obterVelocidadeAtual();

Ao executar o código acima, quando a ciclo de vida de cada objeto criado chegar ao fim, ele executará automaticamente o método __destruct, e o mesmo criará um novo arquivo contendo a velocidade atual do veículo.

É basicamente isso. E ai é difícil? Ficou com alguma dúvida? Comenta aqui em baixo que eu vou te ajudando a estudar e aprender.

Por hoje é só, escoteiro. Até a próxima!