PHP расширенное событие класса - PullRequest
1 голос
/ 03 ноября 2010

Вот код, о котором я буду говорить (помните об этом на протяжении всего этого поста):

Файл: 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;

Но он звучит слишком ресурсоемко, чем последний.

Как вы думаете?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2010

С регистрационным подходом все в порядке, вы можете сделать

Apps::register(get_class());

внутри конструктора MyApp, если он у вас есть.

0 голосов
/ 03 ноября 2010

Подход регистра выглядит чисто и просто.Позднее сопровождающим (и вам самим) будет понятно, что делает код, и он менее подвержен ошибкам.

...