Orientação a objetos em PHP, o básico

php_oop

Já que resolvi montar um guia para o Perl, acredito que não vá custar muito fazer o mesmo com PHP e outras linguagens. No final até ficam como uma boa referência no caso de (eu ou mais alguém) precisar fazer uma consulta rápida.

Ao contrário do que acontece no Perl em que as coisas parecem estar “amarradas” para funcionar daquele jeito, em PHP tudo parece mais ajeitado na parte da orientação a objetos e tendo até palavras reservadas e todo o resto para utilizar.

Então, o roteiro com o mínimo que você precisa saber/fazer em PHP é mais ou menos assim…

Crie uma classe

PHP tem uma implementação mais integrada, logo, para criar uma classe você vai explicitamente dizer que irá criar uma classe:

class «nome da classe»
{
  ...
};

Não há necessidade deixar em um arquivo separado, mas como as classes existem para ser usadas e reutilizadas compensa criar um arquivo só pra elas.

Usando o mesmo exemplo do Perl e para poder comparar a diferença de sintaxe entre as linguagens, criarei a classe “Nome”:

class Nome
{
};

E chamarei o arquivo de Nome.php mas claro que isto é só o começo, ainda falta coisa.

Construtor

Hora de criar o método que será o construtor desta classe, em PHP devemos chamá-lo de __construct() e ele será executado sempre que uma nova instância desta classe for inicializada. Sua aparência é assim:

class «nome da classe»
{
  ...
  public function __construct(«parâmetros»)
  {
    ...
  };
  ...
}

Voltando à classe Nome, ela terá dois atributos nome e sobrenome que serão passados durante a criação:

class Nome
{
  public $nome;
  public $sobrenome;
  public function __construct($nome,$sobrenome)
  {
    $this->nome=$nome;
    $this->sobrenome=$sobrenome;
  }
};

Acho que agora a expressão que usei, de que em Perl as coisas parecem “amarradas”, começa a fazer sentido, não?

É bom enfatizar que é no Perl 5, no Perl 6 as coisas estão mais próximas do que se vê em Python, Ruby ou JavaScript.

Criando outros métodos

E também os demais métodos da classe:

class Nome()
{
  ...
  public function alteraNome($nome)
  {
    $this->nome=$nome;
    return true; // é sempre bom que funções voltem com algo
  }
  public function escreveNome()
  {    
    return $this->$nome;
  }
  public function escreveNomeCompleto()
  {
    return strtoupper($this->sobrenome).", ".$this->nome;
  }
};

O primeiro método, alteraNome(), cuida de alterar o atributo nome dentro de Nome enquanto que as demais,  escreveNome() e escreveNomeCompleto(), escrevem o primeiro nome e o sobrenome seguido do nome, respectivamente.

Testando

Este é um programa bastante simples e que serve para um dos métodos criados:

#!/usr/bin/php5
<?php
  include('Nome.php');
  $giovanni=new Nome('Giovanni','Nunes');
  print $giovanni->escreveNomeCompleto()."\n";
?>

Que foi? Nunca viu PHP rodando em linha de comando antes? 🙂

E o resultado será algo mais ou menos assim:

$ ./nome.php 
NUNES, Giovanni

Eu não disse que era bastante simples?

Herança

Digamos que você precisa criar uma classe que tenha atributos parecidos com uma outra já existente, você vai escrever tudo novamente?

Você pode utilizar e/ou reutilizar a classe já existente e incluir somente aquilo que precisará ser diferente. Ou seja, esta sua nova classe “herda” os atributos e os métodos de uma classe já existente.

class «Nova Classe» extends «Classe Original»
{
  ...
};

Vou criar uma nova classe baseada em Nome mas irei incluir atributo e método específicos para ela. Como deixei a classe original em um arquivo separado continuarei fazendo assim com a SuperNome.php:

include('Nome.php');
class SuperNome extends Nome
{
  public function __construct($nome,$sobrenome,$titulo)
  {
    $this->nome=$nome;
    $this->sobrenome=$sobrenome;
    $this->titulo=$titulo;
  }
  public function escreveSuperNome()
  {
    $this->titulo." ".$this->nome." ".$this->sobrenome;
  }
};

A classe SuperNome herdou todos os atributos e métodos da classe Nome, tanto que vou usar o método escreveNomeCompleto() que não defini em ponto algum desta nova classe, e ainda criei um método específico para ela, o escreveSuperNome() que escreve o nome completo utilizando TITULO + NOME + SOBRENOME.

Hora de testar:

#!/usr/bin/php5
<?php
  include('SuperNome.php');
  // Anakin é apenas um Jedi
  $jedi=new Nome('Anakin','Skywalker');
  // Darth Vader tem uma posição no Império
  $sith=new SuperNome('Darth','Vader','Lord');
  // Escrevo apenas os nomes
  print $jedi->escreveNomeCompleto()."\n";
  print $sith->escreveNomeCompleto()."\n";
  // Porém é bom lembrar quem Lord Vader é... :)
  print $sith->escreveSuperNome()."\n";
?>

E o resultado será:

$ ./supernome.php
SKYWALKER, Anakin
VADER, Darth
Lord Darth Vader

Não irei me aprofundar muito em herança mas dá pra fazer coisas muito legais como redefinir métodos já existentes ou mesmo tornar um método imutável ou até usar métodos que estão na classe pai mas isto fica para um outro momento.

Destrutor

Apenas para constar, assim como há o construtor, o __construct(), também existe o destrutor, o __destruct() e a ideia é justamente o contrário, conter os procedimentos necessários para quando o objeto não for mais necessário.

class «nome da classe»
{
    ...
    public function __destruct()
    {
        ...
    }
    ...
};

Finalizando

E para fechar, fica a sugestão de praticar usando os métodos que não utilizei mas deixei por lá, assim como também os mesmos exercícios propostos pro guia em Perl, ou seja, criar um programa que use o método alteraNome() e o criar o método alteraSobreNome().

E para saber um pouco mais sobre o assunto:

Anúncios

3 comentários sobre “Orientação a objetos em PHP, o básico

  1. Pingback: Orientação a objetos em PHP, o básico - Peguei do

  2. Pingback: Orientação a objetos em Ruby, o básico | giovannireisnunes

  3. Pingback: Orientação a objetos em Python, o básico | giovannireisnunes

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s