функция — PHP использует $ this, когда не в контексте объекта

У меня есть следующий класс:

class Decode {
public $code;
public $codeStore;
public $store;
public $varName;
public $storeNew = array();
public $storeNew = array();

public function __construct($code) {
$this->code = $code;
$this->codeStore = $code;
$this->varName = substr($this->code, 0, 30);
$this->varName = str_replace("var ", "", $this->varName);
$this->varName = substr($this->varName, 0, strpos($this->varName, "=[\""));
}

public function chrToVar() {
// The line below is line 38
$this->code = preg_replace_callback('/'.$this->varName.'\[([0-9]+)\]/', function($matches) { return $this->storeNew[$matches[1]]; }, $this->code);
}
}

$script = new Decode('stuff');
$script->chrToVar();

Когда я запускаю этот код, я получаю следующую ошибку:

Неустранимая ошибка: использование $ this, когда не в контексте объекта в
/var/www/programs/decode.php в строке 38

Почему это происходит? Я предполагаю, что это как-то связано с параметром, который имеет функцию в preg_replace_callback, но я понятия не имею, как это исправить.

1

Решение

Начиная с PHP 5.4 $this может использоваться в анонимных функциях и относится к текущему объекту, простой пример:

class Decode {
public $code;

public function __construct( $code ) {
$this->code = $code;
}

public function chrToVar() {
$this->code = preg_replace_callback( '/\w+/',
function( $matches ) {
var_dump( $this );
}, $this->code
);
}
}

$script = new Decode( 'stuff' );
$script->chrToVar();

Для версии 5.3 вы можете использовать обходной путь, но он работает только с открытыми свойствами:

$self = $this;
$this->code = preg_replace_callback( '/\w+/',
function( $matches ) use ( $self ) {
var_dump( $self );
}, $this->code
);

Мой совет, если возможно, обновить хотя бы до 5.4.

Больше информации: PHP 5.4 — «закрыть $ эту поддержку»

3

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

Других решений пока нет …

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