2010-09-01 6 views
19
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.Как получить имя вызывающего класса (в PHP)

+1

Erm, оба метода - это методы экземпляра (не статика), поэтому, если вам действительно нужно имя класса для другой цели, а затем просто эхо его (т. вызывая обратный вызов), вы должны предоставить экземпляр, а не имя класса, вероятно ... – Wrikken

ответ

17

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

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

// Call callback method 
$className->$callbackMethod(); 
+0

Хорошо! Еще одна победа! –

+0

Это именно то, что я искал. :) –

+0

Это не возвращает вызывающий класс, просто класс $ this. Если вы вызове registerCallback с другим классом, он потерпит неудачу. Либо сделайте registerCallback защищенным, либо используйте подход matthews. – user23127

3

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

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

То есть, как PHP работает с ручками на объект методы.

+0

Так работают внутренние функции обратного вызова PHP (например, preg_replace_callback), но не его класс. Его класс сломался бы, если бы он использовал этот синтаксис. –

+0

Он должен изменить свой класс, чтобы работать с обычными обратными вызовами PHP, если только не существует очень веской причины. – Matthew

48

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

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 
+3

Я думаю, что если вы поместите здесь код, вы получите больше очков, а затем моих. (Хотя, я действительно люблю GitHub, просто было бы лучше, если бы здесь был размещен исходный код для этого.) –

+1

Кажется, что @MarkTomlin был прав :) –

+0

Приветствия. Помог мне. –

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