web-dev-qa-db-ja.com

プラグインのクラスを拡張する

クラスを使うプラグインがあります。そしてこのようなオブジェクトを作成します。

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オブジェクトを拡張クラスに入れることができますか?

1
otinane

Woocommerceサポートは私に私の問題の解決策を送ってきました:

function unregister_parent_hook() {
  if ( function_exists( 'wc_dve' ) ) {
    $instance = wc_dve();
   remove_action( 'woocommerce_after_order_notes', array( $instance, 'exemption_field' ) );
    }
 }
3
otinane

さて、あなたは最初の関数の中で static というキーワードを使いました。キーワードstaticは、変数globalを作成しません。変数がそのローカル関数スコープ内にのみ存在することを確認しますが、プログラムの実行がこのスコープを離れたときにその値が失われることはありません。

そのため、2番目の関数でglobal $my_class;にアクセスしようとすると、明らかにnullが返されます。原因PHPは、2番目の関数のglobal $my_class;を、宣言されたばかりの新しいグローバル変数として扱います。

それが役立つことを願っています。

0
CodeMascot