クラスを使うプラグインがあります。そしてこのようなオブジェクトを作成します。
class WC_Disability_VAT_Exemption {
public function __construct() {
add_action( 'woocommerce_after_order_notes', array( $this, 'exemption_field' ) );
}
public function exemption_field() {
//some code here
}
}
/**
* Return instance of WC_Disability_VAT_Exemption.
*
* @since 1.3.3
*
* @return WC_Disability_VAT_Exemption
*/
function wc_dve() {
static $instance;
if ( ! isset( $instance ) ) {
$instance = new WC_Disability_VAT_Exemption();
}
return $instance;
}
wc_dve();
アクションを削除するためにこのメソッドを使用したいので、クラスを拡張したいです。
class WC_Disability_VAT_Exemption_Extend extends WC_Disability_VAT_Exemption {
function __construct() {
$this->unregister_parent_hook();
add_action( 'woocommerce_after_order_notes', array( $this, 'exemption_field' ) );
}
function unregister_parent_hook() {
global $instance;
remove_action( 'woocommerce_after_order_notes', array( $instance, 'exemption_field' ) );
}
function exemption_field() {
//---some code here
}
}
しかしglobal $instance
はクラスオブジェクトを取得しません。 nullを返します。それでは、どのように私は$instance
オブジェクトを拡張クラスに入れることができますか?
Woocommerceサポートは私に私の問題の解決策を送ってきました:
function unregister_parent_hook() {
if ( function_exists( 'wc_dve' ) ) {
$instance = wc_dve();
remove_action( 'woocommerce_after_order_notes', array( $instance, 'exemption_field' ) );
}
}
さて、あなたは最初の関数の中で static
というキーワードを使いました。キーワードstatic
は、変数global
を作成しません。変数がそのローカル関数スコープ内にのみ存在することを確認しますが、プログラムの実行がこのスコープを離れたときにその値が失われることはありません。
そのため、2番目の関数でglobal $my_class;
にアクセスしようとすると、明らかにnull
が返されます。原因PHPは、2番目の関数のglobal $my_class;
を、宣言されたばかりの新しいグローバル変数として扱います。
それが役立つことを願っています。