Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Ankündigungen, News und Feedback > Tutorials > [PHP] OOP - eine Einführung
Antwort
 
Themen-Optionen
Alt 25.08.2005, 15:36   Nach oben    #1
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard [PHP] OOP - eine Einführung

In diesem Tutorial beschäftige ich mich ganz kurz damit, wie man seine eigenen Klassen durch Standard-Funktion erweitern kann, um Redundanzen zu vermeiden. Ich beschreibe dies anhand eines einfachen Beispiels:

Jede Klasse, die man programmiert, enthält bestimmte Konfigurationen. Nun ist es im Sinne der OOP vorteilhaft, wenn man diese Funktionalität zentral für alle Klassen zur Verfügung stellt, anstatt sie in jeder neuen Klasse manuell wieder einzupflegen. Bei Änderungen der Funktion oder Erweiterungen müsste man dann jede einzelne Klasse bearbeiten.

Eins noch vorweg: Ich weiß, dass Funktionen in Klassen immer als Methoden bezeichnet werden, ich verzichte aus Gewohnheit aber im Nachfolgenden Tutorial darauf und bleibe bei der mir leider Gottes angewöhnten Art und nenne sie Funktionen, man möge mir verzeihen

Als Beispiel nehme ich die Zentralisierung von Konfigurations-Variablen einer Klasse. Hierzu gibt es ein Array und eine Funktion zum Auslesen und/oder setzen von Variablen der Konfiguration.

Die Klasse sieht nun wie folgt aus:

PHP-Code:
<?php
/* Dateistart */

class class_default
{
  var 
$cfg = array ();

  
/* Hier kommt die Funktion hinein */
}

/* nachfolgender Code */
?>
Wir haben nun also die Variable $cfg, in der alle Konfigurations-Variablen gespeichert werden. Diese Definition des Arrays muss in jeder eigenen Klasse angegeben werden, die diese Klasse als Grundlage nutzt. Dies hat den Grund, dass für jede Klasse die Konfigurationsvariablen definiert werden müssen, damit diese von der Funktion zum lesen/ändern benutzt werden können. Außerdem ist somit eine Vorgabe von Standardwerten möglich.

Die Funktion erhält als ersten Übergabeparameter einen Variablennamen, der als Key im Array vorhanden sein muss. Ist dies nicht der Fall, wird FALSE zurückgegeben. Ist dies jedoch der Fall, wird der Wert der Variablen zurückgegeben. Der zweite Parameter ist optional und bietet die Möglichkeit nach dem Auslesen der Variablen diese neu zu setzen. Der alte Wert wird in diesem Fall zurückgegeben. Die Funktion sieht also wie folgt aus:

PHP-Code:
<?php
/* nachfolgend der Code für die Klasse class_default */

  
function config ($config$value NULL)
  {
    if (isset (
$this->cfg[$config]) === TRUE)
    {
      
$return $this->cfg[$config];

      if (
$value !== NULL)
      {
        
$this->cfg[$config] = $value;
      }

      return 
$return;
    }
    else
    {
      return 
NULL;
    }
  }

/* nachfolgender Code */
?>
Eine Beispielklasse, die unsere Standard-Klasse als Grundlage nutzt sieht also wie folgt aus:

PHP-Code:
<?php
/* class_default definieren */

class example_class extends class_default
{
  var 
$cfg = array ('var1' => 1,
                    
'var2' => 'val2',
                    
'val3' => 1337
                    
);
}

/* nachfolgender Code */
?>
Wir legen nun eine Instanz der Klasse example_class an und speichern diese in $example:

PHP-Code:
<?php
/* example_class definieren */

$example = new example_class;
?>
In $example ist nun eine Instanz der Klasse example_class gespeichert, auf die wir ohne Weiteres zugreifen können.

Ein kleiner Test zeigt, dass unsere Zentralisierung geklappt hat:

PHP-Code:
<?php
/* example_class definieren */

