PUBLICIDADE
Este artigo tem nota
10

Autor

everton3x

Everton da Rosa

membro deste janeiro de 2007

Enquete

Você acha que sucesso do Twitter é passageiro?
PUBLICIDADE

terça-feira, 12 de maio de 2009

PHP Orientado a Objetos para quem está começando


Introdução


Há algum tempo utilizo PHP para desenvolver aplicações web based, porém nunca utilizando orientação a objeto (OO). Um tanto por não ter muito interesse nisso (pois isso é para mim um hobby), mas muito é porque os artigos sobre o tema são um tanto confusos para mim.

Por isso este ano decidi realmente aprender a orientação a objetos no PHP. Fruto desse aprendizado é este primeiro artigo sobre o tema e que tem por objetivo apenas apresentar de forma sucinta, clara, objetiva e de fácil compreensão pelos iniciantes do que é a orientação a objeto, seus principais conceitos e como fazer isso funcionar na prática.

Quando falamos em orientação a objetos (OO), em PHP, estamos falando basicamente de classes, métodos e propriedades.

Classe, no PHP, é um bloco de código escrito na forma abaixo:
<?php
class NomeDaClasse {
// Algum código aqui
}
?>

Basicamente é o nome da classe, precedido da palavra reservada class e seguida de um par de colchetes {} o qual delimitará o código da classe.

Cada classe, no PHP, é um objeto, ou seja, uma coleção de métodos e propriedades.

Mas o que são métodos e propriedades?

Se você sabe o que é uma variável no PHP, sabe o que é propriedade, pois propriedades nada mais são do que as variáveis internas de uma classe, ou seja, são variáveis que você coloca dentro dos colchetes {} da classe.

Métodos são as funções internas das classes, ou seja, as funções que você coloca entre os colchetes {} da classe.

Abaixo um exemplo de classe, com métodos e variáveis.
<?php
class NomeDaClasse {
// As propriedades e ...
$propriedade;
$outra_propriedade = 'algum texto';

// ... os métodos
function meuMetodo(){
// Algum código aqui
}

function outroMetodo($parametro){
// Algum código aqui
}
}
?>

Muito bem, agora que sabemos estes três conceitos, vamos à prática, ou seja, vamos fazer uma classe, com seus métodos e variáveis, e ver como tudo funciona.

Criando uma classe


Agora é o momento de colocarmos em prática os conceitos de classe, métodos e propriedades. Para isso vamos construir uma classe de interação com o MySQL.

Essa classe deverá fazer algumas coisas:
  • Conectar ao servidor MySQL e selecionar o banco de dados desejado;
  • Configurar as variáveis (propriedades) dinamicamente;
  • Executar consultas ao banco de dados, retornando o resultado;
  • Retornar a string SQL usada na consulta.


Abaixo está o código completo da classe (mas não se preocupe, abaixo do código vamos explicá-lo passo a passo):
<?
/*
* Script para estudo sobre PHP e Orientação a Objetos
* @author Everton da Rosa (Everton3x)
* @copyright GPL
* @version 1.0 (21/04/2009)
*/

class TutoDB {
/*
* Classe para interação com banco de dados
* @author Everton da Rosa (Everton3x)
* @version 1.0 (21/04/2009)
*/

/*
* Declaração das variáveis (propriedades) da classe
*/
private $host; // Host (Servidor) que executa o banco de dados
private $user; // Usuário que se conecta ao servidor de banco de dados
private $pass; // Senha do usuário para conexão ao banco de dados
private $db; // Nome do banco de dados a ser utilizado
private $sql; // String da consulta SQL a ser executada

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;
}

function selecionarDB(){
/*
* Função para seleção do banco de dados a ser usado
* @author Everton da Rosa (Everton3x)
* @return Boolean Retorna true (verdadeiro) ou false (falso)
*/

$sel = mysql_select_db($this->db) or die($this->erro(mysql_error()));
if($sel){
return true;
}else{
return false;
}
}

function query(){
/*
* Função para execução da consulta ao banco de dados
* @author Everton da Rosa (Everton3x)
* @return Object $qry Retorna o resultado da consulta como um objeto
*/
$qry = mysql_query($this->sql) or die ($this->erro(mysql_error()));
return $qry;
}

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;
}

