Curso POO com PHP: #2 - Encapsulamento, propriedades e métodos

Fala, escoteiro!!! Vamos desbravar mais alguns conceitos de programação e construir códigos cada vez mais profissionais? Como prometido, nesse post você vai entender a diferença entre aquelas 3 palavrinhas que você viu no post anterior: public, protected e private.

Encapsulamento

Encapsulamento é um conceito relacionado à visibilidade das propriedades e métodos da sua classe. Uma propriedade ou método público (public) pode ser acessada tanto dentro da classe, quanto fora dela. Veja o exemplo abaixo:

<?php

class Carro {
    public $velocidade = 0;
}

$carro = new Carro;
$carro->velocidade = 100;

echo "Seu carro está agora a {$carro->velocidade} km/h";

No exemplo acima, criamos na classe Carro uma propriedade pública chamada $velocidade. Como a mesma é pública, ela pode ser acessada tanto de dentro quanto de fora da Classe, e foi justamente isso que fizemos. Criamos uma instância da classe Carro (ou seja, instanciamos um novo objeto) acessamos a propriedade velocidade atribuindo a ela o valor 100 e na sequência fizemos a leitura desse valor.

Perceba que a atribuição do valor 100 foi feita de fora da classe.

O exemplo acima funciona perfeitamente bem, porém nem sempre é interessante deixar que outras partes do nosso código altere propriedades de nossos objetos. Imagine se o nosso exemplo acima fosse um jogo. O que aconteceria se o usuário conseguisse colocar que a velocidade do carro dele é 700 km/h?

Por isso o PHP e diversas outras linguagens de programação que implementam o paradigma de orientação a objetos disponibilizam o modificador de acesso private. Uma propriedade ou método private só é acessível de dentro da classe. Vamos a um exemplo?

<?php

class Carro {
    private $velocidade = 0;
}

$carro = new Carro;
$carro->velocidade = 100;

echo "Seu carro está agora a {$carro->velocidade} km/h";

Perceba que mudamos o modificador de acesso de public para private. Ao executar o código acima você receberá o seguinte erro.

Fatal error: Uncaught Error: Cannot access private property Carro::$velocidade in /home/runner/CursoPHPAcampamentoDev/main.php:8
Stack trace:
#0 {main}
  thrown in /home/runner/CursoPHPAcampamentoDev/main.php on line 8
exit status 255

Chamo aqui a atenção para o seguinte trecho "Cannot access private property Carro::$velocidade", ou seja, o PHP está dizendo que ele não consegue acessar a propriedade $velocidade porque ela é privada.

Beleza, entendi. Mas... E como vamos acessar a propriedade de fora da classe?

Podemos criar métodos públicos para definir como essa propriedade pode ser acessada. Vamos ao exemplo do carro. Como é que um carro modifica sua velocidade? Acelerando e Freando, certo? Então nesse caso podemos criar os métodos acelerar e frear, e deixar que eles se encarreguem de modificar o valor da propriedade velocidade.

<?php

class Carro {
    private $velocidade = 0;

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

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

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

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

echo $carro->obterVelocidadeAtual();

Vamos analisar o código acima

  • A classe Carro agora tem algumas funções dentro dela. Essas funções, quando estão no escopo de uma classe, são chamadas de métodos e elas representam as ações que o objeto poderá executar, nesse caso acelerar e frear.

  • O método acelerar tem como objetivo incrementar em 10 o valor atual da velocidade do carro. Ou seja, na primeira vez que ele for executado a velocidade deixará de ser 0 e passará a ser 10, na segunda vez passará a ser 20 e assim sucessivamente. Perceba que nesse método há uma elemento chamado $this. Esse $this é uma referência ao próprio objeto, ou seja, você está acessando uma propriedade do próprio objeto chamada $velocidade.

  • O método frear é muito parecido com o método acelerar, a diferença é que ao invés de incrementar em 10, ele vai decrementar em 10.

  • O método obterVelocidadeAtual vai devolver por meio do return e do $this o valor atual da propriedade $velocidade presente na própria classe.

Agora que já temos nossos métodos públicos, podemos executa-los sempre lembrando de usar o nosso amigo ->.

O exemplo acima imprimirá no console o valor 10, porém temos um pequeno problema nessa classe. Mesmo privando nossa propriedade $velocidade. A pessoa ainda pode executar o método acelerar várias vezes até chegar em velocidades absurdas ou frear várias vezes e obter valores negativos. Vamos resolver isso?

<?php

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

    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;
$carro->frear();
$carro->frear();
$carro->frear();
$carro->frear();

echo $carro->obterVelocidadeAtual();

Prontinho. Deixamos nossos métodos mais espertos e agora nós podemos validar até que ponto podemos acelerar e frear.

Ainda temos mais um modificador de acesso, que é o nosso amigo protected. Ele é bem simples de utilizar, mas não falaremos nele por enquanto até entrarmos no conceito de herança... Uma coisa de cada vez 😎.

E ai, tá curtindo? Espero que sim. Se tiver alguma dúvida pode postar nos comentários que vou te ajudando.

No próximo post falaremos um pouco sobre Construtores e Destrutores, aguardo você lá!