2008-12-23 7 views
0

Je travaille avec un CMS, Joomla, et il y a une classe de base qui rend un ensemble de paramètres à un formulaire, JParameter. Fondamentalement, il a une fonction render() qui produit du code HTML chargé de tables, ce qui n'est pas cohérent avec le reste de mon site.Modifier la classe d'un objet à l'exécution

Pour les problèmes de maintenabilité, et parce que je ne sais pas où cela est utilisé, je ne veux pas changer le code de base. Ce qui serait idéal serait de pouvoir définir une nouvelle classe qui étend JParameter, puis de convertir mon objet $ params vers cette nouvelle sous-classe.

// existing code -------------------- 
class JParameter { 
    function render() { 
     // return HTML with tables 
    } 
    // of course, there's a lot more functions here 
} 

// my magical class ----------------- 
class MyParameter extends JParameter { 
    function render() { 
     // return HTML which doesn't suck 
    } 
} 

// my code -------------------------- 
$this->params->render(); // returns tables 
$this->params = (MyParameter) $this->params; // miracle occurs here? 
$this->params->render(); // returns nice html 
+0

Je ne pense pas que ce soit possible d'une manière agréable. (D'accord, c'est possible, mais la façon dont je l'ai vu était un hack impliquant serialize() et str_replace() Probablement pas ce que vous voulez en considérant la maintenabilité est le problème ici ...) – flussence

+0

serialize et str_replace? yikes! – nickf

Répondre

3

Il y a toujours PECL's Classkit mais je reçois un sentiment que vous auriez vraiment ne pas le faire. En supposant que vous appelez directement $this->params->render(), vous pouvez simplement créer une fonction/un objet qui effectue un rendu alternatif (MyParamRenderer::render($this->params)) et éviter d'effectuer une gymnastique OO non prise en charge par le langage.

+0

ouais je pense que c'est définitivement une meilleure option. Aussi, je voudrais pouvoir donner +2 votes pour une réponse qui reconnaît que tout le monde ne veut pas installer chaque bibliothèque pour la plus petite chose! – nickf

2

Qu'en est-il la création d'un décorateur de toutes sortes que tout délègue à part JParameter :: render() à l'objet existant

class MyJParameter { 
    private $jparm; 
    function __construct(JParameter $jparm) { 
     $this->jparm = $jparm; 
    } 
    function render() { 
     /* your code here */ 
    } 
    function __get($var) { 
     if(isset($this->$jparm->$var) { 
      return $this->$jparm->$var; 
     } 
     return false; 
    } 
    function __set($var, $val) { 
     /* similar to __get */ 
    } 
    function __call($method, $arguments) { 
     if(method_exists($this->jparm, $method) { 
      return call_user_func_array(array($this->jparm, $method), $arguments); 
     } 
     return false; 
    } 
} 

Ou est-ce trop malodorant?

Questions connexes