2010-09-01 13 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 deve essere admin o client. O mi manca il punto qui completamente e dovrei andare su questo altro modo? Va notato che accetterò solo una risposta che non richiede che invii il nome di classe come argomento al metodo registerCallback.Come ottenere il nome della classe chiamante (in PHP)

+1

Erm, entrambi i metodi sono metodi di istanza (non statici), quindi se è davvero necessario il nome di classe per un altro scopo, quindi solo a farlo eco (ad es. chiamando il callback), devi fornire un'istanza piuttosto che un nome di classe probabilmente ... – Wrikken

risposta

17

Uso get_class():

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

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

OK! Un'altra vittoria! –

+0

È esattamente quello che stavo cercando. :) –

+0

Questo non restituisce la classe chiamante, solo la classe $ this. Se chiami registerCallback con un'altra classe, fallirebbe. O fai in modo che registerCallback sia protetto o in uso. – user23127

3

si dovrebbe davvero fare qualcosa di simile:

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

è così che funziona PHP con maniglie di opporsi metodi.

+0

Ecco come funzionano le funzioni di callback interno di PHP (come preg_replace_callback), ma non la sua classe. La sua classe si spezzerebbe se usasse quella sintassi. –

+0

Dovrebbe cambiare classe per lavorare con normali callback PHP, a meno che non ci sia un buon motivo per non farlo. – Matthew

48

Se qualcuno è venuto qui in cerca di come ottenere il nome di una classe chiamata da un'altra classe come ho fatto io, check this out https://gist.github.com/1122679

EDIT: codice incollato

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

Penso che se si inserisce il codice qui si otterrà più di un upvote quindi solo il mio. (Anche se adoro GitHub, è solo che sarebbe meglio se il codice sorgente fosse ospitato qui.) –

+1

Sembra che @MarkTomlin avesse ragione :) –

+0

Cheers per quello. Mi ha aiutato –

Problemi correlati