IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Call time parameters (https://www.imho.ws/showthread.php?t=129977)

Hubbitus 26.02.2008 03:01

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... Может кто-то уже все-таки делал подобное и поделиться опытом??

Saruman 26.02.2008 03:16

Делать - не делал, но посмотрел бы в сторону Reflection. Правда, он предназначен для реверс-инжиниринга кода, и поможет ли в анализе рантайма с нужными тебе подробностями - утверждать не могу.

Hubbitus 26.02.2008 04:51

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


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

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

EvroStandart 26.02.2008 11:45

А может просто добавить строковую переменную?

Получатся такие варианты вызова:
test($superPuperVar, "$superPuperVar");
test(77, "");

Hubbitus 26.02.2008 13:45

Цитата:

Сообщение от EvroStandart (Сообщение 1526484)
А может просто добавить строковую переменную?

Может конечно. И собственно так и было уже несколько лет :ржать:;):(
Но очень хочется какраз писать просто скажем 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 25.06.2008 15:29

Цитата:

Сообщение от EvroStandart (Сообщение 1526484)
Получатся такие варианты вызова:
test($superPuperVar, "$superPuperVar");

Кстати не так, там одиночные кавычки должны быть, иначе там подставится все также значение переменной.


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

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