web-dev-qa-db-fra.com

Étendre une classe d'un plugin

Il y a un plugin qui utilise une classe; et créez un objet comme celui-ci:

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();

Je veux étendre la classe parce que je veux utiliser cette méthode pour supprimer une action:

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
    }
}

Mais global $instance n'obtient pas l'objet de classe. Il retourne null . Alors, comment puis-je obtenir l'objet $instance dans la classe étendue?

1
otinane

Le support de Woocommerce m'a envoyé la solution de mon problème:

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

Eh bien, vous avez utilisé static la clé Word dans la première fonction. Le mot clé static ne créera pas la variable global. Il s'assurera que la variable n'existe que dans l'étendue de la fonction locale, mais ne perd pas sa valeur lorsque l'exécution du programme quitte cette étendue.

Donc, si vous essayez d'accéder à la deuxième fonction du global $my_class;, il retournera évidemment null. Cause PHP traitera le global $my_class; de la deuxième fonction comme une nouvelle variable globale qui vient d'être déclarée.

J'espère que cela pourra aider.

0
CodeMascot