0

我正在使用 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 抱怨语法..现在这个关闭的东西似乎没有给我带来我想象的那么多好处..

谢谢!

4

1 回答 1

1

闭包不是您的子模型类的方法,因此您无法访问该实例。您需要将其提供给关闭:

$instance = $this;
$table = $this->_table;
$update_db_closure = function() use ($instance, $table) {
    // do some db updates
    $instance->db->update($table, ...);
    $instance->db->update($table, ...);
};

$this->_table属性是protected,因此您将无法在闭包内访问它,因此您需要传递它的副本。

于 2012-06-04T11:47:12.347 回答