Ja mam osobno Data Objects i Data Access Objects. Data Objects przechowuja tylko dane, a Data Access Objects pobieraja dane z bazy i na ich podstawie zwracaja tablice wypelnionych danymi z bazy Data Objects czyli na przyklad:
<?php
class Products_Product
{
public $productID;
public $categoryID;
public $name;
public $urlSlug;
public $copy;
public $displayOrder;
public function __construct ($productID = null, $categoryID = null, $name = null, $urlSlug = null, $copy = null, $displayOrder = null
{
$this->productID = $productID;
$this->categoryID = $categoryID;
$this->name = $name;
$this->urlSlug = $urlSlug;
$this->copy = $copy;
$this->displayOrder = $displayOrder;
}
}
?>
<?php
class Products_Model extends Base_Model
{
public function getAll ()
{
$query = 'SELECT * FROM ' . $this->config->database->prefix . 'products ORDER BY DisplayOrder DESC';
$statement = $this->db->prepare ($query);
$statement->execute ();
while ($product = $statement->fetch ())
{
$products[] = new Products_Product ($product['ProductID'], $product['CategoryID'], $product['Name'], $product['UrlSlug'], $product['Copy'], $product['DisplayOrder'], $product['MetaTitle'], $product['MetaDescription'], $product['MetaKeywords']);
}
{
return null;
}
return $products;
}
}
?>
Co do DB to uzywam PDO, ma chyba taka sama funkcjonalnosc jak PEAR:DB, a jest wbudowane w PHP 5 i obiekt DB tworze sobie w klasie bazowej dla Data Access Object:
<?php
class Base_Model
{
protected $db;
protected $config;
public function __construct ()
{
$this->config = Zend_Registry::get ('config');
$this->db = new PDO ('mysql:host=' . $this->config->database->host . ';dbname=' . $this->config->database->dbname . '', $this->config->database->username, $this->config->database->password);
$this->db->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->db->setAttribute (PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, 1);
}
}
?>
Korzystam z tego tak:
<?php
$productsModel = new Products_Model ();
$products = $productsModel->getAll ();
?>
Jezeli w przyszlosci chcialbym zmienic PDO na PEAR:DB to zmieniam to tylko w klasie bazowej dla modelu ... ewentualnie wyrownuje niespojnosc w API obu bibliotek piszac sobie fasade DB_Adapter ktory korzysta z PEAR:

B ale ma API identyczne jak PDO. Zmiana biblioteki DB odbywa sie bez naruszenia pozostalych klas i tylko w klasie bazowej dla Data Access Objects