Categorias

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:


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.


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):

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.