Как получить имя вызывающего класса (в PHP)

define('anActionType', 1); $actionTypes = array(anActionType => 'anActionType'); class core { public $callbacks = array(); public $plugins = array(); public function __construct() { $this->plugins[] = new admin(); $this->plugins[] = new client(); } } abstract class plugin { public function registerCallback($callbackMethod, $onAction) { if (!isset($this->callbacks[$onAction])) $this->callbacks[$onAction] = array(); global $actionTypes; echo "Calling $callbackMethod in $callbacksClass because we got {$actionTypes[$onAction]}" . PHP_EOL; // How do I get $callbacksClass? $this->callbacks[$onAction][] = $callbackMethod; } } class admin extends plugin { public function __construct() { $this->registerCallback('onTiny', anActionType); } public function onTiny() { echo 'tinyAdmin'; } } class client extends plugin { public function __construct() { $this->registerCallback('onTiny', anActionType); } public function onTiny() { echo 'tinyClient'; } } $o = new core(); 

$callbacksClass должен быть администратором или клиентом. Или я пропустил здесь пункт целиком и должен пойти по этому пути? Следует отметить, что я буду принимать только ответ, который не требует, чтобы я отправил имя класса в качестве аргумента методу registerCallback.

Использовать get_class() :

 $this->callbacks[$onAction][] = $callbackMethod; $className = get_class($this); // Call callback method $className->$callbackMethod(); 

Если кто-то пришел сюда, чтобы узнать, как получить имя вызывающего класса из другого класса, как я, проверьте это https://gist.github.com/1122679

EDIT: вставленный код

 function get_calling_class() { //get the trace $trace = debug_backtrace(); // Get the class that is asking for who awoke it $class = $trace[1]['class']; // +1 to i cos we have to account for calling this function for ( $i=1; $i<count( $trace ); $i++ ) { if ( isset( $trace[$i] ) ) // is it set? if ( $class != $trace[$i]['class'] ) // is it a different class return $trace[$i]['class']; } } 

НАПРИМЕР

 class A { function t() { echo get_calling_class(); } } class B { function x() { $a = new A; $a->t(); } } $b = new B; $b->x(); // prints B 

Вы действительно должны сделать что-то вроде:

 $this->registerCallback(array($this, 'onTiny'), anActionType); 

Так работает PHP с обработкой методов объектов.