Подтвердить что ты не робот

PHP - переопределить существующую функцию

Можно ли обновить существующую функцию с тем же именем, но с другим кодом? Или как-то "отключить" старую функцию?

Я хочу переопределить основную функцию WordPress, но так как плагины и тема часто называют эту функцию, мне нужно сохранить одно и то же имя функции.

4b9b3361

Ответ 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 встроен в функции