2010-11-03 2 views
1

Voici le code que je vais parler de (garder cela à l'esprit tout au long de ce post):PHP événement classe étendue

fichier: index.php

/** 
* Base class used when created a new application. 
*/ 
class App { 
    public function do_something(){ 
    } 
} 

/** 
* Class used, among other things, to manage all apps. 
*/ 
class Apps { 
    public static function _init(){ 
     foreach(glob('apps/*') as $dir) 
      if(file_exists($dir.'/index.php') 
       include_once($dir.'/index.php'); 
    } 
} 
Apps::_init(); 

fichier: MyApp/index.php

class MyApp extends App { 
    /** 
     * This function overrides the the one in App... 
     */ 
    public function do_something(){ 
    } 
} 

Donc, vous savez probablement ce que je fais; C'est une application/système d'extension, où une application est conservée dans un dossier séparé au /apps/ et son point d'entrée est index.php.

Le code, jusqu'à présent, fonctionne bien (ou, bien, il devrait, je l'ai écrit sur le dessus de ma tête;)). Quoi qu'il en soit, mon problème est de rendre la classe Apps au courant de toutes les classes d'applications étendues.


Le moyen facile serait d'écrire quelque chose comme ce qui suit à la fin de chaque application de index.php.

Apps::register('MyApp'); // for MyApp application 

Le problème est que même s'il est compréhensible, il n'est pas automatisé. Par exemple, copier + coller une application a besoin de cette modification, et les nouveaux développeurs sont plus susceptibles d'oublier complètement ce code (et pire encore, la majeure partie du code fonctionne encore sans elle!).

Une autre idée est d'utiliser ce code après le code _init():

$apps=array(); 
foreach(get_declared_classes() as $class) 
    if(array_search('App',class_parents($class))!==false) 
     $apps[]=$class; 

Mais il semble trop exigeant beaucoup de ressources que la dernière.

Qu'en pensez-vous?

Répondre

0

L'approche de registre est correct, vous pouvez faire

Apps::register(get_class()); 

dans le constructeur MyApp, si vous en avez un.

+2

Si vous voulez enregistrer tout le monde, vous pouvez aussi le placer dans le constructeur de la classe 'App', même si vous devez vous souvenir de passer' $ this' à la méthode 'get_class' (' Apps :: register (get_class ($ this));), et vous devriez vous rappeler d'appeler 'parent :: __ construct()' dans chaque constructeur de classe enfant si vous avez besoin d'ajouter quelque chose d'autre dans le constructeur. – Aether

+0

Aether ... c'est exactement ce dont j'avais besoin! Vous auriez dû en faire une réponse. ;) – Christian

0

L'approche du registre semble propre et simple. Il sera clair pour les mainteneurs ultérieurs (et pour vous-même) ce que le code fait et c'est moins sujette aux erreurs.

+0

En fait, je pense qu'il est plus sujet aux erreurs et un souci à maintenir. Mais c'est à peu près tout ce que je peux penser contre. – Christian

Questions connexes