Получить исходный код, переданный в функцию PHP в качестве параметров, используя отражение - PullRequest
0 голосов
/ 19 сентября 2009

Мне интересно, есть ли способ сделать следующее:

function whatever($parameter)
{  
    echo funky_reflection_function();
}

whatever(5 == 7); // outputs "5 == 5" (not true or 1)

Я не оптимистичен, но кто-нибудь знает, есть ли какой-нибудь сумасшедший взлом, который я могу сделать, чтобы сделать это?

Ответы [ 4 ]

0 голосов
/ 21 сентября 2009

Просто чтобы вы знали, это функция, которую я сейчас использую:

// gets the line number, class, parent function, file name, and the actual lines of the call
// this isn't perfect (it'll break in certain cases if the string $functionName appears somewhere in the arguments of the function call)
public static function getFunctionCallLines($fileName, $functionName, $lineNumber)
{   $file = file($fileName);

    $lines = array();
    for($n=0; true; $n++)
    {   $lines[] = $file[$lineNumber - 1 - $n];
        if(substr_count($file[$lineNumber - 1 - $n], $functionName) != 0)
        {   return array_reverse($lines);
        }
        if($lineNumber - $n < 0)
        {   return array(); // something went wrong if this is being returned (the functionName wasn't found above - means you didn't get the function name right)
        }
    }
}
0 голосов
/ 19 сентября 2009

Отражение вам здесь не поможет, но вы можете приготовить что-нибудь, используя debug_backtrace ()

function funky_reflection_function()
{
    $trace = debug_backtrace();
    $file = file($trace[1]['file']);
    return $file[$trace[1]['line'] - 1];
}

Очевидно, что это очень глупо и на него не следует полагаться, но если вы пытаетесь что-то отлаживать, это может помочь вам достичь этого. Эта функция выдаст вам всю строку, теперь вам нужно проанализировать ее, чтобы найти выражение, использованное для вызова вашей whatever() функции.

0 голосов
/ 19 сентября 2009

Как уже отвечали, любые аргументы оцениваются перед передачей в функцию, поэтому «исходный код» не передается.

Теперь, когда вы запрашиваете «сумасшедшие хаки», есть пара альтернативных способов передачи случайного «кода» в качестве параметра:

  • как строка - это может быть использовано в create_function () или eval ():

    somefunc ("echo 5 == 7;")

  • как анонимная функция - начиная с php 5.3, у нас есть замыкания и анонимные функции:

    somefunc (function () {return 5 == 7;});

Как сказал Тим, еще немного "контекстной" информации было бы действительно полезно, так как я признаю, что сумасшедшие хаки не совсем результат хорошего дизайна :)

0 голосов
/ 19 сентября 2009

Зед должен был сделать ответ из своего комментария. Если он это сделает, дай ему голос.

Ответ: нет, вы не можете этого сделать.

Оценивается параметр функции (5 == 7), и результатом этой оценки является то, что превращает его в область действия любого ().

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...