imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Веб-мастеру > Веб-программирование
Опции темы
Старый 26.02.2008, 03:01     # 1
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Call time parameters

Суть в чем, лучше сразу пример:

Есть:
PHP код:
function test($arg0){
...

Есть где-то в документе дальше ее вызов:
PHP код:
$superPuperVar 77;
test($superPuperVar); 
Так, естественно параметры передаются нормально, но очень-очень хочется (предвосхищая вопросы, прежде всего для дебага и логгинга) получть не только значение или ссылку на значение, а именно в самой функции получить с каким параметром ее реально вызвали в самом документе, в виде строки, скажем в данном случае хочется понять что первый аргумент был именно '$superPuperVar' а не прямой вызов test(77).

Такое вообще возможно?

Долго читал доки, так и не нашел.
Есть debug_backtrace() он говорит откуда вызвано (файл, строка и все то же значение параметра). Появилась безумная идея открыть этот файл и распарсить напрямую ту строку либо регулярным выражением, либо с помощью прямого перебора токенов. Но есть несколько НО тут:
  1. Сам по себе метод изначально крив
  2. В выводе debug_backtrace есть только номер строки, не символа, значит впринципе нету надежного способа определить если в одной строке несколько вызовов одной и той же функции
  3. debug_backtrace возвращает строку закрывающей скобки, а не открывающей, если вызов больше чем на строку. Ну это решаемо конечно, но дополнительный геморой все же.
  4. Даже исходя из предположения что она в строке одна, это оказывается весьма и весьма трудоемкой задачей, если попытаться написать общий случай вызова, с вложенными скобками, кавычками, отступами и прочим и прочим... (писать полноценный парсер PHP на PHP как-то совсем не входило в мои планы)

В итоге так и не знаю что делать. Смотрел в сторону Runkit, Parsekit, Tokenizer, Aggregation... Может кто-то уже все-таки делал подобное и поделиться опытом??
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.

Последний раз редактировалось Hubbitus; 26.02.2008 в 04:46. Причина: Очепятки исправил
Hubbitus вне форума  
Старый 26.02.2008, 03:16     # 2
Saruman
::VIP::
 
Аватар для Saruman
 
Регистрация: 12.11.2002
Адрес: Nicosia, Cyprus
Сообщения: 1 285

Saruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman Гуру
Делать - не делал, но посмотрел бы в сторону Reflection. Правда, он предназначен для реверс-инжиниринга кода, и поможет ли в анализе рантайма с нужными тебе подробностями - утверждать не могу.
__________________
"If people only knew how hard I work to gain my mastery, it wouldn't seem so wonderful at all." Michelangelo Buonarroti
Saruman вне форума  
Старый 26.02.2008, 04:51     # 3
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Ну собственно парсер я-таки накидал работает, единственное не вижу никакого способа решить 2 пункт выше...


Saruman, прежде всего, спасибо большое за ответ.

Я забыл его упомянуть, Reflection я тоже смотрел краем глаза. Собственно в поисках пробовал даже, чуть ниже приведенный, пример "Example#3 Using the ReflectionParameter class" - оно неплохо работает, но именно для формальных параметров, то есть для определения функций и методов, но не рантайм к сожалению. Ну или я не вьехал как сделать нужное мне....
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  
Старый 26.02.2008, 11:45     # 4
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

EvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собой
А может просто добавить строковую переменную?

Получатся такие варианты вызова:
test($superPuperVar, "$superPuperVar");
test(77, "");
EvroStandart вне форума  
Старый 26.02.2008, 13:45     # 5
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Цитата:
Сообщение от EvroStandart Посмотреть сообщение
А может просто добавить строковую переменную?
Может конечно. И собственно так и было уже несколько лет
Но очень хочется какраз писать просто скажем dump($someVar) и на выходе получить (упрощая разумеется) что-то типа:
Var $varName has value: var_dump($varValue);

Это первая, и наверное самая главная причина.

Вторая, во многих методах, для проверки переданного значения я использую макрос REQUIRED_VAR, приблизительно таким способом:
$myVar = REQUIRED_VAR($_REQUEST['varFromUser']); где REQUIRED_VAR не делает ничего, кроме как "проверяет" переменную переданную по ссылке (if(!$var)) и возбуждает исключение VariableRequiredException если она пустая. Так вот, писать во всех местах $myVar = REQUIRED_VAR($_REQUEST['varFromUser'], '$_REQUEST[\'varFromUser\']'); мало того что избыточно, так и просто утомительно, поскольку используется весьма часто и в разных местах.
А иначе, я конечно ловлю исключение, но если в try-блоке было 5-7 таких вызовов, то даже нету возможности узнать какое именно значение пустое
Ну и конечно же строка в логе типа просто "2008-02-26 04:52:31: var: Variable requered!" выглядит намного менее полезной чем скажем: "2008-02-26 04:52:31: var: Variable $_REQUEST['mail'] requered!", согласитесь.


P.S. Эээх, хоть это и интерпретатор, а все-таки не хватает хоть элементарного препроцессора иногда (я бы тогда в первую очередь еще "$this->" заменил бы на что-нибудь типа "$->" хотя бы)...
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.

Последний раз редактировалось Hubbitus; 26.02.2008 в 13:50.
Hubbitus вне форума  
Старый 25.06.2008, 15:29     # 6
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Цитата:
Сообщение от EvroStandart Посмотреть сообщение
Получатся такие варианты вызова:
test($superPuperVar, "$superPuperVar");
Кстати не так, там одиночные кавычки должны быть, иначе там подставится все также значение переменной.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 14:33.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.