플러그인이를 만들 때마다 new MyClass();
고유 한 이름을 가진 변수에 할당해야합니다. 그렇게하면 클래스의 인스턴스에 액세스 할 수 있습니다.
그래서 그가하고 있다면 $myclass = new MyClass();
, 당신은 이것을 할 수 있습니다 :
global $myclass;
remove_action( 'wp_footer', array( $myclass, 'my_action' ) );
플러그인이 전역 네임 스페이스에 포함되어 있기 때문에 플러그인 본체의 암시 적 변수 선언은 전역 변수입니다.
플러그인이 새로운 클래스의 식별자를 어딘가에 저장하지 않으면 기술적으로 버그입니다. 객체 지향 프로그래밍의 일반적인 원칙 중 하나는 어떤 변수가 참조하지 않는 객체는 정리 또는 제거 될 수 있다는 것입니다.
PHP는 절반 정도의 OOP 구현이기 때문에 PHP는 특히 Java와 같이 이것을하지 않습니다. 인스턴스 변수는 고유 한 객체 이름을 가진 문자열 일뿐입니다. 변수 함수 이름 상호 작용이 ->
연산자 와 작동하는 방식 때문에 작동합니다 . 따라서 그렇게하는 new class()
것은 실제로 어리석게도 완벽하게 작동 할 수 있습니다. :)
따라서 결론은 절대하지 마십시오 new class();
. 수행 $var = new class();
과 다른 비트를 참조하기위한 몇 가지 방법이 $ var에 액세스 할 수 있도록.
편집 : 몇 년 후
내가 플러그인을 많이 본 것은 "Singleton"패턴과 비슷한 것을 사용하는 것입니다. 클래스의 단일 인스턴스를 얻기 위해 getInstance () 메소드를 작성합니다. 이것은 아마도 내가 본 최고의 솔루션 일 것입니다. 플러그인 예 :
class ExamplePlugin
{
protected static $instance = NULL;
public static function getInstance() {
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
}
getInstance ()를 처음 호출하면 클래스를 인스턴스화하고 포인터를 저장합니다. 이를 사용하여 작업에 연결할 수 있습니다.
이것의 한 가지 문제는 생성자를 사용할 경우 생성자 안에서 getInstance ()를 사용할 수 없다는 것입니다. $ instance를 설정하기 전에 new가 생성자를 호출하므로 생성자에서 getInstance ()를 호출하면 무한 루프가 발생하고 모든 것이 중단됩니다.
한 가지 해결 방법은 생성자를 사용하지 않거나 최소한 getInstance ()를 사용하지 말고 클래스에 "init"함수를 사용하여 작업 등을 설정하는 것입니다. 이처럼 :
public static function init() {
add_action( 'wp_footer', array( ExamplePlugin::getInstance(), 'my_action' ) );
}
다음과 같이 파일 끝에서 클래스가 모두 정의 된 후 플러그인 인스턴스화는 다음과 같이 간단 해집니다.
ExamplePlugin::init();
Init은 액션을 추가하기 시작하고, getInstance ()를 호출하여 클래스를 인스턴스화하고 그 중 하나만 존재하는지 확인합니다. init 함수가 없으면 클래스를 처음 인스턴스화하기 위해 대신 수행합니다.
ExamplePlugin::getInstance();
원래 질문을 해결하기 위해 외부에서 (다른 플러그인에서) 액션 후크를 제거하면 다음과 같이 수행 할 수 있습니다.
remove_action( 'wp_footer', array( ExamplePlugin::getInstance(), 'my_action' ) );
plugins_loaded
이것을 액션 훅에 연결된 것에 넣으면 원래 플러그인에 의해 훅되는 액션을 취소합니다.