• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Erstes Objektorientiertes Programm

bodo92

Aktives Mitglied
Hallo Freunde,

habe mir jetzt mal aus meinem neuen Wissen ein kleines Programm gebastelt, einfach ein bisschen zum Üben und um die Funktionsweise zu verinnerlichen (Learning by doing) :rolleyes:

Mein kleines Programm lässt lediglich ein Auto vor und zurück Fahren, dabei wird beim zurückfahren geschaut ob das Hindernis nicht schon zu nahe ist.
Das ist kein Meisterwerk dennoch würde ich gerne von euch wissen ob ich grobe Fehler gemacht habe oder einen komplett falschen weg gehe. Hier mal der Code:

Code:
<?

class AutoFahren {
    private $auto = "[AUTO]";
    private $hindernis = "#";
    private $strecke = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
    private $position = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";

    public function initPosition() {
        $this -> position = "";
        $this -> position = $this -> vorFahren(10);
    }
    public function zeichnePosition($var = false) {
        echo $this -> hindernis . $this -> position . $this -> auto . " " . $var . "<br/>";
    }
    public function vorFahren($int = false) {
        if (!$int) {
            $int = 1;
        }
        $i = 0;
        while ($i < $int) {
            $this -> position = $this -> strecke . $this -> position;
            $this -> zeichnePosition();
            $i++;
        }
    }
    public function zurueckFahren($int = false)  {
        if (!$int) {
            $int = 1;
        }
        $i = 0;
        while ($i < $int) {
            if (strlen($this -> position) > strlen($this -> strecke)) {
                $this -> position = substr($this -> position, strlen($this -> strecke));
                $this -> zeichnePosition();
            } else {
                $this -> zeichnePosition("Nicht weiter zu nah am Hindernis!");
            }
            $i++;
        }
    }
}

$fahren = new AutoFahren;
$fahren -> vorFahren(5);
$fahren -> zurueckFahren(8);

?>

Die Ausgabe sieht ungefähr so aus:
Code:
#          [AUTO] 
#                   [AUTO] 
#                            [AUTO] 
#                                     [AUTO] 
#                                              [AUTO] 
#                                     [AUTO] 
#                            [AUTO] 
#                   [AUTO] 
#          [AUTO] 
# [AUTO] 
# [AUTO] Nicht weiter zu nah am Hindernis!
 
Danke für die Antwort,

ich habe jetzt die Methode initPosition() durch __construct() ersetzt und in dieser dann einfach vorFahren(3) aufgerufen..
Wo ich isset() bzw. empty() einsetzen sollte komm ich nicht dahinter, denn bei der Überprüfung von der Übergabe $int ist doch die if not abfrage korrekt oder sehe ich das falsch?
 
Also ich finde die Überprüfung
PHP:
if (!$int) {
            $int = 1;
        }

kannst du dir sparen, also sagen wir so, ich finde diesen Mischmasch nicht gut, weil den Parameter setzt du default auf false wenn du kein Parameter übergibst. Wenn diese Variable false ist setzt du den auf 1.
Warum sparst du dir das nicht und setzt den bei den Parametern schon auf 1.

Dann könnte man für die Variablen $auto und $hindernis auch Konstante verwenden. Weil sich der Inhalt der Variablen nicht ändert. Aber ich denke das bleibt jedem selbst überlassen.

EDIT:
Achja und was man vielleicht noch beachten könnte wäre eine richtige Wertübergabe. ALso falls du als Parameter keine Zahl sondern ein Buchstaben oder ein Wort mitgibst, dann funktioniert dein Script nicht mehr.

Also da könnte man mit is_int() arbeiten. Also

PHP:
if(is_int($int)) {
while schleife
}else{
echo "Parameter ist kein Integer";
}

Aber das sind nur tipps. Ansonsten ist mir auch nichts weiter aufgefallen :)
 
Zuletzt bearbeitet:
Danke für die Antwort,

ich habe jetzt die Methode initPosition() durch __construct() ersetzt und in dieser dann einfach vorFahren(3) aufgerufen..
Wo ich isset() bzw. empty() einsetzen sollte komm ich nicht dahinter, denn bei der Überprüfung von der Übergabe $int ist doch die if not abfrage korrekt oder sehe ich das falsch?

isset und empty braucht man eigentlich auch nur, wenn man auch auf isset oder empty prüfen möchte.
In einer Klasse sollte eigentlich niemals auf isset geprüft werden müssen, da man dann mit hoher Wahrscheinlichkeit schlampig gearbeitet hat.
Zumindest wüsste ich jetzt keinen Anwendungsfall in einer sauberen Applikation.

