Oop?

FingerSkill

Erfahrenes Mitglied
Hallo, ich hab ne Frage und zwar wuerd ich gerne wissen ob sich OOP in PHP (5) ueberhaupt etwas bringt.

Was macht ihr mit und was ohne OOP?

lg Fap
 
Eine Sehr gute Frage. Hab ich mich auch gefragt warum man PHP5 private, public und protected braucht.
Der Programmierer bestimmt den Quellcode, nicht der User?
 
Tja, dann kann man diese Frage aber gleich bitte auf alle anderen (Script-/Programmier-)Sprachen ausweiten und nicht immer alles an PHP hängen lassen :) Denn private, public und protected erfüllen in anderen Sprachen ja die selben "Aufgaben".
 
Man fragt sich auch wozu man Interfaces braucht bist man auf einmal an den Punkt ist wo man sich sagt verdammt warum kann JS das nun nicht ;)

Wobei bei PHP Interfaces , mhm als Einsprungspunkt für ne Klasse die ihre Eigenschaften vererbt.
OOP in PHP nutze ich selber um mir Einzelprogramme zu schreiben die in sich etwas gewisses tun.

Zum Beispiel Verzeichnisse auslesen mit Filter und Rekursionstiefe ist eine Klasse bei mir. Dann gibs wieder 2 andere Klassen die beide von der Klasse erben die Verzeichnisse ausliest. Die eine baut ein Listenmenu daraus zusammen die andere einen einfachen String , nunja nicht wirklich spektakulär ;)

Wie genau nun die Klasse die Verzeichnisse ausliest braucht die Kinder nicht zu kratzen also private aber man möchte auch gern Filter anlegen können.Diese Methode hat wieder nen gewisses Schema wie sie zum Beispiel den Eingangsstring sich zurecht legt. Also protected kann von den Kindern nicht geändert/überschrieben aber aufgerufen werden.

Variablen werden nur private gesetzt somit bekommt kein Kind die Rechte diese überhaupt zu manipulieren.

Public setz ich denn meistens nur noch GET Methoden , irgendwie möchte ich ja auch gern das Resultat haben.

Der Vorteil wäre hier nun zum Beispiel wenn ich wen anders die Klasse gebe dann muss er nicht da drinne rumbasteln und die Einstellungen treffen.

Sie vereint mehere Methoden welches als gesammtes nen abgeschlossenes kleines Programm bilden, quasi muss sich der andere Programmierer um gar nix mehr kümmern rein theoretisch. Wenn er dennoch das Ziel hat sie nun umzubauen wird er es auch machen das ist klar ;)
 
public, protected, private, Interfaces, abstrakte Klassen und alles, was PHP noch so alles halbwegs unterstützt, soll die selben Eigenschaften erfüllen, wie auch in anderen Sprachen, die das unterstützen.

Man deklariert Instanzvariablen (objektspezifische Variablen) als "private" und nutzt Getter- und Setter-Methoden (getXXX(), setXXX(value)), um auf deren Werte zuzugreifen oder sie zu verändern. Warum? Weil so z.B. verhindert werden kann, dass eine Instanzvariable "kontostand" einen negativen Wert erhält. Die Getter- und Setter-Methoden dienen quasi als "Zwischenschicht". Das ganze Prinzip nennt sich übrigens Kapselung und ist eins der Grundeigenschaften von OO.

Interfaces? Die benutzt man, um die Wiederverwendbarkeit zu erhöhen! Sie schreiben bestimmte Methoden vor, die implementiert werden müssen und stellen somit sicher, dass jede Klasse, die das Interface implementiert auch die entsprechenden Methoden anbietet. Man könnte z.B. das Interface "Database" schreiben, das die Methoden select(table, where) und delete(table, id) zur Verfügung stellt und sämtliche datenbankspezifische Klassen dieses implementieren lassen. So ist sichergestellt, dass alle Datenbankklassen in der Anwendung gleich sind, was bedeutet, dass du ohne Weiteres auf ein anderes DMBS umstellen kannst.

Das war jetzt alles nur ganz grob erklärt, wer sich intensiver für OOP interessiert, dem empfehle ich ein entsprechendes Buch oder die Sprache Java :)

@FipsTheThief:
Dass als protected definierte Methoden von Subklassen nicht überschrieben werden können, ist AFAIK falsch! Deren Gültigkeit kann beim Überschreiben sogar auf 'public' ausgedehnt werden.
 
Zuletzt bearbeitet:
Als protected deklarierte Variablen können von Kindklassen, meines Wissens überschrieben werden, jedoch kann nicht von außen auf sie zugegriffen werden.
Da ich grad in der Schule bin, kann ich es nicht testen, aber ich glaube folgendes ist richtig, oder?
PHP:
<?php
class Root
{
    private $priv = 'priv-root';
    protected $prot = 'root';

    public function getPriv()
    {
        return $this->priv;
    }
}

class F1 extends Root
{
    private $priv = 'priv-f1';
    protected $prot = 'f1';

    public function foo()
    {
        echo $this->priv . ' != ' . $this->getPriv() .'<br />';
        echo $this->prot . ' = ' . $this->prot.'<br />';
        echo $this->priv . ' != ' . $parent->priv; //leer
    }
}

$test = new F1;
$test->foo(); 
?>
 
Zuletzt bearbeitet:
Das gäbe einen Fehler, weil du von der Subklasse nicht auf eine in der Superklasse als 'private' definierte Variable zugreifen darfst. Abgesehen davon, hast du bei den privaten Variablen natürlich Recht - sie gelten jeweils nur in der Klasse, in der sie definiert wurden und deren Werte sind daher auch unterschiedlich.

Allerdings sind auch die als 'protected' definierten Klassenvariablen nicht gleich, weil du sie zwar auf der einen Seite erbst, auf der andren aber wieder überschreibst (vor dem Überschreiben hatten sie natürlich den gleichen Wert...)

Du sprichst hier aber von etwas ganz anderem als ich in meinem letzten Post. Ich habe von Methoden gesprochen und davon, dass deren Gültigkeit ausgedehnt werden kann. Also in etwa so:
PHP:
class SuperClass {
   protected function method() {
   }
}
PHP:
class SubClass extends SuperClass {

   // geht:
   protected function method() {}

   // geht nicht - du kannst keine geerbten Eigenschaften/Klassenvariablen/Methoden
   // neu als private definieren
   private function method() {}

   // das hingegen geht - den Gültigkeitsbereich ausdehnen:
   public function method() {}

   // willst du also die geerbte Methode global verfügbar machen,
   // schreibst du:
   public function method() {
      super.method();
   }
}
 
Stimmt, mein Fehler... Der Quelltext oben geht jetzt. Aber ist trotzdem nicht auf dein Post bezogen... Wer lesen kann ist klar im Vorteil *duck*.
 
PHP:
echo $this->priv . ' != ' . $parent->priv; //leer

Pack mal ein error_reporting(E_ALL) in die erste Zeile ;)
Und dass $this->prot und $this->prot gleich sind, is auch irgendwo logisch *gg*

Aber wir ham trotzdem aneinander vorbei geredet (oder ich hab an dir vorbei geredet) - da hast du jetz wieder Recht ;-)
 
Ich finde es unnötig. Das mischen von Objekt Orientiertem und Strukturiertem Programmcode gefällt mir nicht. Man müsste für vieles in PHP eine Classe erstellen brauch ICH persönlich nicht und werde es erst einsetzten wenn es nicht anders geht da Code ich immer noch lieber strukturiert:)
 
Zurück