Angepinnt [Tutorial] Weiterer Einblick in die OoP

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • [Tutorial] Weiterer Einblick in die OoP

      hallo Leute,

      Dieses Tutorial setzt Grundwissen voraus - ich werde hier keine Grundkenntnisse vermitteln!

      Inhalt
      1. Der Unterschied zwischen var, public, private und protected
      2. Zugriff auf die eigene Klasse
      2.1 Der Konstruktor
      2.2 Der Destruktor
      2.3 Methoden
      2.3.1 Getter Methoden
      2.3.2 Setter Methoden
      3. Vor- und Nachteile der Objektorientierten Programmierung
      4. Anwendungsfall

      1. Der Unterschied zwischen var, public, private und protected

      Hier gehe ich kurz auf die Unterschiede bzw. Gemeinsamkeiten zwischen var, public, private und protected ein.
      Fangen wir an mit var und public. Die Gemeinsamkeit ist, dass es einfach das gleiche ist.
      Der Unterschied: Var wird in PHP4 verwendet und public wird in PHP5 (aktuell) verwendet.

      Weiter geht es also mit public und private. Deklariert man eine Variable als "public", so kann man außerhalb der Klasse auf diese zugreifen und sie "manipulieren".
      Bei private ist eine Veränderung dieser Variablen von außen nicht möglich (dann gibt es eine Fehlermeldung, wenn man das versucht - dazu kommen wir aber weiter unten noch).
      Protected wird anstatt private verwendet, wenn abgeleitete Klassen Variablen und/oder Methoden erben sollen, da dies mit private nicht möglich ist. Darauf gehe ich aber in diesem Tutorial nicht ein (siehe Teil 2).


      2. Zugriff auf die eigene Klasse

      Will man auf Objekte oder Methoden zugreifen, die sich innerhalb der Klasse befinden, in der man arbeitet, so bezieht sich $this immer auf diese Klasse.
      Will man beispielsweise die Variable a in einem Objekt verändern, so kann dies durch

      PHP-Quellcode

      1. $this->a = wert;
      passieren.

      Will man eine Funktion des Objekts aufrufen, so geschieht dies durch

      PHP-Quellcode

      1. $this->funktionsname(args);
      Beispiel:

      PHP-Quellcode

      1. $this->rechne(2, 4);
      2.1 Der Konstruktor

      Der sogenannte "Konstruktor" ist eine Methode, die beim initialisieren des Objektes automatisch ausgeführt wird. Da der Konstruktor innerhalb des Objektes deklariert ist, kann er logischerweise (wie andere Funktionen der Klasse auch) auf Klassenvariablen zugreifen. Dies geschieht mit der Funktion namens __construct.
      Hinweis: Eine Funktion, die genauso heißt, wie die Klasse, kann auch als Konstruktor eingesetzt werden

      Ein kleines Beispiel:

      PHP-Quellcode

      1. class mensch {
      2. private $sex;
      3. function mensch($sex) {
      4. $this->sex = $sex;
      5. }
      6. }
      2.2 Der Destruktor

      Destruktoren sind in der Regel dafür verantwortlich vom Objekt benutzte Ressourcen freizugeben. Dies findet vor allem in C++ Anwendung, um beispielsweise Speicher freizugeben.
      Dies geschieht mit der Funktion namens __destruct.

      2.3 Methoden

      Eine Methode ist eine Funktion, die innerhalb der Klasse verwendet werden kann.

      2.3.1 Getter-Methoden

      Eine Getter-Methode ist eine Methode, um an Variablen des Objektes heranzukommen.

      Ein Beispiel:

      PHP-Quellcode

      1. class test {
      2. private $value = 1;
      3. function getValue() {
      4. return $this->value;
      5. }
      6. }
      7. $test = new test();
      8. $test->getValue();
      Die Methode __get($name) wird aufgerufen, wenn versucht wird, auf eine Eigenschaft eines Objektes zuzugreifen, die nicht gesetzt oder nicht öffentlich zugänglich ist. Im Parameter $name befindet sich in diesem Fall der Name des Propertys.

      Innerhalb eines Objektes wird diese Methode nur aufgerufen, wenn versucht wird auf eine nicht existierende oder private Eigenschaft der Elternklasse zuzugreifen.


      2.3.2 Setter-Methoden

      Eine Setter-Methode ist eine Methode, um Variablen des Objektes zu setzen.
      Dies kann man zum Beispiel dann anwenden, wenn die Variablen private oder protected (von außen nicht veränderbar) sind.

      Beispiel:

      PHP-Quellcode

      1. class test {
      2. private $value = 1;
      3. function setValue($argument) {
      4. $this->value = $argument;
      5. }
      6. }
      7. $test = new test();
      8. $test->setValue(2);
      Die Methode __set($name, $value) wird aufgerufen wenn versucht wird, nicht verfügbare Eigenschaften zu setzen. Dabei enthält $name den Namen der Eigenschaft und $value den entsprechenden Inhalt. __set spielt hier natürlich gut mit __get zusammen.


      3. Vor- und Nachteile der Objektorientierten Programmierung

      Vorteile
      -OoP ist ein sehr hilfreiches Mittel, um Logik zu verdeutlichen
      -Eine gute Strukturierung kann große Performance-Verbesserungen bringen
      -Webanwendungen können beispielsweise schnell in Windowsanwendungen portiert werden -> Dies spart viel Zeit und Geld
      -Man kann Aufgaben am Objekt gut aufteilen
      -Wie Well weiter unten beschrieben hat, kann man sich ein Basisobjekt für seine Zwecke aufbauen und davon dann beliebig viele Objekte erzeugen und diese mit Werten füllen und damit arbeiten (ein Objekt ist also so etwas wie ein Grundgerüst)

      Nachteile
      -Bei kleineren Programmen ist OoP zu aufwendig
      -Wenn man das Prinzip nicht versteht, kann es zu Performance- und/oder Übersichtlichkeitsproblemen kommen
      -Es ist am Anfang schwer zu verstehen und macht auf Anhieb keinen Sinn


      4. Anwendungsfall

      So, jetzt haben wir den Grundlagen Kram.

      In meinem Beispiel werde ich ein Auto als Vorlage nehmen.
      Ein kleiner Programmcode vorweg:

      PHP-Quellcode

      1. <?php
      2. class Auto {
      3. public $name;
      4. public $fuel;
      5. function Refuel($litres) {
      6. $this->fuel = $this->fuel + $litres;
      7. }
      8. function GetName() {
      9. return $this->name;
      10. }
      11. function GetFuel() {
      12. return $this->fuel;
      13. }
      14. }
      15. $meinAuto = new Auto();
      16. $meinAuto->name = "Golf";
      17. $meinAuto->Refuel(100);
      18. echo $meinAuto->GetName()."<br>";
      19. echo $meinAuto->GetFuel();
      20. ?>
      Alles anzeigen
      So, relativ einfach gehalten. Wir sagen unsere Klasse heißt Auto, kann die Variablen Bezeichnung und Tankinhalt speichern. Man kann einen Namen setzen, sich den Namen ausgeben lassen, tanken und sich den Tankinhalt ausgeben lassen. Mehr habe ich erstmal nicht eingebaut, da es hier den Rahmen sprengen würde.
      Wir erstellen uns also per

      PHP-Quellcode

      1. $meinAuto = new Auto();
      ein neues Auto, setzen dann den Namen auf Golf

      PHP-Quellcode

      1. $meinAuto->name = "Golf";
      und tanken 100 Liter

      PHP-Quellcode

      1. $meinAuto->Refuel(100);
      Als letztes prüfen wir noch, ob alles geklappt hat, indem wir uns einmal den Namen und die getankten Liter ausgeben.

      Da dies jetzt aber ziemlich banal ist und wir in der OoP so denken, wie ein Mensch, muss es natürlich ein Limit für den Tank geben und natürlich darf auch an der Tankstelle keiner kommen, der einfach mal sagt, ich mach den Tankdeckel auf und lasse mal 10 Liter ab. Dagegen gehen wir vor (dazu später etwas).
      An dieser Stelle verwendet man statt dem Schlüsselwort "public", "private".

      Mit dem Schlüsselwort "private" kann man der Klasse sagen, dass diese Variable für Zugriff außerhalb der Klasse geschützt ist, also genau das, was wir haben wollen.

      Genau die gleiche Überlegung gilt auch für die Bezeichnung, also ersetzen wir

      PHP-Quellcode

      1. public $name;
      2. public $fuel;
      durch

      PHP-Quellcode

      1. private $name;
      2. private $fuel;
      3. private $maxfuel;
      Wer das ausprobiert, wird allerdings schnell feststellen, dass es beim Namen setzen und Tankinhalt setzen von PHP Seite aus einen Fehler gibt (wie bereits in 1 beschrieben).

      PHP-Quellcode

      1. Fatal error: Cannot access private property Auto::$name in ##### on line 21
      An dieser Stelle möchte ich also den sogenannten "Konstruktor" verwenden. Wofür er gut ist, steht ja weiter oben beschrieben.
      Wir fügen also hinter unseren private Deklarationen noch hinzu:

      PHP-Quellcode

      1. function __construct($name, $maxfuel) {
      2. $this->name = $name;
      3. $this->maxfuel = $maxfuel;
      4. $this->fuel = 0;
      5. }
      Wichtig: Man sollte $this->name nicht mit $name verwechseln!
      $this->name bezieht sich auf die Variable Name der Klasse Auto. $name bezieht sich auf den Übergabeparameter, der beim Erzeugen des Objektes gefüllt wird.
      Also: Setze den Namen auf das, was übergeben wurde und verfahre genauso beim maximalen Tankinhalt.

      Damit wäre unser Konstruktor fertig. Eine Kleinigkeit fehlt uns aber noch, nämlich die Attribute.

      PHP-Quellcode

      1. $meinAuto = new Auto();
      ersetzen wir durch

      PHP-Quellcode

      1. $meinAuto = new Auto("Golf", 50);
      Durch das new wird jetzt also ein neues Objekt (Auto) ersellt und unser Konstruktor wird ohne weiteres zutun ausgeführt. Wir haben hier als Parameter die Bezeichnung und das Tanklimit gesetzt.
      Der Konstruktor setzt hiermit die Bezeichnung auf Golf und das Tanklimit auf 50 Liter.

      Wir erweitern jetzt noch unsere Funktion "Refuel" (Tanken)

      PHP-Quellcode

      1. function Refuel($litres) {
      2. if ($litres >= 0) {
      3. if ($litres + $this->fuel > $this->maxfuel) {
      4. $this->fuel = $this->maxfuel;
      5. } else {
      6. $this->fuel += $litres;
      7. }
      8. }
      9. }
      Damit sagen wir, wenn man mehr tanken will, als das Limit des Autos ist, dann tank nur voll, sonst würde der Tank ja überlaufen.
      Auch haben wir damit gesagt, wenn negative Liter getankt werden wollen (also Sprit rausnehmen), dann mach gar nichts. Es kann also an der Tanke keiner mehr kommen, der etwas Sprit abzapft :XD: Mehr als volltanken geht auch nicht, also haben wir alles bedacht.

      In diesem Sinne hf & gl.

      PS: Teil 2 gibt es hier.

      Greetz
      ~Leeecher
    • Werbung zur Unterstützung des Forums ( Bitte AddBlocker deaktivieren )

    • Auch die Methoden einer Klasse sollten mit Sichtbarkeitsattributen ausgestattet werden..

      btw, das private nicht mehr verändert werden kann ist falsch, es wird nur verhindert von außen drauf zuzugreifen.
      Ansonsten ganz schick, sollte noch erklärt werden das $this immer auf die eigene Klasse zeigt.
      Und die Zeile wo das Objekt erstellt wird sollte so aussehen: $meinAuto = new Auto();
    • Ich rede davon das $meinAuto = new Auto(); das gleiche wie $meinAuto = new Auto; nur in übersichtlich ist (für mich zumindest, objekte müssen für mich immer mit () erzeugt werden).
      Wenn man Argumente zu übergeben hat ist klar das was zwischen den Klammern stehen muss ^^
    • Also ganz ehrlich, der Betreff "Weitere einischt in OOP" ist hier wohl etwas fehl am Platz.
      Erstens ist das lediglich nen einblick in die Klassenprogrammierung.
      Zweitens erklärst du weder den unterschied zwischen protected, private und public.
      Drittens gibt es auch bedeutend bessere Beispiele welche du hättest abschreiben können. Das Tut ist nur geleecht, sobald ich den Link finde editiere ich meinen Post und setzt den mal hier rein.

      Das einzigste was du gemacht hast, ist das du nen paar sachen leicht geändert hast, und das du die Wagenfarbe rausgeschmissen hast.

      Lieben Gruß
      Ulle
    • Was ist den das für eine Aussage, du gehts davon aus das man das weiß. Wenn jemand das weiß, wieso sollte er sich dein Tutorial anschauen?? Das wichtigste an der OOP ist numal die Funktions Deklaration. Auch wenn du vielleicht anderer Meinung bist aber es ist Tatsache. Dann fehlen diverse Sachen bezüglich Abstraction, Finals und vieles mehr. Selbst wenn einer dein Tutorial versteht, kann er dannach nicht mehr und nicht weniger. Das ist wie gesagt lediglich ne Anzeige wie OOP aussehen kann. Nicht aber ein weiterer Einblick darin.
    • Leecher;58571 schrieb:

      da mir der Beitrag von h4te doch schon etwas zu denken gegeben hat, möchte ich hier gerne mal etwas tiefer und genauer auf die Objekt orientierte Programmierung in PHP eingehen.


      "möchte ich hier gerne mal etwas tiefer und genauer [...] eingehen".
      Da steht eindeutig drin, dass es kein Anfängertutorial ist.

      Außerdem würde ich mal nicht soviel quatschen, so komplexe Strukturen wie final gibt es in PHP nämlich nicht.
      Wenn man keine Ahnung hat, einfach mal (ihr wisst schon, was hier steht).
    • ulle;225310 schrieb:

      Nicht aber ein weiterer Einblick darin.


      doch es ist ein weiterer Einblick, es gibt viele, vllt auch bessere, aber das ist einer von vielen "Einblicken", er schildert hier sein errungenes wissen. ´Die meisten dei das lesen wissen eh worums geht, aber trotzdem wird das als hobb angesehen und vllt. kann es doch mal was bringen =)

      seine arbeit zu kritisieren, ok
      aber eigentlich nur für dinge die er geschrieben hat, wenn du was suchst und es heir nicht drin ist, brauchst du ihn nicht dafür zu beschuldigen, wir könne froh sein dass hier überhaupt sowas geschrieben wird, und von daher immer noch besser als nix ;)
    • Ich stimme Well voll kommen zu. Jemand der behauptet das es keine Final Strukturen gibt, dem sollte verboten werden solche Post zuschreiben und diese dann auch noch Tutorial nennen. Wenn der Threadersteller nicht mal die Grundstrukturen kennt, warum wird dann sowas hier überhaupt als "Tutorial" eingestuft? Ich vertrete nach wievor die Meinung das es lediglich zeigt wie das aussehen kann. Aber wie andere schon schreiben ist selbst ein Anfänger nach dem lesen nicht schlauer als vorher. Desweiteren kritisieren wir ja nicht den Threadersteller direkt. Wir geben konstruktive Kritik. Wenn es ein wirklich gutes Tutorial werden soll, dann gehören eben solch kleinigkeiten wie Abstraction, Final, Public, Protected, Private etc.. da zu. Desweiteren wird auch nicht gezeigt das man Klassen ableiten kann. Auch wird nicht auf verschiedene Entwurfsmuster eingegangen, geschweige den mal erwähnt. Den in der OOP arbeitet man nunmal wenn man es richtig machen möchte nach diversen Entwurfsmustern. Einige Beispiele dafür ist das Registry Design Pattern, MVC Pattern, Singleton Pattern, etc.. nur um mal 3 zu nennen. Auch das der Threadersteller sich offensichtlich nicht helfen lässt wie er sein Tutorial verbessern kann, zeugt doch auch nur davon das dieser nicht so richtig weiß was er da überhaupt schreibt.
    • Okay - Well hat gewonnen.

      ulle;227413 schrieb:

      Jemand der behauptet das es keine Final Strukturen gibt,


      -> dass es keine Final Strukturen in PHP gibt, dass es gar keine gibt, hab ich nie gesagt, aber mal zum Thema:
      Dass es final in php gibt, wusste ich nicht (so intensiv habe ich mich mit OoP in PHP nie befasst, weil PHP dafür nicht geeignet ist / ich weiß, kommt drauf an, was man machen will, aber das beiseite).

      ulle;227413 schrieb:

      zeugt doch auch nur davon das dieser nicht so richtig weiß was er da überhaupt schreibt.


      Mit der Aussage würde ich mal ganz vorsichtig sein!

      Ich habe da auf sys-gaming mal ein neues (und überarbeitetes) Tut geschrieben. Ich aktualisiere das alte hier, sobald ich das Forum drüben wieder erreiche.
    • Der entscheindende Vorteil an OOP ist die wiederverwendbakeit des Codes. Als Beispiel dafür nehmen wir einfach mal ein Weltraum Browser Game.
      In diesem Game gibt es viele verschiedene Schiffe.
      Alle Schiffe unterscheiden sich in Gewicht, Kanone, Geschwindikeit, Panzerung, etc...

      Und genau da kommt OOP ins spiel. Man erstellt ein sogenanntes Objekt der Raumschiffe. Diesem Objekt kann man dann diverse Werte zuweisen. Eben die oben genannten. Natürlich ist das nur eine grobe Umschreibung was OOP ist. Aber ich denke so ist es verständlich.

      Falls nicht meld dich doch einfach nochmal.

      Gruß
      Ulle