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.
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)
*/
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.
[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! ;)
[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
[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.
[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");
[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.
[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 ;)