PHP параметріндегі өрнекті шығару мүмкін бе?

PHP тестілеу сценарийлері үшін кейбір өрнектің нәтижелерін баяндайтын report() функциясы қажет:

report(in_array(null, $array));
report(in_array(false, $array)); 
# etc...

The output should look like:

in_array(null, $array) => false
in_array(false, $array) => true

Сондықтан нәтижені бірге өрнекті басып шығарғым келеді. Мәселен, есеп функциясында қоңырау шалушы берген өрнек қалай басып шығаруға болады?

function report($expr)
{
    SOME_FUNCTION($expr) 
        # function I'm looking for!!
        # function which would write the string 'in_array(null, $array)' to output!
    echo " => ";
    echo $expr;
    echo "
"; }

Is there any such function that would dump the expression as given by the caller? I know this can't be "normal" function, this would need to be somehow bound to PHP internals. But if there are magic things like debug_print_backtrace(), __FUNCTION__ or __LINE__, then I think there still can be some chance...

0
Бұл assert ('$ expr ()'); дегенге ұқсас. Дегенмен, сіз оны себепке байланысты пайдалана алмайсыз.
қосылды автор mario, көзі

1 жауаптар

Тікелей, сіз қалаған нәрсені істеудің таза әдісі жоқ.

Осының арқасында, стэкті алу үшін debug_backtrace қолдануға болады. Содан кейін, сізге қажет бір нәрсе - стека артқа қарай жүру (2-массив элементіне барыңыз) және сізде файл және сызық туралы ақпарат бар. Содан кейін, функция атауын және кірістерді шығару үшін сол жолды талдауға тура келеді.

Бұл таза болмас еді. Бұл оңай болмас еді. Және бұл 100% сенімді болмас еді. Бірақ бұл көп жағдайда жұмыс істеуі керек ...

мұнда мұны істеу үшін утилита функциясының қарапайым жағдайы бар. Оны функция атауымен ғана атаңыз, және ол сізге функцияның нақты қоңырау шалушысын береді:

function getArgs($func) {
    $d = debug_backtrace();
    $call = $d[1];
    $file = file($call['file']);
    $line = $file[$call['line'] - 1];
    if (preg_match('(' . preg_quote($func, '(') . '\((.*)\);)', $line, $match)) {
        return $match[1];
    }
    return $line;
}

Міне мысал:

function doSomething($arg) {
    $call = getArgs(__FUNCTION__);
    echo $call . ' - ' . $arg;
}

doSomething(strlen('foo'));

Шығаратыны:

strlen ('foo') - 3

3
қосылды
күрделі шешім, рахмет.
қосылды автор TMS, көзі
@TomasT: Бұл 100% сенімді емес (әсіресе қоңырау талдаулары), бірақ бұл ештеңеден де жақсы. Ол парамды қайтаруға тырысады, ал егер ол сәтсіз болса, ол бүкіл сызықты қайтарады. Тіркеуді біршама кеңейте аласыз ...
қосылды автор ircmaxell, көзі