24
PHP Personal Homepage Tools - Hypertext Preprocessor Programmieren für das Web Teil 1 - Grundlagen Version: 2012-04-17 License: CC BY NC SA Erstellt von Hans-Joachim Piepereit ([email protected]) Konstruktives Feedback hierzu ist gern gesehen

Web Entwicklung mit PHP - Teil 1

Embed Size (px)

Citation preview

PHPPersonal Homepage Tools - Hypertext Preprocessor

Programmieren für das Web

Teil 1 - Grundlagen

Version: 2012-04-17

License: CC BY NC SA

Erstellt von Hans-Joachim Piepereit ([email protected])Konstruktives Feedback hierzu ist gern gesehen

Inhaltsverzeichnis1 Einführung 3

1.1 Geschichte . . . . . . . . . . . . . . . . . . . . . . . 31.2 Anwendungsbeispiele . . . . . . . . . . . . . . . . . . 51.3 Funktionsweise . . . . . . . . . . . . . . . . . . . . . 71.4 Installation und Extras . . . . . . . . . . . . . . . . 10

2 Bausteine der Sprache 122.1 Eigenschaften . . . . . . . . . . . . . . . . . . . . . . 122.2 Syntax und Strukturen . . . . . . . . . . . . . . . . 132.3 Gefahren und Stützräder . . . . . . . . . . . . . . . . 182.4 Arbeit mit externen Daten . . . . . . . . . . . . . . . 202.5 Argumentation . . . . . . . . . . . . . . . . . . . . . 23

3 Anhang 243.1 Verweise und Empfehlungen . . . . . . . . . . . . . . 24

2

1 Einführung1.1 GeschichtePHP 1, 2

Rasmus Lerdorf

Personal Home Page Tools (1994 - 1997 )

PHP 3, 4

Rasmus Lerdorf, Zeev Suraski, Andi Gutmans

Zend Engine 1 (1999 - 2003 )

3

PHP 5

Zend Engine 2 (2004 - 2012 )

5.0 - 2004 - Objektorientierung5.1 - 2005 - PDO (Datenbanken), SPL (Standard Werkzeugkiste)5.2 - 2006 - Filter (Validierung und Absicherung)5.3 - 2009 - Namensräume, PHAR Archive, Late Static Binding5.4 - 2012 - Mini Webserver, Traits, Wegfall alter Stützräder

PHP 6

Das Unicode Problem der Zend Engine 3 (ICU bzw. INTL)

Aktuell

- Versionskontrolle auf GitHub umgezogen- Planungen für PHP 5.5 laufen (RFCs im Wiki)

4

1.2 AnwendungsbeispieleUrsprung: In HTML eingebettete Template Sprache

1 <html><body>2 <?php echo " Hal lo Welt " ; ?>3 </body></html>

Entwicklung: Trennung von Struktur (HTML) und Logik (PHP)

1 <html><body>2 <?php inc lude 'news . php ' ?>3 </body></html>

1 <?php // news . php2 echo " Dies i s t e i n e News <br />\n " ;3 echo " Dies i s t e i n e we i t e r e News <br />\n " ;

5

MVC-Web: Zusätzliche Trennung von Logik und Daten in PHP

1 <?php2 // Sta r t e Logik3 $con = new \php_framework\FrontCont ro l l e r ( ) ;4 // Verbinde mit Datenspe icher5 $dao = new \php_framework\DAO( 'mysql ' ) ;6 // Hole Daten ab7 $data = $dao−>user−>f i l t e rB y I d (1 ) ;8 // Setze e in e HTML Datei f u e r das Aussehen9 $view = new \php_framework\View ( ' t e s t . htm ' ) ;

10 // Erzeuge d i e Ausgabe11 $ r e s u l t = $view−>parse ( $data ) ;12 // Setze d i e Ausgabe e in13 $con−>setBody ( $ r e s u l t ) ;14 // Sende Header und Ausgabe15 $con−>send ( ) ;

Die Klassen sind je nach Framework anders benannt / strukturiert.

6

1.3 FunktionsweiseAblauf bei Standardverwendung1. Request Ansurfen von z.B. www.php.net/index.php

2. Webserver Annahme der Anfrage z.B. auf HTTP Port 80

3. PHP Verarbeitet z.B. /var/www/localhost/index.php

4. Response PHP übergibt Resultat an Webserver zur Antwort

5. Ausgabe Browser stellt die Antwort dar (z.B. in HTML)

Beachte: HTTP ist zustandslos, Sitzungen in PHP nutzbar

Webserver für PHP: Apache, Lighttpd, Microsoft IIS, Nginx, ...

7

Ablauf bei Kommandozeile1. Kommando Ausführen von z.B. php /dev/php/test.php

2. PHP Verarbeitet die Datei im besonderen CLI Modus

3. Ausgabe Resultat folgt direkt aus PHP heraus

Beispiele für Kommandozeilen: Windows CMD, Linux Bash Shell

Beispiele für Verwendung: PHP PEAR, PHP Server, PHP Tools

Details zum CompilerOn the fly Single Request Verbose

Opcode Caching Shared Memory Zend Guard

8

Bereiche starten und beenden

*.php Standard für auszuführende Dateien*.phps Quelltext der Datei mit Syntaxhervorhebung

1 // Standard2 <?php3 // Short open tag (Achtung be i XML)4 <?5 // Short echo syntax ( s e i t 5 . 4 Standard s t a t t Short )6 <?= " Hal lo Welt "7 // Clos ing tag (am Dateiende weg lassbar )8 ?>9 // Sc r i p t Var iante ( v e r a l t e t )

10 <s c r i p t language="php "></s c r i p t>

9

1.4 Installation und ExtrasDie passende Version bestimmen

- VC9 besser und schneller als VC6, NTS besser als TS- Apache MPM Variante mit mod_php effektivste Umgebung

Thread Sicherheit Ja (TS) Nein (NTS)Verwendung Multi-Threading Kein ThreadingBeispiel Apache MPM worker Apache MPM preforkVorteile Mehr Sicherheit Stabiler und Performanter

Built-in Development Server

Kommandozeile php -S Adresse:PortBeispiel: php -S localhost:8080

10

Konfiguration

- php.ini im PHP Verzeichnis- Webserver (z.B. Apache .htaccess)- PHP Befehle ini_* mit z.B. ini_set

Hinweis: extension_dir = "./ext" geht auch unter Windows

PECL

PHP Extension Community LibraryBezug von Erweiterungen (z.B. APC, Imagick, Xdebug)

PEAR

PHP Extension and Application RepositoryBezug von vorgefertigten Klassen (z.B. PEAR DB, PEAR Mail)

11

2 Bausteine der Sprache2.1 EigenschaftenHerkunft und Einfluss

Imperativ nah bei C und teilweise Perl, Objektorientiert nah bei JavaStellt viele C Bibliotheken als leicht nutzbare Erweiterungen bereit

Typisierung

Dynamisch und schwach, per SPL bedingt erzwingbarTyp bei formalen Parametern nur für Arrays und ObjekteEinfache Typen z.B. per settype Anweisung wechselbar

Einordnung

Programmiersprache, Scriptsprache, Imperativ, Objektorientiert

12

2.2 Syntax und StrukturenAusgabe von Text

1 <?php // Zuweisung e i n e s Wertes be i der Var iab le t e s t2 $ t e s t = 'Test ' ;3 // Der Punkt−Operator ve rb indet Inha l t e mite inander4 echo ' Dies i s t ' . " nur e in " . $ t e s t ;

Rechnen

