Как получить имя вызывающего класса (в 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.
3 ответа:
Использование
get_class()
:$this->callbacks[$onAction][] = $callbackMethod; $className = get_class($this); // Call callback method $className->$callbackMethod();
Если кто-то пришел сюда, чтобы узнать, как получить имя вызывающего класса из другого класса, как это сделал я, проверьте это https://gist.github.com/1122679
Редактировать: вставленный код
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