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 :: Не работает функция глобализации (global)
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
Столкнулся с одной весьма специфической проблемой и не смог найти решение, может, кто уже сталкивался и знает в чем дело?
Суть такая: если вызываю несколько раз одну и туже функцию (специфика нового ДЛЕ), то прихордится ее обрамлять функциями проверки, типа:
if (!defined('f')) {
define('f',1);
global $a;
echo $a; #Empty???
}}
или так:
if (!function_exists('f')) {
function f() {
global $a;
echo $a; #Empty???
}}
Вот именно в данной ситуации у меня глобал не работает, в чём дело никак понять не могу, в остальных случаях работает. Проблемку решил левой рукой через правую ногу - подгрузил в каждую функцию огромную кучу переменных через инклюд, но это корявый выход.
Может, чего-то в движке нахимичили ака "спецхитрозащита"?
JustUserR
Отправлено: 18 Июня, 2010 - 12:25:23
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
isle пишет:
Вот именно в данной ситуации у меня глобал не работает, в чём дело никак понять не могу, в остальных случаях работает
Так как вы создаете функцию внутри дополнительного условия то вероятно что она вызывается из области видимости отличной от той где существует переменная $a - попробуйте создавать ваши функции и константы динамически с помощью модуля http://www.php.su/functions/?cat=runkit - в таком случае вы сможете явно указать простнаство имен в котором они создаются
Также необходимо проверить в каком файле или функции а также в какой момент времени создается переменная $a - например если она находится в подключаемом через include файле то она может оказаться в собственном пространстве имен - в таком случае нужно перед ее созданием в подключемом файле также объявить ее как global
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
isle
Отправлено: 18 Июня, 2010 - 19:07:34
Гость
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
Эх, написал большое сообщение, а оно не напечаталось...
Эх... ладно.
Спасибо за наводку, попробую.
JustUserR
Отправлено: 19 Июня, 2010 - 11:08:49
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
isle пишет:
Эх, написал большое сообщение, а оно не напечаталось...
Эх... ладно.
Спасибо за наводку, попробую.
Пожалуйста! Также для проверки попробуйте посмотреть из какого контекста и каким образом происходит вызов данных функций - поскольку вероятно ваша функция вызывается в тот момент когда нужная переменная не создана или не изменена - или в силу того что у вас происходит динамическое переопределение функций вызывается не та из них например из другого модуля или еще непереопределенная версия Именно поэтому лучше использовать не прямое определение функций в нужном месте - а их runkit-определение с указанием соответствующего контекста
Насчет сообщения такое бывает если например подвисает интернет то есть вы уже отправили запрос на сохранение сообщения и в этот момент соединение прервалось - и если потом нажать обновление то будет выдано сообщение об ошибке причем текст сообщения никуда не будет сохранен - поэтому при отправке большого сообщения полезно предварительно скопировать его в буфер обмена
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
isle
Отправлено: 19 Июня, 2010 - 11:52:24
Гость
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
JustUserR пишет:
поскольку вероятно ваша функция вызывается в тот момент когда нужная переменная не создана или не изменена
Вот хотел об этом уточнить в прошлый раз, но ИЕ глюконул и сообщение улетело.
Пробовал переменную прямо перед вызовом функции определить, т.е.
$a = 1;
if (!function_exists('f')) {
function f() {
global $a;
echo $a; #Empty
}}
Так не работает, хотя заметил, что "глобал" первой функции срабатывает, а вот второй и последующих - уже нет, область видимости какая-то "подлокальная" что ли.
Цитата:
поэтому при отправке большого сообщения полезно предварительно скопировать его в буфер обмена
С моим корявым интернетом так обычно и делаю, но что-то в прошлый раз как-то автоматом сразу нажал, эх, автопилот подвел.
Посидел с "ранкитами" весь день вчера, но что-то они мне туго пока даются, задачку наспех решил, но, видимо, пока что-то сверх серьезное не будет у меня, то вряд ли так разберусь... погуглил сегодня еще - на всех остальных форумах вообще просто тупо удивляются и посылают в учебники, а примерчиков никаких; там нужно сидеть и сидедь, зарывшись в учебники, похоже... Если найду решение - отпишусь, а пока оставляю это гиблое дело - время дорого. Спасибо огромное за внимание.
JustUserR
Отправлено: 19 Июня, 2010 - 12:03:33
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
isle пишет:
Так не работает, хотя заметил, что "глобал" первой функции срабатывает, а вот второй и последующих - уже нет, область видимости какая-то "подлокальная" что ли
По умолчанию в PHP имеется только две области видимости - это глобальная которая является по совместительству межпакетной и локальная которая зависит от уровня вложенности блоков - а множество пространств имен можно сформировать только runkit-ом за счет классов имя которых и дает соответствующее пространство имен
Однако когда вы работаете уже внутри локальной области видимости то внутри нее может формировться несколько подобластей - которые могут не передавать переменные между собой и ключевое слово global на них не действует
isle пишет:
Посидел с "ранкитами" весь день вчера, но что-то они мне туго пока даются, задачку наспех решил
Могу вам привести конкретный пример установки функции в runkit-е
Аналогичным образом можно изменить существующую функцию или удалить ее И также учитывая что в CMS с которой вы работаете может быть много подключаемый файлов которые не разделяют между собой область видимости - то попробуйте добавить ключевое слово global к самому объявлению переменной $a
isle пишет:
Если найду решение - отпишусь, а пока оставляю это гиблое дело - время дорого. Спасибо огромное за внимание.
Пожалуйста! Можете попробовать вышеуказанный пример - веротяно ввиду отсутствия перекрытия областей видимости в нем он сразу заработает
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
isle
Отправлено: 19 Июня, 2010 - 12:11:08
Гость
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
JustUserR пишет:
Аналогичным образом можно изменить существующую функцию или удалить ее И также учитывая что в CMS с которой вы работаете может быть много подключаемый файлов которые не разделяют между собой область видимости - то попробуйте добавить ключевое слово global к самому объявлению переменной $a
Нет, не работает, выдает:
"Fatal error: Call to undefined function runkit_function_add() in ..."
Я очень многое перепробовал скопировать примеров, которые на офф. сайте пхп - ничего не работает, такое ощущение, что либо ранкиты выключены на сервере, либо в ДЛЕ какая-то хитрая защита.
JustUserR
Отправлено: 19 Июня, 2010 - 12:14:45
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
isle пишет:
Я очень многое перепробовал скопировать примеров, которые на офф. сайте пхп - ничего не работает, такое ощущение, что либо ранкиты выключены на сервере, либо в ДЛЕ какая-то хитрая защита
Скорее всего PHP собран без runkit-библиотеки или соответствующее расширение не подключено в конфигурационном файле - так что придется действовать без них
Можете попробовать добавить оператор global при создании переменной - или же попробовать использовать суперглобальный массив $_GLOBALS для доступа к соответствующим переменным
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.