[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
    $this->a = wert;

    passieren.

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

    PHP
    $this->funktionsname(args);

    Beispiel:

    PHP
    $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
    class mensch {
      private $sex;
    
    
      function mensch($sex) {
        $this->sex = $sex;
      }
    }

    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:

    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:

    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:

    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
    $meinAuto = new Auto();

    ein neues Auto, setzen dann den Namen auf Golf

    PHP
    $meinAuto->name = "Golf";

    und tanken 100 Liter

    PHP
    $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
    public $name;
      public $fuel;

    durch

    PHP
    private $name;
      private $fuel;
      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
    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
    function __construct($name, $maxfuel) {
        $this->name = $name;
        $this->maxfuel = $maxfuel;
        $this->fuel = 0;
      }

    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
    $meinAuto = new Auto();

    ersetzen wir durch

    PHP
    $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
    function Refuel($litres) {
        if ($litres >= 0) {
          if ($litres + $this->fuel > $this->maxfuel) {
            $this->fuel = $this->maxfuel;
          } else {
            $this->fuel += $litres;
          }
        }
      }

    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

  • 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 ^^

  • Ach! Jetzt hab ichs auch verstanden :wtfsmilie: Hast natürlich recht, sollte mit () sein, ist mir wohl entgangen.
    Habe ich geändert, danke!

  • 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

  • Rofl das Tutorial ist geleecht? Man bist du erbärmlich - das ist selbst geschrieben. HF BEIM SUCHEN *ablach*

    *Zweitens erkläre ich das auch nicht, da ich davon ausgehe, dass man weiß, was das ist.

  • 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.

  • Zitat von Leecher;58571

    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).

  • Zitat von ulle;225310

    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 ;)

  • Zitat von Leecher;227077

    Außerdem würde ich mal nicht soviel quatschen, so komplexe Strukturen wie final gibt es in PHP nämlich nicht.


    PHP: Final-Schlüsselwort - Manual

    Zitat von Leecher;227077

    Wenn man keine Ahnung hat, einfach mal (ihr wisst schon, was hier steht).

  • 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.

    Zitat von ulle;227413

    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).

    Zitat von ulle;227413

    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.

  • Ich habe jetzt mit mal ein Paar tutorials über PHP -> OOP angeschaut

    aber was sind die vorteile dieser sprache ich habe nur gemerkt das sie schneller sein soll

    wer nett wenn einer mir diese frage beantworten wurde :D

    [CENTER][COLOR=indigo]
    [/COLOR][COLOR=indigo]Sie können nicht Programmieren abe wollen ein Programm haben
    PN , Dieser Dienst ist nicht Kostenlos :) [/COLOR]
    [/CENTER]

  • 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

  • Doch verstanden habe ich das schon !

    Aber man kann das ganze doch auch in einer db speichern :)

    [CENTER][COLOR=indigo]
    [/COLOR][COLOR=indigo]Sie können nicht Programmieren abe wollen ein Programm haben
    PN , Dieser Dienst ist nicht Kostenlos :) [/COLOR]
    [/CENTER]

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!