在短码函数内部使用子类中的$This

时间:2015-04-22 作者:Benjamin

我正在构建许多自定义短代码,为了卸载大量可重用代码,我为所有要扩展的短代码类创建了一个抽象基类。

然而,当我试图引用$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的引用会引发错误。我怎么才能避开这个?

谢谢

1 个回复
最合适的回答,由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和自动化工具。不惜一切代价避免它

结束

相关推荐

Multiple level shortcodes

我正在开发一个插件,遇到了一种情况,我希望有人能帮我找到一个解决方案。我想要一个短代码结构,如:[shortcode_1] [shortcode_2] [shortcode_3] [shortcode_4][/shortcode_4] [/shortcode_3] [/shortcode_2] [/shortcode_1] 但如果我使用add\\u短代码,只有第一个短代码有效。。。有没有办法得到这样的短代码结构?谢谢