Как получить имя вызывающего класса (в PHP) - PullRequest
20 голосов
/ 01 сентября 2010
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 ]

56 голосов
/ 03 августа 2011

Если кто-то пришел сюда в поисках, как получить имя вызывающего класса из другого класса, как я, проверьте это 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'];
    }
}

EG

class A {
    function t() {
        echo get_calling_class();
    }
}

class B {
    function x() {
        $a = new A;
        $a->t();
    }
}

$b = new B;
$b->x(); // prints B
17 голосов
/ 01 сентября 2010

Использование get_class():

$this->callbacks[$onAction][] = $callbackMethod;
$className = get_class($this);

// Call callback method
$className->$callbackMethod();
4 голосов
/ 01 сентября 2010

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

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

Так работает PHP с дескрипторами к объектным методам.

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