Không, bạn không thể 'khởi tạo' hoặc khởi tạo lớp thông qua một cái móc, không trực tiếp. Một số mã bổ sung luôn được yêu cầu (và đó không phải là điều mong muốn để có thể làm điều đó, vì bạn đang mở một hộp giun cho chính mình.
Đây là một cách tốt hơn để làm điều đó:
class MyClass {
function __construct() {
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
function getStuffDone() {
// .. This is where stuff gets done ..
}
}
$var = new MyClass();
Tất nhiên người ta có thể tạo một lớp giao diện để đơn giản hóa nó cho trường hợp chung hơn nữa:
class IGetStuffDone {
function IGetStuffDone(){
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
public abstract function getStuffDone();
}
Lưu ý rằng với tư cách là một giao diện, bạn không thể trực tiếp tạo một đối tượng thuộc loại này, nhưng bạn có thể tạo một lớp con, cho phép bạn nói:
class CDoingThings extends IGetStuffDone {
function getStuffDone(){
// doing things
}
}
$var = new CDoingThings();
Sau đó sẽ tự động thêm tất cả các hook, bạn chỉ cần xác định chính xác những gì đang được thực hiện trong một lớp con và sau đó tạo nó!
Về xây dựng
Tôi sẽ không thêm một hàm tạo như một hàm hook, đó là một cách thực hành tồi và có thể dẫn đến nhiều sự kiện bất thường. Ngoài ra, trong hầu hết các ngôn ngữ, hàm tạo trả về đối tượng đang được khởi tạo, vì vậy nếu hook của bạn cần trả về một cái gì đó như trong bộ lọc, nó sẽ không trả về biến được lọc như bạn muốn, mà thay vào đó, nó sẽ trả về đối tượng lớp.
Gọi một hàm tạo hoặc hàm hủy là một thực hành lập trình rất, rất, rất tệ, bất kể bạn đang sử dụng ngôn ngữ nào và không bao giờ nên thực hiện.
Các nhà xây dựng cũng nên xây dựng các đối tượng, để khởi tạo chúng sẵn sàng để sử dụng, không phải cho công việc thực tế. Công việc được thực hiện bởi đối tượng nên ở một chức năng riêng biệt.
Các phương thức lớp tĩnh và hoàn toàn không cần khởi tạo / khởi tạo
Nếu phương thức lớp của bạn là một phương thức lớp tĩnh, bạn có thể chuyển tên của lớp trong dấu ngoặc kép thay vì $this
như dưới đây:
class MyClass {
public static function getStuffDone() {
// .. This is where stuff gets done ..
}
}
add_action( 'admin_init', array('MyClass','getStuffDone' ) );
Đóng cửa & PHP 5.3
Đáng buồn thay, bạn không thể tránh dòng tạo lớp mới. Giải pháp duy nhất khác để bỏ qua nó sẽ liên quan đến mã tấm nồi hơi vẫn có dòng đó và sẽ yêu cầu PHP 5.3+, ví dụ:
add_action('admin_init',function(){
$var = new MyClass();
$var->getStuffDone();
});
Tại điểm nào bạn cũng có thể bỏ qua lớp và chỉ sử dụng một hàm:
add_action('admin_init',function(){
// do stuff
});
Nhưng hãy nhớ rằng bây giờ bạn đã giới thiệu bóng ma của các chức năng ẩn danh. Không có cách nào để loại bỏ hành động trên bằng cách sử dụng remove_action
và điều này có thể và gây ra nỗi đau lớn cho các nhà phát triển phải làm việc với mã người khác.
Trên Ampersands
Bạn có thể thấy các hành động được sử dụng như thế này:
array( &$this, 'getStuffDone' );
Điều này là xấu . &
đã được thêm lại trong PHP 4 khi các đối tượng được truyền dưới dạng giá trị, không phải là tham chiếu. PHP 4 đã hơn một thập kỷ và không được WordPress hỗ trợ trong một thời gian rất dài.
Không có lý do để sử dụng &this
khi thêm hook và bộ lọc và việc xóa tham chiếu sẽ không gây ra vấn đề gì và thậm chí có thể cải thiện khả năng tương thích với các phiên bản PHP trong tương lai
Sử dụng cái này thay thế:
array( $this, 'getStuffDone' );