Tại sao bạn cần phải bọc một hàm bên trong mảng ($ this, function)


8

Tôi là người mới chơi PHP và WordPress, vì vậy hãy nhẹ nhàng!

Tôi đang xây dựng một plugin - theo một vài hướng dẫn, làm cho nó hoạt động.

Câu hỏi của tôi là tại sao chức năng tôi muốn gọi được gói trong array($this, function)? Ví dụ: tôi có mã constructor này trong lớp

 function __construct() {
      add_action( 'admin_init',array( $this, 'getStuffDone' ) );
 }

Hàm getStuffDone được kích hoạt OK - nhưng tại sao nó phải ở định dạng?

Bất kỳ cái nhìn sâu sắc được nhiều đánh giá cao.


1
Tôi không biết đủ về OOP để đưa ra câu trả lời đầy thông tin nhưng một số nghiên cứu đưa ra một vài tài liệu tham khảo hay: Sử dụng add_actionvới ClassPHP Passing to Function
Howdy_McGee

Không bao giờ đăng ký gọi lại trong constructor. Điều đó làm cho mã của bạn không thể kiểm chứng.
fuxia

@toscho liên kết đến một ví dụ thiết lập khởi tạo chính xác? Gọi một hàm init () chuyên dụng hoặc một cái gì đó từ hàm tạo?
lkraav

@lkraav Xem câu trả lời của gmazzap cho câu hỏi đó .
fuxia

Câu trả lời:


6

Đó là một cuộc gọi lại PHP . Bạn cần cú pháp để giữ một tham chiếu đến thể hiện của lớp.

Nói theo cách này - nếu bạn không có $this, làm thế nào để người gọi biết đó getStuffDonelà một phương thức của lớp của bạn chứ không chỉ là một hàm PHP thông thường? Nó không.

Sử dụng array( $this, 'getStuffDone' )nói với PHP:

Này anh bạn, bạn cần gọi phương thức getStuffDonetrong trường hợp này của lớp tôi


Điều tôi không hiểu, có thể là cách tôi đọc nó, nhưng câu đầu tiên trong Passing nói except language constructs such as: array(), nhưng ở đây chúng tôi đang truyền một mảng. Đây là một lỗi đánh máy hay tôi đang đọc câu sai?
Howdy_McGee

Không đúng, nhưng nó đề cập đến các chức năng, không phải các phương thức. Đọc đoạn para ngay bên dưới nó.
TheDeadMedic

5

các add_action () ngoại hình định nghĩa hàm như:

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

do đó, có vẻ như nó mong đợi (chuỗi, chuỗi, int, int)

Trong tệp php truyền thống, tham số thứ hai sẽ chỉ là một trong các tên hàm của bạn.

vì vậy bạn sẽ có add_action('admin_init','my_init_function')

Có vẻ như bạn đang sử dụng một lớp để đóng gói plugin của mình. Các lớp khác có thể có các hàm trong chúng có cùng tên ( getStuffDone ).

Vì vậy, chức năng của bạn chỉ được biết đến với tham chiếu đến lớp của bạn, đó là lý do tại sao bạn phải chỉ định lớp $thiscũng như tên hàm.

Nếu bạn đang cố gắng tham chiếu một hàm bên trong một lớp, bạn phải sử dụng cú pháp có thể gọi được bằng mảng

Xem thêm codex.wordpress.org


1

Xem tài liệu, trong phần " Ghi chú đóng góp của người dùng ":

"Để sử dụng add_action() khi plugin hoặc chủ đề của bạn được xây dựng bằng các lớp , bạn cần sử dụng cú pháp có thể gọi được mảng. Bạn sẽ chuyển hàm thành add_action()một mảng, với $thistư cách là phần tử đầu tiên, sau đó là tên của phương thức lớp ..."

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.