Co warto stosować add działań, kiedy możemy po prostu użyć add_filter?

10

Właśnie przyjrzałem się kodowi Wordpress i znalazłem definicję dodatkowej aktywności:

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

Dlaczego marnujemy jeden cykl CPU tylko na wywołanie innej funkcji, którą możemy po prostu zrobić sami, a wtedy nie będziemy musieli pamiętać dwóch różnych nazw funkcji dla tej samej rzeczy.

Gagan
źródło
Czy to jest powód, dla którego różnią się wartości zwracanych wartości add działań i add_filter? wordpress.stackexchange.com/questions/283564/…
mahatmanich

Odpowiedzi:

9

Działania czynią różne rzeczy. Filtry modyfikują rzeczy. Robisz różne rzeczy w akcji, a jeśli zastosujesz filtr, nie spodziewasz się, że wystąpią jakieś zdarzenia lub akcje poza modyfikacją filtrowanej wartości. np. wysyłanie wiadomości e-mail lub zapisywanie wartości DB w filtrze jest nie w porządku, ale w działaniu jest w porządku. Mogą zdarzać się rzadkie chwile, gdy trzeba złamać tę konwencję, ale jest to przydatna i konieczna.

Zastępując wszystkie add_actioni do_actionpołączenia ich odpowiednikami filtrów, usuwasz rozróżnienie i wymuszasz znajomość innych nazwisk, takich jak 'the_content'itp., Działań lub filtrów z całego świata, które zapełniają Twoją pamięć, zachęcając do błędów.

Zamiast więc utrudniać czytanie kodu, zdaj sobie sprawę, że jeśli twój kod jest powolny, to nie dlatego, że nie goliłeś instrukcji ani dwóch tu i tam, to albo twój powolny serwer, albo twoja algorytmiczna struktura kodu i charakter przetwarzanych danych. Znacznie więcej zyskałbyś na refaktoryzacji procesów, modernizacji sprzętu lub zmianie paradygmatów. W wielkim schemacie rzeczy powolna strona jest najprawdopodobniej wolna, ponieważ robi dużo lub ma źle napisane zapytania, np. Wysyłanie zapytań opartych na meta lub __not_inzapytania typu

Mówiąc inaczej, po uruchomieniu WordPress PHP wykonuje miliony instrukcji. Zamiana filtrów z trudem spowodowałaby wgniecenie w pierwszej tysięcznej części percentyla.

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

Próbowałem na nowej instalacji Wordpress. Skrypt zatrzymuje się, zanim zakończy się z błędem magistrali na moim laptopie, ale liczba kodów operacyjnych wynosiła już ponad 2,3 miliona . Wystarczająco powiedziane.

Jeśli naprawdę chcesz spróbować, spójrz, jak facet użył VLD i sprawdź swoją teorię dla siebie.

Tom J Nowell
źródło
Oznacza to, że tak naprawdę nie ma żadnej różnicy, z wyjątkiem tej, która jest analogiczna do dzwonienia do osoby o dwóch różnych nazwach ... tylko ta, którą nazywamy go w domu, a druga w biurze :)
Gagan
Zawijanie filtrów przez funkcje akcji prawdopodobnie pociąga za sobą karę 4 lub 5 kodów, co jest trywialne w skali rzeczy, wszelkie korzyści można łatwo usunąć za pomocą operatora trójskładnikowego (?:) Na dużej tablicy (patrz blog na blogu, do którego linkowałem, jego blog jest wart przejrzenia). TLDR Jest różnica, ale jest tak mała, że ​​nie ma sensu
Tom J Nowell
Dzięki kolego za wyjaśnienie tego problemu, nigdy nie zastanawiałem się nad tym, że wiele osób pracuje na tym samym kodzie i staje się większym problemem, jeśli ktoś po prostu pisze doFO () dla filtrów zamiast akcji. Więc użyję add_filters w przypadkach, gdy będę pewien, że jestem jedynym, który przegląda kod, dopóki nie zostanie użyty, w przeciwnym razie napiszę add współdziałanie () :)
Gagan
Przetestuje również metodę wymienioną w poście w weekend i opublikuje wyniki.
Gagan
1
Polecam trzymać się konwencji, używanie filtrów Apply_filters przez cały czas byłoby mikrooptymalizacją. Uzyskujesz karę wydajności, ale nie z kodów PHP, jest to kara za wydajność umysłową, co jest gorsze. Jest to również mylące, jeśli wykonasz niestandardową akcję / filtr i wrócisz później, czy jest to akcja czy filtr? Nie możesz wiedzieć
Tom J Nowell