Artigo Anterior > Programação Orientada A Objetos No PHP 5 – Parte 1
No último artigo foi apresentado a você os conceitos mais básicos na programação orientada a objetos, como nomenclatura, visibilidade dos métodos e atributos. Também foi escrito a primeira classe e em seguida foi instanciada para apresentar uma frase na tela.
Veremos nesta seqüência como compartilhar o código entre as classes, executar código automaticamente e criar blocos de procedimento ajustáveis.
Herança
Além da organização proporcionada pela programação orientada a objetos, outrao vantagem é a diminuição do tamanho do código. Isso se deve a possibilidade de compartilhamento dos métodos e atributos entre as classes e subclasses.
A palavra chave para ocorrer este intercâmbio é a extends. Ela estende o comportamento e características de uma classe para a que esta sendo criada.
Vejamos como isso funciona desenvolvendo mais o código criado no artigo anterior sobre Programação Orientada A Objetos.
class Web{
public $linguagem;
public function pagina(){
echo 'Página escrita utilizando '.$this -> linguagem;
}
}
class Programador extends Web{
public function programar(){
echo 'Eu sei programar em '. $this -> linguagem;
}
}
Ao criar a classe Programador, nós decidimos aproveitar os atributos e métodos já criados na classe Web. Isso significa que além do método programar(), a classe Programador tem à disposição o atributo “linguagem” e o método pagina().
Vamos ver a aplicação:
$web = new Web();
$web -> linguagem = 'PHP';
$web -> pagina();
$prog = new Programador();
$prog -> linguagem = 'Java';
$prog -> programar();
$prog -> pagina();
É instanciada a classe Web, atribuiído o texto “PHP” para o atributo ‘linguagem’ e mostrada na tela a frase “Página escrita utilizando PHP”.
Depois é instanciada a classe Programador, o atributo ‘linguagem’, que não faz parte da classe Programador, mas foi estendido da classe Web, recebe outro valor e é mostrada na tela “Eu sei programar em Java”. Por último ainda é utilizado outro método estendido para mostrar na tela a frase “Página escrita utilizando Java”.
É possível limitar quais atributos e métodos da classe são compartilhados utilizando os modificadores de visibilidade public, protected e private. Para evitar que a classe seja herdada, adiciona-se no início da declaração da classe a palavra final.
final class Web{
//código
}
Faça este teste no código que vimos acima e veja como é retornado um erro informando que a classe Web não pode ser herdada.
Implementação De Interface
Outra vantagem da POO é que você cria diversos blocos de código que podem ser montados conforme a necessidade.
A idéia da criação de uma interface vem da idéia de que os objetos e métodos tenham a aplicação alterada conforme o contexto. Com isso tornando o código mais flexível.
Na interface é definido o método, mas sem especificar como ele deve ser manipulado pela classe. Sendo que eles devem ser públicos.
interface iCalculo{
public function Adicao($num1, $num2);
}
É comum adicionar a letra “i” na frente do nome da interface para identificá-la como tal. Veja que nenhuma operação é feita, apenas é passado o método e os atributos que ele deve trabalhar. É possível adicionar quantos métodos quiser para uma interface.
class Aluno implements iCalculo{
private $total;
public function Adicao($num1, $num2){
echo $this -> total = $num1 + $num2;
}
}
Utilizar a interface na classe, também pode ser chamado de implementar. Por isso a palavra reservada implements após o nome da classe. Criado o atributo para receber o total da soma, entra em ação o método que veio com a interface. Observe como o funcionamento do método foi feito neste ponto e não veio pré-definido pela interface.
A utilização é realmente simples:
$aluno = new Aluno();
$aluno -> Adicao(50,30);
As interfaces também podem ser estendidas, da mesma forma que acontece com as classes. Lembrando que se ela foi implementada na classe ela DEVE ser utilizada, caso contrário é retornado erro.
Para implementar diversas interfaces em uma classe basta separar os nomes por virgula.
Construtores E Destruidores
Se for necessário executar um código logo que a classe é instanciada, você precisa de um __construct().
class Web{
function __construct(){
echo ‘Executado automaticamente';
}
}
$web = new Web();
Os construtores não são anexados à subclasse quando utilizamos a palavra extends. O código para chamada na subclasse é:
class Programador extends Web{
function __construct(){
parent::__construct();
echo 'Em seguida a frase da subclasse.';
}
}
Quando as referencias ao objeto ou o próprio objeto for destruído, entra em ação o __destruct(), que funciona exatamente como o __construct().
class Web{
function __destruct(){
echo 'Fim';
}
}
static e ::
Conforme você for encontrando códigos orientados a objetos, você vai encontrar seguidamente esta palavra-chave. Tanto uma propriedade quando um método pode ser declarado como static. O resultado é que você não vai precisar instanciar a classe para utilizá-los.
class Teste{
public static $variavel;
public function Escreve(){
echo self::$variavel;
}
}
Na declaração da classe, quando uma propriedade é declarada static a pseudo-classe $this não pode ser usada para ela. No lugar surge o self, como no exemplo e o parent quando for uma classe estendida.
Outra novidade é o dois pontos “::” chamado de operador de resolução de escopo. Ele faz o papel do “->” quando o atributo ou método é estático. Aparece também quando trabalhamos com os construtores como visto anteriormente.
Teste::$variavel = 'Valor definido';
echo Teste::$variavel;
$imprime = new Teste();
$imprime -> Escreve();
Simplesmente informamos o nome da classe, dois pontos e o atributo. E ele recebe o valor. Para mostrar o resultado na tela basta um echo simples com o nome da classe e atributo.
Se você escolher instanciar, nada muda em relação aos exemplos anteriores.
Os mesmos princípios valem na aplicação dos métodos criados com o static.
class Teste{
public static $variavel;
public static function Escreve($valor){
echo $valor;
}
}
Teste::Escreve('palavra');
Conclusão
Existem outros pequenos conceitos com os quais você vai se deparar no desenvolvimento dos códigos. Mas os apresentados neste e no artigo anterior são sem dúvida a base para que você consiga explorar os potenciais da programação orientada a objetos.