Verwenden von $ this aus der Kindklasse innerhalb der Shortcode-function

Ich erstelle viele benutzerdefinierte Shortcodes und um viel wiederverwendbaren Code zu laden, habe ich eine abstrakte Basisklasse für alle meine Shortcode-classn erstellt, um sie zu erweitern.

Wenn ich jedoch versuche, einen Verweis auf $ this innerhalb der function add_shortcode () zu verwenden, erhalte ich diesen Fehler:

Fatal error: Using $this when not in object context in...

Aber außerhalb der function add_shortcode () (in anderen classnmethoden) kann meine Kindklasse $ verwenden, die vorhersagbar auf sich selbst und ihre Elternklasse verweist.

Hier ist eine vereinfachte Version meiner Kind-Shortcode-class und Eltern-Abstract-class

Elternklasse

 abstract class ABS_Shortcode { protected $order; public function __construct() { $this->order = ''; } public function set_order_prop($value) { $this->order = $value; } public function get_order_prop() { return $this->order; } protected function setup_default_options() { //Setups up defaults not important for example. But does get called correctly from child class } } 

Kinderklasse

 class WC_Product_Categories extends ABS_Shortcode { protected $shortcode_base = 'wc_product_categories'; public function __construct() { parent::__construct(); // Call to method in parent class works fine $this->setup_default_options(); // Child method works fine $this->map_shortcode(); // Have to use __CLASS__ instead of $this here to not throw an error. Not sure why add_shortcode( $this->shortcode_base, array( __CLASS__, "build_shortcode") ); } protected function map_shortcode() { // Code to handle building shortcode attributes, not necessary for example } public function build_shortcode($atts, $content = null) { extract( shortcode_atts ( // Setup defaults array( 'category' => '', 'posts_per_page' => '', 'orderby' => '', 'order' => '', 'items_per_row' => '', 'hide_empty' => '', ), $atts) ); //Call to parent class property or method throws error when using $this //Fatal error: Using $this when not in object context in... $this->order = 'ASC'; $this->set_order_prop('ASC'); //Call using parent:: works to call parent method. //But inside parent class when using $this throws original error //Fatal error: Using $this when not in object context in... parent::set_order_prop('ASC'); // Try calling parent class property // Fatal error: Access to undeclared static property: ABS_VC_Shortcode::$order parent::$order; } } // Create class $wc_categories = new WC_Product_Categories(); 

Alle diese Fehler verschwinden, wenn sie nicht innerhalb der Shortcode-function (build_shortcode) aufgerufen werden, $ dies verhält sich korrekt und verweist entweder auf die Kind- oder Elternklasse-Eigenschaften und -Methoden.

Ich frage mich, warum der Verweis auf $ Fehler bei der Verwendung der function add_shortcode () wirft. Und wie kann ich das umgehen?

Vielen Dank

Solutions Collecting From Web of "Verwenden von $ this aus der Kindklasse innerhalb der Shortcode-function"

Ihr Problem ist in dem Callable-Objekt, das Sie hinzufügen:

 array( __CLASS__, "build_shortcode") 

Dies bedeutet:

 array( "WC_Product_Categories", "build_shortcode") 

Das entspricht:

 WC_Product_Categories::build_shortcode(); 

Aber build_shortcode ist keine static function / Methode, und statische functionen / Methoden haben kein $this Objekt, weil kein Objekt zugeordnet ist.

Was Sie eigentlich wollen, ist:

 array( $this, 'build_shortcode' ) 

Was bedeutet:

 $this->build_shortcode(); 

Was hast du erwartet.

Letzte Anmerkungen

  • Viele Leute benutzen stattdessen &$this . Das ist falsch. Es ist ein Überbleibsel von PHP4 und macht das nicht auf sehr subtile Weise. Wenn Sie dies sehen, entfernen Sie die & Referenz
  • Verwenden Sie nicht die extract . Es nimmt den Inhalt eines Arrays und gibt es in den aktuellen Namespace aus. Alles könnte da drin sein. Es regt auch schlechten Code an, verbirgt, wo Variablen herkommen, und lähmt IDE-Code-Informationen und automatisierte Werkzeuge. Vermeiden Sie es um jeden Preis.