OOP no PHP: Heranças e Interfaces, extendendo e implementando classes
Postado por Tobias em 15.12.2008 12:00 Desenvolvimento web, Destaques, OOP, php
E ae blz?
Bom gente depois de um alguns dias atrasado devido a problemas pessoais aqui vai o segundo post da série OOP no PHP, nossos assuntos agora são Heranças e Interfaces, e aproveitando o assunto eu preparei uma classe de acesso ao banco de dados que ilustra perfeitamente o nosso assunto de hoje e também usa as definições do post anterior.
Vamos começar com a teoria:
extends – Essa palavra chave indica que uma classe extende outra classe, ou seja, herda todos os métodos e atributos da classe pai.
Exemplos simples:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php class Pai { public function pai() { echo “Função da classe pai”; } } class Filha extends Pai { private function $filha; public function chamaPai(){ $this->pai(); } public function responde() { echo 'Sou uma classe filha'; } } ?> |
No exemplo acima estão disponívels na classe filha todos os métodos/atributos públicos e protegidos (quando existerem) da classe pai.
implements – Essa aqui é um pouco diferente, ela define que uma determinada classe implemente uma interface, que nada mais é uma que uma definição de nomes e parametros de cada método da classe, porém, a real utilidade das interfaces é mais conceitual no mundo OOP e na maioria das vezes é deixada de lado.
vamos a um exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?php interface iFilha { public function chamaPai(); public function responde(); } class Pai { public function pai() { echo “Função da classe pai”; } } class Filha extends Pai implements iFilha { private function $filha; public function chamaPai(){ $this->pai(); } public function responde() { echo 'Sou uma classe filha'; } } ?> |
Algumas considerações interessantes sobre interfaces:
- Somente métodos públicos aparecem nas interfaces;
- Uma classe pode implementar mais de uma interface;
- Uma classe não pode implementar duas interfaces com métodos de nomes iguais;
- Interfaces podem ser herdadas assim como classes, basta usar extends.
Bom acho que deu pra entender como funcionam essas coisas, então vamos pra um exemplo de uso nessa classe de acesso ao banco que eu fiz pra ajudar o nosso entendimento.
config.php
1 2 3 4 5 6 7 8 9 10 11 | <?php class Config { const DB_HOST = 'localhost'; const DB_USER = 'root'; const DB_PASS = 'root'; const DB_SCHEMA = 'technocil'; const DB_ENCODING = 'UTF8'; } ?> |
dbo_mysql.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | <?php require 'config.php'; interface iDBOMysql { public function __construct(); public function connect(); public function insert($table,$fields); public function update($table,$fields); public function delete($table,$conditions); public function select($table,$fields='*',$conditions=null,$order=null,$limit=null); } class DBOMysql extends Config implements iDBOMysql { private $connection; private $result; /** * Construtor chama os métodos necessários quando a classe é instanciada */ public function __construct() { $this->connect(); } /** * Conecta com o banco de dados utilizando os dados das constantes de configuração */ public function connect() { $this->connection = mysql_connect(parent::DB_HOST,parent::DB_USER,parent::DB_PASS) or die (mysql_error()); if (mysql_select_db(parent::DB_SCHEMA, $this->connection)) { $this->setEnconding(); } } private function setEnconding() { $this->query('SET NAMES '' . parent::DB_ENCODING.'''); } private function query($sql) { return mysql_query($sql,$this->connection); } /** * Executa uma query de inserção no banco de dados * * @param string $table nome da tabela * @param array $fields array com os campos e valores a serem inseridos */ public function insert($table,$fields) { $columns = $values = array(); foreach ($fields as $column => $value) { $columns[] = mysql_real_escape_string($column); $values[] = mysql_real_escape_string($value); } $sql = 'INSERT INTO '.mysql_real_escape_string($table).' '; $sql .= '('.join(',',$columns).') '; $sql .= 'VALUES (''.join("','",$values).'')'; return $this->query($sql); } /** * Executa uma query de atualização no banco de dados * * @param string $table nome da tabela * @param array $fields array com os campos e valores a serem inseridos */ public function update($table,$fields,$conditions=null) { $columns = $values = array(); foreach ($fields as $column => $value) { $itens[] = mysql_real_escape_string($column).'=''.mysql_real_escape_string($value).'''; } $sql = 'UPDATE '.mysql_real_escape_string($table).' '; $sql .= 'SET '.join(',',$itens).' '; if ($conditions != null) $sql .= 'WHERE '.mysql_real_escape_string($conditions); return $this->query($sql); } /** * Executa uma query para excluir registros do banco * * @param string $table nome da table * @param string $conditions condições de exclusão (opcional) */ public function delete($table,$conditions) { $sql = 'DELETE FROM '.mysql_real_escape_string($table).' '; if ($conditions != null) $sql .= 'WHERE '.mysql_real_escape_string($conditions); return $this->query($sql); } /** * Executa uma query para selecionar registros no banco de dados * * @param string $table * @param array $fields * @param string $conditions * @param string $order * @param string $limit */ public function select($table,$fields='*',$conditions=null,$order=null,$limit=null) { $sql = 'SELECT '; $sql .= (is_array($fields)) ? join(',',$fields) : $fields; $sql .= ' FROM '.mysql_real_escape_string($table).' '; if ($conditions != null) $sql .= 'WHERE '.mysql_real_escape_string($conditions); if ($order != null) $sql .= 'ORDER BY '.mysql_real_escape_string($order); if ($limit != null) $sql .= mysql_real_escape_string($limit); $results = $this->query($sql); $fetch = array(); while ( $loop = mysql_fetch_assoc($results) ) { $fetch[] = $loop; } return $fetch; } } ?> |
Só uma rápida explicação:
A classe Config é uma classe que contem as constantes de configuração de acesso ao banco, a classe DBOMysql é a classe que implementa a interface iDBOMysql e extend a classe Config, vocês podem notar também o uso de public em private nos atributos, essa classe mostra o uso extends e implements, só gostaria de lembrar que como a classe os métodos private da classe não aparecem na interface, e que nesse caso a interface não é algo essencial.
Bom gente por enquanto é isso, quero me desculpar pelo atraso do post, a última semana foi meio corrida e o fim de semana foi de comemoração por que terminei a faculdade.
Abraços e até a próxima, onde nossos assuntos vão ficar cada vez mais interessantes.
Tags: extends, herança, implements, interfaces, OOP, php

