Cosa vale la pena usare add_action quando possiamo semplicemente usare add_filter?


10

Ho appena esaminato il codice di wordpress e ho trovato questa definizione di add_action:

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

Ora perché stiamo sprecando un ciclo della CPU solo per chiamare un'altra funzione che possiamo semplicemente fare da soli e quindi non dovremo ricordare due nomi di funzioni diverse per la stessa cosa.


È questo il motivo per cui le cose sono diverse con add_action e add_filter restituiscono valori? wordpress.stackexchange.com/questions/283564/…
mahatmanich,

Risposte:


9

Le azioni fanno le cose. I filtri modificano le cose. In un'azione fai qualcosa, mentre se applichi un filtro, non ti aspetti che si verifichino eventi o azioni, a parte la modifica del valore che stai filtrando. es. Non va bene inviare una mail o salvare un valore DB in un filtro, ma va bene in un'azione. Potrebbero esserci rari momenti in cui è necessario violare questa convenzione, ma è utile e necessaria.

Sostituendo tutti add_actione do_actionchiamando con le loro controparti di filtro, si rimuove la distinzione e si forza la conoscenza di tutti i nomi, come 'the_content'ecc., Che sono azioni o filtri fuori dal mondo e nella tua memoria, incoraggiando errori.

Quindi, invece di rendere il tuo codice più difficile da leggere, renditi conto che se il tuo codice è lento, non è perché non hai rasato un'istruzione o due qua e là, è o il tuo server lento, o la tua struttura algoritmica del tuo codice e la natura dei dati trattati. Si otterrebbe molto di più dal refactoring dei processi, dall'aggiornamento dell'hardware o dalla modifica dei paradigmi. Nel grande schema delle cose un sito lento è molto probabilmente lento perché fa molto o ha query scritte male, ad esempio post query che si basano su meta, o __not_indigitare query

Per metterlo in prospettiva, quando WordPress viene eseguito, PHP esegue milioni di istruzioni. Lo scambio di azioni con i filtri non farebbe che intaccare il primo millesimo di un percentile.

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

Ho provato una nuova installazione di Wordpress. Lo script si interrompe prima di terminare con un "Errore di bus" sul mio laptop, ma il numero di codici operativi era già di oltre 2,3 milioni . È stato detto abbastanza.

Se vuoi davvero provare, guarda come il ragazzo ha usato il VLD e prova la tua teoria per te stesso.


Quindi significa che in realtà non c'è alcuna differenza tranne quella che è analoga a chiamare una persona con due nomi diversi .... solo quello che lo chiamiamo a casa e uno che lo chiamiamo in ufficio :)
Gagan

L'avvolgimento dei filtri da parte delle funzioni di azione comporta probabilmente una penalità di 4 o 5 codici operativi, il che è banale nella scala delle cose, e tutti i benefici sarebbero facilmente cancellabili usando un operatore ternario (?:) Su un array di grandi dimensioni (vedi blogpost sul blog a cui mi sono collegato, vale la pena dare un'occhiata al suo blog). TLDR C'è una differenza, ma è così piccola che non ha senso
Tom J Nowell

Grazie amico per averlo chiarito, non ho mai considerato il fatto che molte persone lavorino sullo stesso codice e diventa un problema più grande se qualcuno continua a scrivere do_action () per i filtri anziché le azioni. Quindi userò add_filters nei casi in cui sarò sicuro di essere l'unico a leggere il codice fino al suo utilizzo, altrimenti scriverò add_action () :)
Gagan,

Inoltre testerà il metodo che hai citato nel post nel fine settimana e pubblicherà i risultati.
Gagan,

1
Ti consiglio di attenersi alle convenzioni, l'utilizzo di apply_filters in ogni momento sarebbe una micro-ottimizzazione. Ottieni una penalità di prestazione, ma non dai codici operativi PHP, è una penalità di prestazione mentale, che è peggio. È anche fuorviante se si effettua un'azione / filtro personalizzato e si rivisita in un secondo momento, si tratta di un'azione o di un filtro? Non hai modo di saperlo
Tom J Nowell
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.