bleau: Objektübergabe

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

  1. 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

    --
    RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
    Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
    1. 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

      1. 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

        --
        RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
        Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
        1. #################################################################################

          vielen dank

          ##################################################################################

          1. Halihallo bleau

            vielen dank

            Bitte, gerne geschehen :-)

            Viele Grüsse

            Philipp

            --
            RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
            Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.