Deutsche Begriffe zu verwenden finde ich gar nicht gut.
Wenn du jemals tschechische Codes überarbeiten musst, wirst du das verstehen.
Auch wenn es jetzt nur ein Test war, gewöhn es dir einfach an.

Was ich persönlich noch sehr wichtig/nützlich finde, ist das "method chaining".
Sieht dann so aus:
PHP:
$car->setPosition(0,0)
  ->move(10,0)
  ->update();

Das machst du einfach indem du bei allen Methoden die keinen return value haben ein "return $this;" einfügst.
 
Danke für eure Tipps.

@B3nnoX
Der Hinweis das ich gleich funktion($int =1) schreiben kann ist sehr nützlich danke :) ist ja eigentlich auch relativ logisch hab ich nur nicht kapiert xD ja die Überprüfung des integer ist auch nützlich.

@scbawik
Das mit der englischen Bezeichnungen werde ich mir angewöhnen, hat das "Method Chaining" außer der kürzeren Schreibweise im Aufruf auch noch andere Vorteile?
 
Kann man beim Programmieren mehr Vorteile erwarten als bessere Lesbarkeit/kürzere Schreibweise?

Das mit der Besseren Lesbarkeit sehe ich in diesem Fall neutral.

Aber kann ich die Methoden dann dennoch auch so aufrufen?
Code:
$objekt = new Klasse;
$objekt -> methode1() -> methode2();
// Irgend ein zwischenliegender Code
$objekt -> methode3();
 
Das mit der Besseren Lesbarkeit sehe ich in diesem Fall neutral.

Aber kann ich die Methoden dann dennoch auch so aufrufen?
Code:
$objekt = new Klasse;
$objekt -> methode1() -> methode2();
// Irgend ein zwischenliegender Code
$objekt -> methode3();

Klar kannst du das. Es hat keinerlei Nachteile/Einschränkungen.

Du hast sicher auch schon mit jQuery gearbeitet.
Dort wird nahezu durchgehend "verkettet".

Code:
$(…).stop(…).animate(…).done(…);
 
Ja dann werde ich mir es auf jedenfall angewöhnen in den Methoden ein return $this zurückzuliefern, ob ich es dann letztendlich nutzte oder nicht is ja dann egal :)

Um alle Unklarheiten zu beseitigen... Wenn ich return $this -> eingenschaft zurückgebe wird das Objekt auch mit zurückgeliefert oder, denn wenn ich ein $objekt = new Klasse; echo $objekt -> methode(); bekomme ja einen String zurück und kein Objekt..
 
Mach doch einfach mal ein var_dump() auf deinen Rückgabewert, dann siehst du was du zurück bekommst ;)
Wie ich mir dachte bekomm einen String zurückgeliefert.. Und wie ich annahm geht hier das Method Chaining nicht.
Gibt es eine Möglichkeit das Objekt mit zu übergeben aber dennoch einen String zur Ausgabe mittels echo bereitzustellen?
 
Da sie wahrscheinlich immer am ende ausgeführt werden sollten oder?

Nein, es macht ganz einfach keinen Sinn.
Wenn der getter ein Object zurückgibt, kann das durchaus weiter verketten:

PHP:
class Car {...};
class Wheel {...};

$car = new Car();
$car
  ->getWheel() // gibt eine Objektinstanz von "Wheel" zurück
  ->rotate(10); // führt die Methode rotate() von "Wheel" aus

Das macht hingegen keinen Sinn:

PHP:
$car->getSpeed()->setSpeed(100);

In jQuery würde dies ebenfalls nicht funktionieren:
Code:
$(...).html().html('<div>');

Da du gerade erst mit OOP beginnst, habe ich damit vermutlich mehr Verwirrung gestiftet als zu helfen.
Am Besten du vergisst das vorerst.
 
Also ich bin ja persönlich der Meinung das man Anfänger gleich ins kalte Wasser schmeißen sollte, mit der Herausforderung wächst man und man lernt es gleich richtig.
Wenn ich mir so viele Leute anschaue die immer noch zuerst mit mysql lernen und nicht mysqli oder PDO. Das ist echt eine Plage :D

Also im großen und ganzen will ich nur sagen, falls Fragen aufkommen, dafür ist das Forum ja da :)
 
Zurück
Oben