Io farei più una cosa di questo tipo (ovviamente ci sono alcune considerazioni da fare, inoltre ho scritto il codice
ora, al volo, quindi ci saranno sicuramente degli errori):
Codice PHP:
public interface IDatabase_DAO
{
public function connect();
public function query();
public function close();
public function fetch_row();
public function get_num_rows();
public function get_affected_rows();
}
abstract class Database_DAO implements IDatabase_DAO {
private static $_instance = null;
private function __construct() {}
public static function getInstance() {
if ( selft::$_instance == null ) {
$c = __CLASS__;
self::$_instance = new $c;
}
return self::$_instance;
}
}
class MySQL_DAO extends Database_DAO
{
// ...implementa tutti i metodi descritti nell'interfaccia IDatabase_DAO...
}
class DAO_Factory {
public static function getDAO($name) {
switch ( $name ) {
case 'mysql':
return MySQL_DAO::getInstance();
break;
default:
trigger_error("DAO inesistente!", E_USER_ERROR);
break;
}
}
}
Codice PHP:
public class Articoli {
private $_id;
private $_titolo;
private $_testo;
private $_autore;
public function getTitolo() {}
public function setTitolo() {}
public function getTesto() {}
public function setTesto() {}
public function getAutore() {}
public function setAutore() {}
}
public interface IArticoli_DAO
{
public function insertArticolo(Articoli $articolo);
public function deleteArticolo($id);
public function findArticolo();
public function updateArticolo();
}
class MySQL_Articoli_DAO implements IArticoli_DAO {
public function insertArticolo(Articoli $articolo) {
$db = Database_DAO::getInstance();
// ...esegui dei controlli di validità sui dati che andrai ad inserire a db...
// Crei la query
$sql = sprintf("
INSERT INTO articoli
(titolo, testo, autore)
VALUES
('%s', '%s', '%s')", $articolo->getTitolo, $articolo->getTesto, $articolo->getAutore);
// Esegui la query sul db
$db->query($sql);
if ( $db->get_affected_rows() > 0 )
return true;
else
return false;
}
// ...implementazione di tutti gli altri metodi...
public function deleteArticolo($id) {}
public function findArticolo() {}
public function updateArticolo() {}
}
a questo va ovviamente aggiunta la pagina che gestisce tutto questo, sarà lei ovviamente a sapere se richiamare
come oggetto di persistenza dei dati un oggetto "mysql", "oracle" o altro; allo stesso modo saprà se richiamare
un "MySQL_Articoli_DAO" o un "Oracle_Articoli_DAO" (si possono anche prevedere gestioni più sofisticate).
In questo modo le due componenti sono completamente separate e riutilizzabili.
Anche se sono sempre dell'idea che non c'è bisogno di usare tutto questo per raggiungere il risultato, sopratutto se si è all'inizio.