Klassen und Opperatoren ::
Thomas
- php
Hallo!
Worin liegt der Vorteil, wenn ich Funktionen wie z.B. Euro-Dollar-Umrechnungen in Klassen lege, anstatt sie direkt, ohne Klassen, stehen zu haben (wenn ich hier NICHT mit Objekten arbeite
=> im meinem PHP-Buch ist ein Beispiel, wo ich folgendes habe (leicht gekürzt)
class convert
{
funtion inDo ($euro)
{
$dollar=$euro*1,056766 //meinte Fantasiezahl *g*
return $dollar;
}
funtion inEur ($euro) { */das ganze umgekehrt /* }
}
echo "20 Euro in Dollar:".convert::inDo(20);
Danke
Thomas
Hallo,
vielleicht als Anfang.
gruss
Hallo,
vielleicht als Anfang.
Dieses Beispiel hat nur bedingt etwas mit OOP (objektorientiertes Programmieren) zu tun, da die Funktion mittels "::" aufgerufen wird. D.h. eine Klasse stellt nur eine Sammlung von Funktionen da, es muss/wird jedoch keine Instanz erstellt.
Ich persönlich verwende den Operator "::" nur selten, weil ich keinen konkreten Nutzen in ihm sehe.
Grüße
Jasmin
Hallo Jasmin.
[…] D.h. eine Klasse stellt nur eine Sammlung von Funktionen da, es muss/wird jedoch keine Instanz erstellt.
Ich persönlich verwende den Operator "::" nur selten, weil ich keinen konkreten Nutzen in ihm sehe.
Einen Nutzen hast du bereits selbst genannt: es muss nicht erst eine Instanz des jeweiligen Objektes erzeugt werden, um auf dessen Methoden (sofern erlaubt versteht sich) zugreifen zu dürfen.
Einen schönen Dienstag noch.
Gruß, Ashura
Hallo!
Meine Frage war eigentlich so gemeint: Worin liegt der Vorteil dieser eigentlich nur "Verschachtelung" von "Funktionen", den da ich hier ja KEIN Objekt nutze kann man ja auch ned von Methoden reden...
PS: Ich weiß was es mit Objekten, Klassen und objektorientiertem programmieren auf sich hat...
Danke
Thomas
echo $begrüßung;
Meine Frage war eigentlich so gemeint: Worin liegt der Vorteil dieser eigentlich nur "Verschachtelung" von "Funktionen", den da ich hier ja KEIN Objekt nutze kann man ja auch ned von Methoden reden...
Ich hatte bei meiner ersten Antwort übersehen, dass du hier statische Methodenaufrufe nutzt. Der Vorteil ist, dass diese Methoden hier in einer Klasse zusammengefasst sind und somit eine Art Namensraum simuliert wird. Du hast also quasi Funktionen, die nicht mit "echten" Funktionen kollidieren, die den gleichen Namen haben. Nachteil ist, dass das Schlüsselwort $this und damit Objekt-Variablen nicht genutzt werden können, da es beim statischen Aufruf keine Instanz gibt.
Ab PHP5 kann man statische Klassenvariablen definieren, die allerdings für alle Zugreifenden[*] gleich sind. Dies kann aber auch ein Vorteil sein, wenn man das Singleton-Pattern verwenden möchte.
Beispielsweise soll es von einem Datenbank-Objekt immer nur eine Instanz geben. Man kann dazu auf Verdacht hin am Anfang eines Scriptes eine Instanz der DB-Klasse erzeugen, diese einer Variable zuweisen und über diese Variable drauf zugreifen. Was aber, wenn man innerhalb einer Funktion das DB-Objekt braucht? Mit global zu arbeiten ist unschön. Und wenn sich herausstellt, dass man doch keine DB-Zugriffe braucht, weil z.B. der Anwender das Affenformular immer noch nicht richtig ausgefüllt hat, hat man umsonst die DB konnektiert. Hier greift dann das Singleton-Pattern. Eine statische Methode liefert entweder die bereits erzeugte Instanz aus oder erzeugt eine neue, liefert diese aus und merkt sie sich in einer statischen Klassen-Variable.
Ein Implementationsbeispiel befindet sich im oben verlinkten Handbuch-Kapitel.
echo "$verabschiedung $name";
[*] natürlich nur innerhalb einer Instanz eines Scripts
Hellihello
Nachteil ist, dass das Schlüsselwort $this und damit Objekt-Variablen nicht genutzt werden können, da es beim statischen Aufruf keine Instanz gibt.
aber mit self::$var oder Klasse::$var kann darauf mit PHP5 zugegriffen werden. Nachteil musste ich beim Verwenden von heredoc-Styntax feststellen, weil heredoc nur Variablen erkennt, die mit $ beginnen, also $this->var, nicht aber self::$var. Auch die geschweifte Klammer hilft nicht.
gruß,
frankx
Hallo,
Dieses Beispiel hat nur bedingt etwas mit OOP (objektorientiertes Programmieren) zu tun, da die Funktion mittels "::" aufgerufen wird. D.h. eine Klasse stellt nur eine Sammlung von Funktionen da, es muss/wird jedoch keine Instanz erstellt.
genau das ist OOP, eine (mehr oder minder gekapselte) Sammlung von Funktionen, bei Objekten auch Methoden genannt.
Sowas bietet sich zum Beispiel bei einer Factory Klasse an, wo keine Instanz erstellt werden muss, weil sie keine Instanzdaten vorhält.
class factory
{
function createAuto($typ)
{
return ($typ == 'VW')?new ÜberbewerteteLahmeUndTeureKiste():new Auto();
}
function createFlugzeug
{
return new Flugzeug();
}
}
$meinAuto = factory::createAuto();
Ich persönlich verwende den Operator "::" nur selten, weil ich keinen konkreten Nutzen in ihm sehe.
sei es nur um den eigenen Namespace und der Lesbarkeit willen.
gruss
echo $begrüßung;
Worin liegt der Vorteil, wenn ich Funktionen [...] in Klassen lege, anstatt sie direkt, ohne Klassen, stehen zu haben
Es gibt da erst einmal keinen nennenswerten Vorteil, wenn die Funktionen nicht eine gemeinsame Basis haben. Funktionen sind dazu da, um Funktionalitäten einen Rahmen zu geben.
Wenn du dir vorstellen kannst, dass eine Aufgabe mit Hilfe eines Objekts dargestellt werden kann, dann kannst du diesen Gedanken abstrahieren und eine Klasse daraus erstellen. Ein Objekt gibt Eigenschaften und Vorgehensweisen (Methoden), die eine Einheit bilden, den entsprechenden Rahmen.
Dein convert-Klassen-Beispiel würde etwas sinnvoller werden, wenn der Umrechnungskurs als Eigenschaft abgebildet würde. Die Methoden toDollar() und toEuro() müssten beide darauf zugreifen. Wenn sich der Kurs ändert muss nur die Eigenschft "Kurs" angepasst werden und die beide Methoden funktionieren immer noch richtig.
echo "$verabschiedung $name";
Hallo!
vor allen Dingen sollte man wohl darauf achten funktionierenden Code zu posten. Hier lesen auch Leutchen mit die sowas ungesehen glauben ;-)
class convert
{
funtion inDo ($euro)
^
{
$dollar=$euro*1,056766 //meinte Fantasiezahl *g*
^ ^
return $dollar;
}
funtion inEur ($euro) { */das ganze umgekehrt /* }
^ ^------------------------^
}
echo "20 Euro in Dollar:".convert::inDo(20);
class convert
{
function inDo ($euro)
{
$dollar=$euro*1.056766; //meinte Fantasiezahl *g*
return $dollar;
}
function inEur ($euro) { }
}
echo "20 Euro in Dollar:".convert::inDo(20);
Gruß Rainer