Я использую php 5.3.3 и разрабатываю MVC webapp с использованием codeigniter. Код, который я пытаюсь реорганизовать в основном связка:refactor transaction handling code in php
$this->db->trans_start();
// do some db updates
$this->db->update(...);
$this->db->update(...);
$this->db->trans_complete();
if ($this->db->trans_status() == FALSE) {
$this->handle_db_error();
}
поэтому у меня есть несколько из кода выше разброса вокруг в моих классах модели. Я хотел бы реорганизовать часть обработки транзакций из моделей и остаться СУХОЙ.
Я думал, что я мог бы с помощью закрытия, как следующее:
// in parent CI_Model class
class MY_Model extends CI_Model {
public function txn_wrap($closure) {
$this->db->trans_start();
$closure();
$this->db->trans_complete();
if ($this->db->trans_status() == FALSE) {
$this->handle_db_error();
}
}
// in child model class
class Blog_model extends MY_Model {
protected $_table = 'app_blog';
public function get($id) {
$instance = $this;
$closure = function() use($instance, $id) {
// do some db updates
$instance->db->update($instance->_table, array('title' => 'bla'), array('id' => $id));
};
$this->txn_wrap($closure);
}
Это не работает и дает мне "PHP Fatal error: Using $this when not in object context"
. Поэтому я предполагаю, что использование этого использования не поддерживается в 5.3.
Теперь не удалось использовать закрытие, что еще я могу сделать?
UPDATE: теперь я получаю Undefined property: App_Blog::$_table
где App_About является контроллер, который вызывает функцию Get() в Blog_model. Я пробовал function() use($instance, , $instance->_table, $id)
, но php жалуется на синтаксис .. Теперь эта закрывающая вещь не появляется, дайте мне столько преимуществ, сколько я думал.
спасибо!
спасибо. пытался, но все равно получал такую же ошибку. – perlwle
Это невероятно странно, так как '$ this' не упоминается в закрытии _at all_. Вы уверены, что получаете такую же ошибку? Где вы это понимаете? – lanzz
хорошо. $ instance - это копия $ this. возможно, это тоже запрещено? Я обновил свой вопрос, но в основном просто заменил 'function()' на 'function() use ($ instance)' и добавил некоторый контекст. – perlwle