Я ищу способ передать метод класса для параметра функции обратного вызова.
Обычно я использую 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()
.
Я ценю вашу информацию.
Я обнаружил, что вообще не нужно создавать статический метод.
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 } }
Создайте статический метод, который возвращает массив, содержащий экземпляр класса и имя метода.
/* 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 } }