Kapiert habe ich so ziemlich gar nichts. Ich kommentiere das mal entsprechend:
[src=php]
class Auto {
private $Wheels = 5;
private $Doors = 5;
private $EngineStatus = false;
private $Fuel = 1000;
private $Koords = array("x" => 0, "y" => 0);
private $usagePerKM = 0.05;
public function __construct($InitalFuel, $usagePerKM, $Wheels, $Doors, $Koords){ #Warum "InitalFuel"? Oben steht nur "Fuel"? *1
$this->Wheels = in_array($Wheels, array(3, 5, 7, 9) ? $Wheels : 5;
$this->Doors = in_array($Wheels, array(3, 5) ? $Wheels : 5; #Wheels? Warum nicht Doors? Was soll das Fragezeichen? *2
$this->Fuel = $InitialFuel;
$this->Koords = $Koords; # Ist doch das Gleiche? *3
$this->usagePerKM = $usagePerKM;
}
public function Wheels(){
return $this->Wheels; #Wozu? *4
}
public function Doors(){
return $this->Doors;
}
public function getEngineStatus(){
return $this->EngineStatus;
}
[
public function FuelStatus(){
return $Fuel;
}
# Ab hier Totalausfall. *5
private function distance($point1, $point2){
$res = ($point1[x]-$point2[x]) * ($point1[x]-$point2[x]) + ($point1[y]-$point2[y]) * ($point1[y]-$point2[y]);
return sqrt($res);
}
// [...]
public function fillUp($amount){
$this->Fuel += abs($amount);
}
}
[/src]
Ich versuche dir mal das Beispiel zu erklären, ich hab deinen Fragen Punkte zugewiesen:
*1) folgender Code wird zur Instanzierung genommen, das heißt du erstellst aus einer Klasse eine Instanz.
Sieht wie folgt aus:
[src=php]$meinErstesAuto = new Auto(200, 2, 4, 2, array(12, 14) ) [/src]
Hier wird eine neue Instanz der Klasse Auto erstellt, die Parameter sind das in Klammern, diese werden dann verwendet um die Variablen in
$this->Fuel = Parameter 1 (hier 200), dieser wird in dem Parameter "$initialFuel" übergeben in dem Konstruktur.
$this->Doors = Parameter $Doors an 4erter Stelle, hier "4"
zu setzen.
Also 200 Fuel für $meinErstesAuto und "4" Türen bei Erstellung der Klasse (Erzeugung/Konstruktion => construction, __construct ).
Das $this meint in diesem Fall, das der Wert sich auf eine Variable, vorher mit "private $Wheels = 5", "private $Doors = 5" usw. deklariert, in dieser Klasse bezieht und beim erstellen dann die Parameter verwendet werden soll. Daher auch die Zuweisung über die Parameter an die Variablen in dieser Klasse:
[src=php]$this->Fuel = $InitialFuel;
$this->Koords = $Koords; # Ist doch das Gleiche? *3
$this->usagePerKM = $usagePerKM;[/src]
*Bitte Notiz am Ende des Beitrags lesen, hier bin ich mir nun nicht 100% sicher....
2*) Bei den Variablen Wheels und Doors im Construktor wird folgendes gemacht:
in_array <-- ist ein Wert in einem Array, als Parameter hier das "wo" ($Wheels Parameter) und "was", hier eine Zahl in einem Array von [3, 5, 7, 9] (also eine dieser Zahlen hier enthalten).
Das "?" steht hier für einen Ternary Operator, das ist quasi das selbe wie ein if und funktioniert so:
Prüfe ist X = 0 ? ja/true : nein: false;
Das sieht dann so aus:
[src=php] $x = 0 // Ändere mal x auf irgendwas außer 0, x wird dann 1.5 sein.
$x == 0 ? $x = 0 : $x = 1.5;
echo $x;
[/src]
Man kann es aber auch so schreiben, nur ist es dann kein Einzeiler mehr:
[src=php]
if (x == 0) {
x = 0;
} else {
x = 1.5;
}[/src]
Heißt, ist x == 0?, Ja, dann ist X = 0, wenn nicht, ist x = 1.5 - beide Formen erreichen das selbe Ergebniss, wobei die Ternary Form erst einmal nicht so leicht lesbar ist.
3* )
[src=php]$this->Koords = $Koords;[/src]
Hier wird der Parameter $Koords, also Koordinaten, ein Wert zugewiesen, siehe 1*, hier wäre der Wert für die Koordination für $meinErstersAuto ein Array aus [12, 14].
Das Beispiel ist da etwas schlecht, es ist unklar ob Koords nur eine Zahl ist, ein String "12|14" mit Trenner/Delimeter oder was auch immer.. der Konstruktur gibt keine Auskunft wie und ob es nur eine oder doch mehrere Koordinaten gibt. Weder KoordX, KoordY oder sonst wie... würde ich hier bemängeln.
4*
[src=php]
public function Wheels(){
return $this->Wheels; #Wozu? *4
}
public function Doors(){
return $this->Doors;
}
[/src]
Beide diese Funktionien sind "Getter" - so nennt man das in OOP - eine Getter Funktion dient dazu auf einen Wert einer Klasse zuzugreifen und diesen zu erhalten ("get") - oder auch das Ergebnis einer Funktion die mit Werten/Variablen einer Instanz, hier $meinErstesAuto, arbeitet.
Um also die Anzahl der Räder/Wheels von $meinErstesAuto zu bekommen, würde man folgendes schreiben:
[src=php]$meinErstersAuto.Wheels()[/src]
In OOP gibt es neben einem "Get" also einen Wert bekommen auch das "Set" Prinzip, Setter genannt. Damit setzt man dann werte:
Beispiel:
$meinErstesAuto.setWheels(5);
Ist die Funktion "setWheels" deklariert soll diese dann die Anzahl der Räder mittels:
"$this->Wheels = 5;" - 5 wäre hier mein Parameter, die Funktion müsste man auch so deklarieren:
"public setWheels($numberOfWheels) { $this->Wheels = $numberOfWheels; }
setzen - easy oder?
Diese ganze Getter und Setter Geschichte wurde eigentlich deßhalb eingebürgert (es ist ja nicht Python...
) um zu Vermeiden das man Werte einer Klasse direkt setzt oder ausliest, sondern Funktionen dazu dienen mit den hier als "privat" deklarierten Variablen dieser Klasse, zu agieren. Das kann man nun halten wie ein Dachdecker.. obwohl gleich in anderen Beiträgen geschrien wird
*5
Das sind genau diese Setter Funktionen, wie auch Funktionen um mit den Werten von Auto Instanzen zu arbeiten/entwickeln.
Schau dir mal die letzte Funktion an:
[src=php] public function fillUp($amount){
$this->Fuel += abs($amount);
}[/src]
Rufst du nun folgendes auf:
[src=php]$meinErstesAuto.fillUp(10);[/src]
dann würde die Variable "Fuel" von "meinErsterAuto" bei "210" liegen, zur Erinnerung:
mit "new Auto(200, ....)" haben wir den Sprit auf 200 festgelegt, dieser Aufruf addiert nochmal 10 hinzu.
Das "abs($amount" also, abs dient nur dazu aus, sagen wir: "-4" immer eine positive Zahl zu machen, also "4" anstelle.
So, lange Rede, kurzer Sinn:
Hast du nun zwei Autos, sagen wir:
$meinErstesAuto = new Auto(200, ........)
und
$meinZweitesAuto = new Auto(250, ..... )
dann wäre der Sprit/Fuel für beide Autos unterschiedlich gesetzt und in Ihnen gespeichert.
Das heißt erstesAuto hätte 200 Fuel/Sprit der Tank von zweitesAuto wäre beim Start auf 250 gesetzt.
Du arbeites also mit zwei Objekten, die absolut andere Parameter und Werte enthalten können und diese geschützt von einander trennen, aber mittels Getter und Setter Funktionen das gleiche "Interface" also die Steuerung mittels Funktionen ist bei beiden Autos gleich.
Also können beide Autos mit ".fillUp($amount)" aufgetankt werden, oder den Motor eines Autos starten: "$auto1.startEngine()", "$auto1.getEngineStatus()" -> Motor an
und das andere ist immernoch bei dem Status, mit dem es mit "new Auto" deklariert worden ist, also "$auto2.getEngineStatus()" --> false / aus.
Nochmal zu "private" Variablen,
Diese sind "privat" für diese Klasse, das heißt man kann NUR über Get und Set Funktionen damit arbeiten, ein direkt Aufruf in etwa mit:
$meinErstesAuto->Fuel, wird nicht funktionieren, dazu müssten sie "public" sein.
Wären die Variable mit "public" deklariert ist, so könnte man auf diese von außen zugreifen, wie im Beispiel eben.
Das gleiche bei Funktionen, "private" (nur für interne Zwecke innerhalb der Klasse), "public" für den Aufruf von außen über die KlassenInstanz.
*Notiz:
Ich weiß jetzt nicht wie PHP das händelt wenn keine Werte in einem Kontruktur gegeben sind,, ich vermute es bricht, kann sein das es diese "private $Wheels = 5; ", also 5, als exakter Wert eines neuen (new) Auto verwendet so fern keine Parameter übergeben werden, vielleicht kann das hier ein PHPler aufklären
...
Jedenfalls, wird die Klasse erstellt, dann sind das es immer "private $wheels = 5" jeder Auto Instanz, also 5, so fern der Parameter es nicht ändert.