SlideShare ist ein Scribd-Unternehmen logo
PHP
  Personal Homepage Tools - Hypertext Preprocessor


  Programmieren für das Web

Teil 2 - Objektorientierung

Version: 2012-04-22

License: CC BY NC SA

Erstellt von Hans-Joachim Piepereit (hajo_p@live.de)
Konstruktives Feedback hierzu ist gern gesehen
Inhaltsverzeichnis
1 Strukturierung                                                                                  3
  1.1 Namensräume . . . . . . . . . . . . . . . . . . . . .                                       3
  1.2 Klassen . . . . . . . . . . . . . . . . . . . . . . . . .                                   5
  1.3 Interfaces . . . . . . . . . . . . . . . . . . . . . . . .                                  9

2 Einsatz und Erweiterungen                                                                      10
  2.1 Nutzung von Klassen . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
  2.2 Formale Parameter . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
  2.3 Schlüsselwörter . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
  2.4 Fehlerbehandlung . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16

3 Beispielscript: PDO mit SQLite                                                                 19

4 Anhang                                                    22
  4.1 Verweise und Empfehlungen . . . . . . . . . . . . . . 22




                                 2
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       <?php
2       // S e t z e den Namensraum e i n e r Datei
3       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 t
5       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
Möglichkeiten der Verwendung von Namensräumen


1    <?php // Nutze e i n e n Namensraum beim Aufruf
2    echo  d i e s  i s t  e i n  t e s t abc ( ) ;
3

4    // S e l b i g e s mit vorherigem Import
5    use  d i e s  i s t  e i n  t e s t abc ;
6    echo abc ( ) ;
7

8    // Es g i b t auch e i n e n A l i a s Import
9    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 ( ) ;
11

12   // 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 werden
15   echo __NAMESPACE__;




                                                 4
1.2 Klassen
     Beispiel

1     <?php
2     // E r s t e l l e e i n e neue K l a s s e
3     class test {
4

5         // 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 t
6         p r i v a t e $_attr = ' abc ' ;
7

8         // Funktionen s i n d d i e Methoden von Klassen
9         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 f
12           return $this−           >_attr ;
13        }
14    }




                                                      5
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 erlaubt

1     <?php
2     // E r s t e l l e e i n e neue K l a s s e
3     class test {
4

5         // D i e s e s Mal mit einem Konstruktor
6         f u n c t i o n __construct ( ) {
7

8             echo ' Return Werte machen h i e r wenig Sinn ' ;
9         }
10    }




                                                    6
Vererbung
     - PHP besitzt keine Lösung für das Diamond Problem
     - Klassen können daher nur von einer anderen Klasse erben


1     <?php
2     // Erbe von der K l a s s e t e s t
3     c l a s s extendedtest extends t e s t {
4

5         // E r s e t z e den Konstruktor mit einem e i g e n e n
6         f u n c t i o n __construct ( ) {
7             echo ' t e s t ' ;
8

9             // Rufe den Konstruktor der Basis−K l a s s e a u f
10            p a r e n t : : __construct ( ) ;
11        }
12    }




                                           7
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 beachten

1        <?php // D e f i n i e r e e i n e n minimalen Autoloader
2        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        }
6

7        // S e t z e den Autoloader zu e v e n t u e l l schon anderen hinzu
8        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 e
10       $ t e s t = new  d i e s  i s t  e i n  Test ( ) ;




                                                   8
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 Fehlern

1     <?php
2     // E r s t e l l e e i n I n t e r f a c e
3     i n t e r f a c e test1 { };
4

5     // Noch e i n I n t e r f a c e
6     i n t e r f a c e t e s t 2 extends t e s t 1
7     {
8         // Verlange e i n e Methode
9         p u b l i c f u n c t i o n r e q ( $abc ) ;
10    }




                                                    9
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() auf


1    <?php // Hole e i n e v a l i d e Z e i t z o n e ab
2    $dtz = new DateTimeZone ( ' Europe / B e r l i n ' ) ;
3

