Как отказаться от функции, используемой в плагине?

17

Одной из функций, которые я использую в своем плагине, является загрязнение глобальной области видимости именем, которое может конфликтовать с другой функцией (используемой в другом плагине). Итак, я думаю, я должен осудить это. Но как мне это сделать?

function foo() {
    echo 'bar';
}

Я знаю, _deprecate_function()но был бы благодарен за пример, показывающий все шаги, которые я должен предпринять, чтобы удалить функцию из ядра моего плагина.

Ссылка: https://developer.wordpress.org/reference/functions/_deprecated_function/

henrywright
источник
Хороший вопрос, но не пришло ли время для пространства имен вашего плагина? Вы по-прежнему можете вызывать новое пространство имен из устаревшей функции ...
brianlmerritt
Пространство имен - это вариант, который я хочу изучить, но пока не совсем решил, должен ли я отказаться от поддержки PHP 5.2.
Генрирайт
Загрузка устаревшей альтернативы, если версия php слишком мала, но пространство имен в противном случае может дать вам путь перехода. Тогда ваше устаревшее сообщение может быть «ваш хостинг-провайдер не поддерживает PHP 5.3+, бла-бла и т. Д.»
brianlmerritt

Ответы:

11

В дополнение к ответу @Welcher:

В ядре есть несколько хороших примеров « кладбища », где « функции умирают ».

Вы можете использовать их в качестве руководства, например, в отношении документации.

Вот один такой пример для permalink_link()подwp-includes/deprecated.php

/**
 * Print the permalink of the current post in the loop.
 *
 * @since 0.71
 * @deprecated 1.2.0 Use the_permalink()
 * @see the_permalink()
 */
function permalink_link() {
        _deprecated_function( __FUNCTION__, '1.2', 'the_permalink()' );
        the_permalink();
}

Вот встроенная документация для _deprecated_functionфункции, которая объясняет входные аргументы:

/**
 * Mark a function as deprecated and inform when it has been used.
 *
 * There is a hook deprecated_function_run that will be called that can be used
 * to get the backtrace up to what file and function called the deprecated
 * function.
 *
 * The current behavior is to trigger a user error if WP_DEBUG is true.
 *
 * This function is to be used in every function that is deprecated.
 *
 * @since 2.5.0
 * @access private
 *
 * @param string $function    The function that was called.
 * @param string $version     The version of WordPress that deprecated the function.
 * @param string $replacement Optional. The function that should have been called. 
 *                            Default null.
 */
birgire
источник
1
Спасибо за это. Я не думал смотреть на подход, принятый ядром! Итак, я предполагаю, что это шаги, которые мне нужно предпринять? 1) удалить весь исходный контент из моей функции 2) добавить вызов к _deprecated_function()3) добавить вызов к моей новой функции, которая заменяет старую
henrywright
1
Это звучит как двусторонняя проблема, обсуждаемая здесь - устаревание и возможное столкновение имен. Я только обратился к первой части здесь в соответствии с названием вопроса.
birgire
1
@MarkKaplun Я согласен, что есть 2 проблемы. Вопрос заключался в том, как отказаться от функции, и на этом был основан мой ответ. Уведомление __doing_it_wrong предназначено для разработчиков, которые вызывают этот метод в своих темах и т. Д., Чтобы они могли реагировать на изменения в API, а не просто на белый экран сайта. Log Deprecated Notices - отличный плагин для разработчиков, который позволяет вам быть в курсе основных изменений и также поможет в этом случае.
Велчер
1
@MarkKaplun Я понимаю вашу точку зрения. Однако я бы поспорил, что часть устаревания заключается в поддержании обратной совместимости, пока элемент не будет удален из API. Смысл уведомления (независимо от того, какой метод используется для его генерации) заключается в том, чтобы информировать разработчиков, использующих метод, о том, что он будет удален, и дать им время действовать соответствующим образом. Чтобы осквернить что-то, нужно выделить и удалить его, а правильный способ - сначала дать пользователям
преимущество
2
@MarkKaplun Я не уверен, против чего вы спорите (или за?). Вопрос заключался в том, как отказаться от метода, и это ясно из того факта, что OP говорит, что «мой плагин» знает, что означает «устаревание», что он разработчик. Мнимый пользователь, о котором вы говорите, не имеет никакого отношения к этому конкретному вопросу. Если вы беспокоитесь о получении миллиона уведомлений в журнале, эти методы выводятся только в том случае, если WP_DEBUG включен и, на ваш взгляд, это не будет включено не разработчиками и, конечно, не в производстве. Я собираюсь с уважением просто согласиться не согласиться с ходом :)
Welcher
7

Устаревание не всегда равно удалению, это обычно означает, что элемент помечен для СОБЫТИЯ для удаления из API. Это метод, который будет вызываться извне - как другие плагины или разработчики? Если этот метод только когда-либо используется плагином внутри, вы можете безопасно удалить его и заменить его на более подходящую функцию name.

Если нет, я бы создал функцию с лучшим именем, и одна из них с плохим именем вызывала ее __doing_it_wrongвызовом - читайте об этом в кодексе. Это даст другим разработчикам время обновить свои ссылки на метод, и вы можете безопасно удалить метод в более поздняя версия.

function badly_named() {

    __doing_it_wrong( 'badly_named', 'This method has been deprecated in favor of better_named_function' );

    /**
     * Call the better named method
     */
     better_named_function();
}

Надеюсь это поможет!

Welcher
источник
Спасибо за это, но я думаю, что я должен скопировать, как это делает ядро. Взгляните на ответ @birgire для примера
henrywright
Звучит хорошо для меня :)
Welcher
1

Вы создаете новый плагин и советуете пользователям переходить на него, поскольку текущий - EOL.

Нет ничего более раздражающего, чем авторы плагинов и тем, которые меняют свои общедоступные API и пытаются воспринимать это как «просто еще одно небольшое обновление». Нет причин ломать сайты из-за проблемы, на которую ваши пользователи фактически не влияют.

Марк Каплун
источник
Мои пользователи будут полностью затронуты этим, если другой плагин имеет функцию с точно таким же именем (и не использует пространства имен).
Генрирайт
Нет, активация плагина не удастся, и они будут жаловаться вам или автору другого плагина. Общее время срыва около нуля. Если им нужно, чтобы оба плагина были обновлены до нового, это должно занять не более 15 минут без прерывания работы сайта. Вы хотите, чтобы некоторые из ваших пользователей обновились и обнаружили, что некоторые функции больше не работают без какого-либо уведомления. Время исправить? Вы думаете, что у них есть резервная копия вообще, и вы можете это исправить?
Марк Каплун
После того как вы создали API, вы должны поддерживать его вечно или, по крайней мере, до тех пор, пока он полностью не будет иметь значения, например, WordPress фактически не удаляет устаревший API начиная с версии 3.4, и простое добавление уведомления не принесет вам никакой пользы.
Марк Каплун
1
+1, потому что я уважаю ваше мнение, и что мне нравится в этом сайте, так это разные взгляды, подходы и решения проблем, потому что, как правило, не один размер подходит всем.
Биргире
1

Я хотел бы предложить что-то вроде:

/**
 * @deprecated Please use good_function_name() instead
 * @since x.y.z Marked deprecated in favor of good_function_name()
 * @see good_function_name()
 */
function bad_function_name() {
    trigger_error(
        'The ' . __FUNCTION__ . ' function is deprecated. ' .
        'Please use good_function_name() instead.',
        defined( 'E_USER_DEPRECATED' ) ? E_USER_DEPRECATED : E_USER_WARNING
    );

    return good_function_name();
}

Это приводит к отображению предупреждения об устаревании в журналах вместе с трассировкой стека. Естественно, это будет работать, только если в WordPress включена регистрация.

Тернарный оператор существует потому, что константа E_USER_DEPRECATED была введена только в PHP 5.3.0. В старых версиях мы можем вместо этого обратиться к простому предупреждению пользователя.

Из руководства по PHP по константам ошибок :

E_DEPRECATED Уведомления во время выполнения. Включите это, чтобы получать предупреждения о коде, который не будет работать в будущих версиях.

Причина, по которой я не люблю использовать _doing_it_wrong или __deprecated_function, заключается в том, что эти функции предназначены только для ядра WordPress. Из ссылки на код этих функций:

Доступ к этой функции помечен как частный. Это означает, что он не предназначен для использования разработчиками плагинов или тем, только в других основных функциях. Это перечислено здесь для полноты.

AlexG
источник
1
Это абсолютно верный пункт +1 - хотя мы можем видеть, что плагины, такие как Woocommerce, используют обе функции . несмотря на.
Birgire