我正在使用 php 5.3.3 并使用 codeigniter 开发 MVC webapp。我试图重构的代码基本上是一堆:
$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 中不支持使用 $this 用法。
现在无法使用闭包,我还能做什么?
更新: 现在我Undefined property: App_Blog::$_table
知道 App_About 是在 Blog_model 中调用 get() 函数的控制器。我已经尝试过function() use($instance, , $instance->_table, $id)
,但是 php 抱怨语法..现在这个关闭的东西似乎没有给我带来我想象的那么多好处..
谢谢!