4    // 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 ab
5    $ c f f = DateTime : : createFromFormat ( 'U ' , time ( ) , $dtz ) ;
6

7    // Gebe das Datum i n l e s b a r e r Form aus
8    echo $ c f f −>format ( 'Y −d H: i : s ' ) ;
                               −m
9    /∗ Jahr−Monat−Tag Stunden : Minuten : Sekunden ∗/




                                          10
2.2 Formale Parameter
     Pflichtangaben
     - Durch setzen eines Startwertes werden diese Optional
     - Übergabepflicht bis inklusive dem letzten nicht Optionalen


1     <?php
2     // Eine neue K l a s s e
3     class test5
4     {
5       // Methode d i e zwischen 3 und 4 Parameter v e r l a n g t
6       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
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ützt


1     <?php // Eine neue K l a s s e
2     class test7
3     {
4       // Verlange f o r m a l e Parameter von einem Typ
5       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 Ende
8          $ a r r a y [ ] = $dte−     >getTimestamp ( ) ;
9          return $array ;
10      }
11    }




                                               12
2.3 Schlüsselwörter
Sichtbarkeit
public         Standard, greift wenn ausgelassen
protected      Jeweilige Klasse und bei Vererbung
private        Nur in der jeweiligen Klasse

Zielbereich
parent::$var     "parent" verwendet die Elternklasse
self::$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
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 zu


1     <?php
2     // Keine Objekte von der K l a s s e e r z e u g b a r
3     abstract class test9
4     {
5       // Muss b e i Vererbung i m p l e m e n t i e r t werden
6       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 ) ;
7

8         // 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 t
9         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
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 nutzbar


1    <?php // Kein Erben von d i e s e r K l a s s e e r l a u b t
2    f i n a l c l a s s area51
3    {
4        // D i e s e Funktion kann s t a t i s c h verwendet werden
5        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
2.4 Fehlerbehandlung
     Errors
     - Der gesamte prozedural aufgebaute PHP Kern verwendet Errors
     - Ausgabe per display_errors an- und abschaltbar
     - Detaillevel per error_reporting() einstellbar


1     <?php // Z e i g e a l l e F e h l e r an
2     ini_set ( ' display_errors ' , true ) ;
3     e r r o r _ r e p o r t i n g (E_ALL) ;
4

5     // Z e i g e k e i n e F e h l e r an
6     ini_set ( ' display_errors ' , f a l s e ) ;
7     error_reporting (0) ;
8

9     // 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
Exceptions
     - Werden mit der Throw Anweisung geworfen
     - Sollten mit Try / Catch Blöcken gefangen werden


1     <?php // Teste das Werfen und Fangen von Ausnahmen
2     class test42
3     {
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     }
9

10    try { test42 : : ghi () ; }
11    c a t c h ( Exception $e )
12            { echo $e−  >getMessage ( ) ; }




                                         17
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 behandeln

1    <?php // E r s t e l l e e i n e e i g e n e Fehlerbehandlung
2    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 verwenden
5        $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 n
7        meine_ausnahmebehandlung ( $e ) ;
8    }
9    s e t _ e r r o r _ h a n d l e r ( ' fehler_als_ausnahme ' ) ;




                                               18
3 Beispielscript: PDO mit SQLite
1    <?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 n
2    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 e
9    $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 ) ;
                                >p
12   $check           = $prepared− x e c u t e ( ) ;
                                     >e
13   i f ( empty ( $check ) ) { $ e r r o r = $prepared− r r o r I n f o ( ) [ 2 ] ; }
                                                                    >e
14

15   // 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 aus
16   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
17

18

19   // Trage e i n e n Datensatz e i n
20   $ 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 ) ;
                                  >p
23   $check           = $prepared− x e c u t e ( $ c o n t e n t ) ;
                                           >e
