2010-09-01 9 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 debe ser admin o cliente. ¿O me estoy perdiendo el punto aquí por completo y debería hacerlo de otra manera? Cabe señalar que solo aceptaré una respuesta que no requiera que envíe el nombre de clase como argumento al método registerCallback.Cómo obtener el nombre de la clase de llamada (en PHP)

+1

Erm, ambos métodos son métodos de instancia (no estáticos), por lo que si realmente necesita el nombre de la clase para otro fin, simplemente hacer eco de ella (es decir llamando a la devolución de llamada), debe proporcionar una instancia en lugar de un nombre de clase probablemente ... – Wrikken

Respuesta

17

Uso get_class():

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

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

¡Está bien! ¡Otra victoria! –

+0

Es exactamente lo que estaba buscando. :) –

+0

Esto no devuelve la clase de llamada, solo la clase de $ this. Si llama a registerCallback con otra clase, fallaría. Haga que registerCallback sea protegido o utilice el enfoque matthews. – user23127

3

realmente debería hacer algo como:

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

Esa es la forma en PHP funciona con asas para objetar métodos.

+0

Así es como funcionan las funciones de devolución de llamada interna de PHP (como preg_replace_callback), pero no su clase. Su clase se rompería si usara esa sintaxis. –

+0

Debería cambiar su clase para trabajar con devoluciones de llamada PHP normales, a menos que haya una muy buena razón para no hacerlo. – Matthew

48

Si alguien vino aquí buscando la manera de obtener el nombre de una clase llamada de otra clase como lo hice, mira esto https://gist.github.com/1122679

EDIT: código pegado

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

Creo que si pones el código aquí obtendrás más de un voto positivo que el mío. (Aunque, me encanta GitHub, es solo que sería mejor si el código fuente para esto estuviera alojado aquí.) –

+1

Parece que @MarkTomlin tenía razón :) –

+0

Saludos por eso. Me ayudó a salir –

Cuestiones relacionadas