PHP Orientado a Objeto


1. Introdução
O conceito de programação orientada a objeto é fundamentalmente o mesmo para todas as linguagens de programação como Java, JavaScript, C++, PHP,  etc.

2. 
Programação Orientada a Objetos
Orientação a objetos é um paradigma de programação. Esse paradigma não é novo, desde a década de 60 já existiam linguagem que davam suporte a essa metodologia de desenvolvimento. Usa-se o termo Orientação a Objetos para qualquer estilo de programação que use o conceito objeto (entidade que use características e comportamentos).
A Programação Orientada a objetos abstrai problemas da realidade para que sejam modelados de forma computacional.
2.1. Abstração

Processo de modelagem de sistemas concretos ou não, extraindo do seu  contexto os principais objetos e descrevendo-os por meio da discriminação de suas propriedades e funcionalidades.
Propriedade (atributo): descrevem o objeto, seus possíveis estados e o papel que ele desempenha no sistema;
Funcionalidade (métodos): descrevem a ação do objeto e representam o seu comportamento dentro do sistema.
2.2. Classe
Uma classe é uma estrutura, um molde, uma forma que define os tipos de dados, isto é atributos e métodos. Os atributos são as variáveis, as características do objeto a serem criadas.
O nome da classe, precedido da palavra reservada class e seguida de um par de chaves {} delimitará o código da classe.
Cada classe, no PHP, é um objeto, ou seja, uma coleção de métodos e propriedades.
Na figura abaixo há uma classe de nome Aluno e dois objetos de nomes Aluno1 e Aluno2.


Os atributos são definidos na classe, os objetos herdam esses atributos que são criados fisicamente com o operador new.

2.3. Objetos
Instanciar significa criar. Instanciar um objeto, significa criar fisicamente uma representação concreta da classe. Literalmente significa ato ou efeito de instar, qualidade daquilo que é instante.
Exemplo:
Veiculo é uma classe ou um molde, moto é uma instância de veiculo e apesar de carregar todas as características do molde de Veiculo, é completamente independente de outras instâncias de Veiculo.
Chama-se instância de uma classe, um objeto cujo comportamento e estado são definidos pela classe.

Um objeto é uma instância de uma classe, ou seja uma realização concreta e particular da mesma. Um objeto precisa ser criado. Para que seja possível acessar as variáveis e os métodos de um objeto, é preciso atribuir uma referência ao objeto. O tipo de referência, ou seja, a classe à qual pertence o objeto ao qual ela vai referir-se, precisa ser declarado.
Os objetos são instâncias de classes que permanecem em memória e mantém seus valores de maneira individual durante um momento da execução de um programa.
A criação de uma classe deve anteceder a de um objeto, uma vez que este é criado a partir daquele. Um objeto é definido por suas propriedades e funcionalidades.
Um objeto tem a mesma estrutura de uma classe, mas sua estrutura é dinâmica, seus atributos podem mudar, ser alterados durante a execução do programa. Através de uma classe podemos criar vários objetos a partir da mesma.
2.3.1. Operador new
Para criarmos um objeto do tipo da classe pessoa, por exemplo,  utilizamos o operador new e logo depois o nome da classe.
Para acessarmos os atributos dos objetos, utilizamos o nome do objeto e a propriedade. O objeto não foi feito para ser impresso diretamente, mas podemos fazer isso com suas propriedades.
Exemplo:
Pessoa.class.php: este código PHP possui uma classe de nome Pessoa. O nome do arquivo é composto por um nome válido, mais a palavra reservada class e a extensão php.
<?php
class Pessoa{
var $nome;
var $idade;
   function imprime(){
   print 'Nome: '.$this->nome."<br>\n";
   print 'Idade: '.$this->idade."<br>\n";
   }
}
?>

cliente.php: este código cria o objeto $pedro.
<?php
require_once 'Pessoa.class.php';
$pedro = new Pessoa;
$pedro->nome = 'Pedro Oliveira';
$pedro->idade = 28;
$pedro->imprime();
echo "{$pedro->nome } tem {$pedro->idade} anos";
?>

Resultado:
Nome: Pedro Oliveira
Idade: 28
Pedro Oliveira tem 28 anos

Obs: e
a) extensão de arquivos
.php
Arquivo PHP contendo um programa PHP
.class.php
Arquivo PHP contendo uma classe
.inc.php
Arquivo PHP a ser incluído, podendo conter constantes ou configurações

