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
Форумы портала PHP.SU :: Версия для печати :: одноимённые функции и require
Форумы портала PHP.SU » PHP » Программирование на PHP » одноимённые функции и require

Страниц (2): [1] 2 »
 

1. kaktusjara - 06 Апреля, 2011 - 00:47:23 - перейти к сообщению
Всем заглянувшим доброго времени суток.

Итак есть WP и форумный движок. По задумке моего же говнодизайна в шаблоне блога должно выводиться немного информации из форума. Вроде кол-ва ЛС и прочьего.
Есть скрипт, который подтягивает функции форумного движка, проверяет сессию и выводит то, что мне нужно.
Этот скрипт через require подтягиваю в шаблоне первого движка и тут php ругается, что подгружаемый файл хочет переопределить уже объявленную вордпрессом функцию (Cannot redeclare...). Возможно, что там далеко не одна одноименная функция.

В непосредственно коды движков лезть не хочу, поскольку после каждого обновления надо будет это всё проверять. Есть ли возможность изолированно подтянуть скрипт, чтобы он своё отработал и передал 5 переменных в основной скрипт? Единственный вариант что вертится в голове -- это как-нибудь подтянуть в самом начале функции форума, объявить переменные, потом как-нибудь это выгрузить и работать в штатном режиме, но не думаю, что такое возможно.
В худшем случае можно подтягивать вывод скрипта в айфрейме, но мне такая идея нравится совсем никак. (вывод того скрипта что информацию из форума отдаёт).
Есть какие нибудь ещё варианты?
В пэхапэ я ньюфажен, так что приветствуются чуть более развернутые ответы, чем "в двух словах".

Спасибо, да.
2. DeepVarvar - 06 Апреля, 2011 - 00:53:45 - перейти к сообщению
Создать объект (класс) в котором эти "одноименки" будут приватными (хоть ф-ции, хоть классы). И уже из объекта возвращать результат.
3. kaktusjara - 06 Апреля, 2011 - 04:45:30 - перейти к сообщению
эмм.. не совсем понял, как мне в класс инклюдить скрипт..

PHP:
скопировать код в буфер обмена
  1. class Test {
  2.  
  3.   include "phpscripts/phpscript.php";
  4.      
  5. }


..зато почти уверен, что такая конструкция не заведётся. Можете рассказать малость подробнее?
4. levchick - 06 Апреля, 2011 - 07:20:52 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. class Test {
  3.  
  4.   public function method1(){
  5.      include "phpscripts/phpscript1.php";
  6.   }
  7.  
  8.   public function method2(){
  9.      include "phpscripts/phpscript2.php";
  10.   }
  11.      
  12. }
  13.  


Создаете объект класса, вызываете сначала первый метод, потом второй. Таким образом, функции из скриптов будут объявлены лишь внутри метода, в котором они инклудятся, и конфликта не возникнет. Результат выполнения первого и второго скриптов можно сохранять в свойствах класса - смотрите по ситуации.
5. kaktusjara - 06 Апреля, 2011 - 10:29:10 - перейти к сообщению
Спасибо. вспомнил С++...

первый скрипт, в котором уже объявлена одна из функций я в метод класса заключить не могу, я внутри него по сути работаю. Если пытаться изолировать таким образом только подтягиваемый скрпит форума все в том же в скрипте блога то конфликтная ситуация все равно возникает.

Если пытаться выполнить скрипт вне блогового движка -- форумный, вызываемый в методе класса, тоже начинает ругаться. Говорит: "Fatal error: Call to a member function sql_query() on a non-object in bla-bla-bla..."

======

А можно как-нибудь по другому? Можно на серверной стороне вызвать второй скрипт, передать ему параметры, чтобы он выполнился в отдельном потоке и просто вернул результат, не?
6. levchick - 06 Апреля, 2011 - 15:29:16 - перейти к сообщению
kaktusjara пишет:
А можно как-нибудь по другому? Можно на серверной стороне вызвать второй скрипт, передать ему параметры, чтобы он выполнился в отдельном потоке и просто вернул результат, не?


Самый идеальный вариант - это написать SOAP сервис для второго скрипта, и из первого его использовать. Покопайте на эту тему, в PEAR уже есть классы для работы с SOAP...
7. LIME - 06 Апреля, 2011 - 15:53:27 - перейти к сообщению
php.su/functions/?proc-open
8. levchick - 06 Апреля, 2011 - 15:57:29 - перейти к сообщению
LIME пишет:
php.su/functions/?proc-open


Эта функция разрешена не на всех хостингах. С SOAP все таки более универсальный вариант
9. Мелкий - 06 Апреля, 2011 - 16:11:56 - перейти к сообщению
Вообще, в PHP5.3 появились namespace. Так что если окружение позволяет - было бы лучшим выходом.
10. MAXUS - 06 Апреля, 2011 - 16:45:39 - перейти к сообщению
kaktusjara пишет:
Всем заглянувшим доброго времени суток.

Итак есть WP и форумный движок.