24   i f ( empty ( $check ) ) { $ e r r o r = $prepared− r r o r I n f o ( ) [ 2 ] ; }
                                                                 >e
25

26   // 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 aus
27   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 ;
28

29   // Trage noch e i n e n Datensatz e i n
30   $ 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 ) ;
                                         >e
32   i f ( empty ( $check ) ) { $ e r r o r = $prepared− r r o r I n f o ( ) [ 2 ] ; }
                                                                 >e
33

34   // 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 aus
35   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
36

37

38   // Lese den E i n t r a g mit dem I n h a l t f i r s t aus
39   $ 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 ) ;
                                  >p
42   $check           = $prepared− x e c u t e ( $ c o n t e n t ) ;
                                           >e
43   i f ( empty ( $check ) ) { $ e r r o r = $prepared− r r o r I n f o ( ) [ 2 ] ; }
                                                                 >e
44

45   // Gebe den F e h l e r oder d i e ID aus
46   i f ( empty ( $ e r r o r ) ) {
47       // Hole d i e a n g e f r a t e n Daten ab
48       $ r e s u l t = $prepared− e t c h (PDO : : FETCH_ASSOC) ;
                                       >f
49       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
4 Anhang
4.1 Verweise und Empfehlungen
Websites zu den Themen
http://www.php.net/oop     PHP Manual (OOP Bereich)
http://www.php.net/pdo     PHP Manual (PDO Bereich)

Bücher zu den Themen
Objektorientierte Programmierung in PHP 5      Franzis Blau
Webanwendungen mit PHP und MySQL               O’Reilly

Interessante Community Websites
http://www.it-republik.de/php        http://www.phpmaster.com
http://www.phpdeveloper.org          http://www.planet-php.net
http://www.phphatesme.com            http://www.stackoverflow.com/tags/php



                                22

Weitere ähnliche Inhalte

Andere mochten auch

Web Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 BetaWeb Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 Beta
Hans-Joachim Piepereit
 
High performance mit PHP
High performance mit PHPHigh performance mit PHP
High performance mit PHP
Thomas Burgard
 
Ich dachte, meine Website ist responsive. Aber was ich dann sah, war unglaubl...
Ich dachte, meine Website ist responsive. Aber was ich dann sah, war unglaubl...Ich dachte, meine Website ist responsive. Aber was ich dann sah, war unglaubl...
Ich dachte, meine Website ist responsive. Aber was ich dann sah, war unglaubl...
Sebastian Schally
 
PHP UG Karlsruhe - Zend Framework Introduction
PHP UG Karlsruhe - Zend Framework IntroductionPHP UG Karlsruhe - Zend Framework Introduction
PHP UG Karlsruhe - Zend Framework Introduction
maexpower
 
PHP_Codesniffer
PHP_CodesnifferPHP_Codesniffer
PHP_Codesniffer
Andy Grunwald
 
Baustein 07 grundlagen-html-css-php
Baustein 07 grundlagen-html-css-phpBaustein 07 grundlagen-html-css-php
Baustein 07 grundlagen-html-css-php
Michael Kollmannsberger
 
High Security PHP Applications
High Security PHP ApplicationsHigh Security PHP Applications
High Security PHP Applicationsguest0e6d5e
 
Framework Auswahlkriterin, PHP Unconference 2009 in Hamburg
Framework Auswahlkriterin, PHP Unconference 2009 in Hamburg Framework Auswahlkriterin, PHP Unconference 2009 in Hamburg
Framework Auswahlkriterin, PHP Unconference 2009 in Hamburg
Ralf Eggert
 
Entwicklercamp responive web design
Entwicklercamp   responive web designEntwicklercamp   responive web design
Entwicklercamp responive web designHenning Schmidt
 
jQuery - the world's most popular java script library comes to XPages
jQuery - the world's most popular java script library comes to XPagesjQuery - the world's most popular java script library comes to XPages
jQuery - the world's most popular java script library comes to XPages
Mark Roden
 
Webentwicklung mit PHP und MySQL
Webentwicklung mit PHP und MySQLWebentwicklung mit PHP und MySQL
Webentwicklung mit PHP und MySQL
Kerstin Puschke
 
The Skeleton And Joints Wk3
The Skeleton And Joints Wk3The Skeleton And Joints Wk3
The Skeleton And Joints Wk3
MrHall
 
PHP Optimization
PHP OptimizationPHP Optimization
PHP Optimization
djesch
 
Css Frameworks - Ein Überblick (04/2008)
Css Frameworks - Ein Überblick (04/2008)Css Frameworks - Ein Überblick (04/2008)
Css Frameworks - Ein Überblick (04/2008)
djesse
 
AJAX
AJAXAJAX
CP Le design tchèque à la reconquête du monde
CP Le design tchèque à la reconquête du mondeCP Le design tchèque à la reconquête du monde
CP Le design tchèque à la reconquête du monde
RPKONFIDENTIELLES
 
Abertura do Evento Dot Net Day
Abertura do Evento Dot Net DayAbertura do Evento Dot Net Day
Abertura do Evento Dot Net Day
Luciano Palma
 
Virtualizacion A La Orden
Virtualizacion A La OrdenVirtualizacion A La Orden
Virtualizacion A La Orden
Marlon Manrique
 
Clube do herbert polar bear
Clube do herbert polar bearClube do herbert polar bear
Clube do herbert polar bear
Victor Gabriel
 
Red dot award 2013 Gewinner
Red dot award 2013 GewinnerRed dot award 2013 Gewinner
Red dot award 2013 Gewinner
DanSchwei
 

Andere mochten auch (20)

Web Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 BetaWeb Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 Beta
 
High performance mit PHP
High performance mit PHPHigh performance mit PHP
High performance mit PHP
 
Ich dachte, meine Website ist responsive. Aber was ich dann sah, war unglaubl...
Ich dachte, meine Website ist responsive. Aber was ich dann sah, war unglaubl...Ich dachte, meine Website ist responsive. Aber was ich dann sah, war unglaubl...
Ich dachte, meine Website ist responsive. Aber was ich dann sah, war unglaubl...
 
PHP UG Karlsruhe - Zend Framework Introduction
PHP UG Karlsruhe - Zend Framework IntroductionPHP UG Karlsruhe - Zend Framework Introduction
PHP UG Karlsruhe - Zend Framework Introduction
 
PHP_Codesniffer
PHP_CodesnifferPHP_Codesniffer
PHP_Codesniffer
 
Baustein 07 grundlagen-html-css-php
Baustein 07 grundlagen-html-css-phpBaustein 07 grundlagen-html-css-php
Baustein 07 grundlagen-html-css-php
 
High Security PHP Applications
High Security PHP ApplicationsHigh Security PHP Applications
High Security PHP Applications
 
Framework Auswahlkriterin, PHP Unconference 2009 in Hamburg
Framework Auswahlkriterin, PHP Unconference 2009 in Hamburg Framework Auswahlkriterin, PHP Unconference 2009 in Hamburg
Framework Auswahlkriterin, PHP Unconference 2009 in Hamburg
 
Entwicklercamp responive web design
Entwicklercamp   responive web designEntwicklercamp   responive web design
Entwicklercamp responive web design
 
jQuery - the world's most popular java script library comes to XPages
jQuery - the world's most popular java script library comes to XPagesjQuery - the world's most popular java script library comes to XPages
jQuery - the world's most popular java script library comes to XPages
 
Webentwicklung mit PHP und MySQL
Webentwicklung mit PHP und MySQLWebentwicklung mit PHP und MySQL
Webentwicklung mit PHP und MySQL
 
The Skeleton And Joints Wk3
The Skeleton And Joints Wk3The Skeleton And Joints Wk3
The Skeleton And Joints Wk3
 
PHP Optimization
PHP OptimizationPHP Optimization
PHP Optimization
 
Css Frameworks - Ein Überblick (04/2008)
Css Frameworks - Ein Überblick (04/2008)Css Frameworks - Ein Überblick (04/2008)
Css Frameworks - Ein Überblick (04/2008)
 
AJAX
AJAXAJAX
AJAX
 
CP Le design tchèque à la reconquête du monde
CP Le design tchèque à la reconquête du mondeCP Le design tchèque à la reconquête du monde
CP Le design tchèque à la reconquête du monde
 
Abertura do Evento Dot Net Day
Abertura do Evento Dot Net DayAbertura do Evento Dot Net Day
Abertura do Evento Dot Net Day
 
Virtualizacion A La Orden
Virtualizacion A La OrdenVirtualizacion A La Orden
Virtualizacion A La Orden
 
Clube do herbert polar bear
Clube do herbert polar bearClube do herbert polar bear
Clube do herbert polar bear
 
Red dot award 2013 Gewinner
Red dot award 2013 GewinnerRed dot award 2013 Gewinner
Red dot award 2013 Gewinner
 

Ähnlich wie Web Entwicklung mit PHP - Teil 2

FLOW3-Workshop F3X12
FLOW3-Workshop F3X12FLOW3-Workshop F3X12
FLOW3-Workshop F3X12
Karsten Dambekalns
 
Scala - A Scalable Language
Scala - A Scalable LanguageScala - A Scalable Language
Scala - A Scalable Languagepfleidi
 
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Brigitte Jellinek
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
NETWAYS
 
Testing tools
Testing toolsTesting tools
Testing tools
Sebastian Springer
 
JAX 2024: Go in der Praxis einsetzen
JAX 2024: Go in der Praxis einsetzenJAX 2024: Go in der Praxis einsetzen
JAX 2024: Go in der Praxis einsetzen
Jan Stamer
 
Einsteiger Workshop
Einsteiger WorkshopEinsteiger Workshop
Einsteiger Workshop
FunThomas424242
 
Einführung in Puppet
Einführung in PuppetEinführung in Puppet
Einführung in Puppet
Sebastian Hempel
 
Object-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - WorkshopObject-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - Workshop
Waldemar Dell
 
Perl 5.20: Feature, Kultur, Module, Werkzeuge
Perl 5.20: Feature, Kultur, Module, WerkzeugePerl 5.20: Feature, Kultur, Module, Werkzeuge
Perl 5.20: Feature, Kultur, Module, Werkzeuge
lichtkind
 
Coffee Backone Introduction
Coffee Backone IntroductionCoffee Backone Introduction
Coffee Backone IntroductionTino Isnich
 
Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)
Sebastian Adler
 
Upgrading Puppet CommitterConf Essen 2014
Upgrading Puppet CommitterConf Essen 2014Upgrading Puppet CommitterConf Essen 2014
Upgrading Puppet CommitterConf Essen 2014
Martin Alfke
 
Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit Extbase
Stefan Frömken
 
Der ultimative PHP Framework Vergleich 2023 Edition
Der ultimative PHP Framework Vergleich 2023 EditionDer ultimative PHP Framework Vergleich 2023 Edition
Der ultimative PHP Framework Vergleich 2023 Edition
Ralf Eggert
 
Einführung in Scala im Vergleich mit Java
Einführung in Scala im Vergleich mit JavaEinführung in Scala im Vergleich mit Java
Einführung in Scala im Vergleich mit Java
Marcel Rehfeld
 
Referat T13 Javadoc
Referat T13 JavadocReferat T13 Javadoc
Referat T13 Javadocminiroquer
 
OSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas Lange
OSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas LangeOSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas Lange
OSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas Lange
NETWAYS
 
Ruby On Rails Hermann Stern Bcklu
Ruby On Rails Hermann Stern BckluRuby On Rails Hermann Stern Bcklu
Ruby On Rails Hermann Stern Bcklu
Hermann.Stern
 

Ähnlich wie Web Entwicklung mit PHP - Teil 2 (20)

FLOW3-Workshop F3X12
FLOW3-Workshop F3X12FLOW3-Workshop F3X12
FLOW3-Workshop F3X12
 
Scala - A Scalable Language
Scala - A Scalable LanguageScala - A Scalable Language
Scala - A Scalable Language
 
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
 
Php Schulung
Php SchulungPhp Schulung
Php Schulung
 
Testing tools
Testing toolsTesting tools
Testing tools
 
JAX 2024: Go in der Praxis einsetzen
JAX 2024: Go in der Praxis einsetzenJAX 2024: Go in der Praxis einsetzen
JAX 2024: Go in der Praxis einsetzen
 
Einsteiger Workshop
Einsteiger WorkshopEinsteiger Workshop
Einsteiger Workshop
 
Einführung in Puppet
Einführung in PuppetEinführung in Puppet
Einführung in Puppet
 
Object-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - WorkshopObject-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - Workshop
 
Perl 5.20: Feature, Kultur, Module, Werkzeuge
Perl 5.20: Feature, Kultur, Module, WerkzeugePerl 5.20: Feature, Kultur, Module, Werkzeuge
Perl 5.20: Feature, Kultur, Module, Werkzeuge
 
Coffee Backone Introduction
Coffee Backone IntroductionCoffee Backone Introduction
Coffee Backone Introduction
 
Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)
 
