2010-09-01 46 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 2010-09-01 21:14:23

回答

17

使用get_class()

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

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

好吧!另一個勝利! – 2010-09-02 01:34:46

+0

這正是我所期待的。 :) – 2010-09-02 08:41:39

+0

這不會返回調用類,只是$ this的類。如果你用另一個類調用registerCallback,它會失敗。要麼registerCallback保護或使用matthews方法。 – user23127 2014-04-20 16:44:46

3

你真的應該這樣做:

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

也就是說PHP如何與句柄對象的方法。

+0

這就是PHP內部回調函數(如preg_replace_callback)的工作方式,但不是他的類。如果他使用了這種語法,他的課程就會中斷。 – 2010-09-01 18:38:42

+0

他應該改變他的類來使用普通的PHP回調工作,除非有很好的理由不這樣做。 – Matthew 2010-09-01 18:43:25

48

如果有人來到這裏尋找如何從另一個類,像我一樣得到了調用類的名字,看看這個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 
+3

我認爲如果你把代碼放在這裏,你會得到更多的upvote,然後就是我的。 (雖然我很喜歡GitHub,但是如果源代碼是在這裏託管的話,它會更好。) – 2011-08-04 13:48:44

+1

好像@MarkTomlin是對的:) – 2014-04-15 06:00:27

+0

爲此歡呼。幫我出去了。 – 2015-07-23 10:36:51