Мне было интересно, если бы это был способ получить то, что вы увидите как
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.
Спасибо всем, кто разместил ответы.