1 <?php2 $zah l = FALSE;3 // Addiere 1 hinzu und forme dadurch zum In t eg e r um4 $zah l += 1 ; # Al t e rna t iven : $zah l++ oder ++$zah l5 // S t e l l e s i ch e r , dass Zahl a l s I n t e g e r verwendet wird6 echo ' Zahl : ' . ( i n t ) $zah l ;

13

Arrays

Sind in PHP sehr vielfältig einsetzbar (noch mehr mit SPL)

Map List Stack

Dictionary Collection Queue

1 <?php2 // Spe i che r e mehrere Farben in e i n e r Var iab l e3 $ c o l o r s = array ( ' red ' , ' green ' , ' ye l low ' ) ;4

5 // Mehrere Dimensionen ve r s chach t e l ba r6 $ t e s t = array ( array ( ' t e s t ' => array ( ) ) ) ;7

8 // S e i t PHP 5 . 4 : Short array syntax9 $ c o l o r s = [ ' red ' , ' green ' , ' ye l low ' ] ;

14

Man kann sehr dynamisch und flexibel mit Arrays arbeiten

1 <?php2 $array = array ( ) ;3

4 // Neue Elemente anlegen5 $array [ ] = ' e i n t r a g 1 ' ;6 $array [ ] = ' e i n t r a g 2 ' ;7

8 // Lese das e r s t e Element aus9 $one = $array [ 0 ] ;

10

11 // S o r t i e r e d i e Elemente im Array nach Keys12 kso r t ( $array ) ;13

14 // Entferne e in Element aus einem Array15 unset ( $array [ 0 ] ) ;

15

Funktionen

1 <?php2 // Addiere 1 dazu3 f unc t i on my_inc ( $ in t ) { re turn ++$ in t ; }4 // Teste d i e Funktion5 echo my_inc (1 ) ;6 // Funktion per Cal lback verwenden7 echo ca l l_user_func ( 'my_inc ' , 1) ;8

9 // S e l b i g e s a l s Anonyme Funktion ( Closure )10 $my_inc = func t i on ( $ in t ) { re turn ++$ in t ; }11 // Teste d i e Funktion12 echo $my_inc (2 ) ;13 // Anonyme Funktion per Cal lback verwenden14 echo ca l l_user_func ( $my_inc , 2) ;

16

Verzweigungen

1 <?php // Wenn Dann2 i f (1 === TRUE) { echo ' 1 i s t genau TRUE ' } ;3 // A l t e rna t i v e4 e l s e i f (1 == TRUE) { echo ' 1 i s t sowas wie TRUE ' ; }5 // Sonst6 e l s e { echo ' 1 i s t n i ch t TRUE ' } ;

Schleifen

1 <?php // For−S c h l e i f e ( etwaig wie in C)2 f o r ( $ i = 0 ; $ i < 10 ; $ i++) { echo $ i . ' ' ; }3

4 // Foreach−S c h l e i f e ( sehr g e e i gne t be i Arrays )5 f o r each ( $array AS $key => $value ) { echo '~ ' ; }

17

2.3 Gefahren und StützräderGlobale Werte und Input-DatenTyp Beispiele BemerkungenGlobals $GLOBALS[’var’] Unsauber und seit 5.4 JITGlobal Import global $var Etwaig wie GlobalsSuperglobals $_GET[’id’] Nicht ungefiltert verwendenRegister Globals $_GET[’id’] als $id Seit 5.4 entfernt

Strings und AnführungszeichenTyp Beispiele BemerkungenNull Byte \0 oder %00 Wirkt anders als man denktBearbeitung substr($var) Besser iconv_substr($var)Magic Quotes $_POST mit addslashes Seit 5.4 entferntEncoding Byte order mark Mag PHP nicht leiden

18

WeiteresTyp Beispiele Bemerkungen64 bit builds amd64 Noch nicht ausgereiftThreads Multi-Threading Siehe Abschnitt InstallationEval eval(’php sourcecode’) Viel Spaß beim absichernSafe Mode Künstliche Verbote Seit 5.4 entfernt

