该软件包有一个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的范围时,调用disconnect。 无法调用DESTROY函数,因为我们不返回MyPackage的对象。 我不想更改接口和客户端代码,比如添加新方法,所以我想也许有一种方法可以继承DB句柄并覆盖它的DESTROY方法。在DESTROY方法中,它可以调用MyPackage- >断开
它是可行的还是有人可以帮助想出任何其他好的解决方案? 非常感谢你。
答案 0 :(得分: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处理,就像以前一样。