Можно ли динамически задать имя класса?

#php #class #mediawiki #phpbb

#php #класс #mediawiki #phpbb

Вопрос:

У меня есть установка mediawiki и phpbb, с которыми я успешно интегрировал единый вход.

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

Я обошел это, проверив, загружается ли файл mediawiki. Если это так, то вместо этого вызывается полная копия пользовательского класса с именем phpbb_user. Но мне интересно, есть ли способ получше. Вот как это работает в настоящее время

 if (!defined('FROM_MEDIAWIKI')){
    class User extends session{
    //user class code
    }

}else{
    class phpbb_user extends session{
    //exact copy of user class code
    }

}
  

Есть ли лучший способ сделать это, который не требует 2 копий пользовательского класса?

Я знаю, что вы не можете этого сделать, но можете ли вы сделать что-то подобное?

 $className = (defined('FROM_MEDIAWIKI'))? 'phpbb_user' : 'User';

class $className extends session{
    //user class code
}
  

Комментарии:

1. А что, если у вас просто есть свой код в классе, производном от session , или в session нем самом, если он туда помещается, и расширяется от этого? Это может быть медленнее, но позволяет избежать дублирования.

2. Фактический код единого входа просто вызывает файл, который создает экземпляр пользовательского класса. И мне нужен этот экземпляр класса. Но мне просто нужен фактический класс, вызываемый как другое имя, чтобы я не получал ошибку переопределения.

Ответ №1:

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

 class __user extends session {
    // user class code
}

if (!defined('FROM_MEDIAWIKI')){
    class User extends __user {}
}else{
    class phpbb_user extends __user {}
}
  

Тем не менее, я хотел бы увидеть лучшее решение.