b) com exceção de nomes de classes e funções, o PHP é case sensitive, ou seja, sensível a letras maiúsculas e minúsculas. A variável $Codigo é diferente da variável $codigo.
São case sensitive:
variáveis
constantes
chaves de arrays
propriedades de classes
constantes de classes

Não são case sensitive:
funções
construtores de classes
métodos de classes
palavras-chave e construções da linguagem (if, else, null, foreach, echo, etc.)

2.4. Atributos e Métodos
Os atributos são as variáveis de uma classe. As características que definem um objeto que será criado através dessa classe. Os atributos podem armazenar valores e até mesmo outros objetos que podem ser alterados durante a execução do programa.
Exemplos de atributos de uma classe porta: Cor (Marrom), Altura(2,00), Largura(0,80).
Já os métodos são as ações ou serviços que os objetos podem executar. São os comportamentos dos objetos. Normalmente através dos métodos que modificamos os atributos de uma classe.
Exemplos de métodos de uma classe porta: Abrir e Fechar.
Abaixo veja como criar um objeto e passar valores para seus atributos.
Logo depois imprimimos os dados na tela.
Veja a baixo o exemplo de uma classe em PHP:
class Pessoa{
var $codigo;
var $nome;
var $altura;
var $idade;
var $salario;
 
function ImprimeSalario(){
print 'Salário:'.$this->salario;
}
?>
No exemplo acima o método é o ImprimeSalario().

Utilizamos $this para referenciar o atributo da própria classe.
Quando definimos uma classe, podemos usar a variável $this, que é o próprio objeto. Quando uma classe é instanciada em um objeto, e utilizamos a variável $this, essa variável se refere ao objeto que estamos utilizando.

O uso da flecha (->) permite acessar as propriedades e métodos de um dado objeto. Exemplo: echo $obj->prop1;

Exemplo completo:
ContaCorrente.class.php:

Como já foi dito, um objeto da classe deve ser instanciado pelo operador new. O operador permite referenciarmos atributos e métodos do objeto.
objconta.php:


Uma classe pode extender (extends) outra classe qualquer, isso é chamado Herança. As classes que herdam incluem os métodos como as propriedades da classe a partir da qual estão definidos.
Todos os atributos e métodos estão disponíveis imediatamente, pela variável $this.

ContaEspecial.class.php:


A classe secundaria deve incluir a classe principal, use o comando include_once ou require_once para não ter problemas.
Importante ressaltar também que o script da classe principal deve ser chamado pelo script da classe secundária (a classe que está recebendo a herança).

Vamos utilizar a classe secundária, para tal vamos criar um outro script em php que vai receber a classe principal que é ContaCorrente e a classe secundária que é ContaEspecial.
script.php:

Métodos podem ser chamados como um método de classe, isto é, sem que exista uma referência a instância da classe.
Para tal utilizamos o operador ::
Caso faça referência à variável $this o método de classe irá falhar.

script2.php:


script3.php:
Utilizando um método de classe:


3. Construtores
 O Construtor é referenciado no PHP como _construct(), é uma função definida na classe e que é executada sempre que o objeto é criado, ou seja, sempre que a classe é instanciada.

4. Destrutores
São chamadas no momento em que o objeto está sendo destruído. Podem servir para fechar uma conexão com bando de dados, no PHP5 usamos a nomenclatura padrão _destruct() para implementarmos destrutores.

5. Visibilidade de Atributos e Métodos
Os métodos e atributos de uma classe no PHP podem ser definidos como: private, public, protected
5.1. Public
O atributo ou método definido como public torna-o acessível em qualquer lugar da classe, de suas subclasses ou em qualquer parte dos scritps que fazem parte da classe.
5.2. Protected
O atributo ou método definido como protected são visíveis pela classe que os criou e por suas subclasses, e não são acessíveis fora desse contexto.
5.3. Private
O atributo ou método definido como private são visíveis apenas na classe que os criou, ou seja, subclasses ou script que contêm a classe não podem acessar esses atributos ou métodos.
Exemplo:
Arquivo carro.class.php
<?php
class CARRO
{
    // Aqui declaramos o atributo privado _marca
    private $_marca;                       
    // Aqui declaramos o atributo privado _modelo
    private $_modelo;       
    // Aqui declaramos o atributo privado _cor
    private $_cor;   
 
