Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Web Entwicklung mit PHP - Teil 2

1.614 Aufrufe

Veröffentlicht am

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Web Entwicklung mit PHP - Teil 2

  1. 1. PHP Personal Homepage Tools - Hypertext Preprocessor Programmieren für das WebTeil 2 - ObjektorientierungVersion: 2012-04-22License: CC BY NC SAErstellt von Hans-Joachim Piepereit (hajo_p@live.de)Konstruktives Feedback hierzu ist gern gesehen
  2. 2. Inhaltsverzeichnis1 Strukturierung 3 1.1 Namensräume . . . . . . . . . . . . . . . . . . . . . 3 1.2 Klassen . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . 92 Einsatz und Erweiterungen 10 2.1 Nutzung von Klassen . . . . . . . . . . . . . . . . . 10 2.2 Formale Parameter . . . . . . . . . . . . . . . . . . . 11 2.3 Schlüsselwörter . . . . . . . . . . . . . . . . . . . . . 13 2.4 Fehlerbehandlung . . . . . . . . . . . . . . . . . . . 163 Beispielscript: PDO mit SQLite 194 Anhang 22 4.1 Verweise und Empfehlungen . . . . . . . . . . . . . . 22 2
  3. 3. 1 Strukturierung 1.1 Namensräume - Verhindern Namenskollisionen zwischen Klassen, Interfaces, usw. - Verwenden als Start und Trennzeichen einen Backslash - Schwächere Form von Java Packages, keine Existenzprüfungen - Sprachelemente (z.b. "default") nicht erlaubt und PHP reserviert - Hilfreich beim Abbilden einer Pfadstruktur (siehe Autoloading)1 <?php2 // S e t z e den Namensraum e i n e r Datei3 namespace d i e s i s t e i n t e s t ;4 // A l t e r n a t i v e Syntax d i e mehrere j e Datei e r l a u b t5 namespace d i e s i s t e i n t e s t {6 f u n c t i o n abc ( ) { r e t u r n 1 ; }7 } 3
  4. 4. Möglichkeiten der Verwendung von Namensräumen1 <?php // Nutze e i n e n Namensraum beim Aufruf2 echo d i e s i s t e i n t e s t abc ( ) ;34 // S e l b i g e s mit vorherigem Import5 use d i e s i s t e i n t e s t abc ;6 echo abc ( ) ;78 // Es g i b t auch e i n e n A l i a s Import9 use d i e s i s t e i n t e s t as t e s t 2 ;10 echo t e s t 2 abc ( ) ;1112 // Der g l o b a l e Namespace der PHP F e a t u r e s i s t 13 echo time ( ) ;14 // Der a k t u e l l e Namespace kann z .B. so a b g e r u f e n werden15 echo __NAMESPACE__; 4
  5. 5. 1.2 Klassen Beispiel1 <?php2 // E r s t e l l e e i n e neue K l a s s e3 class test {45 // D e f i n i e r e e i n i n t e r n e s A t t r i b u t6 p r i v a t e $_attr = abc ;78 // Funktionen s i n d d i e Methoden von Klassen9 p u b l i c f u n c t i o n fun ( )10 {11 // Rufe das A t t r i b u t a u f12 return $this− >_attr ;13 }14 } 5
  6. 6. Konstruktor - Ist per __construct() definierbar (seit PHP 5.3.3 einziger Weg) - Keine Pflicht und keine Automatisierung für geerbe Konstruktoren - Das aus Java bekannte super() geht in PHP per parent::__construct() - Es ist je Klasse nur ein eigener bzw. aktiver Konstruktor erlaubt1 <?php2 // E r s t e l l e e i n e neue K l a s s e3 class test {45 // D i e s e s Mal mit einem Konstruktor6 f u n c t i o n __construct ( ) {78 echo Return Werte machen h i e r wenig Sinn ;9 }10 } 6
  7. 7. Vererbung - PHP besitzt keine Lösung für das Diamond Problem - Klassen können daher nur von einer anderen Klasse erben1 <?php2 // Erbe von der K l a s s e t e s t3 c l a s s extendedtest extends t e s t {45 // E r s e t z e den Konstruktor mit einem e i g e n e n6 f u n c t i o n __construct ( ) {7 echo t e s t ;89 // Rufe den Konstruktor der Basis−K l a s s e a u f10 p a r e n t : : __construct ( ) ;11 }12 } 7
  8. 8. Autoloading - Spart include und require Befehle im Quelltext ein - Die Funktion __autoload besser nicht mehr dafür verwenden - spl_autoload_register() nimmt beliebig viele Autoloader auf - Eingeschränkte Funktionalität in den CLI Modi beachten1 <?php // D e f i n i e r e e i n e n minimalen Autoloader2 function autoload_test ( $ c l a s s )3 {4 i n c l u d e b a s i s / pfad / . $ c l a s s . . php ;5 }67 // S e t z e den Autoloader zu e v e n t u e l l schon anderen hinzu8 spl_autoload_register ( autoload_test ) ;9 // E r s t e l l e e i n Objekt e i n e r b i s h e r unverwendeten K l a s s e10 $ t e s t = new d i e s i s t e i n Test ( ) ; 8
  9. 9. 1.3 Interfaces - Erlauben das Definieren der angebotenen Schnittstelle von Klassen - Interfaces können wie auch Klassen voneinander Erben - Klassen können mehrere Interfaces zugleich implementieren - Namenskonflikte werden nicht aufgelöst, führen also zu Fehlern1 <?php2 // E r s t e l l e e i n I n t e r f a c e3 i n t e r f a c e test1 { };45 // Noch e i n I n t e r f a c e6 i n t e r f a c e t e s t 2 extends t e s t 17 {8 // Verlange e i n e Methode9 p u b l i c f u n c t i o n r e q ( $abc ) ;10 } 9
  10. 10. 2 Einsatz und Erweiterungen 2.1 Nutzung von Klassen - Paamayim Nekudotayim (::) erlaubt statischen Methodenaufruf - Echte Objekte werden dagegen per new Klassenname() erzeugt - Die Objektmethoden ruft man per $object->methode() auf1 <?php // Hole e i n e v a l i d e Z e i t z o n e ab2 $dtz = new DateTimeZone ( Europe / B e r l i n ) ;34 // Hole d i e a k t u e l l e Unix Z e i t d i e s e r Z e i t z o n e ab5 $ c f f = DateTime : : createFromFormat ( U , time ( ) , $dtz ) ;67 // Gebe das Datum i n l e s b a r e r Form aus8 echo $ c f f −>format ( Y −d H: i : s ) ; −m9 /∗ Jahr−Monat−Tag Stunden : Minuten : Sekunden ∗/ 10
  11. 11. 2.2 Formale Parameter Pflichtangaben - Durch setzen eines Startwertes werden diese Optional - Übergabepflicht bis inklusive dem letzten nicht Optionalen1 <?php2 // Eine neue K l a s s e3 class test54 {5 // Methode d i e zwischen 3 und 4 Parameter v e r l a n g t6 p u b l i c f u n c t i o n e f g ( $one , $two = 1 , $ t h r e e , $ f o u r = 0)7 {8 r e t u r n $one . $two . $ t h r e e . − . $ f o u r ;9 }10 } 11
  12. 12. Typisierung - Alle Klassen können als Objekttyp erzwungen werden - Dabei sind, falls vorhanden, die Namensräume passend anzugeben - Bei den Basistypen werden nur Arrays unterstützt1 <?php // Eine neue K l a s s e2 class test73 {4 // Verlange f o r m a l e Parameter von einem Typ5 p u b l i c f u n c t i o n e f g ( DateTime $dte , a r r a y $ a r r a y )6 {7 // L i e f e r e Array mit Unix Z e i t an d e s s e n Ende8 $ a r r a y [ ] = $dte− >getTimestamp ( ) ;9 return $array ;10 }11 } 12
  13. 13. 2.3 SchlüsselwörterSichtbarkeitpublic Standard, greift wenn ausgelassenprotected Jeweilige Klasse und bei Vererbungprivate Nur in der jeweiligen KlasseZielbereichparent::$var "parent" verwendet die Elternklasseself::$var "self" verwendet die aktuelle Klasse$this->var "this" verwendet das aktuelle Exemplar- Bei "parent" wird passend aus der Elternklasse aufgerufen- Die Aufrufe an "self" sind statisch, siehe :: Operator- Dagegen kann "this" nur dynamisch in Objekten verwendet werden 13
  14. 14. Abstract - Abstract verhindert das Erzeugen von Exemplaren einer Klasse - Erzwingt bei Methoden deren Signatur für davon erbende Klassen - Achtung: Dies trifft auf den Konstruktor erst seit PHP 5.4 zu1 <?php2 // Keine Objekte von der K l a s s e e r z e u g b a r3 abstract class test94 {5 // Muss b e i Vererbung i m p l e m e n t i e r t werden6 a b s t r a c t p u b l i c f u n c t i o n uvw ( $x , $y , $z ) ;78 // Methoden mit I n h a l t s i n d w e i t e r h i n e r l a u b t9 p r o t e c t e d f u n c t i o n abc ( ) { echo t e s t ; }10 } 14
  15. 15. Final - Das Erben von als Final markierten Klassen ist nicht möglich - Das Überschreiben von als Final markierten Methoden ist verboten Static - Static Variablen behalten zwischen Aufrufen ihren je letzten Wert - Bei Attributen in Klassen verhält sich dies exakt genauso - Mit Static markierte Methoden sind per :: Operator nutzbar1 <?php // Kein Erben von d i e s e r K l a s s e e r l a u b t2 f i n a l c l a s s area513 {4 // D i e s e Funktion kann s t a t i s c h verwendet werden5 p u b l i c s t a t i c f u n c t i o n i n c ( $ i n t ) { r e t u r n ++$ i n t ; }6 } 15
  16. 16. 2.4 Fehlerbehandlung Errors - Der gesamte prozedural aufgebaute PHP Kern verwendet Errors - Ausgabe per display_errors an- und abschaltbar - Detaillevel per error_reporting() einstellbar1 <?php // Z e i g e a l l e F e h l e r an2 ini_set ( display_errors , true ) ;3 e r r o r _ r e p o r t i n g (E_ALL) ;45 // Z e i g e k e i n e F e h l e r an6 ini_set ( display_errors , f a l s e ) ;7 error_reporting (0) ;89 // V e r s t e c k e a u f t r e t e n d e F e h l e r ( b i t t e vermeiden )10 @file_get_contents ( t e s t . txt ) ; 16
  17. 17. Exceptions - Werden mit der Throw Anweisung geworfen - Sollten mit Try / Catch Blöcken gefangen werden1 <?php // Teste das Werfen und Fangen von Ausnahmen2 class test423 {4 public s t a t i c function ghi ()5 {6 throw new Exception ( h i e r geht etwas n i c h t ) ;7 }8 }910 try { test42 : : ghi () ; }11 c a t c h ( Exception $e )12 { echo $e− >getMessage ( ) ; } 17
  18. 18. Exception Details - Ungefangene Ausnahmen brechen die weitere Ausführung ab - Try/Catch besitzt kein Finally (wird in PHP auch nicht benötigt) - Man kann eigene Exception Klassen erstellen bzw. davon erben Errors als Exceptions behandeln1 <?php // E r s t e l l e e i n e e i g e n e Fehlerbehandlung2 f u n c t i o n fehler_als_ausnahme ( $nr , $ s t r , $ f i l e , $ l i n e )3 {4 // Weniger schwere E r r o r s a l s E r r o r E x c e p t i o n verwenden5 $e = new E r r o r E x c e p t i o n ( $ s t r , $nr ,0 , $ f i l e , $ l i n e ) ;6 // J e t z t kann d i e Ausnahmebehandlung damit a r b e i t e n7 meine_ausnahmebehandlung ( $e ) ;8 }9 s e t _ e r r o r _ h a n d l e r ( fehler_als_ausnahme ) ; 18
  19. 19. 3 Beispielscript: PDO mit SQLite1 <?php // V e r b i n d u n g s d e t a i l s b e i F e h l e r v e r s t e c k e n2 try {3 $con = new PDO( s q l i t e : t e s t . s q l i t e ) ;4 }5 c a t c h ( PDOException $e ) {6 $ e r r o r = $e− >getMessage ( ) ;7 }8 // E r s t e l l e e i n e neue T a b e l l e9 $query = CREATE TABLE IF NOT EXISTS t e s t ( t_id i n t e g e r , 10 . t_name v a r c h a r ( 4 0 ) , PRIMARY KEY ( t_id ) ) ;11 $prepared = $con− r e p a r e ( $query ) ; >p12 $check = $prepared− x e c u t e ( ) ; >e13 i f ( empty ( $check ) ) { $ e r r o r = $prepared− r r o r I n f o ( ) [ 2 ] ; } >e1415 // Gebe e i n e E r f o l g s m e l d u n g oder den F e h l e r aus16 echo empty ( $ e r r o r ) ? t a b e l l e a n g e l e g t : $ e r r o r ; 19
  20. 20. 171819 // Trage e i n e n Datensatz e i n20 $ c o n t e n t = a r r a y ( : v1 => f i r s t ) ;21 $query = "INSERT INTO t e s t ( t_name ) VALUES ( : v1 ) " ;22 $prepared = $con− r e p a r e ( $query ) ; >p23 $check = $prepared− x e c u t e ( $ c o n t e n t ) ; >e24 i f ( empty ( $check ) ) { $ e r r o r = $prepared− r r o r I n f o ( ) [ 2 ] ; } >e2526 // Gebe e i n e E r f o l g s m e l d u n g oder den F e h l e r aus27 echo empty ( $ e r r o r ) ? e i n t r a g 1 a n g e l e g t : $ e r r o r ;2829 // Trage noch e i n e n Datensatz e i n30 $ c o n t e n t = a r r a y ( : v1 => second ) ;31 $check = $prepared− x e c u t e ( $ c o n t e n t ) ; >e32 i f ( empty ( $check ) ) { $ e r r o r = $prepared− r r o r I n f o ( ) [ 2 ] ; } >e3334 // Gebe e i n e E r f o l g s m e l d u n g oder den F e h l e r aus35 echo empty ( $ e r r o r ) ? e i n t r a g 2 a n g e l e g t : $ e r r o r ; 20
  21. 21. 363738 // Lese den E i n t r a g mit dem I n h a l t f i r s t aus39 $ c o n t e n t = a r r a y ( : v1 => f i r s t ) ;40 $query = "SELECT ∗ FROM t e s t WHERE t_name = : v1 LIMIT 1 " ;41 $prepared = $con− r e p a r e ( $query ) ; >p42 $check = $prepared− x e c u t e ( $ c o n t e n t ) ; >e43 i f ( empty ( $check ) ) { $ e r r o r = $prepared− r r o r I n f o ( ) [ 2 ] ; } >e4445 // Gebe den F e h l e r oder d i e ID aus46 i f ( empty ( $ e r r o r ) ) {47 // Hole d i e a n g e f r a t e n Daten ab48 $ r e s u l t = $prepared− e t c h (PDO : : FETCH_ASSOC) ; >f49 echo ID von " f i r s t " : . $ r e s u l t [ t_id ] ;50 }51 else {52 echo $ e r r o r ;53 } 21
  22. 22. 4 Anhang4.1 Verweise und EmpfehlungenWebsites zu den Themenhttp://www.php.net/oop PHP Manual (OOP Bereich)http://www.php.net/pdo PHP Manual (PDO Bereich)Bücher zu den ThemenObjektorientierte Programmierung in PHP 5 Franzis BlauWebanwendungen mit PHP und MySQL O’ReillyInteressante Community Websiteshttp://www.it-republik.de/php http://www.phpmaster.comhttp://www.phpdeveloper.org http://www.planet-php.nethttp://www.phphatesme.com http://www.stackoverflow.com/tags/php 22

×