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?
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
Aether ... c'est exactement ce dont j'avais besoin! Vous auriez dû en faire une réponse. ;) – Christian