Referenz? Anfang OOP PHP

Steusi

Nasenbär
Hallo, ich hatte mich schon mal mit OOP von PHP auseinander gesetzt, bin damals in Grundkenntnisse stecken geblieben und ich dachte ich spiel mal wieder etwas rum, um mein Wissen wieder auszufrischen.

Ich dachte an eine kleine Klasse (wie aus Browsergames, weil ich den Begriff hier immer öfter lese im Forum :-))




Ich setzte also ein paar Werte für meine Einheit:

PHP:
class Einheit {
	function setName($wert) {
		$this -> Name = $wert;
	}
}
PHP:
$Bogen = new Einheit;
$Bogen -> setName("Bogenschütze");
$Bogen -> setAngriff(15);
$Bogen -> setVerteidigung(20);
$Bogen -> setEnergie(70);

Klappt wunderbar, auslesen auch:

PHP:
class Einheit {
	function getName() {
		return($this->Name);
	}
}
PHP:
echo ("Die Einheit ".$Bogen->getName().":".
	"<br> Angriffsstärke: ".$Bogen->getAngriff().
	"<br> Verteidigung: ".$Bogen->getVerteidigung().
	"<br> Energie: ".$Bogen->getEnergie().
	"<br> Anzahl: ".$Bogen->getAnzahl().
	"<br>");

Aber das ganze für jedes erzeugte Objekt?
Da hätte ich doch gern eine Funktion:
PHP:
function einheiten_auslesen(&$NameEinheit) {
	echo ("Die Einheit ".$NameEinheit->getName().":".
		"<br> Angriffsstärke: ".$NameEinheit->getAngriff().
		"<br> Verteidigung: ".$NameEinheit->getVerteidigung().
		"<br> Energie: ".$NameEinheit->getEnergie().
		"<br> Anzahl: ".$NameEinheit->getAnzahl().
		"<br>");
}

einheiten_auslesen($Bogen);
Leider klappt es nicht, gibt es eine Möglichkeit mein Vorhaben zu realisieren

// Ich entschuldige mich vielmals für den Beitrag, ich hatte einen einfachen Tippfehler (meine Hauptfehlerquelle) übersehen. Bitte den Beitrag löschen
DANKE
 
Zuletzt bearbeitet:
Leider klappt es nicht

Hmm, ich glaub diese Fehlermeldung hab ich noch nicht gesehen.....



Ich Tappe einfach mal Blind in der Gegend herrum und schaue ob ich etwas treffe..

du hast die Funktion eiheiten_auslesen() aufgerufen aber die Funktion einheiten_auslesen() definiert.
 
Da fehlt ein n beim Funktionsaufruf :)

Wenns das nicht ist: Gibt's eine Fehlermeldung oder so? Sehe da spontan nix verkehrtes dran, außer, dass bei der Instanziierung des Objektes ( $Bogen = new Einheit; ) die Klammern fehlen:

PHP:
$Bogen = new Einheit();
 
@tBureck: Wenn ein neues Objekt initialisiert wird, sind die Klammern nicht verpflichtend. Nur dann wenn man dem Konstruktor der Klasse Variablen übergeben muss.
 
Und wieder was dazu gelernt.. wobei man sagen muss, dass es mit den Klammern zumindest bei größerem Code übersichtlicher ist ;)
 
Was mir gerade noch auffällt: das Kaufmännische Und-Zeichen (&) in deiner Funktion einheiten_auslesen() brauchst du nur, wenn du die übergebene Variable innerhalb der Funktion manipulieren willst und in veränderter Form außerhalb der Funktion weiter nutzen willst. Es ist nicht falsch, aber man brauch es in den meisten Fällen nicht.
 
Richtig, habe auch schon mitbekommen das es auch ohne geht. Dachte aber es muss sein. Stimmt wirkt verwirrend, wenn ich später rüber guck und mich wunder warum es eine Referenz ist, wenn ich doch gar nichts ändere.
DANKE für den Hinweis ;-)
 
Was mir gerade noch auffällt: das Kaufmännische Und-Zeichen brauchst du nur, wenn du die übergebene Variable innerhalb der Funktion manipulieren willst und in veränderter Form außerhalb der Funktion weiter nutzen willst. Es ist nicht falsch, aber man brauch es in den meisten Fällen nicht.

In PHP4 ist es noch zwingend erforderlich um Objektkopien zu vermeiden. Erst ab PHP5 werden Objekte wie beispielsweise in Java und C# immer per Referenz übergeben. Lediglich Standarddatentypen werden (ohne Referenzierung) noch immer via Kopie an den Function-Scope übergeben.
 
Uebrigens, falls Du PHP5 nutzt (wovon ich mal stark ausgehe da ja PHP4 mittlerweile eingeschlaefert wurde) brauchst Du nicht 20 Funktionen nach dem Schema setthis(), getthis(), setthat(), getthat() erstellen sondern kannst schlichtweg mit __get() und __set() arbeiten.

Mal ein einfaches Beispiel:
PHP:
<?php
class units
{
 private $name;
 //...

 public function __get($name)
 {
  return $this->name;
 }

 public function __set($name,$value)
 {
  $this->$name=$value;
 }
}

$unit=new units();
$unit->name='Hugo';
echo $unit->name;
?>
 
an MaeTimmae: Danke für den Hinweis, dass war mir bisher nicht bekannt, da ich immer schon mit PHP5 arbeite und es dementsprechend nur selten brauche.
 
Zurück