2012-10-09 39 views
3

我正在尋找一種將類方法傳遞給回調函數參數的方法。在WordPress中傳遞類方法作爲回調函數

我通常使用create_function()如下,但我聽說它很慢,使調試困難。

add_action('init', create_function('', '$o = new AdminPageClass;')); 
class AdminPageClass { 

    function __construct() { 
     add_action('admin_menu', array(&$this, '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"> 
      <h1>Hi there</h1> 
      <p>Hello World!</p> 
     </div> 
     <?php 
    } 
} 

當然,它可以用這樣的額外功能來完成;但是,如果可能的話,我希望沒有它。

add_action('init', 'load_admin_page_class'); 
function load_admin_page_class() { 
    $o = new AdminPageClass; 
} 

此外,在它使它成爲可能之前實例化類對象,但它也會創建一個額外的行。

$o = new AdminPageClass; 
add_action('admin_menu', array(&$o, '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"> 
      <h1>Hi there</h1> 
      <p>Hello World!</p> 
     </div> 
     <?php 
    } 
} 

我總是在不同的文件中定義類,所以我更喜歡減少主插件文件中第一行的方法。但如前所述,應避免使用create_function()

我感謝您的信息。

回答

7

我發現根本沒有必要創建一個靜態方法。

add_action('admin_menu', array(new AdminPageClass, "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"> 
      <h1>Hi there</h1> 
      <p>Hello World!</p> 
     </div> 
    <?php 
    }  
} 
+0

好的和有益的答案。謝謝。這對我幫助很大。 –

6

創建一個靜態方法,該方法返回包含類實例和方法名稱的數組。

/* 
    Plugin Name: static method callback demo 
*/ 

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

class AdminPageClass { 

    static function _admin_menu() { 
     $class_name = get_class(); 
     $classinstance = new $class_name(); 
     return array(&$classinstance, "admin_menu"); 
    } 
    function admin_menu($instantiate=false) { 
     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"> 
      <h1>Hi there</h1> 
      <p>Hello World!</p> 
     </div> 
     <?php 
    } 
} 
+0

我發現了一個問題。當這個類被擴展時,它不會引用擴展類,而是引用原始類。我問了一個新問題:http://stackoverflow.com/questions/12820728/passing-extended-class-method-as-a-call-back-function-in-wordpress – Teno

+0

你好單身! – kaiser

相關問題