Thread Can't call method - Wertzuweisung schlägt fehl? (16 answers)
Opened by Karakash at 2011-03-24 09:51

pq
 2011-03-24 10:49
#146852 #146852
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
nun ja, ohne ein bisschen lektüre wirst du ewig rumprobieren.
OOP kann in jeder sprache ein bisschen anders implementiert sein. und da es in perl5 auch nicht von anfang an zur sprache gehörte, gibt es hier noch zusätzliche dinge, die man beachten muss.
du hast in deinem code im prinzip klassenvariablen angesprochen.

Foo::Bar::baz() ist ein funktionaufruf des packages Foo::Bar.
$Foo::Bar::boo ist eine package-variable des packages Foo::Bar.

wenn du ein objekt namens $foo ist, ist $foo::bar also mitnichten eine instanzvariable des objektes $foo, sondern eine package-variable des packages foo.

um sauber OOP zu programmieren, solltest du für jedes attribut einen accessor anlegen und alle attribute dann nur über diese accessors ansprechen. also $foo->attribute() z.b.

dafür kannst du CPAN:Class::Accessor oder CPAN:Moose benutzen (welches dir auch automatisch einen konstruktor erstellt).

eine methode überschreibt in perl immer die methode der klasse, von der die klasse erbt. wenn man diese aufrufen will, sagt man:
$self->SUPER::new, wenn man schon ein objekt in $self hat oder
$class->SUPER::new, wenn in $class nur der packagename steht.

hier noch was zum lesen:
http://p3rl.org/perlboot
http://p3rl.org/perltoot

wobei zu beachten ist, dass die beispiele dort alle accessors selber schreiben, damit man lernt, wie das geht. Moose und Class::Accessor erledigen das aber für dich.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem

View full thread Can't call method - Wertzuweisung schlägt fehl?