Использование $ this из класса child внутри функции shortcode

Я создаю много специальных коротких кодов и выгружаю много многоразового кода. Я создал абстрактный базовый класс для всех моих классов коротких кодов для расширения.

Однако, когда я пытаюсь использовать ссылку на $ this при использовании функции add_shortcode (), я получаю эту ошибку:

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

Однако вне функции add_shortcode () (в других методах класса) мой дочерний класс может использовать $ this, предсказуемо ссылающийся на себя и свой родительский класс.

Вот упрощенная версия класса моего младшего кода и родительского абстрактного класса

Родительский класс

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

Класс ребенка

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

Все эти ошибки исчезают, когда не вызываются изнутри функции shortcode (build_shortcode), $, это ведет себя правильно, ссылаясь на свойства и методы дочернего или родительского класса.

Мне интересно, почему ссылка на $ this вызывает ошибки при использовании функции add_shortcode (). И как я могу обойти это?

благодаря

Solutions Collecting From Web of "Использование $ this из класса child внутри функции shortcode"

Ваша проблема заключается в вызываемом объекте, который вы добавляете:

 array( __CLASS__, "build_shortcode") 

Это означает:

 array( "WC_Product_Categories", "build_shortcode") 

Это эквивалентно:

 WC_Product_Categories::build_shortcode(); 

Но build_shortcode не является static функцией / методом, а статические функции / методы не имеют $this объекта, потому что нет связанного с ним объекта.

То, что вы на самом деле хотите:

 array( $this, 'build_shortcode' ) 

Что означает:

 $this->build_shortcode(); 

Это то, чего вы ожидали.

Итоговые заметки

  • Многие люди используют &$this вместо этого. Это не верно. Это отсрочка от PHP4 и не делает то же самое очень тонко. Когда вы увидите это, удалите & reference
  • Не используйте функцию extract . Он принимает содержимое массива и выдает его в текущее пространство имен. Там может быть что угодно. Он также поощряет плохой код, скрываются переменные, и калечит IDE-код intel и автоматизированная оснастка. Избегайте его любой ценой.