Intereting Posts
Функция php mail () и IIS Как преобразовать регулярное выражение PHP в JavaScript regex Маршруты Codeigniter для передачи параметров get в индекс Как я могу узнать, сколько подключений MySQL открыто? Как объединить два массива вместе? API Vimeo: потоковая загрузка с использованием HTTP PUT и загрузки jQuery для синейма Является ли эта функция mail () безопасной от вставки заголовка? Скорость страницы – скорость ответа скрипта mail (): ответ SMTP-сервера: 550 Недопустимый адрес на hmailserver Как сопоставить любое слово в String с регулярным выражением в PHP PHP exec () использование памяти Facebook Pagetab App – пользователи очень понравились Извлечение значения из текстового поля в форме (представлении) в контроллер в codeigniter php при выборе selectbox PHPUnit – «Никаких тестов не выполняется» при использовании файла конфигурации В чем разница (при применении к моему коду) между INT (10) и INT (12)?

Передача класса метода в качестве функции обратного вызова в 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() .

Я ценю вашу информацию.

Я обнаружил, что вообще не нужно создавать статический метод.

 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 } }