DataMapper For Codeigniter:可以实例化模型对象一次并重用


DataMapper For Codeigniter: Possible To Instantiate Model Object Just Once and Reuse?

我不想在这里发垃圾邮件或做广告,我很重视这个社区和那些愿意花时间回答问题的人(像我一样)。我已经为Codeigniter构建了一个名为WolfAuth的身份验证库。它目前依赖于DataMapper进行所有数据库交互,直到进一步通知。

每个函数当前使用的代码如下所示:

$u = new User;
$u->get_by_id($user_id);
if ( $u->exists() )
{  
    // Do user stuff here  
}

我不完全确定PHP是如何处理对象实例化的,但可以肯定的是,在50多个函数中这样做对性能不利,如果不是,还会增加不必要的对象实例化。是否有可能在每个函数中使用和重用每个DataMapper模型对象的全局实例化?

就像下面这样

class Someclass {
    protected $user;
    protected $group;
    protected $roles;
    public function __construct()
    {
        $this->user  = new User;
        $this->group = new Group;
    }
    public function the_user($user_id)
    {
        $user = $this->user->get_by_id($user_id);
        if ( $user->exists() )
        {
            echo "The user exists!";
        } 
    }
}

我只是在这里非常挑剔,还是我所要求的是可能的,也许是更好的方式来做事情,因为我已经建立了这样一个大的图书馆?

是的,你可以在php中传递对象作为参数。

class Someclass {
protected $user;
protected $group;
protected $roles;
public function __construct()
{
    $this->user  = new User();
    $this->group = new Group();
}
public function get_user($user_id)
{
    if (empty($this->user->id))
    {
        $user = $this->user->get_by_id($user_id);
    }
    else
    {
        $user = $this->user;
    }
    if ( $user->exists() )
    {
        prove_user_exists($user);
        return $user;
    }
    else
    {
        show_error('No User Found');
    }
}
public function prove_user_exists($user)
{
    log_message('info', $user->id);
}

然后,当您需要用户时,您可以调用get_user($user_id) -如果用户已经找到,那么您将不必再次调用db