2009-07-22 5 views
0

Ceci est probablement une réponse très simple - mais un petit conseil serait apprécié.Méthodes communes orientées objet: Interfaces, Abstract, ou autre chose

J'ai un petit système où tous mes objets utilisent les mêmes méthodes load() et loadMultiple(). Exactement le même code dans chaque. Très simple, exemple ci-dessous.

public static function load($id) { 
    // Instantiate the object 
    $object = new self($id); 
    return $object; 
} 

Le code exemple ci-dessus ne peut pas aller dans une interface évidemment, mais ne peut-il aller dans une classe abstraite comme je suis instanciation de l'objet (même dans la méthode loadMultiple).

Quelle est la solution la plus élégante à cela? Je prévois actuellement de créer une classe parente telle que:

class Object_Model { 
    public function load() { 
     // Code here 
    } 
    public function loadMultiple() { 
     // Code here 
    } 
} 

class Object1 extends Object_Model { 
} 

class Object2 extends Object_Model { 
} 

Mais je suis sûr qu'il doit y avoir un meilleur moyen. Y a-t-il?

Répondre

0

Je suis d'accord avec Ionut - juste aller avec une méthode d'usine traditionnelle.

<?php 
abstract class A 
{ 
    protected $id; 

    protected function __construct($id) 
    { 
    $this->id = $id; 
    } 

    final public static function factory($subclass, $id) 
    { 
    // Instantiate the object 
    if (is_subclass_of($subclass, __CLASS__)) 
    { 
     return new $subclass($id); 
    } 
    throw new Exception("$subclass is not a valid class for this factory."); 
    } 
} 

class B extends A{} 
class C extends A{} 
class D{} 

try { 
    $b = A::factory('B', 1); 
    $c = A::factory('C', 2); 
    $d = A::factory('D', 2); 
} 
catch (Exception $e) 
{ 
    echo "Oops! " . $e->getMessage(); 
} 

Vous pourriez être en mesure de faire quelque chose avec late static binding, mais c'est PHP 5.3 ne

+0

Merci Peter. La liaison statique tardive semble parfaite. Mais je ne pense pas que nos serveurs le supporteront. Je comprends ce que vous et Ionut dites, mais il semble juste que ce soit un pas en arrière quand j'étais si proche de l'élégance 5.3 offre. – PJE

0

En tant que votre code actuel utilise une méthode statique , je crois que ce serait très bien d'avoir une fonction qui prend deux arguments: le nom de la classe à instancier et id:

function load($class, $id) { 
    return new $class($id); 
} 

Il est OK pour implémenter des usines utilisant des fonctions. Ou y a-t-il plus de logique que vous ne pouvez pas extraire dans une fonction?

0

Si vous utilisez PHP 5.3, vous pouvez en effet utiliser une classe parente et le nouveau mot-clé static pour déterminer la classe de l'enfant sur lequel la fonction statique est appelée.

Cependant, je pense qu'il est préférable d'utiliser la méthode éprouvée new Object1($id); tout en effectuant toutes les tâches de configuration de votre méthode __construct. Votre code sera un peu plus facile à lire et à maintenir.

L'exemple multiple de chargement que vous pouvez extraire dans une fonction distincte pour accélérer le processus.

+0

dcousineau Désolé - Peter a expliqué lsb un peu mieux si je lui ai donné la réponse – PJE

Questions connexes