2010-05-03 9 views
3

Je travaille sur mon propre framework MVC et je me suis retrouvé coincé. J'ai besoin la construction suivante:Imiter plusieurs héritage en PHP

Controller 
     --> Backend_Controller 
      --> Backend_Crud_Controller 
     --> Frontend_Controller 
      --> Frontend_Crud_Controller 

deux « Backend_Crud_Controller » et « Frontend_Crud_Controller » ont les mêmes fonctionnalités et donc ils devraient étendre une autre classe nommée « Base_Crud_Controller », la seule différence vient des contrôleurs « Backend/frontend » qui mettent en œuvre différents mécanismes.

Fondamentalement, ils devraient hériter des deux classes, mais mon problème est que le contrôleur 'Backend/Frontend' n'élargit pas nécessairement 'Base_Crud_Controller'.

Je sais que l'héritage multiple n'existe pas en PHP mais je cherche une solution, j'ai choisi de m'abstenir de Mixins (comme dans Symfony) car je ne considère pas cela comme une solution élégante.

Les interfaces ne me conviennent pas car tout cela finit comme des classes concrètes qui devraient implémenter des méthodes.

+0

Pourriez-vous s'il vous plaît nous dire ce que chacune de ces classes fait? Pourquoi avez-vous décidé de créer un tel mode d'héritage? J'ai de mauvais sentiments à propos de ce que vous essayez de faire. – Crozin

+0

Le 'Controller' représente la fonctionnalité de base du contrôleur comme dans le monde MVC. Le contrôleur backend/frontend étend le 'Controller' et implémente une logique différente. Dans les deux contrôleurs Frontend/Backend je pourrais avoir CRUD_Controllers qui implémentent la fonctionnalité CRUD de base, mais notez que tous les contrôleurs Frontend/Backend n'ont pas besoin d'implémenter CRUD. – fabieno

Répondre

3

Envisagez d'utiliser Decorators ou repenser votre conception.

class FrontEnd 
{ 
    protected $baseController; 
    public function __construct(BaseController $controller) { /* ... */} 
    // ... 
    // methods specific to Frontend 
    // ... 
    public function __call($method, args) { 
     // implement __call to delegate other methods to BaseController 
    } 
} 

Vous pouvez également créer un décor BackEnd et Crud et les empiler ensemble, par ex.

$crudBackEndController = new Crud(new BackEnd(new BaseController));