Qu'est-ce qui vaut la peine d'utiliser add_action alors que nous pouvons simplement utiliser add_filter?

10

Je viens de regarder le code wordpress et j'ai trouvé cette définition de add_action:

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

Maintenant, pourquoi gaspillons-nous un cycle CPU simplement pour appeler une autre fonction que nous pouvons simplement faire nous-mêmes et nous n'aurons plus à nous souvenir de deux noms de fonction différents pour la même chose.

Gagan
la source
Est-ce la raison pour laquelle les choses sont différentes avec les valeurs de retour add_action et add_filter? wordpress.stackexchange.com/questions/283564/…
mahatmanich

Réponses:

9

Les actions font des choses. Les filtres modifient les choses. Vous faites des choses dans une action, alors que si vous appliquez un filtre, vous ne vous attendez pas à ce que des événements ou des actions se produisent, à part la modification de la valeur que vous filtrez. Par exemple, ce n'est pas correct d'envoyer un e-mail ou d'enregistrer une valeur de base de données dans un filtre, mais c'est correct dans une action. Il peut y avoir de rares moments où vous devez violer cette convention, mais elle est utile et nécessaire.

En remplaçant tous add_actionet les do_actionappels par leurs homologues de filtrage, vous supprimez la distinction et forcez la connaissance des noms comme 'the_content'etc. sont des actions ou des filtres hors du monde, et dans votre mémoire, encourageant les erreurs.

Donc, au lieu de rendre votre code plus difficile à lire, sachez que si votre code est lent, ce n'est pas parce que vous n'avez pas rasé une ou deux instructions ici et là, c'est soit votre serveur lent, soit votre structure algorithmique de votre code et la nature des données traitées. Vous auriez beaucoup plus à refactoriser vos processus, à mettre à niveau le matériel ou à changer vos paradigmes. Dans le grand schéma des choses, un site lent est très probablement lent car il fait beaucoup de choses ou contient des requêtes mal écrites, par exemple des requêtes post qui reposent sur des méta ou __not_indes requêtes de type

Pour mettre les choses en perspective, lorsque WordPress fonctionne, PHP exécute des millions d'instructions. L'échange d'actions contre des filtres ferait à peine une brèche dans le 1 millième supérieur d'un centile.

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

J'ai essayé une nouvelle installation de Wordpress. Le script s'arrête avant de se terminer par une "erreur de bus" sur mon ordinateur portable, mais le nombre d'opcodes était déjà supérieur à 2,3 millions . Assez dit.

Si vous voulez vraiment essayer, regardez comment le gars a utilisé le VLD et testez votre théorie par vous-même.

Tom J Nowell
la source
Cela signifie donc qu'il n'y a pas de différence, sauf celle qui est analogue à appeler une personne avec deux noms différents ... juste celle que nous l'appelons à la maison et celle que nous l'appelons au bureau :)
Gagan
L'encapsulage des filtres par les fonctions d'action entraîne probablement une pénalité de 4 ou 5 opcodes, ce qui est trivial à l'échelle des choses, tout avantage serait facilement annulé en utilisant un opérateur ternaire (?:) Sur un grand tableau (voir blogpost sur le blog auquel j'ai lié, son blog vaut bien le détour). TLDR Il y a une différence, mais elle est si minuscule qu'elle n'a pas de sens
Tom J Nowell
Merci mon pote d'avoir effacé cela, je n'ai jamais considéré le fait que beaucoup de gens travaillent sur le même code et cela devient un plus gros problème si quelqu'un continue d'écrire do_action () pour les filtres au lieu des actions. Je vais donc utiliser add_filters dans les cas où je serai sûr que je suis le seul à parcourir le code jusqu'à son utilisation, sinon j'écrirai add_action () :)
Gagan
Testera également la méthode que vous avez mentionnée dans le post le week-end et publiera les résultats.
Gagan
1
Je vous recommande de vous en tenir à la convention, utiliser tout le temps apply_filters serait une micro-optimisation. Vous gagnez une pénalité de performance, mais pas des opcodes PHP, c'est une pénalité de performance mentale, ce qui est pire. Il est également trompeur si vous effectuez une action / un filtre personnalisé et revisitez plus tard, est-ce une action ou un filtre? Vous n'avez aucun moyen de le savoir
Tom J Nowell