Có giá trị gì khi sử dụng add_action khi chúng ta chỉ cần sử dụng add_filter?


10

Tôi vừa xem mã wordpress và tìm thấy định nghĩa này của add_action:

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

Bây giờ tại sao chúng ta lãng phí một chu kỳ CPU chỉ bằng cách gọi một chức năng khác mà chúng ta có thể tự làm và sau đó chúng ta sẽ không phải nhớ hai tên hàm khác nhau cho cùng một thứ.


Đây có phải là lý do tại sao mọi thứ khác nhau với các giá trị trả về add_action và add_filter? wordpress.stackexchange.com/questions/283564/
Ấn

Câu trả lời:


9

Hành động làm mọi việc. Bộ lọc sửa đổi mọi thứ. Bạn thực hiện công cụ trong một hành động, trong khi nếu bạn áp dụng bộ lọc, bạn không mong đợi bất kỳ sự kiện hoặc hành động nào xảy ra, ngoài việc sửa đổi giá trị bạn đang lọc. ví dụ: Không thể gửi email hoặc lưu giá trị DB trong bộ lọc, nhưng trong một hành động thì không sao. Có thể có những khoảnh khắc hiếm hoi khi bạn cần vi phạm quy ước này nhưng nó là một điều hữu ích và cần thiết.

Bằng cách thay thế tất cả add_actiondo_actioncác cuộc gọi bằng các đối tác bộ lọc của chúng, bạn loại bỏ sự khác biệt và buộc kiến ​​thức về các tên wether như 'the_content'vv là những hành động hoặc bộ lọc ra khỏi thế giới và vào bộ nhớ của bạn, khuyến khích những sai lầm.

Vì vậy, thay vì làm cho mã của bạn khó đọc hơn, hãy nhận ra rằng nếu mã của bạn chậm, thì đó không phải là vì bạn đã không thực hiện một hoặc hai lệnh ở đây và đó, đó là máy chủ chậm của bạn hoặc cấu trúc thuật toán của mã của bạn và bản chất của dữ liệu được xử lý. Bạn sẽ nhận được nhiều hơn từ việc tái cấu trúc các quy trình của mình, nâng cấp phần cứng hoặc thay đổi mô hình của bạn. Trong lược đồ lớn, một trang web chậm rất có thể chậm vì nó thực hiện rất nhiều hoặc có các truy vấn được viết xấu, ví dụ: các truy vấn bài đăng dựa trên meta hoặc __not_intruy vấn loại

Để đưa nó vào quan điểm, khi WordPress chạy, PHP thực hiện hàng triệu hướng dẫn. Các hành động hoán đổi cho các bộ lọc sẽ hầu như không biến thành một phần trăm của phần trăm hàng đầu.

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

Tôi đã thử cài đặt Wordpress mới. Kịch bản tạm dừng trước khi kết thúc bằng "Lỗi xe buýt" trên máy tính xách tay của tôi, nhưng số lượng mã đã ở mức hơn 2,3 triệu . Đủ nói.

Nếu bạn thực sự muốn thử, hãy xem cách anh chàng sử dụng VLD và tự mình kiểm tra lý thuyết của bạn.


Vì vậy, điều đó có nghĩa là thực sự không có bất kỳ sự khác biệt nào ngoại trừ một người tương tự như cách gọi một người có hai tên khác nhau .... chỉ có một người chúng ta gọi anh ta ở nhà và một người chúng ta gọi anh ta tại văn phòng :)
Gagan

Việc gói các bộ lọc bởi các chức năng hành động có thể phải chịu một hình phạt 4 hoặc 5 opcodes, điều này không đáng kể trên quy mô của mọi thứ, mọi lợi ích sẽ dễ dàng bị xóa sạch bằng cách sử dụng toán tử ternary (? :) Trên một mảng lớn (xem blogpost trên blog tôi đã liên kết đến, blog của anh ấy rất đáng để duyệt qua). TLDR Có một sự khác biệt, nhưng nó quá nhỏ bé, nó vô nghĩa
Tom J Nowell

Cảm ơn bạn thân đã xóa cái này, tôi chưa bao giờ nghĩ đến việc nhiều người làm việc trên cùng một mã và nó sẽ trở thành vấn đề lớn hơn nếu ai đó cứ viết do_action () cho các bộ lọc thay vì hành động. Vì vậy, tôi sẽ sử dụng add_filters trong các trường hợp khi tôi chắc chắn tôi là người duy nhất duyệt mã cho đến khi sử dụng, nếu không tôi sẽ viết add_action () :)
Gagan

Cũng sẽ kiểm tra phương pháp bạn đã đề cập trong bài đăng vào cuối tuần, và sẽ đăng kết quả.
Gagan

1
Tôi khuyên bạn nên tuân thủ quy ước, sử dụng application_filters mọi lúc sẽ là tối ưu hóa vi mô. Bạn nhận được một hình phạt hiệu suất, nhưng không phải từ các mã của PHP, đó là một hình phạt hiệu suất tinh thần, tệ hơn. Nó cũng gây hiểu lầm nếu bạn thực hiện một hành động / bộ lọc tùy chỉnh và xem lại sau này, đó là một hành động hay bộ lọc? Bạn không có cách nào để biết
Tom J Nowell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.