Я пытаюсь создать синглтон для обработки некоторых данных формы, однако я не могу понять, как эффективно устанавливать / ссылаться на переменные в классе.
Идея заключается в том, что при представлении, функция 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
Я предполагаю, что мой звонок от фильтра не кошерный, но если у кого-то есть какие-либо предложения, я был бы рад.
Я думаю, что проблема не в синглтоне, а в том, что вы делаете статический вызов meta::metafunction
, Мой 15-секундный анализ, я думаю, вам нужно создать экземпляр мета с чем-то вроде
$test = meta::get_instance();
а затем позвоните add_filter('filter', '$test->metafunction');
Вы не возражаете, чтобы я немного изменил ваш код?
Я думаю, вам нужно позвонить 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
Я хотел бы использовать:
$your_plugin = new meta();
add_filter('filter', array($your_plugin, 'metafunction'));
Увидеть WP Codex