Почему нельзя передавать свойство текущего объекта в замыкание? Приветствую коллеги. Помогите разобраться в тонкостях языка. Второй час не могу найти ничего даже близко похожего. Мануал с 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
196 +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 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 91 905 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир