Essa é a segunda parte da saga POO em PHP, se você não leu a parte 1 CLIQUE AQUI e dê uma olhada antes.
Hoje falarei sobre herança e faremos alguns exemplos. Irei lentamente, pois esse assunto é um pouco complicado de entender. Então vamos nessa!
No ultimo post criamos uma classe chamada polígono. Mas e se ao invés de polígono nós precisássemos fazer um retângulo? Bom, na programação estruturada deveríamos refazer tudo ou criar uma nova função para isso, mas na POO o mundo fica um pouco mais fácil. Nós devemos simplesmente criar uma classe chamada retângulo, que estende a classe polígono (você também pode falar que a classe polígono é a super classe da classe retângulo), ao fazermos isso a classe retângulo recebe todos os atributos e métodos da classe polígono (não é tão assim depende da visibilidade, mas veremos depois, por enquanto você pode dizer que a classe retângulo herda tudo da classe Polígono). Abaixo está o exemplo do que foi explicado até agora.
Usarei o mesmo exemplo do post anterior com apenas a adição de 1 classe:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
class Poligono { public $lados = array(); function __construct( $parLados) { echo('<BR><BR>Objeto CONSTRUIDO<BR>'); $this->lados=$parLados; print_r($this->lados); } function __destruct ( ) { echo('<BR><BR> Objeto destruído'); } function perimetro(){ $auxPerimetro = 0; foreach ($this->lados as $l) { $auxPerimetro +=$l; } return $auxPerimetro; } } $l = array(10,20,30); $pol = new Poligono($l); echo('<BR> <BR> o perimetro do poligono é:'.$pol->perimetro()); class Retangulo extends Poligono { } $l1 = array(10,20,10,20); $re = new Retangulo($l1); echo('<BR><BR> o perimetro do Retangulo é:'.$re->perimetro()); |
O código está exatamente igual ao código do ultimo post até a linha 30, aonde há a declaração da classe retângulo. Note que a única diferença dessa declaração para a outra do polígono é a palavra reservada extends, ela informa que a classe retângulo estende a classe Polígono. Perceba que eu não coloquei nenhum método ou atributo na classe, mas logo abaixo na linha 36 eu tive que passar por argumento os lados do retângulo na construção do objeto, isso se dá porque a classe retângulo herda o construtor da classe polígono, e ainda na linha 38 eu consegui acessar o método perímetro, mesmo sem ter escrito nada, de novo a mesma coisa, a classe retângulo herdou o método perímetro da classe polígono.
Até ai tudo certo e fácil de entender, mas a classe retângulo acabou sendo mesma a coisa que a classe polígono, devemos colocar as particularidades do nosso retângulo nessa nova classe.
Primeiro o construtor ficou muito burro, pois ele recebe um array de lados, mas sabemos que o retângulo tem sempre 4 lados e vamos fazer um retângulo regular, então a base tem o mesmo tamanho que o topo. Nosso construtor deverá receber 2 parâmetros (base a altura), para tanto vamos fazer uma coisa chamada de sobrescrita (override).
Sobrescrita é quando queremos mudar algum método da classe Pai (superclasse), significa que ao invés de o objeto acessar o método da classe Pai ele vai acessar o método da classe filha, e para realizar a sobrescrita temos apenas que manter o mesmo nome do método na classe filha.
Veja como fica o código do nosso teste (da linha 30 para cima não precisa alterar nada, portanto irei omitir esse código)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Retangulo extends Poligono { function __construct( $parBase,$parAltura) { echo('<BR><BR>Retangulo CONSTRUIDO<BR>'); $auxLados = array($parBase,$parAltura,$parBase,$parAltura); parent::__construct($auxLados); } function area(){ return $this->lados[0] * $this->lados[1]; } } $re = new Retangulo(10,20); echo('<BR><BR> o perimetro do Retangulo é:'.$re->perimetro()); echo('<BR><BR> e a area do Retangulo é:'.$re->area()); |
Você pode notar que na linha 33 eu sobrescrevi o método “function __construct”. Agora ao instanciar um objeto da classe Retangulo, o PHP vai executar o construtor da classe filha e não da classe Polígono (eu também adicionei um método para calcular a área do nosso retângulo).
Você deve estar achando estranho o comando parent, ele é o responsável por acessar os métodos da superclasse.
Explicando o que está fazendo o construtor da Casse Retangulo:
Recebe dois parâmetros(base e altura), cria um array de arestas para depois acessar o construtor da classe pai passando o array como parâmetro.
O resultado desse código você pode ver abaixo:
Para finalizar o artigo de hoje eu quero que você note na figura acima, as duas ultimas linhas, ao acabar o programa o PHP libera os objetos da memória, por isso aparece essa informação de objeto destruído 2 x (já que criamos 2 objetos).
No próximo artigo iremos ver a Visibilidade do PHP e começar a ver a Pseudo sobrecarga também.
Até
Wenderson Lisardo
<- Parte 1