2010-09-01 34 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 phải là quản trị viên hoặc khách hàng. Hay tôi đang thiếu điểm ở đây hoàn toàn và nên đi theo cách này? Cần lưu ý rằng tôi sẽ chỉ chấp nhận một câu trả lời mà không yêu cầu tôi gửi tên lớp như một đối số cho phương thức registerCallback.Cách lấy tên của lớp gọi điện thoại (bằng PHP)

+1

Erm, cả hai phương pháp đều là phương pháp thể hiện (không phải là thống kê), vì vậy nếu bạn thực sự cần tên lớp cho một mục đích khác sau đó chỉ lặp lại nó (tức là gọi lại gọi lại), bạn phải cung cấp một cá thể thay vì một tên lớp có thể là ... – Wrikken

Trả lời

17

Sử dụng get_class():

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

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

Được rồi! Một chiến thắng khác! –

+0

Đó chính xác là những gì tôi đang tìm kiếm. :) –

+0

Điều này không trả lại lớp gọi, chỉ là lớp $ this. Nếu bạn gọi registerCallback với một lớp khác nó sẽ thất bại. Hoặc là bảo vệ registerCallback hoặc sử dụng cách tiếp cận matthews. – user23127

3

Bạn thực sự nên làm một cái gì đó như:

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

Đó là cách PHP làm việc với tay cầm để phản đối phương pháp.

+0

Đó là cách các hàm gọi lại nội bộ PHP (như preg_replace_callback) hoạt động, nhưng không phải là lớp của nó. Lớp học của anh sẽ phá vỡ nếu anh sử dụng cú pháp đó. –

+0

Ông nên thay đổi lớp học của mình để làm việc với các cuộc gọi lại PHP bình thường, trừ khi có một lý do rất tốt không. – Matthew

48

Nếu bất cứ ai đến đây tìm kiếm làm thế nào để có được tên của một lớp gọi điện thoại từ một lớp khác như tôi đã làm, check this out https://gist.github.com/1122679

EDIT: dán đang

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

Tôi nghĩ rằng nếu bạn đặt mã ở đây bạn sẽ nhận được nhiều hơn một upvote sau đó chỉ của tôi. (Mặc dù, tôi yêu GitHub, nó chỉ là nó sẽ tốt hơn nếu mã nguồn cho điều này được lưu trữ ở đây.) –

+1

Có vẻ như @MarkTomlin đã đúng :) –

+0

Chúc mừng cho điều đó. Giúp tôi. –

Các vấn đề liên quan