Есть скрипт, который подтягивает функции форумного движка, проверяет сессию и выводит то, что мне нужно.

Этот скрипт через require подтягиваю в шаблоне первого движка и тут php ругается, что подгружаемый файл хочет переопределить уже объявленную вордпрессом функцию (Cannot redeclare...). Возможно, что там далеко не одна одноименная функция.


Сорри. Идиотский вопрос, возможно, но не пытаетесь ли Вы подгрузить модуль, который уже подгружен. Не вследствии ли этого функции переопределяются? Может попробовать эти функции сразу использовать, не подгружая модуль их описывающий.
11. kaktusjara - 06 Апреля, 2011 - 17:19:22 - перейти к сообщению
MAXUS, нет, не пытаюсь. У phpbb и WP в самом деле есть одноимённые функции, начиная с WP 3.x. С этим столкнулись в основном те, кто юзал мост wp-united. Хотя понятно, что этим вопросом здесь всякого встречают. Дабы прогнать сомнения скажу, что даже пробовал использовать _once, но тщетно.

Остальных благодарю за советы, пойду эртэфэмить. Спасибо и всего доброго
12. MAXUS - 07 Апреля, 2011 - 20:05:10 - перейти к сообщению
kaktusjara пишет:
У phpbb и WP в самом деле есть одноимённые функции, начиная с WP 3.x.


Ясно. Я просто не понял, что задача поженить два чужих пакета. Я бы тупо выдрал необходимые функции и все относящееся к ним в отдельный файл и переименовал их. Если чужой код править нельзя. Некрасиво, наверное, зато эффективно.
13. MAXUS - 07 Апреля, 2011 - 22:28:16 - перейти к сообщению
Пораскинул тут мозгами. Попробовал. Работает следующий вариант.

Грузишь свой php, содержащий необходимые функции, в string-переменную, заменяешь в ней названия дублирующихся функций на какие-нибудь свои, а потом полученную переменную-код запускаешь через eval и спокойно вызываешь переименованные функции. У меня все заработало.

Пример.

Имеем три файла. В первых двух функции с одинаковыми именами.

wp.php
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. <?PHP
  4. function clone_fnc(){
  5. return "Функция wp";
  6. }
  7. ?>
  8.  
  9.  


phpbb.php
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. <?PHP
  4. function clone_fnc(){
  5. return "Функция phpbb, которая тебе нужна";
  6. }
  7. ?>
  8.  
  9.  



func_all.php
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. <?PHP
  4.  
  5. include "wp.php"; // Имитируем загрузку функций wp. Насколько я понимаю они у тебя на момент подгрузки файла phpbb уже определены.
  6.  
  7. // Грузим твой файл с phpbb функциями в переменную. Получаем переменную-код $file_data
  8. $file_data = '';
  9. $fd = fopen('phpbb.php', 'r');
  10. if (!$fd)   {
  11. echo "Ошибка! Файл не открыт.";
  12. }
  13. while  (! feof($fd))   {
  14. $file_data .= fgets($fd,  5000);
  15. }
  16. fclose ($fd);
  17.  
  18. $file_data = str_replace ("<?PHP ", "", $file_data); //Выкашиваем в переменной-коде все начальные php-теги
  19. $file_data = str_replace ("?>", "", $file_data); //Выкашиваем в переменной-коде все конечные php-теги
  20. $file_data = str_replace ("clone_fnc", "clone_fnc1", $file_data); //Заменяем дублирующееся название функции на какое-нибудь свое
  21.  
  22. eval ($file_data); //Выполняем код из твоей переменной. Функция-клон проинициализировалась с уникальным именем.
  23.  
  24. echo clone_fnc(); // Легко выполняется функция из wp.
  25. echo clone_fnc1(); // Не менее легко выполняется функция из phpbb, т.к. она уже имеет уникальное имя.
  26.  
  27. ?>
  28.  
  29.  


ЗЫ Я, конечно, не программист. Возможно, этот вариант сочтут диким, но он пашет. При этом все необходимые условия выполнены.
14. kaktusjara - 07 Апреля, 2011 - 23:57:13 - перейти к сообщению
а мысль, кстати говоря, интересная. Я о таком что-то даже не подумал, хотя обдумывал возможность проверки существования функции по мере подгрузки скрипта
(Добавление)
хотя такое прокатит только в случае, когда функция определена именно в подгружаемом скрипте. А когда подгружаемый скрипт делает восемь инклюдов, каждый из которых тоже этим, возможно, промышляет.....
15. kaktusjara - 08 Апреля, 2011 - 02:45:03 - перейти к сообщению
ах да, меня даже посещала мысль.. в общем я знаю толк в извращениях, я хотел переопределить стандартную функцию инклюда и в ней проверять содержимое тем же str_replace'ом, например. Но это мегакостыль, да и я понятия не имею, можно ли в PHP изменять функции самого движка. Сишечка баловаться с операторами для нестандартных классов даёт, например

 

Powered by ExBB FM 1.0 RC1