Escolar Documentos
Profissional Documentos
Cultura Documentos
A regra da programação é bem clara. Se um trecho de código se repete em, no mínimo, dois lugares,
transforme este trecho em uma função. O reaproveitamento de códigos deve estar sempre presente.
Outra forma que está sendo utilizada largamente em PHP, e que possibilita um salto
no reaproveitamento de códigos, é a Programação Orientada a Objetos (OOP). Contudo, OOP
em PHP é mais que reaproveitar códigos. É uma mudança radical na forma com que nossos códigos
são escritos.
Ao adotar a programação orientada a objetos, você começa a visualizar suas aplicações como um
conjunto de objetos do mundo real. Agora você terá objetos Cliente, Boleto, Fatura, Produto, etc. E
estes objetos possuirão métodos e características.
Este grupo de anotações cobre a OOP no PHP 5. Esta versão suporta muitas das características da
OOP que não eram suportadas na versão 4. Assim, se estiver usando a versão 4 ou anteriores, faça a
atualização e vamos adiante.
Esta instância específica da classe é chamada de objeto. Cada objeto tem certas características, ou
propriedades, e certas funções pré-definidas, ou métodos. Estas propriedades e métodos do objeto
correspondem diretamente às variáveis e métodos definidos na classe.
Após a definição da classe, a PHP permite-nos criar quantas instâncias desta classe quisermos. Cada
instância é um objeto completamente diferente, com suas próprias propriedades e métodos, e
portanto, pode ser manipulado independentemente de outros objetos. Isso se torna importante
quando precisamos de duas conexões simultâneas com uma base de dados ou dois carrinhos de
compras.
A forma mais comum de usar OOP em códigos PHP é definir as classes em arquivos separados e
incluir estes arquivos nas páginas onde objetos desta classe serão usados. Isso facilita a manutenção
do código das classes sem a necessidade de alterar páginas já disponibilizadas aos seus usuários.
A definição de uma classe PHP começa com a palavra class seguinda pelo nome da classe. No
corpo da definição inserimos as propriedades e métodos que esta classe terá. Em nosso exemplo, a
classe possui três propriedades e um método. Veja o uso da palavra-chave public para definir o
nível de visibilidade dos atributos e métodos da classe. Mais adiante você aprenderá mais sobre este
modificador e os demais.
Para criar uma instância desta classe você pode usar o seguinte código:
<?
// cria uma instância chamada $cliente
$cliente = new Pessoa();
?>
Pronto! A partir de agora a variável $cliente é um objeto da classe Pessoa e pode ter suas
propriedades alteradas independentemente de outras instâncias da mesma classe.
<?
// altera a propriedade nome do objeto
$cliente->nome = "Geraldo Gomes";
?>
Observe o uso do operador -> para acessar propriedades e métodos do objeto. Veja agora como
exibir esta alteração:
<?
// exibe o nome do cliente
echo $cliente->nome;
?>
<?
// chama um método do objeto
$cliente->andar();
?>
Imagine uma classe Impressora capaz de imprimir todos os tipos de documentos possíveis. É claro
que esta classe terá uma certa quantidade de propriedades e métodos. Porém, o usuário da classe
poderia ter acesso a apenas alguns métodos públicos, tais como imprimir(), definirTipo(), etc. As
propriedades e métodos que interessam somente ao funcionamento interno da classe podem ser
ocultos do mundo externo.
class Pessoa{
public $nome;
Aqui tanto as propriedades e métodos são de acesso public e podem ser acessados e manipulados
por qualquer trecho de código que esteja usando um objeto da classe. Experimente agora usar o
modificador private. Este modificador marca um recurso para que este seja acessível somente à
classe a qual ele pertence. Veja:
Isso nos mostra que, de fato, recursos marcados como private são acessíveis somente à classe.
Desta forma, tais recursos podem ser acessados usando métodos public. Veja:
<?
// definição da classe Pessoa
class Pessoa{
private $nome;
Veja que agora o nome do cliente é definido a partir do método public setNome:
O identificador $this é usado para acessar recursos locais da classe. Os prefixos "set" e "get" são
muito usados para definir métodos que acessam ou alteram dados privados de uma classe. Veja o
método que obtém o nome:
Veja como usamos $this novamente para acessar a propriedade nome e devolvê-la na saída do
método.
var $nome;
var $idade;
<?
// definição da classe Pessoa
class Pessoa{
private $nome;
function __construct(){
echo "Novo objeto construído com sucesso!";
}
}
<?
// definição da classe Pessoa
class Pessoa{
private $nome;
function __destruct(){
echo "O objeto foi destruído com sucesso!";
}
}
Algo bem interessante acontece aqui. Execute o código e veja como o objeto é destruído
quando o código PHP no servidor termina sua execução. Se quiser destruir o objeto antes você pode
usar o seguinte código:
<?
// definição da classe Pessoa
class Pessoa{
private $nome;
function __destruct(){
echo "O objeto foi destruído com sucesso!";
}
}
// cria uma instância chamada $cliente
$cliente = new Pessoa();
Vimos na lição anterior que o PHP nos fornece uma função que é executada no
momento em que um objeto de uma classe é construído. Podemos tirar proveito
desta funcionalidade e fornecer valores para algumas propriedades do nosso objeto.
<?
// definição da classe Pessoa
class Pessoa{
public $nome;
public $idade;
Existe, contudo, uma forma de fazer com que uma determinada propriedade pertença à classe e não
aos objetos instanciados a partir dela. Veja um exemplo curioso.
Suponha que você esteja desenvolvendo um jogo que contenha vários objetos da classe Marciano.
Ora, não seria interessante que cada objeto soubesse quantos colegas seus existem no momento?
Isso os faria mais ou menos corajosos.
A palavra-chave static é usada para marcar uma propriedade pertecendo à classe e não às suas
instâncias. Veja um exemplo:
<?
// definição da classe Pessoa
class Pessoa{
static $quant = 0;
function __construct(){
self::$quant++;
}
function __destruct(){
self::$quant--;
}
}
Na linha:
static $quant = 0;
definimos uma variável estática chamada $quant e definimos seu valor como 0. Em seguida usamos
o construtor e destrutor da classe para incrementar ou decrementar o valor da variável. Veja que
temos que usar a palavra self acompanhada de :: para ter acesso a uma propriedade estática dentro
do corpo da classe:
self::$quant++;
Fora do corpo da classe nós usamos o nome da classe e :: como mostrado abaixo:
Métodos estáticos pertencem à classe e podem ser acessados sem a necessidade de se criar uma
instância da classe. Veja:
<?
// definição da classe Pessoa
class Pessoa{
static function avisar(){
echo "Sou um método estático";
}
}
Observe como chamamos o método sem criar uma instância da classe a qual ele pertence. Para isso
usamos o nome da classe e o operador :: seguido pelo nome do método.
Métodos estáticos são úteis quando você quer montar uma biblioteca de funções relacionadas. Um
exemplo seria uma classe Math com as funções matemáticas mais usadas em seus códigos.
É importante ter em mente que métodos estáticos não têm acesso a outros métodos ou propriedades
não estáticas da classe. Isso é fácil de entender. Como não existe uma instância da classe, estes
métodos e propriedades não existem. Veja o que acontece no código a seguir:
<?
// definição da classe Pessoa
class Pessoa{
public $nome;
self::$nome = "Alberto";
<?
define("FATOR", "3.7");
Com o suporte mais avançado da programação orientada a objetos no PHP 5, constantes podem ser
definidas a nível de classes, ou seja, pertencentes à classe e não aos objetos instanciados a partir
dela. Em um primeiro momento, constantes definidas em uma classe se comportam exatamente
como propriedades estáticas e podem ser acessadas sem a necessidade de se criar uma instância da
classe.
A vantagem do uso de constantes em classes PHP é que podemos criar enumerações (tipos
enumerados). Um uso típico é quando temos valores númericos e gostaríamos de tratá-los por
apelidos em algumas partes do código. Veja um exemplo:
<?
// definição da classe Cores
class Cores{
const VERMELHO = "red";
const AZUL = "blue";
const PRETO = "black";
const AMARELO = "yellow";
}
Como o nome diz, constantes não podem ter seus valores alterados durante a execução do código.
Além disso, é prática comum usar constantes sempre em letras maiúsculas.
<?
// definição da classe Pessoa
class Pessoa{
public $nome;
}
O importante a notar nestas atribuições é que todas elas acontecem por referência, ou
seja, qualquer alteração na propriedade de um dos três objetos afetará os demais. Veja:
Para que isso não aconteça nós podemos clonar os objetos. Isso é demonstrado na
lição seguinte.
<?
// definição da classe Pessoa
class Pessoa{
public $nome;
}
Para resolver o problema, o PHP nos fornece o construtor de cópia. Veja como usá-lo no exemplo
anterior:
function __clone(){
echo "Acabei de ser clonado.";
}
}
Assim, se houver referências a outros objetos, o construtor de cópia é o lugar ideal para criar novas
instâncias das classes referenciadas. Veja um exemplo completo:
class MyFile{
function setFileName($file_name){
$this->file_name = $file_name;
}
function openFileForReading(){
$this->file_handle = fopen($this->file_name, "r");
}
function __clone(){
if($this->file_handle){
$this->file_handle = fopen($this->file_name, "r");
}
}
private $file_name;
private $file_handle = NULL;
}
Herança
Uma das facilidades de desenvolvimento trazidas pela programação orientada a objetos, é a
reutilização de códigos já desenvolvidos e testados. A herança nos possibilita derivar classes de
outras classes e adicionar novas propriedades e funções. Veja um exemplo:
<?
// definição da classe Pessoa
class Pessoa{
public $nome;
public $idade;
public $sexo;
}
// Exibe os dados
echo $cliente->nome . "<br>";
echo $cliente->codigo;
?>
Veja que a classe Cliente herda todas as propriedades e métodos da classe Pessoa através da
palavra-chave extends. Agora a classe Cliente é chamada de sub-classe e a classe Pessoa é chamada
de superclasse ou classe base. Note que a classe Cliente possui inicialmente apenas uma
propriedade, mas, depois da herança, ela conterá quatro propriedades.
Em PHP uma classe pode herdar apenas de uma classe, ou seja, a herança múltipla não é permitida,
ainda que o uso de interfaces possibilite o mesmo efeito, como veremos mais adiante.
Imagine o cenário em que queremos passar parâmetros para o construtor de uma classe derivada.
Como acrescentamos mais propriedades à nova classe, é certo pensar que teremos que chamar
primeiro o construtor da super-classe, inicializar suas propriedades e só então chamar o construtor
da classe derivada, inicializando as propriedades adicionadas. Veja um exemplo:
<?
// definição da classe Pessoa
class Pessoa{
private $nome;
private $idade;
private $nome;
private $idade;
Como estas propriedades estão marcadas com o modificador private, elas não são
acessíveis a partir da classe derivada. A classe derivada, por sua vez, acrescenta a
propriedade:
private $codigo;
Observe como usamos a palavra-chave parent para acessar o construtor da superclasse e instanciar
suas propriedades. Sem esta técnica, estas propriedades jamais poderiam ser acessadas e
modificadas a partir da classe derivada. Use-a para chamar qualquer método de uma classe pai.