Herança permite que uma classe para adquirir os membros de outra classe. No exemplo abaixo, a classe Quadrado herda de retângulo, especificado pela palavra-chave extends. Retângulo torna-se então a classe pai de Quadrado, que por sua vez torna-se uma classe filha de retângulo. Além de seus próprios membros, passa a ganha todos os membros acessíveis (não-privadas), Retângulo, incluindo qualquer construtor.
<?php // Classe pai (base class) class Rectangle{ public $x, $y; function __construct($a, $b){ $this->x = $a; $this->y = $b; } } // Classe filha (derived class) class Quadrado extends Rectangle{ } ?>
Ao criar uma instância de Quadrado dois argumentos deve ser especificada, pois Quadrado herdou o construtor de retângulo.
<?php $s = new Quadrado(5,10);
As propriedades herdadas do retângulo também pode ser acessado a partir do objeto Quadrado.
<?php $s = new Quadrado(5,10); $s->x = 5; $s->y = 10;
Uma classe em PHP só pode herdar de uma classe pai e os pais devem ser definidos logo no início no script da classe filha.
Overriding(substituição) de membros
Um membro em uma classe filho pode redefinir um membro da sua classe pai para dar-lhe uma nova implementação. Para substituir um membro herdado ele só precisa ser declarado novamente com o mesmo nome. Como mostrado abaixo:
<?php class Quadrado extends Retangulo{ function __construct($a) { $this->x = $a; $this->y = $a; } } ?>
Com este novo construtor apenas um único argumento é usado para criar o Quadrado.
<?php $s = new Square(5); ?>
O construtor herdado de Retângulo é substituído, o construtor de retângulo não será mais chamado quando o objeto é criado Quadrado. Cabe ao desenvolvedor para chamar o construtor pai, se necessário. Isto é feito, antecedendo a chamada com a palavra-chave “parent” e duas vezes dois-pontos. Dois pontos é conhecido como o operador de resolução de escopo (::).
class Quadrado extends Retangulo{ function __construct($a){ parent::__construct($a,$a); } }
A palavra-chave “parent” é um apelido para o nome de classe do pai, o que pode também ser usado. No PHP, é possível acessar membros substituídos que são qualquer número de níveis de profundidade na hierarquia de herança usando esta notação.
<?php class Quadrado extends Retangulo{ function __construct($a) { Retangulo::__construct($a,$a); } } ?>
Como os construtores, o destruidor dos pais não serão chamados implicitamente se ele é substituído. Ela também teria que ser explicitamente chamado com parent :: __destruct () a partir do destruidor da classe filha.
Palavra-chave Final
Para evitar que uma classe filha possa substituir um método ele pode ser definido como final. A própria classe também pode ser definida como final para evitar qualquer classe de estendê-lo.
<?php final class NotExtendable{ final function notOverridable() {} } ?>
Operador instanceof
Como medida de segurança, você pode testar para ver se um objeto pode ser convertido para uma classe específica usando o operador instanceof. Este operador retorna true se o objeto do lado esquerdo pode ser convertido para o tipo do lado direito, sem causar um erro. Isto é verdade quando o objeto é de uma instância , ou herda, a classe do lado direito.
<?php $s = new Quadrado(5); $s instanceof Quadrado; // true $s instanceof Retangulo; // true ?>
Links Importantes
http://php.net/manual/pt_BR/language.oop5.basic.php
Herança no PHP – Guia de Referência Básico