Получить область вызова в функции PHP? - PullRequest
6 голосов
/ 14 июля 2011

Могу ли я получить доступ к области вызывающей среды из вызываемой функции?

Например, я хотел бы получить доступ к __LINE__ в функции регистрации, но это должен быть __LINE__ извызывающая среда.Я также хотел бы иметь какой-то способ вызова get_defined_vars() для получения переменных вызывающих.

В обоих примерах исключается необходимость иметь дополнительный аргумент.

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 19 марта 2017

Нет способа получить переменные вызывающих, но вы можете получить их аргументы. Это легко сделать с помощью debug_backtrace():

<?php

class DebugTest
{
    public static function testFunc($arg1, $arg2) {
        return self::getTrace();
    }

    private static function getTrace() {
        $trace = debug_backtrace();
        return sprintf(
            "This trace function was called by %s (%s:%d) with %d %s: %s\n",
            $trace[1]["function"],
            $trace[1]["file"],
            $trace[1]["line"],
            count($trace[1]["args"]),
            count($trace[1]["args"]) === 1 ? "argument" : "arguments",
            implode(", ", $trace[1]["args"])
        );
    }
}

echo DebugTest::testFunc("foo", "bar");

Запустив эту программу, мы получим следующий вывод:

This trace function was called by testFunc (/Users/mike/debug.php:23) with 2 arguments: foo, bar

debug_backtrace() возвращает массив; элемент 0 - это функция, в которой была вызвана сама функция, поэтому мы используем элемент 1 в примере. Вы можете использовать петлю, чтобы пройти весь путь назад по трассе.

0 голосов
/ 14 июля 2011

В некотором роде, но не так, как было бы разумно использовать в рабочем коде.

В обоих примерах исключается необходимость иметь дополнительный аргумент.

Это сделает ваш код очень трудным для понимания, так как вы нарушите подразумеваемую инкапсуляцию, которую имеет функция.

При всем этом вы можете использовать глобальную переменную для этого?

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