有没有办法在__PACKAGE __->?的同一模块中设置继承?

时间:2013-04-23 20:15:44

标签: perl class inheritance constructor dbi

例如,我想在启动时存储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? 
 }

2 个答案:

答案 0 :(得分:1)

子类DBI类不是很简单,只是read the documentation。 其他方式可能是声明proxy object,并在AUTOLOAD的帮助下调用包装对象。

答案 1 :(得分: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(...);