PHP – Endlich objektorientiert- P11

30 239 0
Tài liệu đã được kiểm tra trùng lặp
PHP – Endlich objektorientiert- P11

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

4 PHP objektorientiert 270 Der Datenzugriff kann natürlich um Transaktionen und/oder verschlüsselten Zugriff ergänzt werden. Es wurde im UML-Teil des dritten Kapitels bereits erklärt, dass Inter- faces auch vererbt werden können, um zusätzliche Funktionalität hinzuzufügen. Dies kann beispielsweise durch die Definition interface iCryptedDZ extends iDZ erfolgen. Nun muss der Zugriff auf diese Implementierung noch getestet werden. Dazu wird auf die existierende Börsendatenbank aus dem zweiten Kapitel zurückgegriffen (Abb. 2.11 ff.). In der Datenbank boerse ist eine Tabelle ag enthalten, die einen Identifikator und den Namen von Aktiengesellschaften enthält. Zum Testen wird die Verbindung zum Daten- bankserver geöffnet, der Name einer Aktiengesellschaft aktualisiert, anschließend die gesamte Tabelle ausgelesen und im letzten Schritt wird die Verbindung wieder geschlos- sen. Im Gegensatz zum zweiten Kapitel wird die Datenbankverbindung hier innerhalb des Verbindungsobjekts $db verwaltet. Dieses Objekt verfügt durch die Implementierung des zuvor definierten Interfaces über die Methoden ࡯ öffnen ࡯ schreiben ࡯ lesen ࡯ schließen Für die Parametrierung werden beim Öffnen, Schreiben und Lesen eigene Parameterob- jekte definiert, die beim Öffnen über die Parameter host, user, pass und db sowie beim Sch- reiben und Lesen über den Parameter sql verfügen. Erkennen Sie den Mehrwert gegenüber der Realisierung im zweiten Kapitel? Der Pro- grammierer, der ein mysqlDZ-Objekt verwendet, muss nichts über die MySQL-Befehle von PHP wissen. Er muss lediglich die zum Öffnen notwendigen Parameter kennen und die SQL-Sprache beherrschen. Über dasselbe Interface könnten Sie auch Implementie- rungen für eine Oracle-, MS-SQL- oder eine DB2-Datenbank schreiben. Die Verwendung wäre identisch. Gegebenenfalls müssten die Parameter etwas verändert werden. Mit ähnlichen Parametern lassen sich auf die gleiche Art und Weise auch Zugriffe auf Dateien realisieren. Die Eingabe der Parameter erfolgt jedoch üblicherweise über eine Konfigurationseinga- bemaske, die einem eingeloggten Administrator zur Verfügung steht. Für jede Imple- } private function starts_with($str,$wert){ return strtolower(substr($str,0,strlen($wert)))==strtolower($wert); } } ?> Listing 4.47: Die Implementierung des Interfaces für einen MySQL-Zugriff (Forts.) Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Realisierung von Klassengeflechten PHP Endlich objektorientiert 271 mentierung muss also im Frontend noch eine passende Eingabemaske erstellt werden, mit der die Parameter festgelegt werden. Doch zunächst zurück zum Testprogramm. Bei $p_öffnen, $p_schreiben und $p_lesen han- delt es sich um die Parameterobjekte, die gemäß den Vorgaben aus der Implementierung mysqlDZ gefüllt werden. Das Verbindungsobjekt selbst heißt $db. Der schreibende Zugriff $db->schreiben($p_schreiben) liefert als Ergebnis lediglich einen Wahrheitswert, der den Erfolg des Schreibzugriffs widerspiegelt. Interessant ist der lesende Zugriff. Wie bereits beschrieben wurde, liefert $ausgabe=$db- >lesen($p_lesen) ein zweidimensionales Feld als Ergebnismenge in der Referenz $ausgabe zurück. Mit den PHP-Befehlen count($ausgabe) können Sie die Anzahl der Datensätze ermitteln und mit count($ausgabe[0]) die Anzahl der zurückgegebenen Spalten der Ergeb- nistabelle. Das sind die Spalten, die Sie hinter dem SELECT-Befehl der SQL-Anweisung angegeben haben. Mit der verschachtelten foreach-Schleife können Sie nun auf jedes Datenelement zugreifen. <?php require_once("classloader.inc.php"); ?> <html><body> <?php // neues DB-Verbindungsobjekt erstellen, welches das Interface iDZ // implementiert $db=new mysqlDZ(); // 1. öffnen $p_öffnen=new ParameterListe(); $p_öffnen->add('host','localhost'); $p_öffnen->add('user','root'); $p_öffnen->add('pass',''); $p_öffnen->add('db','boerse'); if ($db->öffnen($p_öffnen)==FALSE) die('FEHLER beim DB-Öffnen!'); // 2. schreiben: $p_schreiben=new ParameterListe(); $p_schreiben->add('sql','UPDATE ag SET name="Dopatka AG" WHERE ID=6'); echo 'Schreiben erfolgreich:'; echo var_dump($db->schreiben($p_schreiben)); echo '<br>'; // 3. lesen: $p_lesen=new ParameterListe(); $p_lesen->add('sql','SELECT ID,name FROM ag ORDER BY ID'); $ausgabe=$db->lesen($p_lesen); if ($ausgabe==FALSE){ $db->schliessen(); die('FEHLER beim DB-Zugriff!'); } echo 'Anzahl Datensätze:'.count($ausgabe).'<br>'; echo 'Anzahl Spalten:'.count($ausgabe[0]).'<br>'; foreach($ausgabe as $index => $datensatz){ Listing 4.48: Test der Implementierung Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. 4 PHP objektorientiert 272 Auf diese Weise wird die folgende Ausgabe erzeugt. Als Übung können Sie diese Aus- gabe in eine HTML-Tabelle umformatieren. Schreiben erfolgreich:bool(true) Anzahl Datensätze:30 Anzahl Spalten:2 1 ADIDAS-SALOMON AG 2 ALLIANZ AG VNA O.N 3 ALTANA AG O.N. 4 BASF AG O.N. 5 BMW 6 Dopatka AG . 4.2.6 Umsetzung von Sequenzdiagrammen Wie Sie aus einem bestehenden UML-Klassendiagramm eine Klasse in PHP 5 ableiten können, haben Sie bereits in den vorherigen Kapiteln erfahren. Hier wird die Definition der Klassen, der Eigenschaften und Methoden sowie der Beziehungen der Klassen unter- einander fokussiert. Ebenso wurde bereits ein Aktivitätsdiagramm aus Abbildung 4.9 in Listing 4.36 in einer Methode umgesetzt. foreach($datensatz as $index2 => $wert){ echo $wert; echo '<br>'; } } // 4. schliessen $db->schliessen(); ?> </body></html> Listing 4.48: Test der Implementierung (Forts.) Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Realisierung von Klassengeflechten PHP Endlich objektorientiert 273 Die Beziehung zwischen einem UML-Sequenzdiagramm und einer PHP-Klasse wurde jedoch noch nicht vorgestellt. Wie ein Aktivitätsdiagramm zeigt ein Sequenzdiagramm einen Ablauf, der jedoch weniger einen Geschäftsprozess abbildet, sondern eher die Interaktion von Objekten in den Vordergrund stellt. Der Quellcode aus Listing 4.49 ist ein Ausschnitt aus dem bereits vorgestellten Quellcode des Listings 4.41, der den Test des Klassengeflechts zwischen Kunden, Rechnungen, Rechnungspositionen und Artikeln realisiert. Es wird also eine Kommunikation von Objekten von vier verschiedenen Klassen abgebildet. Dieser existierende Quellcode soll in diesem Beispiel in einem Sequenzdiagramm auf Muschelebene dokumentiert werden. Zunächst wird über den Frontend-Quellcode den man als Akteur gegenüber den ande- ren Objekten sehen kann die Methode getRechnungen des Kunden Dopatka aufgerufen. Daraufhin erhält der Aufrufer eine Liste der Rechnungen als Rückgabe. Von dieser Liste wird das erste Element, $rechnungen[0] betrachtet. Dies ist ein Objekt der Klasse Rech- nung. Von dieser Rechnung werden nun Eigenschaften ausgelesen, nämlich ࡯ die Rechnungsnummer (ID) ࡯ das Rechnungsdatum ࡯ der Name des Kunden der Rechnung ࡯ der Rabatt auf die Gesamtrechnung ࡯ die Anzahl der Rechnungspositionen Genau dieses Auslesen erkennen Sie im Sequenzdiagramm der Abbildung 4.12. Im Anschluss daran wird jede Rechnungsposition in einer Schleife durchgegangen. Die Schleife kann in einem Sequenzdiagramm nur schwer abgebildet werden und wird in $rechnungen=$k1->getRechnungen(); echo '<b>RECHNUNG Nr. '.$rechnungen[0]->getID().' vom '.$rechnungen[0] ->getDatum().':</b><br>'; echo 'Kunde: '.$rechnungen[0]->getKunde()->getName().'<br>'; echo 'Rabatt auf die Gesamtrechnung: '.$rechnungen[0] ->getRabatt().'%<br>'; $positionen=$rechnungen[0]->getPositionen(); $i=0; foreach ($positionen as $index => $p){ echo '<i>Position '.($i+1).':</i><br>'; echo $p[0]->getName().', '.$p[1].' Stück, '.$p[2].'% Rabatt<br>'; echo number_format($p[3],2).'EUR pro Stück, '.number_format($p[4],2). 'EUR gesamt incl. '; echo $p[0]->getMwSt().'% MwSt.<br>'; $i++; } Listing 4.49: Quellcodeausschnitt aus Listing 4.41 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. 4 PHP objektorientiert 274 dem gepunkteten Kasten mit der Beschriftung *positionen (heißt: für alle Positionen) dar- gestellt. Für jede Rechnungsposition werden nun ausgegeben: ࡯ der Name des Artikels ࡯ die bestellte Menge ࡯ der Rabatt dieser einzelnen Position ࡯ der Einzelpreis ࡯ der Gesamtpreis dieser Position ࡯ der Mehrwertsteuersatz Der Name des Artikels wird über die Artikelreferenz ausgelesen, die jede Rechnungspo- sition besitzt. Im Sequenzdiagramm der Abbildung 4.12 werden nur die ersten beiden Lesevorgänge aus jeder Rechnungsposition, also Artikelname und Menge, dargestellt. Abbildung 4.12: Sequenzdiagramm des PHP-Codes aus Listing 4.49 4.2.7 Umsetzung von Zustandsautomaten Auch die Implementierung eines in UML definierten Zustandsdiagramms ist in PHP 5 möglich. Die folgende Abbildung 4.13 wurde bereits im dritten Kapitel zur Beschreibung des Zustandsdiagramms der UML verwendet. Es beschreibt das Interface einer Flugre- servierung mit den Methoden Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Realisierung von Klassengeflechten PHP Endlich objektorientiert 275 ࡯ reservieren ࡯ stornieren ࡯ buchen Dies ist zunächst Bestandteil eines Klassendiagramms. Zusätzlich wird jedoch ein Proto- koll in Form eines Zustandsdiagramms dargestellt. Dieses Protokoll zeigt, in welcher Reihenfolge die Methoden einer Klasse abgearbeitet werden müssen, die das Interface und das Protokoll implementieren soll. Abbildung 4.13: Zustandsdiagramm einer Interfacebeschreibung Listing 4.50 zeigt im ersten Schritt die Definition des Interfaces zur Flugreservierung mit den drei Methoden. Hinweis Sie erkennen daran, dass jedes UML-Diagramm der Designphase direkten Einfluss auf den entstehenden Quellcode haben kann. Dies gilt insbesondere für die Fisch- und Muschelebene. Jedes Diagramm stellt einen anderen Aspekt des Quellcodes dar und kann direkt in Quellcode übersetzt werden. Ebenso ist eine Übersetzung von Quellcode in UML zu Zwecken der Dokumentation möglich. <?php interface iFlugreservierung{ Listing 4.50: Das Interface der Flugreservierung Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. 4 PHP objektorientiert 276 Listing 4.51 zeigt nun die Implementierung des Interfaces unter Berücksichtigung des im Zustandsdiagramm definierten Protokolls. Insgesamt existieren die Zustände 1. initialisiert 2. reserviert 3. gebucht 4. storniert Der aktuelle Zustand wird in der Eigenschaft $zustand festgehalten und im Konstruktor auf 0 gesetzt. Zusätzlich wird eine Methode getZustand() implementiert, mit der man den Zustand des Reservierungsobjekts jederzeit abfragen kann. Dem folgen die im Interface deklarierten Methoden reservieren, stornieren und buchen. Dabei wird stets im ersten Schritt geprüft, ob die entsprechende Methode im aktuellen Zustand überhaupt ausgeführt werden darf. Ist dies nicht der Fall, so gibt die Methode FALSE zurück. Ansonsten erfolgt ein Zustandswechsel und die entsprechende Methode gibt den Wahrheitswert TRUE zurück. Zu berücksichtigen ist noch, dass nicht jede Reservierung in einer erfolgreichen Buchung endet. Dies geschieht dann, wenn die Reservierung zu spät in eine Buchung umgewan- delt wird und bereits viele andere Kunden den Flug ausgebucht haben. Da jedoch in die- sem Beispiel kein vollständiges Reservierungssystem implementiert werden soll, wird die Reservierung per Zufallssystem in eine Buchung umgewandelt. Dazu wird mit srand(microtime()*1000000) ein Zufallszahlengenerator auf Basis der Systemzeit initiali- siert. Der Befehl $zufall=rand(0,2) gibt dann eine Zufallszahl zwischen 0 und 2 zurück. Ist die erstellte Zahl größer als 1, so gilt die Buchung als erfolgreich, ansonsten nicht. Der Zustandswechsel innerhalb einer Methode wird dann wiederum in der Eigenschaft $zustand festgehalten. public function reservieren(); public function stornieren(); public function buchen(); } ?> <?php class AirlineReservierung implements iFlugreservierung{ // 0:init, 1:reserviert, 2:gebucht, 3:storniert private $zustand; public function __construct(){ $this->zustand=0; } Listing 4.51: Die Interfaceimplementerung und Umsetzung des Zustandsautomaten Listing 4.50: Das Interface der Flugreservierung (Forts.) Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Realisierung von Klassengeflechten PHP Endlich objektorientiert 277 public function getZustand(){ switch($this->zustand){ case 0: return 'initialisiert'; break; case 1: return 'reserviert'; break; case 2: return 'gebucht'; break; case 3: return 'storniert'; break; default: return 'FEHLER: Ungültiger Zustand!'; break; } } public function reservieren(){ if ($this->zustand!=0) return FALSE; $this->zustand=1; // reserviert return TRUE; } public function stornieren(){ if ($this->zustand!=1) return FALSE; $this->zustand=3; // storniert return TRUE; } public function buchen(){ if ($this->zustand!=1) return FALSE; // es ist Zufall, ob die Buchung funktioniert . srand(microtime()*1000000); $zufall=rand(0,2); if ($zufall>1){ $this->zustand=3; // gebucht } else{ $this->zustand=2; // storniert } return TRUE; } Listing 4.51: Die Interfaceimplementerung und Umsetzung des Zustandsautomaten (Forts.) Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. 4 PHP objektorientiert 278 Der Test der Implementierung erfolgt, indem ein Objekt der AirlineReservierung ange- lehnt wird. Im Anschluss daran wird ein Pfad im Zustandsdiagramm durchgegangen und nach jedem Schritt der aktuelle Zustand des Objekts ausgegeben. Die Ausgabe ist im Folgenden dargestellt, wobei in ca. 50 % der Fälle die dritte Ausgabe storniert lautet: initialisiert reserviert gebucht 4.3 Objektorientierte Fehlerbehandlung Bereits im zweiten Kapitel wurde der @-Operator zur Fehlerunterdrückung vorgestellt. So wird mit $datei=@fopen("counter.txt","w") die Meldung Warning: fopen(counter.txt) [function.fopen]: failed to open stream . unterdrückt. Über die Prüfung if($datei===FALSE){ .} könnte dann eine Behandlung des Fehlers erfolgen, wenn die Datei nicht existiert. Auch in Listing 4.51 werden Fehlerprüfungen durchgeführt, indem eine if-Verzweigung zum Einsatz kommt und bei einem Fehler der Rückgabewert einer Methode in besonderem Maße erfolgt. Die implementierten Methoden reservieren, stor- nieren und buchen liefern im Fehlerfall FALSE zurück. Auch die Implementierung der Datenbankzugriffsschnittstelle in Listing 4.48 arbeitet auf diese Weise. Das Lesen aus der Datenbank liefert ein Datenfeld als Rückgabe oder FALSE, wenn das Lesen nicht erfolgreich war. } ?> <?php require_once("classloader.inc.php"); ?> <html><body> <?php $FDairline=new AirlineReservierung(); echo $FDairline->getZustand().'<br>'; $FDairline->reservieren(); echo $FDairline->getZustand().'<br>'; $FDairline->buchen(); echo $FDairline->getZustand().'<br>'; ?> </body></html> Listing 4.52: Test der Umsetzung des Zustandsautomaten Listing 4.51: Die Interfaceimplementerung und Umsetzung des Zustandsautomaten (Forts.) Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Objektorientierte Fehlerbehandlung PHP Endlich objektorientiert 279 Doch wird diese besondere Fehlerrückgabe vom Aufrufer einer Methode ausgewertet? Die Antwort lautet: Meistens nicht! Dies liegt daran, dass man oft dazu neigt, nur den erfolgrei- chen Fall zu betrachten, um möglichst schnell eine lauffähige Anwendung zu erhalten. Im Fall der Flugreservierung hat dies zur Folge, dass Sie unter Umständen einen Flug in einem Zustand stornieren wollen, der ungleich reserviert ist. In diesem Fall liefert die Methode stornieren den Wert FALSE. Wird dieser Rückgabewert nicht ausgewertet, so geht der Aufrufer der Methode davon aus, dass sein Flug erfolgreich storniert wurde. Nun könnte man sagen: Aber dann hätte der Wert doch ausgewertet werden müssen! Die Verantwortung für die Fehlerbehandlung wird also vom Programmierer der Klasse auf den Aufrufer der Methode weitergegeben. Dieser muss dann nach jedem Methoden- aufruf eine Prüfung vornehmen, ob der Aufruf erfolgreich war oder nicht. Dies führt dazu, dass Sie den regulären, erfolgreichen Ablauf des Programms bei vielen Zeilen Quellcode kaum noch nachvollziehen können, da er ständig von der Fehlerprüfung unterbrochen wird. So zeigt Listing 4.53 einen Ausschnitt aus dem bereits vorgestellten Listing des objektori- entierten Datenzugriffs mit dem Datenzugriffsobjekt $db. Der reguläre Programmablauf ist fett gedruckt, während der restliche Code zur Fehlerbehandlung dient. Bei größerem Quellcode entstehen viele Fehlerpfade im Quellcode, sodass Sie den regulären Ablauf des Programms kaum noch erkennen können. Fehler in einer Klasse: werfen und fangen Das Beispiel in Listing 4.53 zeigt ein Datenbankobjekt, das Fehler produzieren kann. Bei der Flugreservierung in Abbildung 4.13 sind nicht alle Methodenaufrufe in jedem Zustand erlaubt. Die jeweilige Methode des Reservierungsobjekts gibt bei einem ungül- tigen Aufruf ebenso FALSE zurück wie die Methode des Datenbankobjekts. Mit der fünften Version hat PHP nun ein Konzept zur Fehlerbehandlung eingeführt, das bei anderen objektorientierten Sprachen wie Java, VB.NET oder C# bereits sehr erfolg- reich ist. Dabei wird der Quellcode, der Fehler produzieren kann, an einem Stück in einem so genannten try-Block ausgeführt. Die Idee ist, dass man zunächst versucht, den Quellcode an einem Stück auszuführen. Ist dies erfolgreich, wird der aufrufende Code linear abgearbeitet. Ansonsten ist ein Fehler aufgetreten, der von einer aufgerufenen $p_lesen=new ParameterListe(); $p_lesen->add('sql','SELECT ID,name FROM ag ORDER BY ID'); $ausgabe=$db->lesen($p_lesen); if ($ausgabe==FALSE){ $db->schliessen(); die('FEHLER beim DB-Zugriff!'); } echo 'Anzahl Datensätze:'.count($ausgabe).'<br>'; echo 'Anzahl Spalten:'.count($ausgabe[0]).'<br>'; Listing 4.53: Ausschnitt aus Listing 4.48 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. [...]... des PHPBefehls set_error_handler PHP Endlich objektorientiert Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark 291 4 PHP objektorientiert < ?php function meldung($typ, $meldung, $datei, $zeile){ echo 'Typ: '.$typ.''; echo 'Meldung: '.$meldung.''; echo 'in Datei: '.$datei.''; echo 'Zeile: '.$zeile.''; } set_error_handler('meldung'); ?> < ?php. .. Sie als PHP- Entwickler besonders sorgfältig und gewissenhaft alle möglichen Fälle eines Programmablaufs beachten Eine weitere Schwachstelle im try/catch-Konzept von PHP 5 liegt darin, dass es nicht universell anwendbar ist So führt unter anderem die Anweisung $x=10/0; zu der Ausgabe PHP Endlich objektorientiert Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark 287 4 PHP objektorientiert... Fehlermeldungen realisiert werden < ?php class mysqlDZ implements iDZ{ private $conn; private $connected=FALSE; public function öffnen($p){ if (!isset($p)) throw new Fehler(1,'Das Parameter-Objekt ist Listing 4.55: Datenbankzugriff mit objektorientiertem Fehlermanagement PHP Endlich objektorientiert Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark 281 4 PHP objektorientiert ungültig!','mysqlDZ-öffnen',FALSE);... werden Dabei kann dieselbe Fehlerklasse verwendet werden In diesem Fall werden irreguläre Zustandsübergänge in Fehlerobjekte umgewandelt PHP Endlich objektorientiert Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark 285 4 PHP objektorientiert < ?php class AirlineReservierung implements iFlugreservierung{ public function reservieren(){ if ($this->zustand!=0){ throw new Fehler(20,'Reservieren... strtolower(substr($str,0,strlen($wert)))==strtolower($wert); } } ?> Listing 4.55: Datenbankzugriff mit objektorientiertem Fehlermanagement (Forts.) PHP Endlich objektorientiert Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark 283 4 PHP objektorientiert Das Testskript für die Fehlerbehandlung aus Listing 4.48 muss nur unwesentlich verändert werden Zunächst geht man davon aus,... Listing 4.62: XML-Datei, die eine Objektinfrastruktur realisiert PHP Endlich objektorientiert Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark 293 4 PHP objektorientiert Listing 4.62: XML-Datei, die eine Objektinfrastruktur realisiert (Forts.) Im Gegensatz zu HTML (Hypertext... sind ࡯ der Dokumentknoten, der die gesamte Baumstruktur darstellt ࡯ Dokumentfragmentknoten, die jeweils einen Teil der Baumstruktur darstellen PHP Endlich objektorientiert Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark 295 4 PHP objektorientiert ࡯ Elementknoten, die jeweils exakt einem XML-Element entsprechen ࡯ Attributknoten, die jeweils exakt einem Attribut in XML... Hans Wurst Listing 4.63: Beispielhafte XML-Datei PHP Endlich objektorientiert Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark 297 4 PHP objektorientiert Listing 4.63: Beispielhafte XML-Datei (Forts.) Profitipp Es kann sein, dass die Verarbeitung von großen... Tabelle 4.3: Übersicht über die Fehler- und Warnmeldungen von PHP (Forts.) Welche Meldungen dargestellt werden, können Sie in der Konfigurationsdatei php. ini in dem Parameter error_reporting einstellen Die Konfigurationsdatei befindet sich bei XAMPP im Unterverzeichnis php Der betreffende, gut dokumentierte Eintrag sieht standardmäßig in der PHP- Version 5.30 folgendermaßen aus: ; Common Values: ; E_ALL... Production Value: E_ALL & ~E_DEPRECATED ; http:/ /php. net/error-reporting error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED Da die Werte der Konstanten Zweierpotenzen darstellen, können mehrere Konstanten mit binären Operatoren hinzu- oder abgeschaltet werden Abbildung 4.14 erklärt einige der binären Verknüpfungen und deren Ergebnis grafisch PHP Endlich objektorientiert Please purchase PDF Split-Merge . Realisierung von Klassengeflechten PHP – Endlich objektorientiert 273 Die Beziehung zwischen einem UML-Sequenzdiagramm und einer PHP- Klasse wurde jedoch noch. Objektorientierte Fehlerbehandlung PHP – Endlich objektorientiert 289 Welche Meldungen dargestellt werden, können Sie in der Konfigurationsdatei php. ini in dem Parameter

Ngày đăng: 29/10/2013, 02:15

Tài liệu cùng người dùng

Tài liệu liên quan