#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 {}
}
Тем не менее, я хотел бы увидеть лучшее решение.