Programação Orientada A Objetos No PHP 5 – Parte 2

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.

programação orientada a objetos

Be Sociable, Share!

Participa! Comenta...