你不能。不是你怎么写的。您需要能够访问的实例ChildAdminClass
但它只存在于MainAdminClass
类,并且不会以任何方式暴露。
在试图删除它的代码中,您引用了$child_admin
作为全局变量,但您没有将其创建为全局变量。如果您这样做:
public function init() {
global $child_admin;
$child_admin = new ChildAdminClass();
$child_admin->init();
}
现在这将起作用:
global $child_admin;
remove_action(\'admin_notices\', array($child_admin, \'printFoo\'));
但全局变量并不重要。更好的方法是将对子类实例的引用存储为主类上的属性:
class MainAdminClass {
public $child_admin;
public function init() {
$this->child_admin = new ChildAdminClass();
$this->child_admin->init();
}
}
如果这样做,您可以按如下方式删除它:
remove_action(\'admin_notices\', array($main_admin_class->child_admin, \'printFoo\'));
那是假设
$main_admin_class
在使用此代码的任何范围内都可用。这就解决了主要问题:要从类实例中删除操作,需要传递该实例。因此,这一切都归结为变量范围,并确保类实例是可访问的,以便可以使用它们删除挂钩。最终,这是一个纯粹的PHP问题,而不是WordPress特有的问题。