Objektübergabe
bleau
- perl
Hallo,
habe folgende Frage:
ich möchte in einer pl datei ein obj. einer Klasse erzeugen und dieser Klasse durch den konstruktor ein objekt übergeben (in diesem Fall $cgi)
in der index.pl
use CGI;
use my_class;
my $cgi = new CGI;
my $my_class = my_class->new($cgi);
funzt bis dahin auch
in der der Klasse (my_class.pm) lege ich das cgi-obj auf $self, damit ich innerhalb der Klasse problemlos daraf zugreifen kann.
in my_class.pm
sub new()
{
my $class = shift;
my $self = {};
$self->{cgi} = shift;
bless($self, $class);
return $self;
}
möchte ich aber jetzt innerhalb einer Methode (innerhalb der Klasse my_class)
auf die methoden des cgi-Objektes zugreifen weis ich mir keinen rat!?
sub my_sub()
{
my $self = shift;
my %request = $self->{cgi}{Vars} ???? geht so nicht
}
würde gerne das Hash request mit den werten aus der $cgi->Vars Methode füllen
weis einer darüber bescheid?
gruss bleau
Halihallo bleau
ich möchte in einer pl datei ein obj. einer Klasse erzeugen und dieser Klasse durch den konstruktor ein objekt übergeben (in diesem Fall $cgi)
Willst du die Funktionsweise von CGI einfach nur erweitern, oder übernimmt die Klasse
auch noch andere Aufgaben? - Falls ersteres der Fall ist, wäre ein Erweitern der Klasse
sinnvoller.
sub new()
"sub new ()" - Konstrukte sind nur sinnvoll, wenn man Prototyping (und dafür sind die
Klammern gedacht) auch verwendet. Ansonsten ist "sub name {}" die korrekte Syntax.
{
my $class = shift;
my $self = {};
$self->{cgi} = shift;
Ich würde nicht so viele "shift"'s machen:
sub new {
my ($class,$cgi) = @_;
bless( {cgi=>$cgi}, $class );
}
macht das selbe.
möchte ich aber jetzt innerhalb einer Methode (innerhalb der Klasse my_class)
auf die methoden des cgi-Objektes zugreifen weis ich mir keinen rat!?
sub my_sub {
my ($self) = @_;
my %request = $self->{cgi}->Vars();
}
Beachte: $self->{cgi} ist ein Skalar, der eine Instanz des CGI-Moduls referenziert.
An Methoden oder Hash-values kommst du nur über einen dereferenzierenden Zugriff.
Will heissen:
$self->{cgi}{Vars} gibt es nicht. $self->{cgi}->{Vars} ist der korrekte dereferenzierte
Zugriff. Um dann an einen Wert des referenzierten Hashes zu kommen:
$self->{cgi}->{Vars}->{name}
denn auch Vars ist ein _referenzierter_ Hash, kein normaler. Merke einfach: Für eine
Referenz verwende "->" gefolgt vom "normalen" Zugriff (also ->{} für Hash, ->[] für
Arrays).
perldoc perldata
perldoc perlreftut
perldoc perlboot
perldoc perltooc
perldoc perldsc
perldoc perllol
Falls du dich in die Sache etwas einlesen möchtest, was ich sehr empfehle.
Viele Grüsse
Philipp
vielen dank du hast mir sehr viel geholfen :-)
hätte da nur eine frage
wie schaut es aus wenn ich ein ogj. einer klasse übergebe und sich in dieser übergebenen Klasse eine Methode befindet, der man parameter übergeben kann. wie rufe ich die methode mit parameterübergabe auf sprich:
in meiner pl datei steht
$dbh = DBI->connect($::cfg_db{'connect'},$::cfg_db{'namepwd'} , '');
möchte nun dem obj. $dbh zb.
my $new_obj = new_pm -> new ($dbh)
übergeben, um in dieser klasee die connection zu verwenden:
in der pm
sub my_sub
{
my $self = shift;
$self->{dbh}->{prepare($sql)}; # ???? $sql = statement for db
}
gruss bleau
Halihallo bleau
wie schaut es aus wenn ich ein ogj. einer klasse übergebe und sich in dieser übergebenen Klasse eine Methode befindet, der man parameter übergeben kann. wie rufe ich die methode mit parameterübergabe auf sprich:
Du musst mich nur wörtlich nehmen:
Merke einfach: Für eine
Referenz verwende "->" gefolgt vom "normalen" Zugriff (also ->{} für Hash, ->[] für
Arrays).
Wie schreibst du einen normalen Funktionsaufruf (eine Methode ist in Perl nichts
anderes)?
[funktion(@argumente)]?
{funktion(@argumente)}?
funktion(@argumente)?
wohl letzeres, oder? - Richtig. Beim dereferenzieren wie gesagt: einfach ein "->" davor:
->funktion(@argumente)
Nun muss perl aber noch wissen, von was du die Funktion aufrufen möchtest:
$obj->funktion(@argumente)
in meiner pl datei steht
$dbh = DBI->connect($::cfg_db{'connect'},$::cfg_db{'namepwd'} , '');
Sauberer ist es, wenn du den Packetnamen "main" angibst:
$main::cgf_db{}
sub my_sub
{
my $self = shift;
$self->{dbh}->{prepare($sql)}; # ???? $sql = statement for db
}
Wie gesagt: $self->{dbh}->prepare($sql);
---
Du hast das Kapitel:
"FURTHER INFORMATION - Subclassing the DBI" in "perldoc DBI" gelesen? - Vielleicht
interessiert dich das...
Viele Grüsse
Philipp
#################################################################################
vielen dank
##################################################################################
Halihallo bleau
vielen dank
Bitte, gerne geschehen :-)
Viele Grüsse
Philipp