在单身内使用$ this

时间:2014-10-22 21:35:27

标签: php singleton hook wordpress

我试图创建一个单例来处理某些表单数据,但是我无法弄清楚如何有效地设置/引用类中的变量。

这个想法是,在提交时,调用函数getpostdata(),在类meta中创建一个新实例,并将数组$_POST['ids']保存到$this->ids类。然后使用过滤器将另一段数据发送到同一类中的函数;但是,当我尝试在该函数中引用$this->ids时,我收到以下错误:

  

致命错误:当不在public_html / wp-content / plugins / myplugin / myplugin.php中的对象上下文中时使用$ this

以下是代码:

class meta 
{
    # Singleton
    protected static $instance = NULL;

    public $ids;  

    private function __construct() {}

    public static function get_instance() 
    {
        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }
    public function post_info($info)
    {
        $this->ids = $info;
        echo "good deal";
        return $this->ids;
    }

    public function metafunction($usermeta)
    {
        echo "<br/>Dumping USERMETA: ";
        var_dump($usermeta);
        var_dump( $this->ids );
        die();
    }
}
add_filter('filter', 'meta::metafunction');

add_action('action', 'getpostdata');

function getpostdata(){
    var_dump($_POST['ids']);
    $a=meta::get_instance();
    $info=$_POST['ids'];
    $a->post_info($info);
    echo "<br/>A vardump: ";
    var_dump($a);
}

输出如下:

array(3) { [0]=> string(4) "test" [1]=> string(5) "test1" [2]=> string(5) "test2" } infodump: testgood deal
A vardump: object(meta)#110 (1) { ["ids"]=> array(3) { [0]=> string(4) "test" [1]=> string(5) "test1" [2]=> string(5) "test2" } } 
Dumping USERMETA: array(4) { ["field_1"]=> string(4) "test" ["field_2"]=> string(4) "test" ["profile_field_ids"]=> string(3) "1,2" ["password"]=> string(34) "$P$BEgv26F57KKv/.dGpNcWip1Tbb8zyK0" } Fatal error: Using $this when not in object context in public_html/wp-content/plugins/myplugin/myplugin.php

我的猜测是,来自过滤器的电话不是犹太人,但如果有人有任何建议,我会很高兴。

3 个答案:

答案 0 :(得分:1)

我认为问题不在于单身,而是您正在对meta::metafunction进行静态调用。我的15秒分析,我认为你需要用

之类的东西来实例化meta

$test = meta::get_instance();然后致电add_filter('filter', '$test->metafunction');

答案 1 :(得分:0)

你介意我改变你的代码吗?

我认为你需要在你创建的类上调用new来实例化一个对象。一旦有了对象,就可以在其上调用$this->

<?php
class meta 
{
    public $ids;  

    public function meta() {} //this replaces __construct()


    public function post_info($info)
    {
        $this->ids = $info;
        echo "good deal";
        return $this->ids;
    }

    public function metafunction($usermeta)
    {
        echo "<br/>Dumping USERMETA: ";
        var_dump($usermeta);
        var_dump($this->ids);
        die();
    }
}

function getpostdata(){
    //using $array here as a placeholder for $_POST data
    $array = array('a' => 1, 'b' => 2, 'c' => 3); //$_POST['ids'];
    var_dump($array);

    //This line in specific
    $a = new meta();

    $info = $array; //$_POST['ids'];
    $a->post_info($info);
    echo "<br/>A vardump: ";
    var_dump($a);
}

getpostdata();

?>

以下是关于课程的php手册:http://php.net/manual/en/keyword.class.php

答案 2 :(得分:0)

我会用:

$your_plugin = new meta();

add_filter('filter', array($your_plugin, 'metafunction'));

请参阅WP Codex