Bất cứ khi nào một plugin tạo ra một new MyClass();
, nó nên gán nó cho một biến có tên duy nhất. Bằng cách đó, thể hiện của lớp có thể truy cập.
Vì vậy, nếu anh ấy đang làm $myclass = new MyClass();
, thì bạn có thể làm điều này:
global $myclass;
remove_action( 'wp_footer', array( $myclass, 'my_action' ) );
Điều này hoạt động vì các plugin được bao gồm trong không gian tên toàn cục, do đó, khai báo biến ẩn trong phần chính của plugin là các biến toàn cục.
Nếu plugin không lưu mã định danh của lớp mới ở đâu đó , thì về mặt kỹ thuật, đó là một lỗi. Một trong những nguyên tắc chung của Lập trình hướng đối tượng là các đối tượng không được tham chiếu bởi một số biến ở đâu đó có thể được dọn dẹp hoặc loại bỏ.
Bây giờ, PHP đặc biệt không làm điều này giống như Java, bởi vì PHP là một triển khai OOP nửa vời. Các biến đối tượng chỉ là các chuỗi có tên đối tượng duy nhất trong đó, sắp xếp thứ. Chúng chỉ hoạt động vì cách tương tác tên hàm biến hoạt động với ->
toán tử. Vì vậy, chỉ cần làm new class()
thực sự có thể làm việc hoàn hảo, chỉ là ngu ngốc. :)
Vì vậy, dòng dưới cùng, không bao giờ làm new class();
. Làm $var = new class();
và làm cho $ var có thể truy cập theo một cách nào đó để các bit khác tham chiếu nó.
Chỉnh sửa: năm sau
Một điều tôi đã thấy rất nhiều plugin đang làm là sử dụng một cái gì đó tương tự như mẫu "Singleton". Họ tạo ra một phương thức getInstance () để lấy một thể hiện của lớp. Đây có lẽ là giải pháp tốt nhất tôi từng thấy. Plugin ví dụ:
class ExamplePlugin
{
protected static $instance = NULL;
public static function getInstance() {
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
}
Lần đầu tiên getInstance () được gọi, nó khởi tạo lớp và lưu con trỏ của nó. Bạn có thể sử dụng nó để móc trong hành động.
Một vấn đề với điều này là bạn không thể sử dụng getInstance () bên trong hàm tạo nếu bạn sử dụng một thứ như vậy. Điều này là do hàm mới gọi hàm tạo trước khi đặt $ dụ, do đó, việc gọi getInstance () từ hàm tạo dẫn đến một vòng lặp vô hạn và phá vỡ mọi thứ.
Một cách giải quyết khác là không sử dụng hàm tạo (hoặc, ít nhất, không sử dụng getInstance () trong nó), nhưng rõ ràng có một hàm "init" trong lớp để thiết lập hành động của bạn và như vậy. Như thế này:
public static function init() {
add_action( 'wp_footer', array( ExamplePlugin::getInstance(), 'my_action' ) );
}
Với một cái gì đó như thế này, ở phần cuối của tệp, sau khi lớp đã được xác định tất cả và như vậy, việc khởi tạo plugin trở nên đơn giản như sau:
ExamplePlugin::init();
Init bắt đầu thêm hành động của bạn và để thực hiện nó gọi getInstance (), khởi tạo lớp và đảm bảo chỉ có một trong số chúng tồn tại. Nếu bạn không có hàm init, bạn sẽ làm điều này để khởi tạo lớp ban đầu thay vào đó:
ExamplePlugin::getInstance();
Để giải quyết câu hỏi ban đầu, loại bỏ móc hành động đó từ bên ngoài (hay còn gọi là trong một plugin khác) sau đó có thể được thực hiện như sau:
remove_action( 'wp_footer', array( ExamplePlugin::getInstance(), 'my_action' ) );
Đặt nó vào một cái gì đó được nối với plugins_loaded
hook hành động và nó sẽ hoàn tác hành động được hook bởi plugin gốc.