PHP Orientado a Objetos: Para quem está começando

O objetivo deste artigo é ensinar os conceitos principais e fundamentais da Orientação a Objetos do PHP para aquelas pessoas que estão iniciando na linguagem ou para aqueles que têm encontrado dificuldades para entender outros artigos. Este artigo tratará de classes, métodos, propriedades e, além disso, dará uma breve explanação sobre o que é PHP-OO.

[ Hits: 73.437 ]

Por: EVERTON DA ROSA em 29/04/2009 | Blog: http://everton3x.github.io


Utilizando a classe



Agora que temos a nossa classe pronta, vamos ver o que ela faz e entender um pouco mais sobre métodos e propriedades e a interação entre eles.

Primeiramente devemos instanciar a classe, ou seja, criar um objeto na memória que irá representar a classe TutoDB.

Isso nós conseguimos da seguinte maneira:

$obj = new TutoDB;

Com isso estamos dizendo ao PHP para armazenar na variável $obj uma nova instância da classe TutoDB.

Depois vamos atribuir valores às nossas propriedades da seguinte forma:

$obj->set('db','information_schema');
$obj->set('host','localhost');
$obj->set('user','root');
$obj->set('pass','');
$obj->set('sql','select * from COLLATIONS');

Com isso dizemos ao PHP para utilizar o método set() do objeto armazenado em $obj (a classe TutoDB) para atribuir à propriedade passada pelo primeiro argumento o valor do segundo argumento.

Argumentos são os valores passados entre os parênteses das funções ou métodos. No caso da primeira linha, estamos dizendo para que seja colocado o valor information_schema na propriedade $db.

Poderíamos fazer isso de outra forma, sem utilizar um método, mas atribuindo diretamente um valor para a propriedade assim:

$obj->db = 'information_schema'

Por que então utilizamos um método para fazer isso?

Vamos supor que quiséssemos que a propriedade $user armazene apenas os valores 'root' ou 'admin'. Se deixássemos para atribuir valores em $user da forma $obj->user, qualquer valor poderia ser atribuído, mas se utilizamos um método para isso (no nosso caso, set()), podemos, dentro do método, colocar um código que verifique se o valor passado para ser armazenado na propriedade $user seja apenas root ou admin.

Vamos aproveitar e ver o método set():

   function set($prop,$value){
      /*
      * Função para atribuir valores às propriedades da classe
      * @author Everton da Rosa (Everton3x)
      * @param String $prop Nome da propriedade que terá seu valor atribuído
      * @param String, Array, Object Valor a ser atribuído
      * @return void Não dá nenhum retorno
      */

      $this->$prop = $value;
   }

Veja que a atribuição de valor à propriedade é feita no seguinte esquema:

$this->$prop = $value;

Onde:
  • $this referencia a própria classe.

Precisamos fazer referência à classe pois se colocássemos apenas $prop = $value, estaríamos dizendo ao PHP para atribuir $value a uma variável chamada $prop, que poderia estar até mesmo fora da nossa classe.

Note também que o que o método faz é apenas $this->nomedapropriedade = valor a ser atribuído.

Seguindo...

Vamos conectar com o servidor MySQL com o método conectar() da seguinte forma:

$obj->conectar(); // Realiza a conexão

   function conectar(){
      /*
      * Função para conexão ao banco de dados
      * @author Everton da Rosa (Everton3x)
      * @return Object Retorna o objeto da conexão
      */

      $con = mysql_connect($this->host,$this->user,$this->pass) or die($this->erro(mysql_error()));
      return $con;
   }

Vejam que o método pega os valores das propriedades $host, $user e $pass para conectar ao servidor MySQL (mysql_connect($this->host,$this->user,$this->pass)), ou se der erro, para o script e chama o método erro() massando-lhe o parâmetro mysql_error() ( or die($this->erro(mysql_error())))

Depois disso selecionamos o banco de dados desejado (que foi informado na propriedade $db):

$obj->selecionarDB(); // Seleciona o banco de dados

Em seguida realizamos a consulta ao banco de dados:

$rs = $obj->query();

