Почему нельзя передавать свойство текущего объекта в замыкание? Приветствую коллеги. Помогите разобраться в тонкостях языка. Второй час не могу найти ничего даже близко похожего. Мануал с SO все уже вычитал)) Ошибка следующая:
PHP Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR), expecting ')', Судя по всему в этом месте $this->db
Код:class Orders {
function __construct(Database $db) {
$this->db = $db;
}
function createOrder(array $data) {
$this->db->transaction(function($this->db) { // ошибка в этой строке
$id1 = $this->db->insert('...');
$id2 = $this->db->insert('...');
$res = $this->db->update('...');
});
}
}
$orders = new Orders($db);
function createOrder(array $data) {
$db = $this->db;
$this->db->transaction(function($db) { // Так работает
$this->db->transaction(function() use ($db) { // И так тоже
$id1 = $this->db->insert('...');
$id2 = $this->db->insert('...');
$res = $this->db->update('...');
});
}
Это нафиг не удобно вообще, в каждом методе прегонять в локальную переменную $db = $this->db, сейчас их 5, а когда будет 25, это же кабзда.

21 Авг 2019 в 07:01
219 +1
0
Ответы
1

Ошибка возникает из-за того, что вы пытаетесь передать свойство текущего объекта $this->db в замыкание через параметр функции. В PHP нельзя передавать свойства объекта напрямую в замыкания таким образом.

Вместо этого, вам нужно использовать ключевое слово use для передачи свойства объекта в замыкание. В вашем случае, правильное использование будет таким:

function createOrder(array $data) {
$this->db->transaction(function() {
$id1 = $this->db->insert('...');
$id2 = $this->db->insert('...');
$res = $this->db->update('...');
});
}

Или если вам нужно использовать $this->db внутри замыкания для других целей, вы можете передать его через use:

function createOrder(array $data) {
$db = $this->db;
$this->db->transaction(function() use ($db) {
$id1 = $db->insert('...');
$id2 = $db->insert('...');
$res = $db->update('...');
});
}

Помните, что использование use позволяет передать переменную в замыкание извне, и это является удобным способом работать с переменными объекта в замыканиях.

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир