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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
kaktusjara
Отправлено: 06 Апреля, 2011 - 00:47:23
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Всем заглянувшим доброго времени суток.

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

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

Спасибо, да.
 
 Top
DeepVarvar Супермодератор
Отправлено: 06 Апреля, 2011 - 00:53:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Создать объект (класс) в котором эти "одноименки" будут приватными (хоть ф-ции, хоть классы). И уже из объекта возвращать результат.
 
 Top
kaktusjara
Отправлено: 06 Апреля, 2011 - 04:45:30
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




эмм.. не совсем понял, как мне в класс инклюдить скрипт..

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


..зато почти уверен, что такая конструкция не заведётся. Можете рассказать малость подробнее?
 
 Top
levchick
Отправлено: 06 Апреля, 2011 - 07:20:52
Post Id



Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Июль 2010  


Помог: 3 раз(а)




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.  


Создаете объект класса, вызываете сначала первый метод, потом второй. Таким образом, функции из скриптов будут объявлены лишь внутри метода, в котором они инклудятся, и конфликта не возникнет. Результат выполнения первого и второго скриптов можно сохранять в свойствах класса - смотрите по ситуации.

(Отредактировано автором: 06 Апреля, 2011 - 07:24:24)

 
 Top
kaktusjara
Отправлено: 06 Апреля, 2011 - 10:29:10
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Спасибо. вспомнил С++...

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

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

======

А можно как-нибудь по другому? Можно на серверной стороне вызвать второй скрипт, передать ему параметры, чтобы он выполнился в отдельном потоке и просто вернул результат, не?
 
 Top
levchick
Отправлено: 06 Апреля, 2011 - 15:29:16
Post Id



Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Июль 2010  


Помог: 3 раз(а)




kaktusjara пишет:
А можно как-нибудь по другому? Можно на серверной стороне вызвать второй скрипт, передать ему параметры, чтобы он выполнился в отдельном потоке и просто вернул результат, не?


Самый идеальный вариант - это написать SOAP сервис для второго скрипта, и из первого его использовать. Покопайте на эту тему, в PEAR уже есть классы для работы с SOAP...
 
 Top
LIME
Отправлено: 06 Апреля, 2011 - 15:53:27
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




php.su/functions/?proc-open
 
 Top
levchick
Отправлено: 06 Апреля, 2011 - 15:57:29
Post Id



Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Июль 2010  


Помог: 3 раз(а)




LIME пишет:
php.su/functions/?proc-open


Эта функция разрешена не на всех хостингах. С SOAP все таки более универсальный вариант
 
 Top
Мелкий Супермодератор
Отправлено: 06 Апреля, 2011 - 16:11:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Вообще, в PHP5.3 появились namespace. Так что если окружение позволяет - было бы лучшим выходом.


-----
PostgreSQL DBA
 
 Top
MAXUS
Отправлено: 06 Апреля, 2011 - 16:45:39
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




kaktusjara пишет:
Всем заглянувшим доброго времени суток.

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

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

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


Сорри. Идиотский вопрос, возможно, но не пытаетесь ли Вы подгрузить модуль, который уже подгружен. Не вследствии ли этого функции переопределяются? Может попробовать эти функции сразу использовать, не подгружая модуль их описывающий.
 
 Top
kaktusjara
Отправлено: 06 Апреля, 2011 - 17:19:22
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




MAXUS, нет, не пытаюсь. У phpbb и WP в самом деле есть одноимённые функции, начиная с WP 3.x. С этим столкнулись в основном те, кто юзал мост wp-united. Хотя понятно, что этим вопросом здесь всякого встречают. Дабы прогнать сомнения скажу, что даже пробовал использовать _once, но тщетно.

Остальных благодарю за советы, пойду эртэфэмить. Спасибо и всего доброго
 
 Top
MAXUS
Отправлено: 07 Апреля, 2011 - 20:05:10
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




kaktusjara пишет:
У phpbb и WP в самом деле есть одноимённые функции, начиная с WP 3.x.


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


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




Пораскинул тут мозгами. Попробовал. Работает следующий вариант.

Грузишь свой 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.  


ЗЫ Я, конечно, не программист. Возможно, этот вариант сочтут диким, но он пашет. При этом все необходимые условия выполнены.
 
 Top
kaktusjara
Отправлено: 07 Апреля, 2011 - 23:57:13
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




а мысль, кстати говоря, интересная. Я о таком что-то даже не подумал, хотя обдумывал возможность проверки существования функции по мере подгрузки скрипта
(Добавление)
хотя такое прокатит только в случае, когда функция определена именно в подгружаемом скрипте. А когда подгружаемый скрипт делает восемь инклюдов, каждый из которых тоже этим, возможно, промышляет.....
 
 Top
kaktusjara
Отправлено: 08 Апреля, 2011 - 02:45:03
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




ах да, меня даже посещала мысль.. в общем я знаю толк в извращениях, я хотел переопределить стандартную функцию инклюда и в ней проверять содержимое тем же str_replace'ом, например. Но это мегакостыль, да и я понятия не имею, можно ли в PHP изменять функции самого движка. Сишечка баловаться с операторами для нестандартных классов даёт, например
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB