我正在构建许多自定义短代码,为了卸载大量可重用代码,我为所有要扩展的短代码类创建了一个抽象基类。
然而,当我试图引用$this 在add\\u shortcode()函数中时,我收到以下错误:
Fatal error: Using $this when not in object context in...
然而,在add\\u shortcode()函数之外(在其他类方法中),我的子类可以使用$this,可以预见地引用自身及其父类。
下面是我的子shortcode类和父抽象类的简化版本
父类
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\\u shortcode)内部调用,所有这些错误都会消失。$这可以正确地引用子类或父类的属性和方法。
我想知道为什么在使用add\\u shortcode()函数时,对$this的引用会引发错误。我怎么才能避开这个?
谢谢
最合适的回答,由SO网友:Tom J Nowell 整理而成
您添加的可调用对象存在问题:
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的延续,并没有以非常微妙的方式做同样的事情。当您看到此情况时,请删除&
参考不要使用extract
作用它获取数组的内容并将其溢出到当前命名空间中。里面可能有任何东西。它还鼓励编写错误代码,隐藏变量的来源,并削弱IDE代码intel和自动化工具。不惜一切代价避免它