неявное расширение классов? - PullRequest
1 голос
/ 23 февраля 2011

Сценарий Система имеет классы, объявленные в /system/classes/.Приложение имеет классы, объявленные в /application/classes/.

Если в папке application есть класс, имя которого совпадает с именем класса в папке system , то класс в приложении папка должна расширять класс в папке system .

Не все классы в папке system будут перезаписаны классом в приложении папка.

Вопрос Как можно заставить класс в папке system расширять класс в приложении class только , если в приложении есть класс folder.

NB: Все классы, которые могут быть перезаписаны, являются статическими классами
NB: Даже если нам нужно назвать application classes my_className все в порядке, пока мы можем просто позвонить className::functionName()

Я думаю, я ищу что-то похожее на то, как это делает Code Igniter.

Редактировать

Пример классаПриведенный ниже класс используется в качестве загрузчика для загрузки во всех других классах (будь то библиотеки, процессы или другие).Он также используется для загрузки в файлы css / image / js и т. Д.

Если пользователь должен расширить класс, он может захотеть добавить функцию ini(), которая будет использоваться для загрузки в файлы ini.

class load {

    protected static $helpers;
    protected static $configs;
    protected static $libraries;
    protected static $processes;
    protected static $js;
    protected static $css;

    public static function init() {
        self::$helpers = new stdClass();
        self::$libraries = new stdClass();
        self::$configs = new stdClass();
        self::$processes = new stdClass();
        self::$css = new stdClass();
        self::$js = new stdClass();
    }

    public static function config($name) {
        if (isset(self::$configs->$name) && is_object(self::$configs->$name))
            return self::$configs->$name;

        if (is_file(CONFIG_DIR . $name . '.php')) {
            require_once(CONFIG_DIR . $name . '.php');
            self::$configs->$name = new $name();
            return self::$configs->$name;
        }
        throw new exception('Could not load config file \'' . $name . '\'');
        return false;
    }

    public static function helper($name) {
        if (isset(self::$helpers->$name) && is_object(self::$helpers->$name))
            return self::$helpers->$name;

        if (is_file(APP_HELPER_DIR . $name . '.php')) {
            require_once(APP_HELPER_DIR . $name . '.php');
            self::$helpers->$name = new $name();
            return self::$helpers->$name;
        }

        if (is_file(HELPER_DIR . $name . '.php')) {
            require_once(HELPER_DIR . $name . '.php');
            self::$helpers->$name = new $name();
            return self::$helpers->$name;
        }
        throw new exception('Could not load helper file \'' . $name . '\'');
        return false;
    }

    public static function library($name, $params = array()) {
        if (empty($params) && isset(self::$libraries->$name) && is_object(self::$libraries->$name))
            return self::$libraries->$name;

        if (is_file(APP_LIBRARY_DIR . $name . '.php')) {
            require_once(APP_LIBRARY_DIR . $name . '.php');
            self::$libraries->$name = new $name($params);
            return self::$libraries->$name;
        }

        if (is_file(LIBRARY_DIR . $name . '.php')) {
            require_once(LIBRARY_DIR . $name . '.php');
            self::$libraries->$name = new $name();
            return self::$libraries->$name;
        }
        throw new exception('Could not load library file \'' . $name . '\'');
        return false;
    }

    public static function process($name, $args = array()) {
        if (isset(self::$processes->$name) && is_object(self::$processes->$name))
            return self::$processes->$name;

        if (is_file(PROCESS_DIR . $name . '.php')) {
            require_once(PROCESS_DIR . $name . '.php');
            if (empty($args)) {
                self::$processes->$name = new $name();
                return self::$processes->$name;
            } else {
                self::$processes->$name = new ReflectionClass($name);
                return self::$processes->$name->newInstanceArgs($args);
            }
        }
        throw new exception('Could not load process file \'' . $name . '\'');
        return false;
    }

    public static function css($name) {
        if (isset(self::$css->$name) && !empty(self::$css->$name))
            return self::$css->$name;

        self::$css->$name = '<link rel="stylesheet" type="text/css" href="' . CSS_PATH . $name . '.css">';
        return self::$css->$name;
    }

    public static function js($name) {
        if (isset(self::$js->$name))
            return self::$js->$name;

        self::$js->$name = '<script src="' . JS_PATH . $name . '.js"></script>';
        return self::$js->$name;
    }

    public static function template($name, $vars = array()) {
        if (is_file(TEMPLATE_DIR . $name . '.php')) {
            ob_start();
            if (!empty($vars))
                extract($vars);
            require(TEMPLATE_DIR . $name . '.php');
            $contents = ob_get_contents();
            ob_end_clean();
            return $contents;
        }
        throw new exception('Could not load template file \'' . $name . '\'');
        return false;
    }

}

1 Ответ

1 голос
/ 07 марта 2011

Насколько я знаю, Igniter заменяет классы, а не расширяет их.

Более практичный способ - динамически генерировать код:

$code = file_get_contents($appFile);
if ( file_exists( $systemFile ) )
{
    //don't do this ! Just a proof of concept, use regexp or code tokenizer
    //you will also need to programmatically determine MyClass and SystemClass
    $code = str_replace ('class myClass', 'class MyClass extends SystemClass', $code);
}
eval ($code)

Обратите внимание, что eval обычно считается злом по уважительным причинам, поэтому обязательно перепроверьте свой код. Возможно, вы захотите переосмыслить свой дизайн фреймворка.

ОБНОВЛЕНИЕ: если классы являются просто статическими, вы можете захотеть взглянуть на шаблон Decorator и __call () __get () __set (). Этого может быть достаточно и избежать маршрута eval ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...