Использование $ this в пределах одного

Я пытаюсь создать синглтон для обработки некоторых данных формы, однако я не могу понять, как эффективно устанавливать / ссылаться на переменные в классе.

Идея заключается в том, что при представлении, функция getpostdata() называется, который создает новый экземпляр в классе meta и сохраняет массив $_POST['ids'] в $this->ids в классе. Затем фильтр используется для отправки другой части данных в функцию в том же классе; Однако, когда я пытаюсь сделать ссылку на $this->ids внутри этой функции я получаю следующую ошибку:

Неустранимая ошибка: использование $ this, когда не в контексте объекта в public_html / wp-content / plugins / myplugin / myplugin.php

Ниже приведен код:

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

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

0

Решение

Я думаю, что проблема не в синглтоне, а в том, что вы делаете статический вызов meta::metafunction, Мой 15-секундный анализ, я думаю, вам нужно создать экземпляр мета с чем-то вроде

$test = meta::get_instance(); а затем позвоните add_filter('filter', '$test->metafunction');

1

Другие решения

Вы не возражаете, чтобы я немного изменил ваш код?

Я думаю, вам нужно позвонить 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

0

Я хотел бы использовать:

$your_plugin = new meta();

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

Увидеть WP Codex

0
По вопросам рекламы [email protected]