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)

 PHP.SU

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


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

> Описание: Глобальные переменные не назначаются в функции.
isle
Отправлено: 18 Июня, 2010 - 03:51:06
Post Id



Гость


Покинул форум
Сообщений всего: 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???
}}

Вот именно в данной ситуации у меня глобал не работает, в чём дело никак понять не могу, в остальных случаях работает. Проблемку решил левой рукой через правую ногу - подгрузил в каждую функцию огромную кучу переменных через инклюд, но это корявый выход. Ха-ха

Может, чего-то в движке нахимичили ака "спецхитрозащита"? Радость
 
 Top
JustUserR
Отправлено: 18 Июня, 2010 - 12:25:23
Post Id



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


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


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




isle пишет:
Вот именно в данной ситуации у меня глобал не работает, в чём дело никак понять не могу, в остальных случаях работает
Так как вы создаете функцию внутри дополнительного условия то вероятно что она вызывается из области видимости отличной от той где существует переменная $a - попробуйте создавать ваши функции и константы динамически с помощью модуля http://www.php.su/functions/?cat=runkit - в таком случае вы сможете явно указать простнаство имен в котором они создаются
Также необходимо проверить в каком файле или функции а также в какой момент времени создается переменная $a - например если она находится в подключаемом через include файле то она может оказаться в собственном пространстве имен - в таком случае нужно перед ее созданием в подключемом файле также объявить ее как global


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
isle
Отправлено: 18 Июня, 2010 - 19:07:34
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


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




Эх, написал большое сообщение, а оно не напечаталось... Недовольство, огорчение

Эх... ладно.

Спасибо за наводку, попробую.
 
 Top
JustUserR
Отправлено: 19 Июня, 2010 - 11:08:49
Post Id



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


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


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




isle пишет:
Эх, написал большое сообщение, а оно не напечаталось...
Эх... ладно.
Спасибо за наводку, попробую.
Пожалуйста! Также для проверки попробуйте посмотреть из какого контекста и каким образом происходит вызов данных функций - поскольку вероятно ваша функция вызывается в тот момент когда нужная переменная не создана или не изменена - или в силу того что у вас происходит динамическое переопределение функций вызывается не та из них например из другого модуля или еще непереопределенная версия Именно поэтому лучше использовать не прямое определение функций в нужном месте - а их runkit-определение с указанием соответствующего контекста
Насчет сообщения такое бывает если например подвисает интернет то есть вы уже отправили запрос на сохранение сообщения и в этот момент соединение прервалось - и если потом нажать обновление то будет выдано сообщение об ошибке причем текст сообщения никуда не будет сохранен - поэтому при отправке большого сообщения полезно предварительно скопировать его в буфер обмена


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
isle
Отправлено: 19 Июня, 2010 - 11:52:24
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


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




JustUserR пишет:
поскольку вероятно ваша функция вызывается в тот момент когда нужная переменная не создана или не изменена


Вот хотел об этом уточнить в прошлый раз, но ИЕ глюконул и сообщение улетело.

Пробовал переменную прямо перед вызовом функции определить, т.е.

$a = 1;
if (!function_exists('f')) {
function f() {
global $a;
echo $a; #Empty
}}

Так не работает, хотя заметил, что "глобал" первой функции срабатывает, а вот второй и последующих - уже нет, область видимости какая-то "подлокальная" что ли. Огорчение

Цитата:
поэтому при отправке большого сообщения полезно предварительно скопировать его в буфер обмена


С моим корявым интернетом так обычно и делаю, но что-то в прошлый раз как-то автоматом сразу нажал, эх, автопилот подвел. Улыбка

Посидел с "ранкитами" весь день вчера, но что-то они мне туго пока даются, задачку наспех решил, но, видимо, пока что-то сверх серьезное не будет у меня, то вряд ли так разберусь... погуглил сегодня еще - на всех остальных форумах вообще просто тупо удивляются и посылают в учебники, а примерчиков никаких; там нужно сидеть и сидедь, зарывшись в учебники, похоже... Однако Если найду решение - отпишусь, а пока оставляю это гиблое дело - время дорого. Спасибо огромное за внимание.
 
 Top
JustUserR
Отправлено: 19 Июня, 2010 - 12:03:33
Post Id



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


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


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




isle пишет:
Так не работает, хотя заметил, что "глобал" первой функции срабатывает, а вот второй и последующих - уже нет, область видимости какая-то "подлокальная" что ли
По умолчанию в PHP имеется только две области видимости - это глобальная которая является по совместительству межпакетной и локальная которая зависит от уровня вложенности блоков - а множество пространств имен можно сформировать только runkit-ом за счет классов имя которых и дает соответствующее пространство имен
Однако когда вы работаете уже внутри локальной области видимости то внутри нее может формировться несколько подобластей - которые могут не передавать переменные между собой и ключевое слово global на них не действует
isle пишет:
Посидел с "ранкитами" весь день вчера, но что-то они мне туго пока даются, задачку наспех решил
Могу вам привести конкретный пример установки функции в runkit-е
Аналогичным образом можно изменить существующую функцию или удалить ее И также учитывая что в CMS с которой вы работаете может быть много подключаемый файлов которые не разделяют между собой область видимости - то попробуйте добавить ключевое слово global к самому объявлению переменной $a
isle пишет:
Если найду решение - отпишусь, а пока оставляю это гиблое дело - время дорого. Спасибо огромное за внимание.
Пожалуйста! Можете попробовать вышеуказанный пример - веротяно ввиду отсутствия перекрытия областей видимости в нем он сразу заработает


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
isle
Отправлено: 19 Июня, 2010 - 12:11:08
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


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




JustUserR пишет:
Аналогичным образом можно изменить существующую функцию или удалить ее И также учитывая что в CMS с которой вы работаете может быть много подключаемый файлов которые не разделяют между собой область видимости - то попробуйте добавить ключевое слово global к самому объявлению переменной $a


Нет, не работает, выдает:

"Fatal error: Call to undefined function runkit_function_add() in ..."

Я очень многое перепробовал скопировать примеров, которые на офф. сайте пхп - ничего не работает, такое ощущение, что либо ранкиты выключены на сервере, либо в ДЛЕ какая-то хитрая защита.
 
 Top
JustUserR
Отправлено: 19 Июня, 2010 - 12:14:45
Post Id



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


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


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




isle пишет:
Я очень многое перепробовал скопировать примеров, которые на офф. сайте пхп - ничего не работает, такое ощущение, что либо ранкиты выключены на сервере, либо в ДЛЕ какая-то хитрая защита
Скорее всего PHP собран без runkit-библиотеки или соответствующее расширение не подключено в конфигурационном файле - так что придется действовать без них
Можете попробовать добавить оператор global при создании переменной - или же попробовать использовать суперглобальный массив $_GLOBALS для доступа к соответствующим переменным


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB