O que vale a pena usar add_action quando podemos simplesmente usar add_filter?

10

Acabei de olhar para o código wordpress e encontrei esta definição 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);
}

Agora, por que estamos desperdiçando um ciclo de CPU apenas chamando outra função que podemos simplesmente executar por nós mesmos e depois não precisaremos lembrar de dois nomes de funções diferentes para a mesma coisa.

Gagan
fonte
É por isso que as coisas são diferentes nos valores de retorno add_action e add_filter? wordpress.stackexchange.com/questions/283564/…
mahatmanich 21/17

Respostas:

9

Ações fazem coisas. Os filtros modificam as coisas. Você faz coisas em uma ação, enquanto que, se aplicar um filtro, não espera que ocorram eventos ou ações, exceto a modificação do valor que está filtrando. Por exemplo, não há problema em enviar um email ou salvar um valor de banco de dados em um filtro, mas tudo bem em uma ação. Pode haver momentos raros em que você precisa violar esta convenção, mas é útil e necessária.

Ao substituir todas add_actione do_actionchamadas pelas respectivas contrapartes de filtro, você remove a distinção e força o conhecimento de nomes como 'the_content'ações ou filtros fora do mundo e em sua memória, incentivando erros.

Portanto, em vez de dificultar a leitura do código, perceba que, se o código for lento, não é porque você não depilou uma instrução ou duas aqui e ali, é o servidor lento ou a estrutura algorítmica do código e a natureza dos dados sendo manipulados. Você poderia muito mais refatorar seus processos, atualizar o hardware ou alterar seus paradigmas. No grande esquema de coisas, um site lento provavelmente é lento porque faz muitas ou possui consultas mal escritas, por exemplo, publica consultas que dependem de meta ou __not_indigita consultas

Para colocar em perspectiva, quando o WordPress é executado, o PHP executa milhões de instruções. A troca de filtros por filtros dificilmente chegaria ao milésimo de um percentil.

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

Eu tentei uma nova instalação do Wordpress. O script é interrompido antes de terminar com um "Erro de barramento" no meu laptop, mas o número de códigos de operação já era superior a 2,3 milhões . Disse o suficiente.

Se você realmente quiser tentar, veja como o cara usou o VLD e teste sua teoria por si mesmo.

Tom J Nowell
fonte
Por isso significa que não há realmente nenhuma diferença, exceto aquele que é análogo ao chamar uma pessoa com dois nomes diferentes .... exatamente isso que nós chamá-lo em casa e outro nós o chamamos no escritório :)
Gagan
A quebra de filtros pelas funções de ação provavelmente incorre em uma penalidade de 4 ou 5 opcodes, o que é trivial na escala das coisas; quaisquer benefícios seriam facilmente eliminados usando um operador ternário (?:) Em uma grande variedade (veja o blogpost no blog ao qual vinculei, vale a pena navegar no blog dele). TLDR Há uma diferença, mas é tão pequena é sem sentido
Tom J Nowell
Obrigado amigo por esclarecer isso, nunca considerei o fato de muitas pessoas trabalharem no mesmo código e isso se torna um problema maior se alguém continuar escrevendo do_action () para filtros em vez de ações. Então, eu vou usar add_filters nos casos em que eu vou ter certeza que eu sou a única pessoa a atravessar o código até o seu usado, caso contrário eu vou escrever add_action () :)
Gagan
Também testará o método que você mencionou na postagem no fim de semana e publicará os resultados.
Gagan #
11
Eu recomendo que você fique com a convenção, o uso de apply_filters o tempo todo seria uma micro-otimização. Você ganha uma penalidade de desempenho, mas não dos códigos de código PHP, é uma penalidade de desempenho mental, o que é pior. Também é enganoso se você criar uma ação / filtro personalizado e revisitar mais tarde, é uma ação ou um filtro? Você não tem como saber
Tom J Nowell