1

该包有一个 DBI->connect 的包装器:

Package MyPackage;
our $dbh;
sub connect {
    $dbh = DBI->connect(...)
    return $dbh;
}

sub disconnect {
    $dbh->disconnect;
    #some other things...
}
In the client program:
{
    my $dbh = MyPackage->connect(...)
}

MyPackage 只是一个函数包,它不是一个类。但现在我想使用 RAII,当离开客户端调用 MyPackage->connect 的范围时,调用断开连接。无法调用 DESTROY 函数,因为我们不返回 MyPackage 的对象。我不想更改接口和客户端代码,例如添加新方法,所以我认为也许有一种方法可以从 DB 句柄继承并覆盖它的 DESTROY 方法。在 DESTROY 方法中,它可以调用 MyPackage- >断开连接。

这是可行的还是有人可以帮助想出任何其他好的解决方案?非常感谢你。

4

1 回答 1

3

是的,如果你愿意,你可以这样做。

Package MyPackage;
use base 'DBI::db';
sub connect {
    my $dbh = DBI->connect(...)
    bless $dbh => 'MyPackage';
    return $dbh;
}

sub DESTROY {
    my ($dbh) = @_;
    $dbh->disconnect;
    #some other things...
}

客户端程序仍然可以connect像以前一样调用您的子例程。当实例超出范围时,将调用 DESTROY 方法并由您的代码处理。其他数据库句柄方法由 DBI::db 处理,就像以前一样。

于 2013-09-02T13:15:23.917 回答