2009-12-16 5 views
3

J'ai créé un site localement en PHP 5, mais j'ai rencontré quelques problèmes de conception.Problème de conception orientée objet

Actuellement, il existe trois fonctionnalités du site et chaque fonctionnalité a une classe. Ces caractéristiques sont les suivantes:

  • un blog
  • une liste d'amis
  • un ensemble d'images

J'ai une classe pour chacun, mais je définis essentiellement dans chaque classe une méthode similaire obtient tout [blogs | Amis | images]. Je me demandais si certains d'entre vous savent comment je pourrais réduire ces classes pour qu'elles soient plus minces et probablement avoir une classe générique entre les trois fonctions pour toutes les méthodes qui sont les mêmes pour chaque fonctionnalité. (c'est-à-dire getAllById ($ feature, $ id)).

Une fonction d'exemple pour ma classe de blog existant se présente comme suit:

function getBlogsByUserId($userId) { 
    global $db; 
    $blogs = array(); 
    $db->where(array("userId"=>$userId)); 
    $rows = $db->get("blog")->fetch(0); 
    foreach($rows as $row) { 
$blog = new Blog(); 
$blog->id = $row['id']; 
$blog->userId = $row['userId']; 
$blog->content = $row['content']; 
$blogs[] = $blog; 
    } 
return $blogs; 
} 

Note: J'ai défini ma propre classe pour les choses DB, alors ne vous inquiétez pas à ce sujet.

J'ai examiné le modèle de conception de la passerelle, mais je n'ai pas encore trouvé de solution. Je veux aussi que ce soit réutilisable, donc si j'augmente les fonctionnalités à sept ou plus alors je n'aurai pas à changer beaucoup de classe.

Merci, Matt

Répondre

1

Vous pouvez créer une classe parente appelée, par exemple, Model, comme ceci:

abstract class Model { 
    protected static $_featureTable; 

    static public function getAllById($id) { 
    global $db; 
    $items = array(); 
    $db->where(array("userId"=>$userId)); 
    $rows = $db->get(self::$_featureTable)->fetch(0); 
    foreach($rows as $row) { 
     $item = self::getInstance(); 
     $item->setValues($row); 
     $items[] = $item; 
    } 
    return $items; 
    } 

    abstract static protected function getInstance(); 
    abstract protected function setValues($row); 
} 

class Blog extends Model { 
    protected static $_featureTable = 'blogs'; 

    protected static function getInstance() { 
    $self = __CLASS__; 
    return new $self(); 
    } 

    protected function setValues($row) { 
    $this->content = $row['content']; 
    // etc. 
    } 
} 

Ensuite, pour obtenir une liste des blogs:

$blogs = Blog::getAllById($id); 
+0

le seul problème que j'ai ici est que pour le truc $ item-> content = $ row ['content'], ceux-ci seront différents pour toutes les fonctionnalités, par exemple la classe image aura un nom de fichier où le blog aura du contenu . Des suggestions ici? A part ça, c'est tout bon merci! – phpNutt

+0

@Matt: code mis à jour en réponse à votre commentaire. Notez l'ajout de la méthode setValues ​​(). –

+0

Merci Lucas! :-) – phpNutt

1

Peut-être que vous devriez jeter un oeil à certains systèmes ORM comme Doctrine ou Propel. Cela vous aidera beaucoup avec votre base de données < -> mapping d'objet. Et je sais qu'au moins Doctrine prend en charge les héritages des tables et mappe également cette structure à une hiérarchie de classes (ce qui vous permet d'implémenter des méthodes communes dans la classe parent).

+0

Pourriez-vous s'il vous plaît répondre http://stackoverflow.com/questions/9511137/is-the-solution-design-optimal-c-sharp-3-tier? – Lijo

0

Vous pouvez créer un objet/une fonction Factory paramétrable. Il agréger une fonction « row_to_object » et un objet « requête »:

function row_to_blog($row) { 
    return new Blog($row["id"], $row["title"]); 
} 

function create_from_query($query, $row_to_object) { 
    $objects=array(); 
    foreach($row as $db->fetch($query)) { 
     $objects[]=$row_to_object($row); 
    } 
    return $objects; 
} 

$query=new Query("blogs", new Where("userid",$id)); 
$blogs=create_from_query($query, row_to_blog);