Artikelformat

Die Modifiers in PHP – Teil 2

Im letzten Beitrag habe ich den public Modifier betrachtet und als Fazit aus dem Beispiel den private Modifier gefordert. Und um genau diesen geht es heute.

Der private-Modifier ist genau das Gegenteil von public. Programmiert man eine Klasse mit private Modifiern, so kann weder von außen noch von einer abgeleiteten Klasse auf diese Elemente zugegriffen werden. Sie sind eben privat. Das einfachste Beispiele sind Attribute, die man nur durch einen validierten Zugriff verfügbar machen möchte. Diese sind an sich private und der Entwickler bietet bspw. public Getter und Setter an. Auch kann man private Methoden nutzen, um das divide and conquer Prinzip in einer Klasse zu forcieren. So werden Teilalgorithmen in diese private Methoden ausgelagert.

Diese Methoden können nur von der eigenen Klasse genutzt werden und sind sowohl gegen den Zugriff von außen, als auch durch eine abgeleitete Klasse geschützt.

Nun gibt es gelgentlich das Problem, dass man bestimmte Variablen und Methoden in einer Klasse definiert und diese in einer abgeleiteten Klasse nutzen möchte, aber auch nur in dieser Klasse. Diese Methoden sollen nicht allgemein zugänglich sein. Hierfür gibt es den protected Modifier. Dieser stellt genau diese Funktionalität zu Verfügung.

Nun fehlen noch die final– und abstract-Modifier. Diese werden im nächsten Teil der Reihe beschrieben.

5 Kommentare

  1. Dazu sollte man sagen, dass es sinnlos ist, die Klassenvariablen private zu machen, und diese dann über „getter“- und vor allem „setter“-Funktionen zugänglich zu machen. Dann kann man die Variable gleich public machen.
    Folgendes Beispiel ist sicherlich sinnfrei:

    private $meine_daten;
    public function getMeineDaten()
    {
    return $this->meine_daten;
    }
    public function setMeineDaten($daten)
    {
    $this->meine_daten = $daten;
    }

    Antworten
    • Naja, würde ich so nicht unterschreiben. Wenn ich dein Beispiel leicht modifiziere, macht es durchaus Sinn:

      1
      2
      3
      4
      5
      6
      
      public function setMeineDaten($daten) {
           if ($daten === null) {
                throw new Exception('Illegal argument');
           }
           $this->meine_daten = $daten;
      }

      Wenn man bspw. nur einen lesenden Zugriff erlauben möchte, ist der private Modifier und ein zugehöriger Getter eine gute Möglichkeit.

  2. Da muss ich Norbert recht geben:

    wenn ich mit der methode von Maikl auf das property zugreife:

    $myObject->myVar = „test“;

    dann müsste ich beim einführen einer setter/getter variante (weil notwendig) jede referenz ändern.

    sprich dann wäre:

    $myObject->setMyVar(„test“);

    überall einzuführen wo der setter required ist.
    Deshalb sind setter/getter definitiv best practice. Open/Closed principial. Von außen macht es keinen unterschied mehr, wenn sich in der MyObject Klasse etwas ändert, der Zugriff erfolgt immer gleich.
    Beim Beispiel von Maikl müsste ich jeden aufruf ändern, alles mitzubekommen wäre schwierig.

    Und bei modernen IDE’s wie Zend-Studio oder NetBeans ist der aufwand nicht größer als das Member direkt so zu benutzen:
    NetBeans: Alt + Enter (beim private Member) generate getter/setter

    Lg aus Österreich,
    Manuel

    Antworten
  3. Ich möchte das Beispiel noch weiter erweitern:

    meine_daten = $daten;
    }
    ?>

    Durch die explizite angabe des Typen kann ich verhindern, dass ungewollte Typen eingespeist werden.

    Außerdem gilt in der OO immer gegen eine Schnittstelle zu programmieren, so ist man nachher frei, weitere Anpassungen vorzunehmen. Ich habe diese Möglichkeit schon oft genug genutzt.

    Getter und Setter haben einen wichtigen Zweck! Sie sind nicht immer Pflicht, bei größeren Projekten aus meiner Sicht aber fast immer sinnvoll.
    Ob die dahinterliegenden Attribute dann private oder protected sein müssen, hängt von der Fachlogik ab.

    Antworten
  4. Der Code ist irgendwie zerlegt worden, sollte eigentlich nur als PHP eingerahmt werden, hier zur Sicherheit noch einmal:

    public function setMeineDaten(Daten $daten) {
    $this->meine_daten = $daten;
    }

    Antworten

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.