echo $example->config ('var2');
?>
Als Ausgabe erhalten wir nun 'val2', da dies der aktuelle Wert von 'var2' ist. Es zeigt uns, dass trotz der Tatsache, dass die Klasse example_class keine Funktionen enthält, die Funktion config () aufgerufen werden konnte und auch das korrekte Ergebnis geliefert hat. Also können wir sicher sein, dass die Klasse ordnungsgemäß die Funktion config () der Standard-Klasse geerbt hat (andernfalls wäre auch ein Fehler ausgegeben worden ).

Will man nun den Wert von 'var1' z.B. auf 5 ändern, muss der Funktionsaufruf wie folgt aussehen:

PHP-Code:
<?php
/* example_class definieren */

$example->config ('var1'5);
?>
Zur Überprüfung bauen wir jedoch noch etwas dazu:

PHP-Code:
<?php
/* example_class definieren */

echo $example->config ('var1'5);
echo 
'<br />';
echo 
$example->config ('var1');
?>
Nun erhalten wir als Ausgabe untereinander erst die 1 und dann die 5. Es wurde beim ersten Funktionsaufruf also die 1 ausgelesen und dann durch die 5 ersetzt. Dies ist in diesem Beispiel wichtig, wenn man nach dem Setzen einer Variable den neuen Wert erhalten möchte. Dies muss also beachtet werden.

Variablen, die nicht im Config-Array enthalten sind, können mit dieser Funktion auch nicht gesetzt werden. Würden wir also folgendes versuchen:

PHP-Code:
<?php
/* example_class definieren */

$value $example->config ('var_not_defined');
?>
Würde FALSE zurückgegeben werden. An dieser Stelle ist die Funktion etwas ungenau, da eine Variable im Config-Array ebenfalls FALSE enthalten könnte. Eine Alternative wäre dann z.B. NULL als Rückgabewert. Ich persönlich bin jedoch nicht der Fan von NULL, sondern lasse meine Funktionen entweder einen Wert oder TRUE/FALSE zurückgeben. Mit NULL wäre dann jedoch eine genauere Zuordnung möglich, da in der Funktion überprüft wird, ob $value den Wert NULL hat und in diesem Fall ($value === NULL) das Setzen der Variable nicht vollzogen wird.

Nun haben wir eine Standard-Klasse, die es uns ermöglicht, Konfigurationsvariablen mittels Funktionsaufruf zu bearbeiten oder auszulesen. Dies ist nur ein Beispiel, wie man stetig benötigte Funktionen global halten kann. Der Vorteil liegt auf der Hand: Ändere ich etwas in der Funktion config (), brauche ich nicht alle Klassen, die diese Funktion benutzen zu ändern. Ein weiteres Beispiel wäre eine Log-Funktion, die Daten in ein Log-File schreibt oder eine Debug-Funktion, die formatierte Nachrichten am Bildschirm ausgibt. Dem Erfindungsreichtum sind hier keine Grenzen gesetzt.

Ich hoffe ich konnte einen kleinen Einblick in einen kleinen Teilbereich der OOP bieten, die einem das Programmieren stark erleichtern kann, wenn man sich im Vorfeld nur genug Gedanken macht.

Für Fragen zu diesem Tutorial oder bei Ungenauigkeiten oder Fehlern bitte ich sich mit mir oder einem Moderator in Verbindung zu setzen, damit dieser Fehler behoben werden kann.

Jetzt solltet Ihr eigentlich in der Lage sein, das Script ohne Vorlage nachzuprogrammieren. Die verwendeten Funktionen findet Ihr alle im PHP-Manual.

Solltet Ihr Fragen zu dem Tutorial haben, so schreibt bitte einen Beitrag im PHP-Forum mit einem Verweis auf dieses Tutorial.
Danke.

MfG
MrNiceGuy


// edit by Jann Hendrik: nach Absprache mit dem Autor eine Kleinigkeit geändert.

Geändert von Jann Hendrik (27.06.2007 um 10:51 Uhr). Grund: intern-tag angepasst
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.10.2005, 00:59   Nach oben    #2
Michel
Gast
 
Beiträge: n/a
Standard

Tut mir sehr leid, aber dieses Tutorial hat mir leider nicht gezeigt, wozu OOP gut sein soll.
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.10.2005, 05:47   Nach oben    #3
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard

Es ist auch nur eine Kleine Einführung und erklärt nicht gänzlich OOP (schließlich gibt es ganze Bücher über dieses Thema ^^).Es sollte nur einen Teilaspekt beleuchten: Di Zentralisierung von Funktionen bzw. Methoden in Klassen. Sprich: Die Vererbung. Ich lege eine Klasse mit den Funktionen zur Verwaltung von Config-Informationen an. Dadurch, dass ich alle Klassen mit "extends class_default" erweitere, fällt dafür der Code in jeder Klasse weg, was die Klasse ansich schlanker macht und den Wartungsaufwand bedeutend verringert, da ich nurnoch an einer Stelle schauen muss, wenn ich die Funktionalität der Config-Variablen rweitern möchte (oder weitere generelle Methoden hnzufügen will, wie z.B. eine Logging-Funktion um Fhler zu protokollieren, etc.).

Welchen Teil des Tutorials hast du denn nicht so gut gefunden bzw. nicht verstanden? Dann versuche ich dies zu überarbeiten, konstruktive Kritik ist also gefragt und keine "das tutorial ist doof, weil: das tutorial ist doof"-Begründung. Sorry, aber wenn du mir nicht sagst, was man hinzufügen / abändern sollte, damit es verständlicher ist, fasse ich es als haltloses Rumgenörgel auf, da es eher destruktiv als konstruktiv wirkt...
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.10.2005, 13:08   Nach oben    #4
Gruppenlos
 
Benutzerbild von derMaggus
 
Registriert seit: 24.08.2005
Beiträge: 26
Standard

Die Beschreibung gibt eine WEITERE Einführung, bzw. zusätzliches Wissen im Bereich OOP an. Genau das hat der Autor wunderbar umgesetzt- find ich.

Find den Lösungsansatz wirklich sehr nett und werde das mal überdenken. Stehe selbst am Anfang von OOP und freue mich daher immer, über solche Themen und Einblicke
derMaggus ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.10.2005, 19:42   Nach oben    #5
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard

In Anlehnung an den Tipp von WAQ habe ich den Return-Wert von FALSE auf NULL geändert, wenn der Config-Wert nicht vorhanden ist. Ansich erscheint ein NULL als Rückgabe sinnvoller, da dies auch der Rückgabewert einer nicht vorhandenen Variable wäre. Auf die Ausführung des Scriptes hat es jedoch keinen Einfluss und im Regelfall sollte der Else-Zweig eigentlich nicht auftreten, denn man weiß ja, welche Werte man setzen kann und nicht (weil man sie ja vorher in seine Klasse reinprogrammiert) Wer es bei dem FALSE belassen will, möge dies tun, es ist kein Beinbruch. Da es mit NULL jedoch logischer ist, habe ich es geändert.

Danke nochmal an WAQ!
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.10.2005, 21:52   Nach oben    #6
Goldman.de
 
Benutzerbild von J33d3X
 
Registriert seit: 09.10.2005
Ort: Frankfurt am Main
Beiträge: 190
Standard

o) if a function is described to return bool, expect to get a real bool
(TRUE/FALSE) and not an int (0/1). so please code your functions and
methods that way.

auszug: CODING GUIDELINES FOR DEVELOPERS
J33d3X ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2005, 05:48   Nach oben    #7
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard

@J33d3X: Das, was du da geschrieben hast, hat irgendwie nichts mit der Klasse zu tun. Innerhalb der Funktion nutze ich === bzw. !== zur Überprüfung von Rückgabewerten und der Rückgabewrt, den meine Funktion erzeugt, hat nichts mit dem Text zu tun, den du da gepostet hast. Ich wäre dir dementsprechend sehr verbunden, wenn du mir deine Intentionen diesbezüglich mitteilen würdest.

@Michel: ich warte im Übrigen immernoch auf konstruktive Kritik deinerseits, was denn genau an dem Tutorial schlecht ist und einer Verbesserung bedarf!
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2005, 07:29   Nach oben    #8
Goldman.de
 
Benutzerbild von J33d3X
 
Registriert seit: 09.10.2005
Ort: Frankfurt am Main
Beiträge: 190
Standard

