2010-01-22 5 views
0

Salut les gens et les salutations de la Suède!Ordre fichier d'inclusion en fonction de l'héritage

J'ai un problème vraiment délicat ici. Je vais essayer de montrer exactement ce que je veux dire.

Je construis un CMS basé sur un module, et certains modules héritent d'un module parent. Mon problème est que les modules parents doivent être inclus avant les "enfants".

I à partir d'un ModuleInfo d'extraction fichier XML et le stocker dans un tableau comme celui-ci:

Array 
(
    [bloggy] => Array 
     (
      [module_id] => blog 
      [module_name] => Blog 
      [module_desc] => Description 
      [module_url] => http://www.url.se 
      [author] => Dev Name 
      [author_url] => http://url.se 
      [version] => 1.0 
      [inherit] => core|twitter 
      [path] => /path/to/file 
      [dependon] => Array 
       (
        [0] => core 
        [1] => twitter 
       ) 
     ) 

J'ai fait exploser sur Hériter et enregistré dans « dependon » comme vous le voyez ci-dessus. Le problème est maintenant, comment puis-je trier quel ordre pour inclure les fichiers. Chaque module hérite du noyau mais s'il y a un autre module dans le tableau depenon, alors le module "enfant" doit être inclus après.

J'espère que vous comprenez ce que je veux dire?

// Tobias

Répondre

1

Rechercher "tri topologique".

0

Vous pouvez créer des modules en tant que classes, puis utiliser la fonction magique __autoload pour inclure/exiger automatiquement tous les fichiers php nécessaires.

De cette façon, c'est beaucoup moins un mal de tête lorsque vous avez des dépendances complexes.

Reportez-vous au manuel PHP pour plus de détails sur le chargement automatique.

+0

Tous les modules sont des classes :) et j'utilise autoload mais ne comprends pas comment vous voulez dire? – sandelius

+1

Si vous utilisez déjà l'autoloading, votre problème ne se pose pas. Autoloading devrait devrait résoudre toutes vos dépendances sur demande automatiquement et vous n'aurez pas besoin d'inclure du tout. – selfawaresoup

0

Incluez simplement toutes les dépendances dans vos fichiers. Essayez

// module1.php 
require_once 'core.php' 

// module2.php 
require_once 'core.php' 
require_once 'module1.php' 

// module3.php 
require_once 'core.php' 
require_once 'module1.php' 
require_once 'module2.php' 

Y compris module3 comprend également module2, module1 et noyau. Vous pourriez omettre le core et le module1 dans le module 3 et il les chargerait tous, mais vous devez savoir ce qui inclut quoi.

Ou utilisez l'autoloading et ne vous embêtez pas à ce sujet.

+0

Y compris toutes les dépendances est une perte de performance dans la plupart des cas parce que vous construisez rapidement des listes d'inclusion longues dont de nombreux fichiers php ne sont pas vraiment utilisés. L'auto-chargement résout ce problème. – selfawaresoup

+0

Il n'y a rien dans l'exemple que vous pourriez dire à partir de si c'est gaspiller des ressources ou non. De plus, j'ai également dit utiliser l'auto-chargement. – Gordon

0

Hmm Je vais essayer d'expliquer un peu mieux.

Je recherche le dossier de module pour le fichier d'informations xml et enregistrer les données dans un tableau, je sauvegarde également le chemin d'accès au fichier dans le tableau. Ensuite, j'utilise une boucle foreach pour inclure et instancier les modules. Mon problème est que les modules parents doivent être instanciés avant les "enfants".

Je ne veux pas toucher les fichiers de base lors de l'ajout d'un nouveau module, j'ai besoin d'utiliser les crochets sur un module parent.

+0

Donc, vous recherchez essentiellement des conteneurs de service d'injection de dépendance? Dans ce cas, voir http: //components.symfony-project.org/dépendance-injection / – Gordon

Questions connexes