![]() |
![]() |
10 Einträge, 1 Seite |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
sub new { ref (my $class = shift) && croak 'class name needed in constructor'; my $self = {@_}; $self->{$_} = $self->{$_} || '' for(qw/db user pass/); bless $self, $class; $self->connect(); $self; } sub connect { my $self = shift; my $dbh = DBI->connect("dbi:mysql:$self->{'db'}", $self->{'user'}, $self->{'pass'}) || croak "DB-error: $DBI::errstr\n"; $self->{'db_handle'} = $dbh; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
my %parameter = @_; my %option = ( '-db' => 'required', '-user' => 'required', '-pass' => 'required', '-extra' => 'optional', ); foreach my $parameter (keys %parameter){ unless (exists $option{$parameter}){ warn "Unknown parameter '$parameter'"; next; } # und so weiter... }
#Kein Kommentar+2007-12-14 17:56:46--Sollte, ja. Aber wer hindern den Benutzer daran?aber naja, $obj->{user} sollte von dem benutzer des moduls sowieso nicht
benutzt werden, ...
Struppi+2007-12-14 19:27:30--#Kein Kommentar+2007-12-14 17:56:46--Sollte, ja. Aber wer hindern den Benutzer daran?aber naja, $obj->{user} sollte von dem benutzer des moduls sowieso nicht
benutzt werden, ...
Wie frage ich & perlintro
brian's Leitfaden für jedes Perl-ProblemStruppi+2007-12-15 13:03:54--daher würde ich die Prüfung eben in den Aufruf von connect verpacken, sinnvollerweise z.b. über -param => 'value', dann läßt sich die Funktion leicht anpassen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
sub check_mysql_params { my( $self ) = @_; foreach my $attr ( qw( db username pass ) ) { unless( defined $self->$attr ) { croak( "Error: attribute '$attr' not set" ); } } # eventuell hier noch den connect testen return $self; } # check_mysql_params sub init { my( $self, %params ) = @_; # parameter hier setzen my $driver = $self->driver || 'mysql'; my $checkDriverParamsMethod = "check_${driver}_params"; if( $self->can( $checkDriverParamsMethod ) { $self->$checkDriverParamsMethod; } else { croak "Error: no method '$checkDriverParamsMethod' existing"; } } # init
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
my @objectInterfaceMethods = qw( db user pass db_handle ); foreach my $method ( @objectInterfaceMethods ) { # anonyme sub erzeugen my $sub = sub { my( $self, @params ) = @_; $self->{ $method } = $params[0] if @params; return $self->{ $method }; }; # sub # sub in der symboltabelle unter dem Namen $method verankern no strict 'refs'; *{ $method } = $sub; } # foreach sub new { my( $class, @params ) = @_; croak 'class name needed in constructor' if ref $class; my $self = bless( {}, $class ); $self->init( @params ) if scalar @params; return $self; } sub init { my( $self, %params ) = @_; foreach my $param ( keys %params ) { if( $self->can( $param ) ) { $self->$param( $params{$param} ); } else { croak( "Invalid param '$param'" ); } } # foreach # hier eventuell noch ueberpruefen, ob alle benoetigten parameter gesetzt sind # ... $self->connect(); return $self; } sub connect { my $self = shift; my $dbh = DBI->connect("dbi:mysql:" . $self->db, $self->user, $self->pass) or croak "DB-error: $DBI::errstr\n"; $self->db_handle( $dbh ); return $self; }
pktm+2007-12-14 21:19:24--Nichts.So wirklich hindern kannst du den Benutzer nicht daran, außerd du verwendest die entsprechenden Techniken.
Aber das soll *dich* ja nicht daran hindern eine ordentliche Initialisierung zu forndern :)
Class::Accessor. Aber die "ordentliche" initialisierung sehe ich hier nicht. Einmal ist wie schon erwähnt das vorbelegen mit einem Leerstring nicht überflüssig, ausserdem sind es keine Werte die das Modul braucht, sondern lediglich eine Methode. ![]() |
![]() |
10 Einträge, 1 Seite |