Janeiro 10th 2007 03:07 am
Utilizando interfaces em PHP
A utilização de interfaces é um conceito pouco utilizados por programadores PHP, e talvez mais abstratos para programadores menos experientes.
Para começar, uma definição bem simples para interface sería: Uma interface, especifica tipos abstratos de dados, através de um conjunto de operações e suas respectivas assinaturas de métodos.
Interfaces podem ser vistas como protocolos de comportamentos, na prática, uma classe que implementa a interface Countable está comprometida em implementar o método count(), logo, sabemos que qualquer classe que implementar esta interface Countable terá o método count().
Podemos criar classes que implementam uma ou mais classes, como por exemplo, a classe ArrayIterator, ela implementa as interfaces Countable, ArrayAccess e SeekableIterator, logo, terá todos os métodos definidos nestas três interfaces.
Um exemplo de utilização das interfaces.
-
<?php
-
/**
-
* UnbufferedAssociativeResultSet
-
*
-
* Permite o acesso aos resultados da base de dados
-
*
-
* @implements ArrayAccess, Iterator, Countable
-
* @remarks If not using 5.1, implementing countable can be and count() used directly.
-
* @see SPL Documentation For Interface Declarations.
-
*/
-
class UnbufferedAssociativeResultset implements ArrayAccess, Iterator, Countable
-
{
-
private $currentIndex, $result;
-
-
function __construct($result)
-
{
-
$this->currentIndex = 0;
-
$this->result = $result;
-
}
-
-
//Region ArrayAccess
-
function offsetExists($offset)
-
{
-
switch($configuration['databasetype']) {
-
case 'PostgreSQL':
-
if(pg_fetch_assoc($this->result, $offset)) {
-
return true;
-
} else {
-
return false;
-
}
-
default:
-
throw new Exception("No Database Handler");
-
}
-
}
-
-
function offsetGet($offset)
-
{
-
switch($configuration['databasetype']) {
-
case 'PostgreSQL':
-
if($row = pg_fetch_assoc($this->result, $offset)) {
-
return $row;
-
} else {
-
throw new Exception("No row at ". $offset);
-
}
-
default:
-
throw new Exception("No Database Handler");
-
}
-
}
-
-
function offsetSet($offset,$value)
-
{
-
throw new Exception("This collection is read only.");
-
}
-
-
function offsetUnset($offset)
-
{
-
throw new Exception("This collection is read only.");
-
}
-
//EndRegion
-
-
//Region Countable
-
function count()
-
{
-
switch($configuration['databasetype']) {
-
case 'PostgreSQL':
-
if($rows = pg_num_rows($this->result)) {
-
return $rows;
-
} else {
-
throw new Exception("Could not fetch the number of rows in resultset");
-
}
-
default:
-
throw new Exception("No Database Handler");
-
}
-
}
-
//EndRegion
-
-
//Region Iterator
-
function current()
-
{
-
return $this->offsetGet($this->currentIndex);
-
}
-
-
function key()
-
{
-
return $this->currentIndex;
-
}
-
-
function next()
-
{
-
return $this->currentIndex++;
-
}
-
-
function rewind()
-
{
-
$this->currentIndex = 0;
-
}
-
-
function valid()
-
{
-
if($this->offsetExists($this->currentIndex)) {
-
return true;
-
} else {
-
return false;
-
}
-
}
-
-
function append($value)
-
{
-
throw new Exception("This collection is read only");
-
}
-
-
function getIterator()
-
{
-
return $this;
-
}
-
//EndRegion
-
}
-
?>
Como podemos perceber foram utilizadas as interfaces ArrayAccess, Iterator e Countable, criando uma classe para abstrair o resultset do banco de dados PostgreSQL, poderiamos criar outras classes utlizando as mesmas interfaces para abstrair resultsets de outras bases de dados, isso garantiria as classes de nossa aplicação, que teríamos os mesmos métodos para todas as bases de dados suportadas (desde que a assinatura dos métodos definidos nas interfaces não mudem, lógico!) .
Procurei fazer uma pequena explicação sobre definição de interfaces e como é feita a utilização deste conceito em PHP. Caso alguem tenha alguma duvida estou disposto a ajudar.
Thanks
No Comments yet »













(2 votos, média: 3.5 de 5)
