Whats layak menggunakan add_action ketika kita bisa menggunakan add_filter?

10

Saya baru saja melihat ke kode wordpress dan menemukan definisi add_action ini:

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

Sekarang mengapa kita membuang satu siklus CPU hanya untuk memanggil fungsi lain yang bisa kita lakukan sendiri dan kemudian kita tidak perlu mengingat dua nama fungsi yang berbeda untuk hal yang sama.

Gagan
sumber
Apakah ini alasan mengapa semuanya berbeda dengan add_action dan add_filter mengembalikan nilai? wordpress.stackexchange.com/questions/283564/…
mahatmanich

Jawaban:

9

Tindakan melakukan banyak hal. Filter memodifikasi beberapa hal. Anda melakukan hal-hal dalam tindakan, sedangkan jika Anda menerapkan filter, Anda tidak mengharapkan peristiwa atau tindakan apa pun terjadi, selain modifikasi dari nilai yang Anda filter. mis. Tidak boleh mengirim email atau menyimpan nilai DB dalam filter, tetapi tidak apa-apa dalam tindakan. Mungkin ada saat-saat langka ketika Anda perlu melanggar konvensi ini, tetapi itu adalah yang berguna dan perlu.

Dengan mengganti semua add_actiondan do_actionmenelepon dengan rekan filter mereka, Anda menghapus perbedaan dan memaksa pengetahuan tentang apakah nama seperti 'the_content'dll adalah tindakan atau filter dari dunia, dan ke dalam memori Anda, mendorong kesalahan.

Jadi, alih-alih membuat kode Anda lebih sulit dibaca, sadarilah bahwa jika kode Anda lambat, itu bukan karena Anda tidak mencukur satu atau dua instruksi di sana-sini, itu adalah server Anda yang lambat, atau struktur algoritmik kode Anda dan sifat data yang ditangani. Anda akan mendapatkan jauh lebih banyak dari refactoring proses Anda, meningkatkan perangkat keras, atau mengubah paradigma Anda. Dalam skema besar, situs lambat kemungkinan besar lambat karena banyak atau memiliki kueri yang ditulis dengan buruk, mis. Kueri kiriman yang mengandalkan meta, atau __not_inketik kueri

Untuk memasukkannya ke dalam perspektif, ketika WordPress berjalan, PHP mengeksekusi jutaan instruksi. Bertukar tindakan untuk filter hampir tidak akan membuat penyok ke dalam seperseribu persen teratas.

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

Saya telah mencoba instalasi Wordpress baru. Skrip berhenti sebelum diakhiri dengan "Bus Error" di laptop saya, tetapi jumlah opcode sudah lebih dari 2,3 juta . Cukup kata.

Jika Anda benar-benar ingin mencoba, lihat bagaimana pria itu menggunakan VLD dan menguji teori Anda sendiri.

Tom J Nowell
sumber
Jadi itu berarti sebenarnya tidak ada perbedaan kecuali yang analog dengan memanggil seseorang dengan dua nama yang berbeda .... hanya saja kita memanggilnya di rumah dan satu kita memanggilnya di kantor :)
Gagan
Pembungkus filter oleh fungsi aksi mungkin dikenakan penalti 4 atau 5 opcode, yang sepele pada skala hal, manfaat apa pun akan dengan mudah dihilangkan dengan menggunakan operator ternary (?:) Pada array besar (lihat blogpost di blog yang saya tautkan, blognya layak dibaca). TLDR Ada perbedaan, tetapi sangat kecil sehingga tidak ada artinya
Tom J Nowell
Terima kasih sobat untuk membersihkan ini, saya tidak pernah mempertimbangkan fakta bahwa banyak orang bekerja pada kode yang sama dan itu menjadi masalah yang lebih besar jika seseorang terus menulis do_action () untuk filter daripada tindakan. Jadi saya akan menggunakan add_filters dalam kasus-kasus ketika saya akan yakin saya satu-satunya yang melalui kode sampai digunakan, kalau tidak saya akan menulis add_action () :)
Gagan
Juga akan menguji metode yang Anda sebutkan di posting pada akhir pekan, dan akan memposting hasilnya.
Gagan
1
Saya sarankan Anda tetap dengan konvensi, menggunakan apply_filters sepanjang waktu akan menjadi optimasi mikro. Anda mendapatkan penalti kinerja, tetapi bukan dari opcode PHP, ini adalah penalti kinerja mental, yang lebih buruk. Ini juga menyesatkan jika Anda membuat tindakan / filter khusus dan mengunjungi kembali nanti, apakah itu tindakan atau filter? Anda tidak mungkin tahu
Tom J Nowell