    // Função pública, lembrando que ela é executada no momento de criação do objeto
    public function __construct() {
        // Mensagem é exibida no momento da criação do objeto
        echo 'Passei por aqui, logo criei um objeto<br>';   
 
        // O $this é utilizada para referenciar ao próprio objeto, ou seja,
        // $this->_marca estaria acessando ao atributo $_marca.
 
        //chama-se a função setAtributos atribuindo valores "NULL" a Marca do Carro
        $this->setAtributos(null,null,null);   
    }
 
   
    // Recebe como parametros uma marca, um modelo e uma cor
    public function setAtributos($marca, $modelo, $cor) {
        // Atributo _marca recebe a marca passada por parâmetro
        $this->_marca    = $marca;
        // Atributo _modelo recebe um modelo passado por parâmetro
        $this->_modelo    = $modelo;
        // Atributo _cor recebe uma cor passada por parâmetro
        $this->_cor        = $cor;
    }
 
    // Função que retorna apenas a Marca do carro
    public function getMarca() {    
        return $this->_marca;
    }
 
    // Função que retorna apenas o Modelo do carro
    public function getModelo() {
        return $this->_modelo;
    }
 
    // Função que retorna apenas a Cor do carro
    public function getCor() {
        return $this->_cor;
    }   
}
?>

Arquivo index.php
<?php
    // Fazemos nosso include da nossa classe
    include 'carro.class.php';
 
    //criação de uma nova instância da classe CARRO ($um_carro)
    $um_carro         = new CARRO;
    //criação de uma nova instância da classe CARRO ($dois_carros)                   
    $dois_carros    = new CARRO;
    //criação de uma nova instância da classe CARRO ($tres_carros)                   
    $tres_carros    = new CARRO;
 
    // Chamamos a função setAtributos, que seta os atributos do objeto $um_carro
    $um_carro->setAtributos('Munstang','GT','Vermelho');   
    // Chamamos a função setAtributos, que seta os atributos do objeto $dois_carros
    $dois_carros->setAtributos('Audi','A3','Preto');
    // Chamamos a função setAtributos, que seta os atributos do objeto $tres_carros
    $tres_carros->setAtributos('Peugeot','307','Prata');
 
    // Eximos uma linha para separação
    echo '<hr>';
    echo '<p>';
    // Exibimos a Marca do carro e quebramos uma linha com o <br />
    echo '<b>Carro:</b> '. $um_carro->getMarca() . '<br />';
    // Exibimos o Modelo do carro e quebramos uma linha com o <br />   
    echo '<b>Modelo:</b> '. $um_carro->getModelo() . '<br />';
    // Exibimos a Cor do carro e quebramos uma linha com o <br />
    echo '<b>Cor:</b> '. $um_carro->getCor() . '<br />';
    echo '</p>';
    // Eximos uma linha para separação
    echo '<hr>';
 
    echo '<p>';
    // Exibimos a Marca do carro e quebramos uma linha com o <br />
    echo '<b>Carro:</b> '. $dois_carros->getMarca() . '<br />';
    // Exibimos o Modelo do carro e quebramos uma linha com o <br />   
    echo '<b>Modelo:</b> '. $dois_carros->getModelo() . '<br />';
    // Exibimos a Cor do carro e quebramos uma linha com o <br />
    echo '<b>Cor:</b> '. $dois_carros->getCor() . '<br />';
    echo '</p>';
    // Eximos uma linha para separação
    echo '<hr>';
 
    echo '<p>';
    // Exibimos a Marca do carro e quebramos uma linha com o <br />
    echo '<b>Carro:</b> '. $tres_carros->getMarca() . '<br />';
    // Exibimos o Modelo do carro e quebramos uma linha com o <br />
    echo '<b>Modelo:</b> '. $tres_carros->getModelo() . '<br />';
    // Exibimos a Cor do carro e quebramos uma linha com o <br />
    echo '<b>Cor:</b> '. $tres_carros->getCor() . '<br />';
    echo '</p>';
    // Eximos uma linha para separação
    echo '<hr>';
?>
Resultado:
Passei por aqui, logo criei um objeto
Passei por aqui, logo criei um objeto
Passei por aqui, logo criei um objeto

Carro: Munstang
Modelo: GT
Cor: Vermelho


Carro: Audi
Modelo: A3
Cor: Preto


Carro: Peugeot
Modelo: 307
Cor: