osaki: Vor- / Nachteile von Objektorientierung

Beitrag lesen

Hallo Marc!

Als PHPler kommt einem das so vor, auch eingefleischte C-Programmierer würden dir voll und ganz zustimmen. Wenn du die Vorteile von OOP wirklich kennen lernen möchtest, empfehle ich Java.

Ja das sollte ich glaub wirklich machen, denn auch wenn ich denke, das Prinzip hinter OOP verstanden zu haben, fällt es mir schwer, dann auch wirklich konsequent so zu programmieren. Zumindest wenn ich dann (doch wieder) mit PHP programmiere. Wie gesagt, für eine Datenbank-Klasse hab ich follstes Verständnis, hier finde ich den Einsatz logisch. Also das Erstellen eines DB-Objektes
$db = new Database('server', 'user', 'password');
wobei die Verbindung automatisch per Konstruktor hergestellt wird. Dann beliebige Anfragen über $db->executeQuery('SQL ...'); oder $db->getResult('SQL...'); und am Ende das Objekt $db wieder löschen.  Auch das Beispiel mit dem Raumschiff fand ich einleuchtend.

Aber bei dem "Drumherum" tue ich mir schwer, auch wenn du geschrieben hast, dass sich das üblicherweise mit OOP elegant lösen lässt. Ich versuch das mal in einem Beispiel zu erläutern. Das folgende soll meine Seitengrundstruktur sein:
<!doctype ... >
<html>
<head>...</head>
<body>
   <div class="menu">
   link<br /> link<br />...
   </div>
   <div class="content">
   ...
   </div>
</body>
</html>

Angenommen, das Menü ist immer gleich. Mit dem Menü kann ich zwischen verschiedenen Seiten wechseln (das können aber auch mehr werden, wer weiß). Im "Content"-Bereich will ich meinen Inhalt anzeigen. Woraus der erzeugt wird, sei mal egal. Konsequenterweise bräuchte ich also eine Klasse, die folgendes kann:

class Website {
   const $_DOCTYPE = '<!doctype ...>';
   var $_htmlhead;
   var $_menu = '';
   var $_content;

function website() {
   // leerer Konstruktor
   }

function setHtmlhead($value) {
      $this->_htmlhead = $value;
   }

function addMenu($desc, $link) {
      $this->_menu .= '<a href="'.$link.'">'.$desc.'</a><br />';
   }

function setContent($value) {
      $this->_content = '<div class="content">'.$value.'</div>';
   }

function draw() {
      echo $this->_DOCTYPE;
      echo '<html><head>'.$this->_htmlhead.'</head><body>';
      echo '<div class="menu">'.$this->_menu.'</div>';
      echo $this->_content;
      echo '</body></html>';
   }
}

Um meine Seite darzustellen, muss ich jetzt schreiben:

$page = new Website();
$page->setHtmlhead('<title>test</title><meta name="..." />');
$page->addMenu('google', 'http://www.google.de');
$page->addMenu('selfhtml', 'http://forum.de.selfhtml.org');
$page->addContent('So, das hier ist also mein Inhalt');
$page->draw();

Das ist jetzt natürlich sehr einfach, auch dass ich alles nur als Strings realisiere. Um es noch konsequenter zu machen, bräuchte ich wohl eine Klasse "menu", die einzelne Menüpunkte enthält und sogar eine Klasse "htmlheader", die mir set-Methoden für <title>, <meta...>, <style...> anbietet.

A B E R :

Warum nicht einfach so?
Die Datei "header.php" enthält
<!doctype ... >
<html>
<head>...</head>
<body>

Die Datei "menu.php" enthält das Menü (und ist jederzeit getrennt vom Rest änderbar).

Die Datei "footer.php" enthält
</body>
</html>

Meine Seite erzeuge ich durch
include ('./header.php');
include ('./menu.php');
echo '<div class="content">Das ist mein Inhalt</div>';
include ('./footer.php');

...fertig. Tut genau das gleiche. Ist nicht objektorientiert aber in meinen Augen viel einfacher und verständlicher als das (sehr einfach geschriebene) Beispiel oben.

==> Klassen machen für mich irgendwie nur Sinn, wenn ich mit innerhalb von Objekten einer Klasse auch mit Daten arbeite.
==> Im oben beschriebenen Fall geht es nur um Ausgabe. Hier empfinde ich Klassen als überflüssig, wenn nicht sogar verwirrend.
Hm *grübelnd*
Viele Grüße
osaki