Почему нельзя передавать свойство текущего объекта в замыкание? Приветствую коллеги. Помогите разобраться в тонкостях языка. Второй час не могу найти ничего даже близко похожего. Мануал с 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, это же кабзда.
Ошибка возникает из-за того, что вы пытаетесь передать свойство текущего объекта $this->db в замыкание через параметр функции. В PHP нельзя передавать свойства объекта напрямую в замыкания таким образом.
Вместо этого, вам нужно использовать ключевое слово use для передачи свойства объекта в замыкание. В вашем случае, правильное использование будет таким:
Помните, что использование use позволяет передать переменную в замыкание извне, и это является удобным способом работать с переменными объекта в замыканиях.
Ошибка возникает из-за того, что вы пытаетесь передать свойство текущего объекта $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 позволяет передать переменную в замыкание извне, и это является удобным способом работать с переменными объекта в замыканиях.