Что стоит использовать add_action, когда мы можем просто использовать add_filter?


10

Я только что посмотрел код WordPress и нашел это определение add_action:

function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
    return add_filter($tag, $function_to_add, $priority, $accepted_args);
}

Теперь, почему мы тратим один цикл ЦП на то, чтобы просто вызвать другую функцию, которую мы можем просто сделать сами, и тогда нам не придется запоминать два разных имени функции для одной и той же вещи.


Это причина того, что вещи с возвращаемыми значениями add_action и add_filter отличаются? wordpress.stackexchange.com/questions/283564/…
mahatmanich

Ответы:


9

Действия делают вещи. Фильтры модифицируют вещи. Вы делаете вещи в действии, тогда как если вы применяете фильтр, вы не ожидаете каких-либо событий или действий, кроме изменения значения, которое вы фильтруете. Например, нельзя отправлять электронное письмо или сохранять значение БД в фильтре, но это нормально в действии. Могут быть редкие моменты, когда вам нужно нарушить это соглашение, но оно является полезным и необходимым.

Заменяя все add_actionи do_actionвызовы их фильтрами, вы удаляете различие и заставляете знание о более влажных именах, таких как и 'the_content'т. Д., Являться действиями или фильтрами из мира, в вашу память, поощряя ошибки.

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

Для сравнения: при запуске WordPress PHP выполняет миллионы инструкций. Смена действий для фильтров едва ли сделает вмятину в верхнюю тысячную часть процентиля.

http://fabien.potencier.org/article/8/print-vs-echo-which-one-is-faster

Я попробовал новую установку Wordpress. Сценарий останавливается до того, как он заканчивается «Ошибка шины» на моем ноутбуке, но количество кодов операций уже превысило 2,3 миллиона . Достаточно сказано.

Если вы действительно хотите попробовать, посмотрите, как парень использовал VLD, и проверьте свою теорию для себя.


Таким образом, это означает, что на самом деле нет никакой разницы, кроме той, которая аналогична звонку человеку с двумя разными именами ... только ту, которую мы называем его дома, а другую - в офисе :)
Гаган

Обертывание фильтров с помощью функций действия, вероятно, влечет за собой штраф в 4 или 5 кодов операций, что тривиально в масштабе вещей, любые преимущества могут быть легко уничтожены с помощью троичного оператора (?:) В большом массиве (см. Blogpost в блоге, на который я ссылаюсь, его блог стоит того, чтобы его просмотреть). TLDR Есть разница, но она такая крошечная, что не имеет смысла
Том Дж. Новелл

Спасибо, приятель, за разъяснение этого, я никогда не задумывался над тем, что многие люди работают над одним и тем же кодом, и становится большой проблемой, если кто-то просто продолжает писать do_action () для фильтров вместо действий. Поэтому я буду использовать add_filters в тех случаях, когда я буду уверен, что я единственный, кто просматривает код до его использования, в противном случае я напишу add_action () :)
Gagan

Также протестирует метод, который вы упомянули в посте на выходных, и опубликует результаты.
Гаган

1
Я рекомендую придерживаться соглашения, использование apply_filters все время будет микрооптимизацией. Вы получаете снижение производительности, но не от кодов PHP, это снижение производительности ума, что еще хуже. Это также вводит в заблуждение, если вы делаете настраиваемое действие / фильтр и возвращаетесь позже, это действие или фильтр? У тебя нет возможности узнать
Том Дж. Новелл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.