function getSQL(){
/*
* Função para retornar a string SQL
* @author Everton da Rosa (Everton3x)
* @return String String SQL
*/
return $this->sql;
}

function erro($erro){
/*
* Função para exibir os error
* @author Everton da Rosa (Everton3x)
* @param String $erro Erro a ser exibido
* @return void Não dá nenhum retorno
*/

echo $erro;
}
}

?>

Inicialmente, indicamos a classe com a palavra-chave class e damos um nome a ela (TutoDB).
class TutoDB {

Em seguida, definiremos as propriedades da classe, que nada mais são do que variáveis que podem ou não receber valores desde já. No nosso casso, apenas definiremos as variáveis. Caso quiséssemos atribuir-lhes valor, faríamos $host = 'localhost'; por exemplo.
/*
* Declaração das variáveis (propriedades) da classe
*/
$host; // Host (Servidor) que executa o banco de dados
$user; // Usuário que se conecta ao servidor de banco de dados
$pass; // Senha do usuário para conexão ao banco de dados
$db; // Nome do banco de dados a ser utilizado
$sql; // String da consulta SQL a ser executada

Aqueles que já trabalham com classes sentirão falta das palavras public, private ou protected. Como disse inicialmente, este é um artigo básico. A questão sobre visibilidade fica para um próximo.

As propriedades que foram definidas servem para armazenar o host MySQL, o usuário, a senha e o banco de dados, além da string de consulta SQL ($host, $user, $pass, $db e $sql, respectivamente).

Depois disso, iniciaremos com os códigos do nossos métodos.

Temos seis métodos na nossa classe:
  • conectar() serve para estabelecer uma conexão ao servidor MySQL (o host);
  • selecionarDB() serve para selecionar o banco de dados desejado;
  • query() executa a consulta ao banco de dados;
  • set() é o método que atribui os valores ás nossas propriedades;
  • getSQL() retorna a String SQL atribuída à propriedade $sql;
  • erro() exibe mensagens de erro;


É importante salientar que não serão explicados o que cada método faz, pois isso fugiria do escopo do artigo. O importante é que se entenda que propriedades são objetos que são armazenados dentro da classe e que são utilizados geralmente pelos métodos e que métodos são partes da classe que fazem alguma coisa, geralmente baseados nas propriedades.

Na próxima parte do artigo veremos como utilizar esta classe e aprenderemos mais sobre a interação entre propriedades e métodos.

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() passando-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.

Resumo final


Para finalizar o artigo, faremos um apanhados dos principais conceitos nele abordados:

Classes são blocos de código, geralmente tratando de operações relacionadas (banco de dados, arquivos etc) e que devem ser instanciadas (colocadas na memória) para serem usadas. Isso se faz da seguinte forma:
$variavel = new NomeDaClasse; 

Propriedades são variáveis internas da classe que servem para armazenar dados que serão utilizados por métodos.

Para atribuir diretamente dados às propriedades fazemos:
$variavel->nome_da_propriedade = dados a serem atribuídos; 

Para "ver" o que está armazenado na propriedade, fazemos o seguinte:
$variavel->nome_da_propriedade;

Métodos são funções internas das classes que realizam alguma coisa, geralmente tomando por base os dados armazenados nas propriedades.

Para executar um método, fazemos o seguinte:
$variavel->metodo();

Dentro dos métodos, as propriedades e outros métodos internos da classe são referenciados utilizando $this:
$this->nome_da_propriedade;
$this->nomeDoMetodo();

Espero que o leitor, principalmente o iniciante, tenha aprendido um pouco mais sobre classes, item básico para a compreensão do que é programação orientada a objetos no PHP.
Sim   Não   Este artigo foi útil para você?
NotaComentário
10
lcsilva comentou em 22/3/2012

Muito bom

Consegui aprender muito também com este site www.cafeesoftware.com
Tem um curso de PHP OO completo.
10
giachini comentou em 4/3/2012

Muito bom

Bem explicado, peguei a materia bem, valeu.
10
guiski comentou em 25/2/2012

Otimo

Parabens pelo tuto, muito bem exemplificado e explicado, Parabens !
10
ericknil comentou em 24/2/2012

Muuuuuuito Bom mesmo!

Cara, tá de parabéns!
Você foi direto ao que interessa para entender a orientação a objetos.
Quando tentei aprender a primeira vez, li livros e mais livros onde todos davam voltas e mais voltas para tentar ensinar isso que vc explicou em poucas linhas.
10
nocturne comentou em 18/1/2012

Parabens, muito didatico.

Ainda não faço muito coisa com php, mas já me cobraram estudar a linguagem de maneira Orientada a Objeto.
Tirou todas minhas dúvidas, agradeço muito.
10
altacir comentou em 15/11/2011

Muito Bom Tutorial

Acabei de concluir um curso de PHP>>> e o módulo avançado, abrangeu a orientação a objetos..
Mas o tutorial acima, foi melhor e mais exemplificado do que vi no curso...

Parabéns !!!
10
kdukdu comentou em 12/11/2011

Será Um Bula!!!

Muito bom gostei...
Pra iniciante.. como eu,....é de grande valia...
Valeu ... muito obrigado....
10
daluria comentou em 8/11/2011

Muuuuuito bom

Simples e direto, exatamente o que eu precisava para entender de vez OO em PHP, tive o mesmo problema em encontrar materiais muito confusos, este tuto foi na medida certa.

Já estou programando em OO que é uma beleza depois disso...
10
jomar comentou em 15/6/2011

Parabéns

Muito bom. Agora aprendi orientação a objetos na prática.
10
w7x comentou em 5/11/2010

Super Aula!

Parabéns pela explicação , muito esclarecedora para a gente que está começando com -> classes .Você consegue simplificar o que para o principiante é muito complicado .
10
11closed comentou em 2/12/2009

exelente para iniciantes POO

Maravilha de tutorial, eu já conhecia POO mas estou começando a utilizar em PHP e esse tutorial está me dando uma luz.
Obrigado!
10
usertop comentou em 10/11/2009

Legal

Muito bom o tutorial muito bem explicado a continuidade seiria legal
10
lubni comentou em 12/9/2009

Parabéns

Valeu rapaz bom tutorial. Vou mim dedicar mais a aprender PHP orientado a objeto.

Parabéns
10
epessoa comentou em 13/8/2009

Show de bola

Muito legal!!!, você vai dar continuaidade ao assunto?
10
frontinojr comentou em 2/7/2009

Ótimo tutorial !

Ótimo tutorial pra quem esta iniciando, o conteúdo é
simples, objetivo, e bom para entender rapidamente os primeiros passos em POO.
Parabéns Everton!
Um Abraço!
10
frontinojr comentou em 2/7/2009

ÓtimoTutorial !

Ótimo tutorial pra quem esta iniciando, o conteúdo é
simples, objetivo, sem perder seu valor nem o foco.
Parabéns Everton!
Um Abraço!
10
rodvida22 comentou em 3/6/2009

Ótimo

Ótimo tutorial!!! Sou iniciante em programação PHP e este tutorial me ajudou muito a sanar algumas duvidas que eu tinha.
10
dunmait comentou em 2/6/2009

Parabens

voce esta de parabens mesmo! Devido a compreensao do conteudo e a transmissao do mesmo para os que aqui se fazem presente. Escreva mais artigos para a gente^^
10
masteer comentou em 17/5/2009

Muito bom

muito bom o tutorial...
Regras:
Os comentários seguem as seguintes regras:
  • Todos os comentários são enviados por membros cadastrados no site.
  • A pontuação de comentários de conteúdo do próprio membro não serão computados.
  • Os comentários serão pré-aprovados, porém a equipe do site revisará o conteúdo de todos os comentários podendo ser invalidados (inclusive a pontuação).
  • Os comentários precisam ter, obrigatóriamente, coerência sobre o conteúdo que será comentado.
  • O membro que atingir 5 comentários invalidados não poderá mais comentar dentro do site. Com isso o membro não poderá mais ganhar pontos com comentários.
  • Há um limite de 10 comentários por dia para cada membro.
  • Qualquer comentário após ter sido publicado poderá ser retirado através da opção ( denunciar)

Comente

     (ainda não tem cadastro? clique aqui!)


Máximo de 30 caracteres

Máximo de 255 caracteres