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á!