sorry ich wollte dich sicher nicht angreifen ( was ich denken muss nach deinem posting )

ich habe mich eher auf:
Zitat:
In Anlehnung an den Tipp von WAQ habe ich den Return-Wert von FALSE auf NULL geändert
bezogen und das auch nur so in den virt. raum geworfen
solltest du oder waq mir eine für mich nachvollziehbare erklärung für NULL liefern
lasse ich mich gerne überzeugen ( wer will schon dumm sterben )

mfg
J33d3X ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2005, 07:59   Nach oben    #9
Waq
Erfahrener Benutzer
 
Registriert seit: 18.08.2005
Beiträge: 108
Standard

Das Keyword NULL wie leere Variable und nicht die Zahl 0.
http://de.php.net/null
Waq ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2005, 10:08   Nach oben    #10
Goldman.de
 
Benutzerbild von J33d3X
 
Registriert seit: 09.10.2005
Ort: Frankfurt am Main
Beiträge: 190
Standard

jo jo auch kein FALSE und kein empty ...

wo speziell liegt der vorteil bei einem rückgabewert NULL vs. FALSE||TRUE
J33d3X ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2005, 11:26   Nach oben    #11
Benutzer
 
Benutzerbild von Guradia
 
Registriert seit: 18.08.2005
Ort: Düsseldorf
Beiträge: 57
Standard

Zitat:
Zitat von J33d3X
jo jo auch kein FALSE und kein empty ...

wo speziell liegt der vorteil bei einem rückgabewert NULL vs. FALSE||TRUE

http://de.php.net/is_null

Die ist der einzige eindeutige "Wert", um zu verdeutlichen, dass diese Klasse für den abgefragten Key eben keinen Wert besitzt.

true/false sind gültige Werte.

Alternative: Exception.
Guradia ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2005, 14:27   Nach oben    #12
Goldman.de
 
Benutzerbild von J33d3X
 
Registriert seit: 09.10.2005
Ort: Frankfurt am Main
Beiträge: 190
Standard

das ist mir ja vollkommen klar ... das muss mir auch niemand erklären

ABER:
wo speziell liegt der vorteil bei einem rückgabewert NULL vs. FALSE||TRUE

ausgangspunkt: normale private methode ( exeptionhandling wird über eine eigene klasse geregelt "also uninteressant in diesem fall " )

es muss doch einen Grund haben wenn jmd. sagt das es besser ist einen NULL "nicht"wert zurückzugeben als einen ins leere laufenden booleschen
oder soll/muss ich das als gegeben hinnehmen

*laut denk* wobei mir keine sinnvolle struktureinfällt im try-catch , welche es mir veranschaulicht warum gerade NULL als rückgabewert sinniger ist

eventuell steh ich ja auch einfach nur mir selbst im weg .... nungut

trotzalledem einen wunderschönen tag noch ( ... auch vom wetter her )
J33d3X ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2005, 15:03   Nach oben    #13
Benutzer
 
Benutzerbild von Guradia
 
Registriert seit: 18.08.2005
Ort: Düsseldorf
Beiträge: 57
Standard

Zitat:
Zitat von J33d3X
eventuell steh ich ja auch einfach nur mir selbst im weg .... nungut
Ja .. tust du ^^

Bei Exceptions kommt es nicht mehr zum Return.
Was ansonsten dein Problem mit logischen Rückgaben ist, verstehe ich nicht ^^
Guradia ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2005, 15:20   Nach oben    #14
Goldman.de
 
Benutzerbild von J33d3X
 
Registriert seit: 09.10.2005
Ort: Frankfurt am Main
Beiträge: 190
Standard

Zitat:
Ja .. tust du ^^
mein herz blutet ... wie kann ein so kleines nettes mädel so herzlos sein *die welt ist am ende

wenn ich ehrlich sein darf !
Zitat:
Was ansonsten dein Problem mit logischen Rückgaben ist, verstehe ich nicht ^^
du glaubst gar nicht wie, gekonnt und eisern ich "unnecessary else" meldungen ignorieren kann, glaubst du da wirklich das ich ein Problem mit logischen, bool oder wie sie auch alle heissen mögen, werten habe ??? (hihhi) ich versteh noch nichtmal die logischen operatoren was gehen mich da die returns an ...

