2010-07-22 6 views
0

Как получить имя метода вызывающего объекта в конструкторе класса, get_called_class() дает мне имя расширенного класса, который был создан, но как я могу получить имя метода, который был вызван в этом классе? Мне нужно это для производственного состояния, поэтому debug_backtrace() не является хорошим решением.Как получить имя вызываемой функции в __construct без debug_backtrace

ответ

1

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

0

Если вы не хотите использовать функцию debug_backtrace(), вы также можете бросить и поймать исключение, чтобы получить обратную трассировку.

Но это тоже некрасиво ... В любом случае:

try 
{ 
    throw new Exception(); 
} 
catch(Exception $e) 
{ 
    print_r($e->getTrace()); 
} 

Я не знаю, почему вам нужно звонящему. Возможно, вы можете исправить это, используя другую логику.
Это должно быть лучше, чем получить трассировку ...

EDIT

Исключение не нужно быть выброшен. Извините за эту часть.
Таким образом, вы можете просто использовать:

$e = new Exception(); 
print_r($e->getTrace()); 

Но еще раз, вы должны не должны использовать это!

+0

Невозможно использовать просто: '$ e = new Exception; $ E-> getTrace() '? Требуется ли бросить, чтобы получить след? – NikiC

+1

Я так и думал, но я только что протестировал, и нет, его не нужно бросать. – Macmade

0

Похоже, что нет способа получить его без debug_backtrace(). Тем не менее вы можете создать свою функцию для этого. Пример из manual:

function get_caller_method() 
{ 
    $traces = debug_backtrace(); 

    if (isset($traces[2])) 
    { 
     return $traces[2]['function']; 
    } 

    return null; 
} 
0

Там нет автоматического способа сделать это, кроме медленного/уродливой debug_backtrace или передавая имя в качестве аргумента конструктора .... но вы не должны действительно строить эти виды зависимостей в ваших классах.

Смежные вопросы