Was ist es wert, add_action zu verwenden, wenn wir einfach add_filter verwenden können?

10

Ich habe gerade in WordPress-Code geschaut und diese Definition von add_action gefunden:

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

Warum verschwenden wir nun einen CPU-Zyklus, um nur eine andere Funktion aufzurufen, die wir einfach selbst ausführen können, und müssen uns dann nicht zwei verschiedene Funktionsnamen für dieselbe Sache merken.

Gagan
quelle
Ist dies der Grund, warum die Dinge bei den Rückgabewerten add_action und add_filter anders sind? wordpress.stackexchange.com/questions/283564/…
Mahatmanich

Antworten:

9

Aktionen machen Dinge. Filter ändern Dinge. Sie führen Dinge in einer Aktion aus, während Sie beim Anwenden eines Filters keine Ereignisse oder Aktionen erwarten, außer der Änderung des zu filternden Werts. zB Es ist nicht in Ordnung, eine E-Mail zu senden oder einen DB-Wert in einem Filter zu speichern, aber in einer Aktion ist es in Ordnung. Es kann seltene Momente geben, in denen Sie gegen diese Konvention verstoßen müssen, aber sie ist nützlich und notwendig.

Indem Sie alle add_actionund do_actionAufrufe durch ihre Filter-Gegenstücke ersetzen , entfernen Sie die Unterscheidung und erzwingen das Wissen darüber, ob Namen wie 'the_content'usw. Aktionen oder Filter außerhalb der Welt und in Ihrem Gedächtnis sind, was zu Fehlern führt.

Anstatt Ihren Code schwerer lesbar zu machen, sollten Sie sich darüber im Klaren sein, dass wenn Ihr Code langsam ist, dies nicht daran liegt, dass Sie hier und da nicht ein oder zwei Anweisungen rasiert haben, sondern entweder an Ihrem langsamen Server oder an Ihrer algorithmischen Struktur Ihres Codes und die Art der Daten, die verarbeitet werden. Sie würden viel mehr davon haben, Ihre Prozesse umzugestalten, die Hardware zu aktualisieren oder Ihre Paradigmen zu ändern. Im großen Schema der Dinge ist eine langsame Site höchstwahrscheinlich langsam, weil sie viel tut oder schlecht geschriebene Abfragen hat, z. B. Post-Abfragen, die auf Meta basieren, oder __not_inTypabfragen

Wenn WordPress ausgeführt wird, führt PHP Millionen von Anweisungen aus. Das Austauschen von Aktionen gegen Filter würde kaum zu einer Beule im oberen Tausendstel eines Perzentils führen.

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

Ich habe eine neue Wordpress-Installation ausprobiert. Das Skript wird angehalten, bevor es mit einem "Busfehler" auf meinem Laptop endet, aber die Anzahl der Opcodes lag bereits bei mehr als 2,3 Millionen . Genug gesagt.

Wenn Sie es wirklich versuchen möchten, schauen Sie sich an, wie der Typ die VLD verwendet hat, und testen Sie Ihre Theorie selbst.

Tom J Nowell
quelle
Es bedeutet also, dass es eigentlich keinen Unterschied gibt, außer dem, der analog dazu ist, eine Person mit zwei verschiedenen Namen anzurufen ... nur den, den wir zu Hause und den, den wir im Büro nennen :)
Gagan
Das Umschließen von Filtern durch die Aktionsfunktionen führt wahrscheinlich zu einer Strafe von 4 oder 5 Opcodes, was in der Größenordnung trivial ist. Alle Vorteile würden leicht durch die Verwendung eines ternären Operators (? :) Auf einem großen Array beseitigt (siehe Blogpost) Auf dem Blog, auf das ich verlinkt habe, ist sein Blog einen Besuch wert. TLDR Es gibt einen Unterschied, aber es ist so klein, dass es bedeutungslos ist
Tom J Nowell
Vielen Dank, Kumpel, dass du das geklärt hast. Ich habe nie daran gedacht, dass viele Leute am selben Code arbeiten, und es wird ein größeres Problem, wenn jemand einfach weiter do_action () für Filter anstelle von Aktionen schreibt. Also werde ich add_filters verwenden, wenn ich sicher bin, dass ich der einzige bin, der den Code bis zu seiner Verwendung durchläuft, andernfalls schreibe ich add_action () :)
Gagan
Testet auch die Methode, die Sie in der Post am Wochenende erwähnt haben, und veröffentlicht die Ergebnisse.
Gagan
1
Ich empfehle Ihnen, sich an die Konvention zu halten. Die ständige Verwendung von apply_filters wäre eine Mikrooptimierung. Sie erhalten eine Leistungsstrafe, aber nicht durch PHP-Opcodes, sondern eine mentale Leistungsstrafe, die schlimmer ist. Es ist auch irreführend, wenn Sie eine benutzerdefinierte Aktion / einen benutzerdefinierten Filter erstellen und später erneut aufrufen. Handelt es sich um eine Aktion oder einen Filter? Sie haben keine Möglichkeit zu wissen
Tom J Nowell