Upgrading Puppet CommitterConf Essen 2014
Upgrading Puppet CommitterConf Essen 2014Upgrading Puppet CommitterConf Essen 2014
Upgrading Puppet CommitterConf Essen 2014
 
Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit Extbase
 
Der ultimative PHP Framework Vergleich 2023 Edition
Der ultimative PHP Framework Vergleich 2023 EditionDer ultimative PHP Framework Vergleich 2023 Edition
Der ultimative PHP Framework Vergleich 2023 Edition
 
Einführung in Scala im Vergleich mit Java
Einführung in Scala im Vergleich mit JavaEinführung in Scala im Vergleich mit Java
Einführung in Scala im Vergleich mit Java
 
Referat T13 Javadoc
Referat T13 JavadocReferat T13 Javadoc
Referat T13 Javadoc
 
OSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas Lange
OSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas LangeOSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas Lange
OSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas Lange
 
Ruby On Rails Hermann Stern Bcklu
Ruby On Rails Hermann Stern BckluRuby On Rails Hermann Stern Bcklu
Ruby On Rails Hermann Stern Bcklu
 

Web Entwicklung mit PHP - Teil 2

  • 1. PHP Personal Homepage Tools - Hypertext Preprocessor Programmieren für das Web Teil 2 - Objektorientierung Version: 2012-04-22 License: CC BY NC SA Erstellt von Hans-Joachim Piepereit (hajo_p@live.de) Konstruktives Feedback hierzu ist gern gesehen
  • 2. Inhaltsverzeichnis 1 Strukturierung 3 1.1 Namensräume . . . . . . . . . . . . . . . . . . . . . 3 1.2 Klassen . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . 9 2 Einsatz und Erweiterungen 10 2.1 Nutzung von Klassen . . . . . . . . . . . . . . . . . 10 2.2 Formale Parameter . . . . . . . . . . . . . . . . . . . 11 2.3 Schlüsselwörter . . . . . . . . . . . . . . . . . . . . . 13 2.4 Fehlerbehandlung . . . . . . . . . . . . . . . . . . . 16 3 Beispielscript: PDO mit SQLite 19 4 Anhang 22 4.1 Verweise und Empfehlungen . . . . . . . . . . . . . . 22 2
  • 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 <?php 2 // S e t z e den Namensraum e i n e r Datei 3 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 t 5 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. Möglichkeiten der Verwendung von Namensräumen 1 <?php // Nutze e i n e n Namensraum beim Aufruf 2 echo d i e s i s t e i n t e s t abc ( ) ; 3 4 // S e l b i g e s mit vorherigem Import 5 use d i e s i s t e i n t e s t abc ; 6 echo abc ( ) ; 7 8 // Es g i b t auch e i n e n A l i a s Import 9 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 ( ) ; 11 12 // 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 werden 15 echo __NAMESPACE__; 4
  • 5. 1.2 Klassen Beispiel 1 <?php 2 // E r s t e l l e e i n e neue K l a s s e 3 class test { 4 5 // 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 t 6 p r i v a t e $_attr = ' abc ' ; 7 8 // Funktionen s i n d d i e Methoden von Klassen 9 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 f 12 return $this− >_attr ; 13 } 14 } 5
  • 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 erlaubt 1 <?php 2 // E r s t e l l e e i n e neue K l a s s e 3 class test { 4 5 // D i e s e s Mal mit einem Konstruktor 6 f u n c t i o n __construct ( ) { 7 8 echo ' Return Werte machen h i e r wenig Sinn ' ; 9 } 10 } 6
  • 7. Vererbung - PHP besitzt keine Lösung für das Diamond Problem - Klassen können daher nur von einer anderen Klasse erben 1 <?php 2 // Erbe von der K l a s s e t e s t 3 c l a s s extendedtest extends t e s t { 4 5 // E r s e t z e den Konstruktor mit einem e i g e n e n 6 f u n c t i o n __construct ( ) { 7 echo ' t e s t ' ; 8 9 // Rufe den Konstruktor der Basis−K l a s s e a u f 10 p a r e n t : : __construct ( ) ; 11 } 12 } 7
  • 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 beachten 1 <?php // D e f i n i e r e e i n e n minimalen Autoloader 2 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 } 6 7 // S e t z e den Autoloader zu e v e n t u e l l schon anderen hinzu 8 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 e 10 $ t e s t = new d i e s i s t e i n Test ( ) ; 8
  • 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 Fehlern 1 <?php 2 // E r s t e l l e e i n I n t e r f a c e 3 i n t e r f a c e test1 { }; 4 5 // Noch e i n I n t e r f a c e 6 i n t e r f a c e t e s t 2 extends t e s t 1 7 { 8 // Verlange e i n e Methode 9 p u b l i c f u n c t i o n r e q ( $abc ) ; 10 } 9
  • 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() auf 1 <?php // Hole e i n e v a l i d e Z e i t z o n e ab 2 $dtz = new DateTimeZone ( ' Europe / B e r l i n ' ) ; 3 4 // 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 ab 5 $ c f f = DateTime : : createFromFormat ( 'U ' , time ( ) , $dtz ) ; 6 7 // Gebe das Datum i n l e s b a r e r Form aus 8 echo $ c f f −>format ( 'Y −d H: i : s ' ) ; −m 9 /∗ Jahr−Monat−Tag Stunden : Minuten : Sekunden ∗/ 10
  • 11. 2.2 Formale Parameter Pflichtangaben - Durch setzen eines Startwertes werden diese Optional - Übergabepflicht bis inklusive dem letzten nicht Optionalen 1 <?php 2 // Eine neue K l a s s e 3 class test5 4 { 5 // Methode d i e zwischen 3 und 4 Parameter v e r l a n g t 6 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. 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ützt 1 <?php // Eine neue K l a s s e 2 class test7 3 { 4 // Verlange f o r m a l e Parameter von einem Typ 5 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 Ende 8 $ a r r a y [ ] = $dte− >getTimestamp ( ) ; 9 return $array ; 10 } 11 } 12
  • 13. 2.3 Schlüsselwörter Sichtbarkeit public Standard, greift wenn ausgelassen protected Jeweilige Klasse und bei Vererbung private Nur in der jeweiligen Klasse Zielbereich parent::$var "parent" verwendet die Elternklasse self::$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. 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 zu 1 <?php 2 // Keine Objekte von der K l a s s e e r z e u g b a r 3 abstract class test9 4 { 5 // Muss b e i Vererbung i m p l e m e n t i e r t werden 6 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 ) ; 7 8 // 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 t 9 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. 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 nutzbar 1 <?php // Kein Erben von d i e s e r K l a s s e e r l a u b t 2 f i n a l c l a s s area51 3 { 4 // D i e s e Funktion kann s t a t i s c h verwendet werden 5 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. 2.4 Fehlerbehandlung Errors - Der gesamte prozedural aufgebaute PHP Kern verwendet Errors - Ausgabe per display_errors an- und abschaltbar - Detaillevel per error_reporting() einstellbar 1 <?php // Z e i g e a l l e F e h l e r an 2 ini_set ( ' display_errors ' , true ) ; 3 e r r o r _ r e p o r t i n g (E_ALL) ; 4 5 // Z e i g e k e i n e F e h l e r an 6 ini_set ( ' display_errors ' , f a l s e ) ; 7 error_reporting (0) ; 8 9 // 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. Exceptions - Werden mit der Throw Anweisung geworfen - Sollten mit Try / Catch Blöcken gefangen werden 1 <?php // Teste das Werfen und Fangen von Ausnahmen 2 class test42 3 { 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 } 9 10 try { test42 : : ghi () ; } 11 c a t c h ( Exception $e ) 12 { echo $e− >getMessage ( ) ; } 17
  • 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 behandeln 1 <?php // E r s t e l l e e i n e e i g e n e Fehlerbehandlung 2 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 verwenden 5 $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 n 7 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. 3 Beispielscript: PDO mit SQLite 1 <?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 n 2 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 e 9 $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 ) ; >p 12 $check = $prepared− x e c u t e ( ) ; >e 13 i f ( empty ( $check ) ) { $ e r r o r = $prepared− r r o r I n f o ( ) [ 2 ] ; } >e 14 15 // 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 aus 16 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. 17 18 19 // Trage e i n e n Datensatz e i n 20 $ 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 ) ; >p 23 $check = $prepared− x e c u t e ( $ c o n t e n t ) ; >e 24 i f ( empty ( $check ) ) { $ e r r o r = $prepared− r r o r I n f o ( ) [ 2 ] ; } >e 25 26 // 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 aus 27 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 ; 28 29 // Trage noch e i n e n Datensatz e i n 30 $ 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 ) ; >e 32 i f ( empty ( $check ) ) { $ e r r o r = $prepared− r r o r I n f o ( ) [ 2 ] ; } >e 33 34 // 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 aus 35 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. 36 37 38 // Lese den E i n t r a g mit dem I n h a l t f i r s t aus 39 $ 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 ) ; >p 42 $check = $prepared− x e c u t e ( $ c o n t e n t ) ; >e 43 i f ( empty ( $check ) ) { $ e r r o r = $prepared− r r o r I n f o ( ) [ 2 ] ; } >e 44 45 // Gebe den F e h l e r oder d i e ID aus 46 i f ( empty ( $ e r r o r ) ) { 47 // Hole d i e a n g e f r a t e n Daten ab 48 $ r e s u l t = $prepared− e t c h (PDO : : FETCH_ASSOC) ; >f 49 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. 4 Anhang 4.1 Verweise und Empfehlungen Websites zu den Themen http://www.php.net/oop PHP Manual (OOP Bereich) http://www.php.net/pdo PHP Manual (PDO Bereich) Bücher zu den Themen Objektorientierte Programmierung in PHP 5 Franzis Blau Webanwendungen mit PHP und MySQL O’Reilly Interessante Community Websites http://www.it-republik.de/php http://www.phpmaster.com http://www.phpdeveloper.org http://www.planet-php.net http://www.phphatesme.com http://www.stackoverflow.com/tags/php 22