2012-10-10 49 views
-1

一個回調函數這是this question的延續。當類擴展時,它指的是原來的類方法。在創建頁面中迴應類的名稱應該是AnotherAdminPage這是擴展類的名稱。傳遞擴展類方法,如在WordPress

/* 
    Plugin Name: static method callback demo 
*/ 

class AnotherAdminPage extends AdminPageClass { 
} 

add_action('admin_menu', AnotherAdminPage::_admin_menu()); 

class AdminPageClass { 

    static function _admin_menu() { 
     $class_name = get_class(); 
     $classinstance = new $class_name(); 
     return array(&$classinstance, "admin_menu"); 
    } 
    function admin_menu() { 
     add_options_page(
      'Sample Admin Page Class', 
      'Sample Admin Page Class', 
      'manage_options', 
      'sample_admin-page_class', 
      array(&$this, 'admin_page')); 
    } 
    function admin_page() { 
     ?> 
     <div class="wrap"> 
      <p><?php echo get_class(); ?></p> 
     </div> 
     <?php 
    } 
} 

它通過重新定義擴展的類的方法,但它變得有些無意義它在這種情況下延長。

class AnotherAdminPage extends AdminPageClass { 

    static function _admin_menu() { 
     $class_name = get_class(); 
     $classinstance = new $class_name(); 
     return array(&$classinstance, "admin_menu"); 
    } 
    function admin_page() { 
     ?> 
     <div class="wrap"> 
      <p><?php echo get_class(); ?></p> 
     </div> 
     <?php 
    } 
} 

那麼有沒有更優雅的做法呢?

回答

-1

我發現我自己,這個工作。

/* 
    Plugin Name: extended class method as a callback demo 
*/ 

class AnotherAdminPage extends AdminPageClass { 
} 

add_action('admin_menu', array(new AnotherAdminPage, "admin_menu")); 

class AdminPageClass { 

    function admin_menu() { 
     add_options_page(
      'Sample Admin Page Class', 
      'Sample Admin Page Class', 
      'manage_options', 
      'sample_admin_page_class', 
      array(&$this, 'admin_page')); 
    } 
    function admin_page() { 
     ?> 
     <div class="wrap"> 
      <p><?php echo get_class($this); ?></p> 
     </div> 
     <?php 
    } 
} 
+0

因爲您不再使用靜態函數,所以不是真正的答案 – soju

+0

所以這是一個與靜態範圍有關的問題。謝謝你提到它。但這樣,擴展類似乎是指自己的實例。這是我想要的。但奇怪的是,如果不重新定義'msg()'方法,它會引用原始的。 – Teno

1

您應該使用get_called_class(PHP 5.3)

編輯

如果你沒有PHP 5.3,你應該閱讀這

PHP get_called_class() alternative

+0

感謝您的輸入。我使用的服務器之一是PHP版本5.2.17。有沒有解決方法? – Teno

+0

更新的答案。 – soju

+0

謝謝。所以在v5.2.x中是不可能的。我找到了一個解決方法。我發佈它作爲答案。 – Teno