Sadece add_filter kullanabileceğimizde add_action kullanmaya değer nedir?


10

Ben sadece wordpress kodu içine baktım ve add_action bu tanımı buldum:

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

Şimdi neden sadece kendimiz yapabileceğimiz başka bir işlevi çağırmak için bir CPU döngüsü harcıyoruz ve sonra aynı şey için iki farklı işlev adını hatırlamak zorunda kalmayacağız.


Add_action ve add_filter dönüş değerleri ile durumların farklı olmasının nedeni bu mu? wordpress.stackexchange.com/questions/283564/…
mahatmanich

Yanıtlar:


9

Eylemler bir şeyler yapar. Filtreler bazı şeyleri değiştirir. Bir eylemde bir şeyler yaparsınız, ancak filtre uygularsanız, filtrelediğiniz değerin değiştirilmesi dışında herhangi bir olay veya işlem gerçekleşmesini beklemezsiniz. Örneğin, bir e-posta göndermek veya bir DB değerini bir filtreye kaydetmek uygun değildir, ancak bir eylemde sorun yoktur. Bu sözleşmeyi ihlal etmeniz gerektiğinde nadir anlar olabilir, ancak yararlı ve gerekli bir konudur.

Tümünü add_actionve do_actionçağrıları filtre meslektaşlarıyla değiştirerek, ayrımı kaldırırsınız ve 'the_content'vb.

Bu nedenle, kodunuzu okumayı zorlaştırmak yerine, kodunuz yavaşsa, bunun burada bir veya iki talimatı tıraş etmediğinizden değil, yavaş sunucunuzdan veya kodunuzun algoritmik yapısından kaynaklandığını ve işlenen verinin niteliği. İşlemlerinizi yeniden düzenlemekten, donanımı yükseltmekten veya paradigmalarınızı değiştirmekten çok daha fazlasını elde edersiniz. Büyük şemada, yavaş bir site büyük olasılıkla yavaştır, çünkü çok şey yapar veya kötü yazılmış sorgular vardır, örneğin metaya dayanan __not_insorgular veya sorgular yazın

Perspektife koymak için, WordPress çalışırken, PHP milyonlarca talimat yürütür . Filtreler için yer değiştirme eylemleri, yüzdelik dilimin en üst binde biri kadar zorlanmayacaktır.

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

Yeni bir Wordpress yüklemesi denedim. Komut dosyası dizüstü bilgisayarımdaki "Veri Yolu Hatası" ile bitmeden önce duruyor, ancak opcode sayısı zaten 2.3 milyondan fazlaydı . Yeterince söylendi.

Gerçekten denemek istiyorsanız, adamın VLD'yi nasıl kullandığına bakın ve teorinizi kendiniz için test edin.


Yani bu aslında iki farklı isme sahip bir kişiyi aramaya benzeyen şey dışında bir fark olmadığı anlamına gelir .... sadece onu evde çağırdığımız ve onu ofiste çağırdığımız :)
Gagan

Filtrelerin eylem işlevleriyle sarılması muhtemelen 4 veya 5 opcode cezaya neden olur, bu da şeylerin ölçeğinde önemsizdir, herhangi bir fayda, büyük bir dizide üçlü bir operatör (?:) Kullanılarak kolayca silinebilir (bkz. Blog yazısı) Bağlantı kurduğum blogda, bloguna göz atmaya değer). TLDR Bir fark var, ama anlamsız
Tom J Nowell

Bunu temizlediğiniz için teşekkürler dostum, birçok insanın aynı kod üzerinde çalıştığı gerçeğini hiç düşünmedim ve birisi filtreler için do_action () yazmaya devam ederse daha büyük bir sorun haline gelir. Bu yüzden, kullanılana kadar koddan geçen tek kişi olduğumdan emin olacağım durumlarda add_filters kullanacağım, aksi takdirde add_action () :) yazacağım
Gagan

Ayrıca hafta sonu postada bahsettiğiniz yöntemi test edecek ve sonuçları yayınlayacaktır.
Gagan

1
Ben kurallara uymanızı öneririm, her zaman uygula_filtre'leri kullanmak bir mikro optimizasyon olacaktır. Bir performans cezası kazanırsınız, ancak PHP opcodesinden değil, daha kötü bir zihinsel performans cezasıdır. Özel bir eylem / filtre yapar ve daha sonra tekrar ziyaret ederseniz yanıltıcıdır, bu bir eylem mi yoksa filtre mi?
Bilmenin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.