Todos os três métodos seguem um mesmo padrão: usam os valores armazenados nas propriedades para realizar alguma coisa.

Ainda falta pegarmos a string SQL com o seguinte código:

$sql = $obj->getSQL(); // Pega o valor da propriedade $sql

Observe que o método getSQL() apenas retorna o valor armazenado na propriedade $sql. Poderíamos fazer isso também da seguinte forma:

$obj->sql;

Por fim, vamos escrever algo para mostrar que nossa classe funciona:

echo 'O número de linhas encontrado para a consulta '.$sql.' é de '.mysql_num_rows($rs); // Exibe o número de linhas do resultado

Se tudo funcionar, no navegador deve aparecer uma mensagem do tipo:

O número de linhas encontrado para a consulta select * from COLLATIONS é de 127

Agora temos o código completo para usarmos nossa classe:

/*
* Testando a classe
*/


$obj = new TutoDB; // Instanciando a classe

// Atribuindo valores às propriedades da classe
$obj->set('db','information_schema');
$obj->set('host','localhost');
$obj->set('user','root');
$obj->set('pass','');
$obj->set('sql','select * from COLLATIONS');

$obj->conectar(); // Realiza a conexão
$obj->selecionarDB(); // Seleciona o banco de dados
$rs = $obj->query();

$sql = $obj->getSQL(); // Pega o valor da propriedade $sql
echo 'O número de linhas encontrado para a consulta '.$sql.' é de '.mysql_num_rows($rs); // Exibe o número de linhas do resultado

Agora que sabemos o básico cobre classes, propriedades e métodos, vamos na conclusão abordar os principais conceitos do artigo.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Criando uma classe
   3. Utilizando a classe
   4. Resumo final
Outros artigos deste autor

Qual o valor de seu trabalho

Relatórios com PHP e XSLT - Conceitos iniciais e utilização básica

SLiM: Simple Login Manager - Mini review

SliTaz: Mini-review desta mini-distribuição Linux

Utilizando PHP para validar dados passados pelo usuário

Leitura recomendada

Xoops - Um ótimo gestor de portais em PHP

Instalando Servidor LAMP no Ubuntu e Derivadas

Implementando scripts PHP com MySQL

PHP5 - Criando e utilizando uma classe básica

Introdução a Orientação a Objetos no PHP4

  
Comentários
[1] Comentário enviado por giaco em 29/04/2009 - 08:10h

Parabéns pelo artigo!
Suas explicações foram claras e objetivas. Acho que muita gente programa em PHP sem usar OO...

[2] Comentário enviado por reideer em 29/04/2009 - 08:48h

Parabéns pela iniciativa.
Existem algumas falhas, mas como tem caráter introdutorio acho que não convém descrevê-las.

O povo que programa PHP é numeroso. porém apenas uma pequena porcentagem admite que programar PHP-OO é mais produtivo, rápido, seguro, legível, agradável.....

Temos que nos unir (programadores PHP-OO), para introduzirmos uma nova mentalidade nos programadores php spartanos.
Quem nunca pegou um script simples e teve vontade de se matar? Eu mesmo peguei um trabalho de um colega aqui na empresa e precisei refaze-lo, pois era impossível compreender as idas e vindas.
Os malditos include("cabeçalho.php"); include("menu1.php); e as variáveis e funções que ninguém sabe direito o que fazem e de onde é quem vem.
Quando temos um sistema Orientado a Objetos fica muito mais simples encontrar métodos(funções) e seus significados. Também fica muito mais seguro por não termos variáveis perdidas no meio do sistema.

[3] Comentário enviado por phpricardo em 29/04/2009 - 09:25h

Meu irmãozinho que artigo maravilhosooo!!!

Não entendia bem OO até não sou muito avançado no php, mas sempre importei com a vontade de aprender OO e esse artigo ta magnifico!! parabéns mesmo! ;)

[4] Comentário enviado por joaomc em 29/04/2009 - 09:28h

É muito importante lembrar ao leitor que só PHP5 ou superior têm suporte a OO. No PHP4, as classes não são classes de verdade, mas variáveis.

[5] Comentário enviado por joaomc em 29/04/2009 - 09:30h