AbhilfenTyp Beispiele BemerkungenSQL Injection Quotes, Union Prepared Statements (PDO)Remote Exec include $file allow_url_include deaktivierenHeaders send echo vor header Ausgabepuffer (ob_*)

Erweiterung der Sicherheit:

PECL taint, Suhosin Patch, open_basedir, display_errors, ...

19

2.4 Arbeit mit externen DatenSuperglobals

1 <?php // De t a i l s zum Server und dem Anfrage−Z i e l2 $_SERVER3 // HTTP GET Daten4 $_GET5 // HTTP POST Daten6 $_POST7 // Mult ipart Daten8 $_FILES9 // Cookies s e t z en und abrufen

10 s e t c o ok i e ( 'name ' , ' i n h a l t ' ) ;11 $_COOKIE12 // Se s s i on s t a r t en und verwenden13 s e s s i on_s t a r t ( )14 $_SESSION

20

Dateisystem

1 <?php2 // Lese den Inha l t e i n e r Datei e in3 $text = f i l e_ge t_conten t s ( ' t e s t . txt ' ) ;4

5 // Schre ibe den Inha l t in e in e andere Datei6 f i l e_put_contents ( ' t e s t 2 . txt ' , $ t ext ) ;7

8 // Das Lesen geht z .B. auch per URI9 $ur i = ur l encode ( ' http ://www. php . net / index . php ' ) ;

10 $text2 = f i l e_ge t_conten t s ( $u r i ) ;11 /∗12 ∗ Man s o l l t e be i URIs immer ur l encode verwenden13 ∗ und vor e i n e r Ausgabe den Inha l t abs i che rn14 ∗/

21

User Memory Cache (KeyValueStore)

1 <?php $ r e s u l t = ' ' ;2 // Check auf Exi s tenz der Erweiterung3 i f ( extens ion_loaded ( ' xcache ' ) ) {4

5 // Spe i che r e e inen Eintrag 30 Sekunden lang6 xcache_set ( ' key ' , ' t e s t va lue ' , 30) ;7

8 // Lade den Eintrag9 i f ( xcache_i s se t ( ' key ' ) ) {

10

11 $ r e s u l t = xcache_get ( ' key ' ) ;12 }13 }14

15 echo 'Cache Inha l t : ' . $ r e s u l t ;

22

2.5 ArgumentationVorteile

- Sehr gut dokumentiert, einfach zu Lernen, schnelle Resultate- Flexibel verwendbar, Plattformunabhängig, alles Wichtige dabei- Hochgradig skalierbar, leichtes Deployment, Cloud Betrieb möglich- Direkter und vollständiger Support von HTTP und der Server-API- Durchdachte Einteilung von Sichtbarkeitsbereichen der Variablen- Keine laufende Anwendung nötig, wird gestartet und verworfen

Nachteile

- Schnelle Resultate führen zu Fehlern und schlechter Code Qualität- Historisch gewachsen, daher teilweise mehrere Wege für ein Ziel- PHP Erweiterungen untereinander sehr unterschiedlich aufgebaut- Strings werden nur Byte-basiert verwendet (Abhilfen vorhanden)- Fehlende Features treiben Enterprise Frameworks in Workarounds

23

3 Anhang3.1 Verweise und EmpfehlungenWebsites zu den Themenhttp://www.php.net/manual PHP Manualhttp://pear.php.net PHP PEARhttp://pecl.php.net PHP PECLhttp://www.hardened-php.net/suhosin Suhosin Patchhttp://httpd.apache.org Apache Webserverhttp://www.apachelounge.com Apache for Windowshttp://xcache.lighttpd.net XCache Extension

Bücher zu den ThemenProgramming PHP O’Reilly Der Klassiker von Rasmus LerdorfPHP 5 Kochbuch O’Reilly Lösungswege für gängige Aufgaben

24