-1

例如,我想在启动时存储 dbi 连接的数据,这样我就不必通过对象对其进行初始化,他们是否可以在同一个包中执行此操作?

通过我的对象初始化将是:

my $obj = foo->new;
my $dbh = $obj->connect('dbi', 'user', 'pw');

但我想在启动时将它存储到我可以使用的地方

my $obj = foo->new;
my $blah = $obj->selectall_arrayref(...);


package foo; 

use strict; 
use warnings;  

__PACKAGE__->connect('dbi', 'user', 'pw');    

sub new {   
 my $class = shift;   
 my $self  = {};   
 bless ($self, $class);   
 return $self; 
}   

 sub connect {   
  my $class = shift;   
  my $self  = ref $class || $class;   
  return $self->(@_);     # Is this possible? 
 }
4

2 回答 2

1

子类化 DBI 类并不是很简单,只需阅读文档即可。其他方式可能是声明一个代理对象,并在AUTOLOAD的帮助下调用包装的对象。

于 2013-04-23T21:14:53.193 回答
1

使用代理对象的替代方法是简单地将 DBI 组合到您的类中。

package foo;    
use DBI;

sub new {   
    my $class = shift;
    my $self  = {DBH => DBI->connect(@_)};   
    bless ($self, $class);   
    return $self; 
}

# defer method call to DBH
sub selectall_arrayref {shift->{DBH}->selectall_arrayref(@_)}

package main;    
my $obj = foo->new('dbi:...', 'user', 'password');
my $blah = $obj->selectall_arrayref(...);
于 2013-04-24T03:15:33.117 回答