Lembrem que PHP4 não tem suporte verdadeiro a OO.

[6] Comentário enviado por Reideer em 29/04/2009 - 09:44h

Lembrar também que ninguém mais deve utilizar PHP4.
Pois:
Não tem mais suporte.
É defasado.
Está saindo a versão 6 do PHP, que não suportará inúmeras funções do PHP4

[7] Comentário enviado por luizvieira em 29/04/2009 - 09:59h

Show!

[8] Comentário enviado por everton3x em 29/04/2009 - 17:27h

Caro reideer:

A respeito do que escreveste sobre as falhas do artigo , gostaria muito que apontasse quais são pelos seguintes motivos:
1. Sou iniciante em PHP-OO e, justamente por sentir falta de artigos que falassem uma linguagem simples sobre o tema é que escrevi este. Estou planejando uma continuação deste falando sobre visibilidade e herança e, por isso, acho importante que apontes minhas falhas para poder aprender e não cometê-las nnos próximos artigos.
2. Também é importante apontares as falhas do artigo para que aqueles iniciantes que o lerem corrigam no seu aprendizado aquilo que está falho..

Agradeço a todos os comentários que só me incentivam a continuar escrevendo.

[9] Comentário enviado por joaomc em 29/04/2009 - 21:21h

Tenho algumas opiniões a respeito do artigo, mais especificamente sobre o método set. Não concordo com o uso do método 'set' para modificar as propriedades. Há vários problemas nessa abordagem:
- TODA a lógica de verificação e validação do acesso a propriedades fica dentro de um método só. Em pouco isso, isso vira uma salada difícil de manter, especialmente se a classe contiver dezenas de propriedades (o não é tão difícil).
- A leitura do código fica muito prejudicada. Getters e Setters podem ser chatos, mas pode ser muito mais fácil encontrar o método setter do que procurar tudo dentro de um "metodão" set.
- Um bom IDE consegue detectar o acesso a um método inexistente, acesso a um membro inexistente, mas não consegue detectar o mau uso desse método 'set'.



[10] Comentário enviado por everton3x em 30/04/2009 - 11:48h

Caro joaomc:

A respeito de seu comentário sobre o "métodão" set, concordo com sua exposição. Talvez eu devesse ter utilizado um método set diferente para cada propriedade ou até mesmo deixar a parte sobre atribuir dados às propriedades da forma convencional ($this-propriedade = valor).

No caso do artigo, utilizei o método set para demonstrar que é possivel atribuir dados às propriedades desta forma. Talvez devesse ter colocado que existem outras formas alé desta e da convencional.

Mas como disse no artigo e repito: é um artigo introdutório voltado para iniciantes (ou para quem ainda nem começou). Não é intensão discutir se esta ou aquela é a melhor forma, mas sim mostrar os CONCEITOS de objeto, classe, método e propriedade.

Mas como disse no início, respeito e concordo com seu comentário que, con certeza, servirá como aprendizado para o próximo artigo que deverá tratar de visibilidade, herança e extensão de classes.

[11] Comentário enviado por marcusnunes em 01/05/2009 - 15:28h

Ótimo artigo para iniciantes. :)

[12] Comentário enviado por reideer em 02/05/2009 - 14:26h

Boa tarde.
A pedido do Everton3x vou comentar 2 erros aparentes.
O primeiro diz respeito a boas práticas de Programação. Não declarou métodos Construtores, que na padronização do PHP 5 seriam feitos como __construct(){} e __destruct(){}. Embora não estejam efetuando nenhuma função, é importante ter estes por visibilidade.

Outra coisa é quanto aos métodos set, pois da forma que está esta destruindo o conceito de encapsulamento.

Caso eu tenha

class xxx{
private intocavelExternamente;
public dois;
}

com a utilização deste método set, eu poderei alterar os valores do atributo um publicamente mesmo que eu não deseje isto.
Acho que o ideal a se fazer quando se trabalha com este tipo de método set genérico é:

...
private $atributosSet = array();

public set($atributo, $valor){
$this->array[$atributosSet] = $valor;
}

