来自类的短码处理程序出现PHP错误

时间:2012-08-10 作者:xmaestro

目前,我正在使用以下通用流程为插件添加短代码。

class MyPlugin {

    private $myvar;

    function baztag_func() {
        print $this->myvar;            
    }
}

add_shortcode( \'baztag\', array(\'MyPlugin\', \'baztag_func\') );
现在,当调用这个类及其方法时,我得到以下错误。

致命错误:不在中的对象上下文中时使用$this。。。

(行号是我打印$this->myvar)

这是Wordpress的问题还是我做错了什么?这似乎很简单。

3 个回复
最合适的回答,由SO网友:fuxia 整理而成

正如错误所述,您需要使用类的实例$this. 至少有三种可能性:

使一切保持静止

class My_Plugin
{
    private static $var = \'foo\';

    static function foo()
    {
        return self::$var; // never echo or print in a shortcode!
    }
}
add_shortcode( \'baztag\', array( \'My_Plugin\', \'foo\' ) );
但这不再是真正的OOP,只是名称空间。

首先创建真实对象

class My_Plugin
{
    private $var = \'foo\';

    public function foo()
    {
        return $this->var; // never echo or print in a shortcode!
    }
}

$My_Plugin = new My_Plugin;

add_shortcode( \'baztag\', array( $My_Plugin, \'foo\' ) );
这……行得通。但你遇到了一些obscure problems 如果有人想替换短代码。

因此,添加一个方法来提供类实例:

final class My_Plugin
{
    private $var = \'foo\';

    public function __construct()
    {
        add_filter( \'get_my_plugin_instance\', [ $this, \'get_instance\' ] );
    }

    public function get_instance()
    {
        return $this; // return the object
    }

    public function foo()
    {
        return $this->var; // never echo or print in a shortcode!
    }
}

add_shortcode( \'baztag\', [ new My_Plugin, \'foo\' ] );
现在,当有人想要获取对象实例时,他/她只需要写:

$shortcode_handler = apply_filters( \'get_my_plugin_instance\', NULL );

if ( is_a( $shortcode_handler, \'My_Plugin \' ) )
{
    // do something with that instance.
}
旧的解决方案:在类中创建对象
class My_Plugin
{
    private $var = \'foo\';

    protected static $instance = NULL;

    public static function get_instance()
    {
        // create an object
        NULL === self::$instance and self::$instance = new self;

        return self::$instance; // return the object
    }

    public function foo()
    {
        return $this->var; // never echo or print in a shortcode!
    }
}

add_shortcode( \'baztag\', array( My_Plugin::get_instance(), \'foo\' ) );

SO网友:Pavnish Yadav

您可以像这样在类中使用shortcode

class stockData{


    function __construct() {
        add_shortcode( \'your_shortcode_name\', array( $this, \'showData\' ) );
        //add_action(\'login_enqueue_scripts\', array( $this,\'my_admin_head\'));
    }

    function showData(){
        return \'<h1>My shortcode content</h1>\' ;
    }
}

$object=new stockData();
如果您想从另一个类访问短代码内容。你可以这样做
class my_PluginClass {

  public function __construct( $Object ) {

    $test = add_shortcode( \'your_shortcode_name\', array( $Object, \'your_method_name\' ) );

  }

}

class CustomHandlerClass{

  public function your_method_name( $atts, $content ) {
     return \'<h1>My shortcode content</h1>\' ;
  }
}

$Customobject  = new CustomHandlerClass();
$Plugin         = new my_PluginClass( $Customobject );

SO网友:woony

确保在使用类之前创建了它的一个实例,除非您确定它应该是静态调用的。静态调用方法时,不使用任何实例,因此它无权访问任何成员变量或方法。

结束

相关推荐

How to return loop contents

有时,我需要return 循环的输出(通常带有WP_Query 如本例所示)用于短代码或启用筛选器the_content.下面使用对象缓冲的代码可以工作,但我在其他地方读到过缓冲可能效率低下。我也看到过HEREDOC,但我不知道这在这里是如何工作的,除非我先将每个模板标记保存为变量(这似乎再次低效)。所以我的问题是,返回循环输出的最佳方法是什么?<?php if ( $cms_pl_pages->have_posts() ) : ob_start(); // start object