2010-09-01 5 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 sollte Admin oder Client sein. Oder verpasse ich den Punkt hier völlig und sollte das anders gehen? Es sollte angemerkt werden, dass ich nur eine Antwort akzeptiere, die nicht erfordert, dass ich den Klassennamen als Argument an die registerCallback-Methode sende.So erhalten Sie den Namen der aufrufenden Klasse (in PHP)

+1

Erm, beide Methoden sind Instanzmethoden (nicht Statik), also wenn Sie wirklich brauchen Klassenname für einen anderen Zweck dann nur Echo (d. h. Callback), Sie müssen eine Instanz und dann wahrscheinlich einen Klassennamen angeben ... – Wrikken

Antwort

17

Verwendung get_class():

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

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

In Ordnung! Ein weiterer Sieg! –

+0

Es ist genau das, was ich gesucht habe. :) –

+0

Dies gibt die aufrufende Klasse nicht zurück, nur die Klasse von $ this. Wenn Sie registerCallback mit einer anderen Klasse aufrufen, würde es fehlschlagen. Entweder make registerCallback protected oder matthews verwenden. – user23127

3

Sie sollten wirklich so etwas wie tun:

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

Das ist, wie PHP mit Griffen funktioniert Methoden zu widersprechen.

+0

So funktioniert der interne PHP Callback-Funktionen (wie preg_replace_callback), aber nicht seine Klasse. Seine Klasse würde brechen, wenn er diese Syntax benutzte. –

+0

Er sollte seine Klasse ändern, um mit normalen PHP-Callbacks zu arbeiten, es sei denn, es gibt einen sehr guten Grund, dies nicht zu tun. – Matthew

48

Wenn jemand hierher gekommen suchen, wie den Namen einer rufenden Klasse von einer anderen Klasse zu bekommen wie ich, check this out https://gist.github.com/1122679

EDIT: eingefügt Code

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

Ich denke, wenn du den Code hier eingibst, bekommst du mehr von einem Upvote als nur von mir. (Obwohl, ich liebe GitHub, es ist nur, dass es besser wäre, wenn der Quellcode dafür hier gehostet wäre.) –

+1

Scheint wie @MarkTomlin hatte Recht :) –

+0

Prost für das. Hat mir geholfen. –