gut jetzt bevor ich noch kindischer werde gehe ich lieber erstmal Mittagessen

lg
J
J33d3X ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2005, 16:51   Nach oben    #15
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard

Zitat:
Zitat von J33d3X
sorry ich wollte dich sicher nicht angreifen ( was ich denken muss nach deinem posting )
Nein, entschuldige, kam vielleicht so rüber, war aber nicht so gemeintl. Ich wollte nur klarstellen, dass ich das, was in deinem Post stand eh beachtet hatte und daher nicht ganz wusste, was du damit ansprechen wolltest. Ich fühlte mich dadurch nicht angegriffen.
Zitat:
Zitat von J33d3X
ich habe mich eher auf:
Zitat:
In Anlehnung an den Tipp von WAQ habe ich den Return-Wert von FALSE auf NULL geändert
bezogen und das auch nur so in den virt. raum geworfen
solltest du oder waq mir eine für mich nachvollziehbare erklärung für NULL liefern
lasse ich mich gerne überzeugen ( wer will schon dumm sterben )

mfg
Eine Variable, die nicht vorhanden ist, liefert im Zugriffsfall NULL zurück, welches keinen Wert beinhaltet. NULL ist quasi "NICHTS". FALSE / TRUE hingegen sind Boolsche Werte, nämlich Wahr / Falsch, 1 / 0, An / Aus. Eine Variable kann nun also auch den Wert FALSE annehmen, wenn ich (in meinem Beispiel mit der Konfiguration) z.B. eine Variable für das Debuggen erstelle, kann diese TRUE oder FALSE sein. Wenn sie TRUE ist, kann die Klasse an bestimmten Stellen so programmiert sein, dass sie Fehlermeldungen am Bildschirm ausgibt. Würde ich das Extrem nun umdrehen und sagen die Variable heißt "deaktivate_debug", wäre ein FALSE quasi die Aktivierung des DEBUG-Modus und ein TRUE die Abschaltung dessen. Würde die Variable nun aus welchen Gründen auch immer nicht vorhanden sein, würde die methode config () FALSE zurückliefern und somit das Debugging aktivieren. Gibt es aber NULL zurück und prüft man wie in dem von dir geposteten Teil auf Bool-Werte mittels

PHP-Code:
<?php
if ($this->config ('deactivate_debug') === FALSE)
{
  
/* DEBUGGING */
}
?>
springt er nurnoch in die Schleife, wenn die Variable vorhanden ist und wirklich auf FALSE gesetzt wurde.

zugegeben, dieses Probem tritt eigentlich nur dann auf, wenn man bei der Programmierung nicht aufpasst, da ich mir nicht vorstellen kann, dass ein derartiger Code absichtlich programmiert würde, aber man weiß ja nie, bei den schier unendlichen Möglichkeiten, die es gibt, kann es durchaus mal vorkommen, dass ein FALSE hier zu einem Fehler führen würde. Ich hoffe ich konnte durch mein Beispiel etwas klar machen, weshalb ein NULL sinnvoller sein könnte. Letztlich geht es eigentlich nur um eine sauberere Programmierung. Du kannst genausogut FALSE verwenden.
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2005, 17:01   Nach oben    #16
Goldman.de
 
Benutzerbild von J33d3X
 
Registriert seit: 09.10.2005
Ort: Frankfurt am Main
Beiträge: 190
Standard

danke für das ausführlich post

...

ich liebe saubere, strukturierte seiten wenn ich doch bloß
a) mir die Zeit nehmen würde
b) es könnte

:wink:

greedings
J33d3X ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.11.2005, 00:05   Nach oben    #17
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Ich füge hier mal ein PDF-Dokument von der diesjährigen PHP Conference in Franfurt an:
http://ilia.ws/files/frankfurt_oop.pdf

Vielleicht kann es ja wer als Einstieg nutzen.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Suche] OOP - Erklärung und Beispiele Jan Gesuche 4 29.06.2006 11:34