Столкнулся с одной весьма специфической проблемой и не смог найти решение, может, кто уже сталкивался и знает в чем дело?
Суть такая: если вызываю несколько раз одну и туже функцию (специфика нового ДЛЕ), то прихордится ее обрамлять функциями проверки, типа:
if (!defined('f')) {
define('f',1);
global $a;
echo $a; #Empty???
}}
или так:
if (!function_exists('f')) {
function f() {
global $a;
echo $a; #Empty???
}}
Вот именно в данной ситуации у меня глобал не работает, в чём дело никак понять не могу, в остальных случаях работает. Проблемку решил левой рукой через правую ногу - подгрузил в каждую функцию огромную кучу переменных через инклюд, но это корявый выход.
Может, чего-то в движке нахимичили ака "спецхитрозащита"?
1. isle - 18 Июня, 2010 - 03:51:06 - перейти к сообщению
2. JustUserR - 18 Июня, 2010 - 12:25:23 - перейти к сообщению
isle пишет:
Так как вы создаете функцию внутри дополнительного условия то вероятно что она вызывается из области видимости отличной от той где существует переменная $a - попробуйте создавать ваши функции и константы динамически с помощью модуля http://www.php.su/functions/?cat=runkit - в таком случае вы сможете явно указать простнаство имен в котором они создаютсяВот именно в данной ситуации у меня глобал не работает, в чём дело никак понять не могу, в остальных случаях работает
Также необходимо проверить в каком файле или функции а также в какой момент времени создается переменная $a - например если она находится в подключаемом через include файле то она может оказаться в собственном пространстве имен - в таком случае нужно перед ее созданием в подключемом файле также объявить ее как global
3. isle - 18 Июня, 2010 - 19:07:34 - перейти к сообщению
Эх, написал большое сообщение, а оно не напечаталось...
Эх... ладно.
Спасибо за наводку, попробую.
Эх... ладно.
Спасибо за наводку, попробую.
4. JustUserR - 19 Июня, 2010 - 11:08:49 - перейти к сообщению
isle пишет:
Пожалуйста! Также для проверки попробуйте посмотреть из какого контекста и каким образом происходит вызов данных функций - поскольку вероятно ваша функция вызывается в тот момент когда нужная переменная не создана или не изменена - или в силу того что у вас происходит динамическое переопределение функций вызывается не та из них например из другого модуля или еще непереопределенная версия Именно поэтому лучше использовать не прямое определение функций в нужном месте - а их runkit-определение с указанием соответствующего контекстаЭх, написал большое сообщение, а оно не напечаталось...
Эх... ладно.
Спасибо за наводку, попробую.
Эх... ладно.
Спасибо за наводку, попробую.
Насчет сообщения такое бывает если например подвисает интернет то есть вы уже отправили запрос на сохранение сообщения и в этот момент соединение прервалось - и если потом нажать обновление то будет выдано сообщение об ошибке причем текст сообщения никуда не будет сохранен - поэтому при отправке большого сообщения полезно предварительно скопировать его в буфер обмена
5. isle - 19 Июня, 2010 - 11:52:24 - перейти к сообщению
JustUserR пишет:
поскольку вероятно ваша функция вызывается в тот момент когда нужная переменная не создана или не изменена
Вот хотел об этом уточнить в прошлый раз, но ИЕ глюконул и сообщение улетело.
Пробовал переменную прямо перед вызовом функции определить, т.е.
$a = 1;
if (!function_exists('f')) {
function f() {
global $a;
echo $a; #Empty
}}
Так не работает, хотя заметил, что "глобал" первой функции срабатывает, а вот второй и последующих - уже нет, область видимости какая-то "подлокальная" что ли.
Цитата:
поэтому при отправке большого сообщения полезно предварительно скопировать его в буфер обмена
С моим корявым интернетом так обычно и делаю, но что-то в прошлый раз как-то автоматом сразу нажал, эх, автопилот подвел.
Посидел с "ранкитами" весь день вчера, но что-то они мне туго пока даются, задачку наспех решил, но, видимо, пока что-то сверх серьезное не будет у меня, то вряд ли так разберусь... погуглил сегодня еще - на всех остальных форумах вообще просто тупо удивляются и посылают в учебники, а примерчиков никаких; там нужно сидеть и сидедь, зарывшись в учебники, похоже... Если найду решение - отпишусь, а пока оставляю это гиблое дело - время дорого. Спасибо огромное за внимание.
6. JustUserR - 19 Июня, 2010 - 12:03:33 - перейти к сообщению
isle пишет:
По умолчанию в PHP имеется только две области видимости - это глобальная которая является по совместительству межпакетной и локальная которая зависит от уровня вложенности блоков - а множество пространств имен можно сформировать только runkit-ом за счет классов имя которых и дает соответствующее пространство именТак не работает, хотя заметил, что "глобал" первой функции срабатывает, а вот второй и последующих - уже нет, область видимости какая-то "подлокальная" что ли
Однако когда вы работаете уже внутри локальной области видимости то внутри нее может формировться несколько подобластей - которые могут не передавать переменные между собой и ключевое слово global на них не действует
isle пишет:
Могу вам привести конкретный пример установки функции в runkit-е Посидел с "ранкитами" весь день вчера, но что-то они мне туго пока даются, задачку наспех решил
isle пишет:
Пожалуйста! Можете попробовать вышеуказанный пример - веротяно ввиду отсутствия перекрытия областей видимости в нем он сразу заработает
Если найду решение - отпишусь, а пока оставляю это гиблое дело - время дорого. Спасибо огромное за внимание.