PHP - переопределить существующую функцию
Можно ли обновить существующую функцию с тем же именем, но с другим кодом? Или как-то "отключить" старую функцию?
Я хочу переопределить основную функцию WordPress, но так как плагины и тема часто называют эту функцию, мне нужно сохранить одно и то же имя функции.
Ответы
Ответ 1
Только если вы используете что-то вроде APD, которое расширяет движок zend для этого:
Intro
Документы переопределения методов
Примечание. Runkit кажется лучшим вариантом, чем APD, поскольку он более специфичен для этой цели и позволит вам сохранить оригинальный метод без изменений на другом адресе.
Ответ 2
Вы можете использовать крючки WordPress (называемые фильтрами и действиями), а затем использовать функцию add_filter()
для переопределения функции, которую вы используете.
то есть.
function function_name() {
//code goes here
}
$hook = 'get_options'; // the function name you're filtering
add_filter( $hook, 'function_name' );
Кодекс поможет вам в этом.
http://codex.wordpress.org/Plugin_API/Filter_Reference
Ответ 3
Просто прокомментируйте старую функцию и напишите новую;)
В PHP невозможно переопределить или перегрузить (т.е. определить функцию с тем же именем, но с разными параметрами) функцию изначально. Существуют расширения, такие как runkit, которые позволяют переопределять функции (runkit_function_redefine
), но вы, вероятно, не хотят использовать их (такие расширения редко устанавливаются и в основном ненадежны.)
Ответ 4
Вы можете обернуть блок, определяющий исходную функцию, в условной проверке, если другое одноименное имя еще не определено (я предполагаю, что вы имеете в виду функции Wordpress, а не ядро PHP)
<?php
if(!function_exists('function_name')){
//old definition here
} ?>
Затем вы можете переопределить его выше, сохранив при этом оригинал, если вам нужно будет вернуться к нему.
В зависимости от того, насколько сложны изменения и сколько раз вы можете это сделать, вы также можете посмотреть Namespaces, если вы находятся на PHP 5.
Ответ 5
Мое решение состояло в следующем:
function suffusion_get_image($options = array()) {
include_once ABSPATH.'wp-content/themes/suffusion-child/functions/media.php';
return childtheme_overide_suffusion_get_image($options = array());
....
}
Очевидно, что при обновлении есть накладные расходы, так как вам нужно будет снова добавить строки в сценарии, и я успешно использовал этот метод на сегодняшний день, но теперь попытаюсь сделать это с помощью get_terms
в wp-include и нажав на повторную декларацию вопрос, который я пытаюсь решить или обходиться на данный момент.
Моя причина для редактирования ядра заключается в том, что существующее ядро не обеспечивает удобный способ для многозадачного требования.
Кто-то только что предложил на другом форуме, но используя override_function
, но руководство написано так, что оно, по-видимому, полезно только для встроенных функций - я понял, что это означает, что PHP встроен в функции