Вот код, о котором я буду говорить (помните об этом на протяжении всего этого поста):
Файл: 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();
Файл: MyApp / index.php
class MyApp extends App {
/**
* This function overrides the the one in App...
*/
public function do_something(){
}
}
Итак, вы, наверное, знаете, что я делаю;это система приложений / расширений, где приложение хранится в отдельной папке в /apps/
, а его точка входа - index.php
.
Код на данный момент работает хорошо (или, ну, должен,Я написал это от макушки головы;)).В любом случае, моя задача - сделать так, чтобы класс Apps знал обо всех расширенных классах приложений.
Самый простой способ - написать что-то вроде следующего в конце каждого 101 * * *
каждого приложения.
Apps::register('MyApp'); // for MyApp application
Проблема в том, что, хотя это понятно, оно не автоматизировано.Например, копирование + вставка приложения требует такой модификации, и новые разработчики с большей вероятностью полностью забудут этот код (и, что еще хуже, большая часть кода по-прежнему работает без него!).
Другая идея заключалась в использованииэтот код после кода в _init()
:
$apps=array();
foreach(get_declared_classes() as $class)
if(array_search('App',class_parents($class))!==false)
$apps[]=$class;
Но он звучит слишком ресурсоемко, чем последний.
Как вы думаете?