Как расширить класс php с большим количеством классов - PullRequest
1 голос
/ 19 января 2011

Мне было интересно, если бы это был способ получить то, что вы увидите как

class main_class extends main_class {...}

Но php не был счастлив. (

Итак, я хотел спросить stackoverflow, я уверен, что кто-то найдет решение. Тем не менее, за несколько часов отладки я самостоятельно решил свою проблему с помощью небольшого кода.

Проблема заключалась в том, что class some_class не позволит вам переопределить существующий класс, поэтому мне нужно было использовать __get и __call и добавить еще две строки в мою функцию __construct.

Итак, вот мой решенный код:

class main_class {
    private $_MODS = array(),...;
    public ...;
    public function __construct(...) {
        ...
        global $MODS_ENABLED;
        $this -> $_MODS = $MODS_ENABLED;
    }
    ...
    public function __get( $var ) {
        foreach ( $this->_MODS as $mod ) 
            if ( property_exists( $mod, $var ) )
                return $mod -> $var;
    }
    public function __call( $method, $args ) {
        foreach ( $this->_MODS as $mod )
            if ( method_exists( $mod, $method ) )
                return call_user_method_array( $method, $mod, $args );
    }
}

Затем просто запустите это, чтобы расширить мой main_class, не переопределяя исходные функции, поэтому он заставляет меня запускать мои новые функции, но при необходимости я могу получить исходные функции:

$MODS_ENABLED=array();
class mod_mail {...}
$MODS_ENABLED[]=new mod_mail;

Теперь давайте загрузим наш класс и запустим функцию из нашего мода:

$obj = new main_class(...);
$obj -> mail("root@localhost", "me@me.me", "Testing a mod.", "This email was sent via My main_class but this is a mod that extended main_class without renaming it.");

Хорошо, мой мод не для отправки электронных писем, а вместо этого перенаправляет субдомены на псевдоним, но вы понимаете концепцию, показанную здесь.

Редактировать: После того, как я решил проблему, я увидел комментарий о том, что возможный дубликат существует, поэтому я проверяю его и выясняю, что у кого-то другого есть чрезвычайно похожее решение, но, пожалуйста, не отмечайте его как Дублируясь, когда он спрашивал о добавлении в класс, который уже был создан, я хочу переопределить функции при создании. Мое решение принимает массив созданных классов и «сливает» их в мой main_class. Этот метод резервирует исходные функции, но я также могу вызывать исходные функции, используя другую функцию, чтобы обойти функцию __call.

Спасибо всем, кто разместил ответы.

Ответы [ 2 ]

0 голосов
/ 19 января 2011

Самостоятельно решенный :) Я понял это самостоятельно, и я уверен, что кто-то найдет это полезным, так что вот мой php-код.

class main_class {
    private $_MODS = array(),...;
    public ...;
    public function __construct(...) {
        ...
        global $MODS_ENABLED;
        $this -> $_MODS = $MODS_ENABLED;
    }
    ...
    public function __get( $var ) {
        foreach ( $this->_MODS as $mod ) 
            if ( property_exists( $mod, $var ) )
                return $mod -> $var;
    }
    public function __call( $method, $args ) {
        foreach ( $this->_MODS as $mod )
            if ( method_exists( $mod, $method ) )
                return call_user_method_array( $method, $mod, $args );
    }
}

Затем просто запустите:

$MODS_ENABLED=array();
class mod_mail {...}
$MODS_ENABLED[]=new mod_mail;

Теперь все, что вам нужно сделать, это просто позвонить своему основному классу через.

$obj = new main_class(...);
$obj -> mail("root@localhost", "me@me.me", "Testing a mod.", "This email was sent via my main_class but this is a mod that extended main_class without renaming it.");

Хорошо, это не мое использование, но я уверен, что вы поняли, мой класс - CMS-бэк-энд, и мой мод - это перенаправление нескольких поддоменов в другие места, такие как mail.sitegen.com.au и phpmyadmin.sitegen.com.au, которые будут перенаправлены на веб-интерфейс моей CMS.Я также делаю больше модов для своей CMS.

Кстати: мои расширения разделены на две категории: моды и плагины, моды запускаются на каждом сайте, который работает на моей CMS (SiteGen), и плагины есть там.собственные настройки для каждого сайта и они не обязательны.Другими словами, моды выбираются мной, а плагины - владельцем сайта.

0 голосов
/ 19 января 2011

В C # вы бы сделали это, определив partial class.По сути, это все равно, что записывать больше одного и того же класса в другой файл.Я не уверен, что PHP поддерживает это, но эта статья может помочь?

http://www.toosweettobesour.com/2008/05/01/partial-classes-in-php/

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