e para recuperar pode utilizar

public getUM(){
return $this->atributosSet["um"];
}

...

desta forma não ocorrerá o seguinte:

class xxx{
private intocavelExternamente;
private dois;
public set($atributo, $valor){
$this->$atributo = $valor;
}

}

$xxx= new class xxx();
$xxx->set("dois","dois");
$xxx->set('intocavelExternamente',"quebrei a segurança da classe");

Espero que comente equivocos meu.
Até mais.

[13] Comentário enviado por everton3x em 02/05/2009 - 18:53h

Sobre o comentário do reideer:
Agradeço a ele por apontar as falhas que entendeu ter o artigo e posso dizer que, dentro dos meus conhecimentos restritos que tenho sobre o tema, concordo com todas, principalmente com respeito ao método set, o qual já comentei anteriormente.

Contudo, reforço que o objetivo do artigo foi apresentar conceitos de objeto, classe, métodos e propriedades de uma forma que um iniciante possa entender facilmente, sem me preocupar com boas práticas de programação, como o que é certo ou errado. Não que tais assuntos não sejam importantes, muito pelo contrário. Mas o objetivo foi fazer algo de fácil entendimento voltado para iniciantes e creio que isso foi alcançado.

De toda essa discussão, creio que fica o convite a todos que possuem conhecimento sobre os assuntos que deixaram de ser aborados no artigo (como boas práticas de programação), escreverem sobre isso, principalmente textos voltados para iniciantes.

Um grande abraço a todos.

P.S.: Pretendo em breve abordar visibilidade, herença e extensão de classes, voltado para iniciantes.

[14] Comentário enviado por removido em 03/05/2009 - 10:40h

Não gostaria de causar flames, porém desde quando;

$obj->set('db','information_schema');
$obj->set('host','localhost');
$obj->set('user','root');
$obj->set('pass','');
$obj->set('sql','select * from COLLATIONS');

é OO?

Cada método tem o seu objetivo, estes ai fazem tudo. Certo seria separar os métodos, e colocar os argumentos fundamentais para o funcionamento da classe no construtor dela.
Fica a dica para quem está começando com orientação a objeto, seja em qualquer linguagem.

Abraços e sucesso.

[15] Comentário enviado por everton3x em 03/05/2009 - 17:08h

A respeito do comentário do lfamorim:

Realmente, o método set() não tem nada de OO (equívoco meu).

A respeito dos métodos __construct() e __destruct(), não fiz referência a eles pois pretendo abordar o tema posteriormente. Como diria Jack, vamos por partes.

Ainda sobre set(), aconselho lfamorim a ler os comentários anteriores, caso já não o tenha feito.

[16] Comentário enviado por joaomc em 04/05/2009 - 09:54h

Everton, vou dar mais umas dicas para o próximo artigo:
- Utilize um exemplo real de classe. Eu começaria com "Cliente".
- Com a classe Cliente, você poderia mostrar como fazer um construtor com argumentos, para inicializar um cliente já com algumas propriedades definidas.
- Depois, poderia mostrar que pode fazer uma validação do CPF do cliente no setter de CPF, e como colocar automaticamente o nome do cliente em maiúsculas no setter do NOME. Pode criar um getter getNomeCompleto, que retorna o nome e o sobrenome.
- O destrutor da classe pode ser usado para fechar automaticamente a conexão com banco de dados, por exemplo.
- No método salvar(), você poderia fazer outras validações.

[17] Comentário enviado por everton3x em 04/05/2009 - 11:41h

Caro joaomc:
Obrigado pelas dicas, vou analisá-las com cuidado, porém, uma coisa é certa: não pretendo cometer os mesmos equívocos sobre o método set() que cometi neste artigo. Afinal, errar uma vez é humano; duas vezes é burrice mesmo!

[18] Comentário enviado por phpoo em 01/06/2015 - 13:06h

Muito bom esse artigo! Recomendo para quem deseja continuar os estudos com PHP Orientado a objetos o curso Work Series: Tem vídeo aulas gratuitas disponíveis nesse link: http://vconectado.com/PHPOO/
abraços ;)


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts