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 は単なる関数パッケージであり、クラスではありません。しかし、クライアントがMyPackageを呼び出すスコープを離れるときに、RAIIを使用したい-> connect、disconnectが呼び出されます。MyPackage のオブジェクトを返さないため、DESTROY 関数を呼び出すことができません。新しいメソッドを追加するなど、インターフェースとクライアントコードを変更したくないので、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 に答える