Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: одноимённые функции и require
Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2011
Помог: 0 раз(а)
Всем заглянувшим доброго времени суток.
Итак есть WP и форумный движок. По задумке моего же говнодизайна в шаблоне блога должно выводиться немного информации из форума. Вроде кол-ва ЛС и прочьего.
Есть скрипт, который подтягивает функции форумного движка, проверяет сессию и выводит то, что мне нужно.
Этот скрипт через require подтягиваю в шаблоне первого движка и тут php ругается, что подгружаемый файл хочет переопределить уже объявленную вордпрессом функцию (Cannot redeclare...). Возможно, что там далеко не одна одноименная функция.
В непосредственно коды движков лезть не хочу, поскольку после каждого обновления надо будет это всё проверять. Есть ли возможность изолированно подтянуть скрипт, чтобы он своё отработал и передал 5 переменных в основной скрипт? Единственный вариант что вертится в голове -- это как-нибудь подтянуть в самом начале функции форума, объявить переменные, потом как-нибудь это выгрузить и работать в штатном режиме, но не думаю, что такое возможно.
В худшем случае можно подтягивать вывод скрипта в айфрейме, но мне такая идея нравится совсем никак. (вывод того скрипта что информацию из форума отдаёт).
Есть какие нибудь ещё варианты?
В пэхапэ я ньюфажен, так что приветствуются чуть более развернутые ответы, чем "в двух словах".
Спасибо, да.
DeepVarvar
Отправлено: 06 Апреля, 2011 - 00:53:45
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Создать объект (класс) в котором эти "одноименки" будут приватными (хоть ф-ции, хоть классы). И уже из объекта возвращать результат.
Создаете объект класса, вызываете сначала первый метод, потом второй. Таким образом, функции из скриптов будут объявлены лишь внутри метода, в котором они инклудятся, и конфликта не возникнет. Результат выполнения первого и второго скриптов можно сохранять в свойствах класса - смотрите по ситуации.
Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2011
Помог: 0 раз(а)
Спасибо. вспомнил С++...
первый скрипт, в котором уже объявлена одна из функций я в метод класса заключить не могу, я внутри него по сути работаю. Если пытаться изолировать таким образом только подтягиваемый скрпит форума все в том же в скрипте блога то конфликтная ситуация все равно возникает.
Если пытаться выполнить скрипт вне блогового движка -- форумный, вызываемый в методе класса, тоже начинает ругаться. Говорит: "Fatal error: Call to a member function sql_query() on a non-object in bla-bla-bla..."
======
А можно как-нибудь по другому? Можно на серверной стороне вызвать второй скрипт, передать ему параметры, чтобы он выполнился в отдельном потоке и просто вернул результат, не?
levchick
Отправлено: 06 Апреля, 2011 - 15:29:16
Новичок
Покинул форум
Сообщений всего: 43
Дата рег-ции: Июль 2010
Помог: 3 раз(а)
kaktusjara пишет:
А можно как-нибудь по другому? Можно на серверной стороне вызвать второй скрипт, передать ему параметры, чтобы он выполнился в отдельном потоке и просто вернул результат, не?
Самый идеальный вариант - это написать SOAP сервис для второго скрипта, и из первого его использовать. Покопайте на эту тему, в PEAR уже есть классы для работы с SOAP...
LIME
Отправлено: 06 Апреля, 2011 - 15:53:27
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
php.su/functions/?proc-open
levchick
Отправлено: 06 Апреля, 2011 - 15:57:29
Новичок
Покинул форум
Сообщений всего: 43
Дата рег-ции: Июль 2010
Помог: 3 раз(а)
LIME пишет:
php.su/functions/?proc-open
Эта функция разрешена не на всех хостингах. С SOAP все таки более универсальный вариант
Мелкий
Отправлено: 06 Апреля, 2011 - 16:11:56
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Вообще, в PHP5.3 появились namespace. Так что если окружение позволяет - было бы лучшим выходом.
----- PostgreSQL DBA
MAXUS
Отправлено: 06 Апреля, 2011 - 16:45:39
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
kaktusjara пишет:
Всем заглянувшим доброго времени суток.
Итак есть WP и форумный движок.
Есть скрипт, который подтягивает функции форумного движка, проверяет сессию и выводит то, что мне нужно.
Этот скрипт через require подтягиваю в шаблоне первого движка и тут php ругается, что подгружаемый файл хочет переопределить уже объявленную вордпрессом функцию (Cannot redeclare...). Возможно, что там далеко не одна одноименная функция.
Сорри. Идиотский вопрос, возможно, но не пытаетесь ли Вы подгрузить модуль, который уже подгружен. Не вследствии ли этого функции переопределяются? Может попробовать эти функции сразу использовать, не подгружая модуль их описывающий.
kaktusjara
Отправлено: 06 Апреля, 2011 - 17:19:22
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2011
Помог: 0 раз(а)
MAXUS, нет, не пытаюсь. У phpbb и WP в самом деле есть одноимённые функции, начиная с WP 3.x. С этим столкнулись в основном те, кто юзал мост wp-united. Хотя понятно, что этим вопросом здесь всякого встречают. Дабы прогнать сомнения скажу, что даже пробовал использовать _once, но тщетно.
Остальных благодарю за советы, пойду эртэфэмить. Спасибо и всего доброго
MAXUS
Отправлено: 07 Апреля, 2011 - 20:05:10
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
kaktusjara пишет:
У phpbb и WP в самом деле есть одноимённые функции, начиная с WP 3.x.
Ясно. Я просто не понял, что задача поженить два чужих пакета. Я бы тупо выдрал необходимые функции и все относящееся к ним в отдельный файл и переименовал их. Если чужой код править нельзя. Некрасиво, наверное, зато эффективно.
MAXUS
Отправлено: 07 Апреля, 2011 - 22:28:16
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
Пораскинул тут мозгами. Попробовал. Работает следующий вариант.
Грузишь свой php, содержащий необходимые функции, в string-переменную, заменяешь в ней названия дублирующихся функций на какие-нибудь свои, а потом полученную переменную-код запускаешь через eval и спокойно вызываешь переименованные функции. У меня все заработало.
Пример.
Имеем три файла. В первых двух функции с одинаковыми именами.
$file_data=str_replace("<?PHP ","",$file_data);//Выкашиваем в переменной-коде все начальные php-теги
$file_data=str_replace("?>","",$file_data);//Выкашиваем в переменной-коде все конечные php-теги
$file_data=str_replace("clone_fnc","clone_fnc1",$file_data);//Заменяем дублирующееся название функции на какое-нибудь свое
eval($file_data);//Выполняем код из твоей переменной. Функция-клон проинициализировалась с уникальным именем.
echo clone_fnc();// Легко выполняется функция из wp.
echo clone_fnc1();// Не менее легко выполняется функция из phpbb, т.к. она уже имеет уникальное имя.
?>
ЗЫ Я, конечно, не программист. Возможно, этот вариант сочтут диким, но он пашет. При этом все необходимые условия выполнены.
kaktusjara
Отправлено: 07 Апреля, 2011 - 23:57:13
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2011
Помог: 0 раз(а)
а мысль, кстати говоря, интересная. Я о таком что-то даже не подумал, хотя обдумывал возможность проверки существования функции по мере подгрузки скрипта (Добавление)
хотя такое прокатит только в случае, когда функция определена именно в подгружаемом скрипте. А когда подгружаемый скрипт делает восемь инклюдов, каждый из которых тоже этим, возможно, промышляет.....
kaktusjara
Отправлено: 08 Апреля, 2011 - 02:45:03
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2011
Помог: 0 раз(а)
ах да, меня даже посещала мысль.. в общем я знаю толк в извращениях, я хотел переопределить стандартную функцию инклюда и в ней проверять содержимое тем же str_replace'ом, например. Но это мегакостыль, да и я понятия не имею, можно ли в PHP изменять функции самого движка. Сишечка баловаться с операторами для нестандартных классов даёт, например
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.