Как получить объект, который вызывает функцию в PHP?

avatar
user5741640
7 апреля 2018 в 23:45
59
2
1

PHP предоставляет функцию get_class(), которая не требует параметра, если она вызывается в контексте класса.

Я хочу написать аналогичную функцию, способную извлекать вызывающий объект без его явной передачи. Я пытался использовать debug_backtrace(), но индекс object не установлен:

function outer_function() {
    var_dump(debug_backtrace());
}

class ExampleObject {
    function __construct() {
        outer_function();
    }
}

new ExampleObject();

eval на 3v4l.org

Обратите внимание, что не имеет значения, вызывается функция из конструктора или нет; get_class() также работает, если вызывается внутри конструктора.

Источник
Ben
7 апреля 2018 в 23:51
0

Это из функции-члена, потому что если это так, $this должно работать нормально.

user5741640
7 апреля 2018 в 23:53
0

@Ben Нет, a() не является членом класса A. Может быть, мне следует отредактировать код, чтобы избежать недоразумений.

ankabot
8 апреля 2018 в 00:11
0

Привет, что ты имеешь в виду под объектом? Класс объекта?

Ответы (2)

avatar
sevavietl
9 апреля 2018 в 07:07
1

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

function get_caller(): ?object
{
    foreach (debug_backtrace() as $call) {
        if (isset($call['object'])) {
            return $call['object'];
        }
    }

    return null;
}

Вот демо.

avatar
ArtisticPhoenix
7 апреля 2018 в 23:52
0

Что-то вроде этого

 public function trace($offset = 0)
 {
    $trace = debug_backtrace(false);
    foreach ($trace as $t) {
        // print_r($t);
        // print_r($offset);
        if ($t['file'] != __FILE__) {
            break;
        }

        ++$offset;
    }
    $arr = array_slice($trace, ($offset - count($trace)));
    return $arr;
}

Это из пакета отладки, который я написал,

https://github.com/ArtisticPhoenix/Debug

Или вы можете получить его с помощью композитора

evo/debug

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

Это работает до тех пор, пока вызов не находится в том же файле.