Webtechnologien
Wintersemester 2024
PHP: Hypertext Preprocessor
♯
♫
PHP: Hypertext Preprocessor
<section bg="php_hammer.jpg" class="slide cover"><div><h2> </h2> <p class="note">Quelle: <a href="https://www.flickr.com/photos/raindrift/7095238893/in/set-72157629492908038">Ian Baker</a></p> <footer> <ul> <li>22 Jahre isser, der kleine Hypertext Preprocessor.</li> <li>Und er hatte es nicht leicht, wurde in der Jugend viel geärgert, ist aber in den letzten Jahren eigentlich ganz cool geworden.</li> <li>Powered angeblich über <a href="http://w3techs.com/technologies/history_overview/programming_language">80% der Websites</a></li> </ul> </footer> </div></section> <section class="slide" id="geschichte"><div><h2>Geschichte</h2> <ul> <li>1995 von Rasmus Lerdorf entwickelt, um Web-Entwicklung zu vereinfachen</li> <li>Deswegen auch HTML-zentriert</li> <li>C-Basis, Perl- und C-Syntax</li> <li>Zend-Engine für bessere Ausführung dank Kompilierung und Code-Caches</li> <li>Aktuell Version 7.1 (sehr lang 5, dann 6 übersprungen)</li> </ul> <footer> <ul> <li>Urpsrünglich für kleine Homepage-Projekte und Nicht-Entwickler gedacht</li> <li>Lerdorf: <q>I don’t know how to stop it, there was never any intent to write a programming language […] I have absolutely no idea how to write a programming language, I just kept adding the next logical step on the way.</q></li> <li>Zend: Interpreter und virtuelle Maschine, ähnlich zu Java wird Bytecode generiert (Zend-Opcode), der gecached werden kann</li> <li>Entstanden ist eine objektorientierte, funktionale (und imperative, prozedurale, reflektive), garbage collectete, interpretierte Skriptsprache</li> <li>freie Software unter PHP License</li> <li>nicht spezifiziert, Interpreter = Defacto-Standard (seit diesem Jahr Arbeit an Spezifikation)</li> </ul> </footer> </div></section> <section class="slide" id="beispiel"><div><h2>Beispiel</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$link</span> <span class="o">=</span> <span class="s1">'http://www.cinestar.de/de/kino/berlin-cinestar-original-im-sony-center/veranstaltungen/original-sneak-mysterie-movie-ov/'</span><span class="p">;</span> <span class="nv">$html</span> <span class="o">=</span> <span class="nb">file_get_contents</span><span class="p">(</span><span class="nv">$link</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="nb">strpos</span><span class="p">(</span><span class="nv">$html</span><span class="p">,</span> <span class="s1">'time_table_container'</span><span class="p">)</span> <span class="o">==</span> <span class="kc">false</span><span class="p">)</span> <span class="k">die</span><span class="p">;</span> <span class="nv">$to</span> <span class="o">=</span> <span class="s1">'beierm@htw-berlin.de'</span><span class="p">;</span> <span class="nv">$subject</span> <span class="o">=</span> <span class="s1">'Tickets können jetzt reserviert werden.'</span><span class="p">;</span> <span class="nv">$message</span> <span class="o">=</span> <span class="s2">"Go go go: </span><span class="nv">$link</span><span class="s2">"</span><span class="p">;</span> <span class="nv">$headers</span> <span class="o">=</span> <span class="s1">'From: "Sneak-Scanner" <beierm@htw-berlin.de>'</span><span class="p">;</span> <span class="nb">mail</span><span class="p">(</span><span class="nv">$to</span><span class="p">,</span> <span class="nv">$subject</span><span class="p">,</span> <span class="nv">$message</span><span class="p">,</span> <span class="nv">$headers</span><span class="p">);</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Keine Main-Funktion – es geht einfach los</li> </ul> </footer> </div></section> <section class="slide" id="kritik"><div><h2>Kritik</h2> <ul> <li><q>Keine Sprache, sondern eine willkürliche Sammlung an Funktionalität.</q></li> <li><q>⋯ und die sind auch noch inkonsistent benannt.</q></li> <li><q>PHP-Code wird unausweichlich chaotischer, unwartbarer Mist.</q></li> <li><q>PHP ist das Nickelback der Programmiersprachen.</q></li> <li><q>Aber Facebook, Wikipedia und WordPress nutzen PHP!</q></li> <li>große Liste an Kritikpunkten: <a href="http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/">PHP: a fractal of bad design</a></li> </ul> <footer> <ul> <li>Nie designed, eher organisch entwickelt und viele Funktionen nur C-Wrapper</li> <li>laut PHPs <a href="http://php.net/manual/en/indexes.functions.php">Function and Method listing</a> derzeit knapp 10k Funktionen, davon ein paar hundert Kern</li> <li><q>Spaghetti SQL wrapped in spaghetti PHP wrapped in spaghetti HTML, replicated in slightly-varying form in dozens of places</q></li> <li><q>Aber Facebook, und Wikipedia, und WordPress</q>: Schlechtes Argument: Path Dependence (= a logical decision in the past leads to a suboptimal system in the present), Altstadt-Problem, Dvorak</li> <li>Sehen wir PHP nicht als Werkzeug sondern als Material: Holz oder Stein – nichts ist per se besser, um ein Haus zu bauen; es kommt nur darauf an, was für ein Haus.</li> <li>Und wer Software bauen möchte, die frei ist, auf nahezu jedem Server läuft und das reibungsfrei und ohne Konfiguration …</li> <li>Und von den Millionen Kritikern hat es bisher niemand geschafft, eine ordentliche Alternative zu bauen</li> <li>Kurzum: Sie ermöglicht es, bestimmte Aufgaben sehr leicht zu lösen, kann aber bei größeren Aufgaben Probleme mitbringen</li> </ul> </footer> </div></section> <section class="slide" id="aufbau"><div><h2>Aufbau</h2> <p><img src="Webanwendung.png" alt="Client Server" class="full-width" /></p> <p class="note">Quelle: <a href="https://de.wikipedia.org/w/index.php?title=Datei:Webanwendung_client_server_01.png&filetimestamp=20070603211516&">Wikipedia</a></p> <footer> <ol> <li>Webserver (nicht <code class="language-plaintext highlighter-rouge">file://</code>!) bekommt Anfrage</li> <li>Wenn <code class="language-plaintext highlighter-rouge">.php</code> (Kann auch alles andere sein, aber Server muss entsprechend konfiguriert werden)</li> <li>Lädt Datei von Festplatte (<code class="language-plaintext highlighter-rouge">DOCUMENT_ROOT</code>)</li> <li>Übergibt Datei an PHP-Interpreter</li> <li>PHP-Interpreter (CGI oder Server-Modul) arbeitet alles ab (Serverseitig – es wird also nur Resultat der Verarbeitung übermittelt, kein Code)</li> <li>Gegebenenfalls Versand der Antwort</li> </ol> <ul> <li>PHP per CGI: Für jede Anfrage wird vom Webserver (!) eine Instanz des PHP-Interpreters gestartet (wobei auch alle Ressourcen z.B. Datenbankverbindungen auf- und abgebaut werden)</li> <li>PHP zustandslos wie HTTP (langsam, darum Bytecode-Caches)</li> <li>Kann genauso gut für Kommandozeilenprogramme genutzt werden</li> <li>Hierachie klarmachen: PHP kann JS generieren kann HTML generieren</li> </ul> </footer> </div></section> <section class="slide" id="installation"><div><h2>Installation</h2> <ul> <li><a href="http://php.net/manual/de/install.php">Anleitung für alle Betriebssysteme</a></li> <li>Pakete: (<a href="http://www.apachefriends.org/de/xampp.html">XAMPP</a>), <a href="http://www.mamp.info/en/downloads/index.html">MAMP</a> (OSX)</li> <li>REPL per <code class="language-plaintext highlighter-rouge">php -a</code> oder <a href="https://github.com/bobthecow/psysh">PsySH</a></li> <li>Konfiguration per <code class="language-plaintext highlighter-rouge">php.ini</code></li> <li>Prüfen per <code class="language-plaintext highlighter-rouge">phpinfo</code> (zeigt Systeminformationen an)</li> </ul> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nb">phpinfo</span><span class="p">();</span> <span class="cp">?></span> </code></pre> </div></section> <section class="slide" id="schlüsselwörter"><div><h2>Schlüsselwörter</h2> <p><a href="http://php.net/manual/de/language.oop5.abstract.php"><code class="language-plaintext highlighter-rouge">abstract</code></a>, <a href="http://php.net/manual/de/language.operators.logical.php"><code class="language-plaintext highlighter-rouge">and</code></a>, <a href="http://php.net/manual/de/http://php.net/manual/de/function.array.php"><code class="language-plaintext highlighter-rouge">array()</code></a>, <a href="http://php.net/manual/de/control-structures.foreach.php"><code class="language-plaintext highlighter-rouge">as</code></a>, <a href="http://php.net/manual/de/control-structures.break.php"><code class="language-plaintext highlighter-rouge">break</code></a>, <a href="http://php.net/manual/de/control-structures.switch.php"><code class="language-plaintext highlighter-rouge">case</code></a>, <a href="http://php.net/manual/de/language.exceptions.php"><code class="language-plaintext highlighter-rouge">catch</code></a>, <a href="http://php.net/manual/de/keyword.class.php"><code class="language-plaintext highlighter-rouge">class</code></a>, <a href="http://php.net/manual/de/language.oop5.cloning.php"><code class="language-plaintext highlighter-rouge">clone</code></a>, <a href="http://php.net/manual/de/language.oop5.constants.php"><code class="language-plaintext highlighter-rouge">const</code></a>, <a href="http://php.net/manual/de/control-structures.continue.php"><code class="language-plaintext highlighter-rouge">continue</code></a>, <a href="http://php.net/manual/de/control-structures.declare.php"><code class="language-plaintext highlighter-rouge">declare</code></a>, <a href="http://php.net/manual/de/control-structures.switch.php"><code class="language-plaintext highlighter-rouge">default</code></a>, <a href="http://php.net/manual/de/control-structures.do.while.php"><code class="language-plaintext highlighter-rouge">do</code></a>, <a href="http://php.net/manual/de/control-structures.else.php"><code class="language-plaintext highlighter-rouge">else</code></a>, <a href="http://php.net/manual/de/control-structures.elseif.php"><code class="language-plaintext highlighter-rouge">elseif</code></a>, <a href="http://php.net/manual/de/control-structures.declare.php"><code class="language-plaintext highlighter-rouge">enddeclare</code></a>, <a href="http://php.net/manual/de/control-structures.alternative-syntax.php"><code class="language-plaintext highlighter-rouge">endfor</code></a>, <a href="http://php.net/manual/de/control-structures.alternative-syntax.php"><code class="language-plaintext highlighter-rouge">endforeach</code></a>, <a href="http://php.net/manual/de/control-structures.alternative-syntax.php"><code class="language-plaintext highlighter-rouge">endif</code></a>, <a href="http://php.net/manual/de/control-structures.alternative-syntax.php"><code class="language-plaintext highlighter-rouge">endswitch</code></a>, <a href="http://php.net/manual/de/control-structures.alternative-syntax.php"><code class="language-plaintext highlighter-rouge">endwhile</code></a>, <a href="http://php.net/manual/de/keyword.class.php"><code class="language-plaintext highlighter-rouge">extends</code></a>, <a href="http://php.net/manual/de/language.oop5.final.php"><code class="language-plaintext highlighter-rouge">final</code></a>, <a href="http://php.net/manual/de/control-structures.for.php"><code class="language-plaintext highlighter-rouge">for</code></a>, <a href="http://php.net/manual/de/control-structures.foreach.php"><code class="language-plaintext highlighter-rouge">foreach</code></a>, <a href="http://php.net/manual/de/functions.user-defined.php"><code class="language-plaintext highlighter-rouge">function</code></a>, <a href="http://php.net/manual/de/language.variables.scope.php"><code class="language-plaintext highlighter-rouge">global</code></a>, <a href="http://php.net/manual/de/control-structures.goto.php"><code class="language-plaintext highlighter-rouge">goto</code></a>, <a href="http://php.net/manual/de/control-structures.if.php"><code class="language-plaintext highlighter-rouge">if</code></a>, <a href="http://php.net/manual/de/language.oop5.interfaces.php"><code class="language-plaintext highlighter-rouge">implements</code></a>, <a href="http://php.net/manual/de/language.oop5.interfaces.php"><code class="language-plaintext highlighter-rouge">interface</code></a>, <a href="http://php.net/manual/de/language.operators.type.php"><code class="language-plaintext highlighter-rouge">instanceof</code></a>, <a href="http://php.net/manual/de/language.namespaces.php"><code class="language-plaintext highlighter-rouge">namespace</code></a>, <a href="http://php.net/manual/de/keyword.class.php"><code class="language-plaintext highlighter-rouge">new</code></a>, <a href="http://php.net/manual/de/language.operators.logical.php"><code class="language-plaintext highlighter-rouge">or</code></a>, <a href="http://php.net/manual/de/language.oop5.visibility.php"><code class="language-plaintext highlighter-rouge">private</code></a>, <a href="http://php.net/manual/de/language.oop5.visibility.php"><code class="language-plaintext highlighter-rouge">protected</code></a>, <a href="http://php.net/manual/de/language.oop5.visibility.php"><code class="language-plaintext highlighter-rouge">public</code></a>, <a href="http://php.net/manual/de/language.variables.scope.php"><code class="language-plaintext highlighter-rouge">static</code></a>, <a href="http://php.net/manual/de/control-structures.switch.php"><code class="language-plaintext highlighter-rouge">switch</code></a>, <a href="http://php.net/manual/de/language.exceptions.php"><code class="language-plaintext highlighter-rouge">throw</code></a>, <a href="http://php.net/manual/de/language.exceptions.php"><code class="language-plaintext highlighter-rouge">try</code></a>, <a href="http://php.net/manual/de/language.namespaces.php"><code class="language-plaintext highlighter-rouge">use</code></a>, <a href="http://php.net/manual/de/keyword.class.php"><code class="language-plaintext highlighter-rouge">var</code></a>, <a href="http://php.net/manual/de/control-structures.while.php"><code class="language-plaintext highlighter-rouge">while</code></a>, <a href="http://php.net/manual/de/language.operators.logical.php"><code class="language-plaintext highlighter-rouge">xor</code></a></p> </div></section> <section class="slide" id="konstanten"><div><h2>Konstanten</h2> <ul> <li><code class="language-plaintext highlighter-rouge">TRUE</code>, <code class="language-plaintext highlighter-rouge">FALSE</code>, <code class="language-plaintext highlighter-rouge">NULL</code>, <code class="language-plaintext highlighter-rouge">NAN</code></li> <li><a href="http://en.wikipedia.org/wiki/Uname#Table_of_standard_uname_output"><code class="language-plaintext highlighter-rouge">PHP_VERSION</code></a></li> <li><code class="language-plaintext highlighter-rouge">PHP_EOL</code> (OS-kompatibel, sonst nicht nötig)</li> <li><code class="language-plaintext highlighter-rouge">E_ALL</code>, <code class="language-plaintext highlighter-rouge">E_ERROR</code>, <code class="language-plaintext highlighter-rouge">E_WARNING</code>, <code class="language-plaintext highlighter-rouge">E_PARSE</code>, <code class="language-plaintext highlighter-rouge">E_NOTICE</code></li> <li>eigene definierbar</li> </ul> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nb">define</span><span class="p">(</span><span class="s1">'NULLPUNKT'</span><span class="p">,</span> <span class="o">-</span><span class="mf">273.15</span><span class="p">);</span> <span class="cp">?></span> <span class="cp"><?php</span> <span class="kd">Class</span> <span class="nc">Temperature</span> <span class="p">{</span> <span class="k">const</span> <span class="no">NULLPUNKT</span> <span class="o">=</span> <span class="o">-</span><span class="mf">273.15</span><span class="p">;</span> <span class="p">}</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>gibt noch mehr, hier nur eine Auswahl</li> <li>eigene Konstanten können nicht wie Variablen in Doublequote-Strings verwendet werden</li> </ul> </footer> </div></section> <section class="slide" id="konstanten-zur-kompilezeit"><div><h2>Konstanten zur Kompilezeit</h2> <p>A.k.a. Magische Konstanten</p> <table> <tbody> <tr> <td><a href="http://php.net/manual/de/language.constants.predefined.php"><code class="language-plaintext highlighter-rouge">__CLASS__</code></a></td> <td>Name einer Klasse</td> </tr> <tr> <td><a href="http://php.net/manual/de/language.constants.predefined.php"><code class="language-plaintext highlighter-rouge">__DIR__</code></a></td> <td>Verzeichnisname der Datei</td> </tr> <tr> <td><a href="http://php.net/manual/de/language.constants.predefined.php"><code class="language-plaintext highlighter-rouge">__FILE__</code></a></td> <td>Vollständiger Pfad- und Dateiname</td> </tr> <tr> <td><a href="http://php.net/manual/de/language.constants.predefined.php"><code class="language-plaintext highlighter-rouge">__LINE__</code></a></td> <td>Aktuelle Zeilennummer einer Datei</td> </tr> <tr> <td><a href="http://php.net/manual/de/language.constants.predefined.php"><code class="language-plaintext highlighter-rouge">__FUNCTION__</code></a></td> <td>Name der Funktion</td> </tr> <tr> <td><a href="http://php.net/manual/de/language.constants.predefined.php"><code class="language-plaintext highlighter-rouge">__METHOD__</code></a></td> <td>Name einer Klassenmethode</td> </tr> <tr> <td><a href="http://php.net/manual/de/language.namespaces.php"><code class="language-plaintext highlighter-rouge">__NAMESPACE__</code></a></td> <td>Name des aktuellen Namespaces</td> </tr> </tbody> </table> <footer> <ul> <li>siehe Perl</li> <li><code class="language-plaintext highlighter-rouge">__FUNCTION__</code> gibt nur Namen der Funktion zurück</li> <li><code class="language-plaintext highlighter-rouge">__METHOD__</code> gibt Namen der Klasse und der Funktion zurück</li> </ul> </footer> </div></section> <section class="slide" id="sprachkonstrukte"><div><h2>Sprachkonstrukte</h2> <table> <tbody> <tr> <td><a href="http://php.net/manual/de/function.die.php"><code class="language-plaintext highlighter-rouge">die()</code></a></td> <td>Entspricht <code class="language-plaintext highlighter-rouge">exit()</code></td> </tr> <tr> <td><a href="http://php.net/manual/de/function.echo.php"><code class="language-plaintext highlighter-rouge">echo</code></a></td> <td>Gibt einen oder mehrere Strings aus</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.empty.php"><code class="language-plaintext highlighter-rouge">empty()</code></a></td> <td>Prüft, ob eine Variable einen Wert enthält</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.exit.php"><code class="language-plaintext highlighter-rouge">exit()</code></a></td> <td>Gibt eine Meldung aus und beendet aktuelles Skript</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.eval.php"><code class="language-plaintext highlighter-rouge">eval()</code></a></td> <td>Wertet eine Zeichenkette als PHP-Code aus</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.include.php"><code class="language-plaintext highlighter-rouge">include</code></a></td> <td>Bindet eine angegebene Datei ein und führt sie aus</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.include-once.php"><code class="language-plaintext highlighter-rouge">include_once</code></a></td> <td><code class="language-plaintext highlighter-rouge">include</code>, aber pro Datei nur einmal ausgeführt</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.isset.php"><code class="language-plaintext highlighter-rouge">isset()</code></a></td> <td>Prüft, ob Variable existiert und nicht <code class="language-plaintext highlighter-rouge">NULL</code> ist</td> </tr> </tbody> </table> </div></section> <section class="slide" id="sprachkonstrukte-1"><div><h2>Sprachkonstrukte</h2> <table> <tbody> <tr> <td><a href="http://php.net/manual/de/function.list.php"><code class="language-plaintext highlighter-rouge">list()</code></a></td> <td>Weist Variablen zu, als wären sie ein Array</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.require.php"><code class="language-plaintext highlighter-rouge">require</code></a></td> <td>Wie <code class="language-plaintext highlighter-rouge">include</code>, aber stirbt, wenn Datei fehlt</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.require-once.php"><code class="language-plaintext highlighter-rouge">require_once</code></a></td> <td><code class="language-plaintext highlighter-rouge">require</code>, aber pro Datei nur einmal ausgeführt</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.return.php"><code class="language-plaintext highlighter-rouge">return</code></a></td> <td>Beendet Funktion oder Programm</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.print.php"><code class="language-plaintext highlighter-rouge">print</code></a></td> <td>Ausgabe eines Strings</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.unset.php"><code class="language-plaintext highlighter-rouge">unset()</code></a></td> <td>Löschen einer angegebenen Variablen</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.halt-compiler.php"><code class="language-plaintext highlighter-rouge">__halt_compiler()</code></a></td> <td>Beendet die Kompilerausführung</td> </tr> </tbody> </table> <footer> <ul> <li>Wenn einzubindene Datei nicht vorhanden ist, generiert <code class="language-plaintext highlighter-rouge">include</code> eine Warnung und fährt vor, <code class="language-plaintext highlighter-rouge">require</code> hingegen wirft einen <code class="language-plaintext highlighter-rouge">E_COMPILE_ERROR</code> und beendet die Programmausführung.</li> <li><code class="language-plaintext highlighter-rouge">return</code>, <code class="language-plaintext highlighter-rouge">return($var)</code> aber nicht <code class="language-plaintext highlighter-rouge">return()</code></li> </ul> </footer> </div></section> <section class="slide shout" id="code"><div><h2>Code</h2> </div></section> <section class="slide" id="einbettung"><div><h2>Einbettung</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><!DOCTYPE html></span> <span class="nt"><html</span> <span class="na">lang=</span><span class="s">"de"</span><span class="nt">></span> <span class="nt"><head></span> <span class="nt"><meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span><span class="nt">></span> <span class="nt"><title></span>Entscheidungshilfe<span class="nt"></title></span> <span class="nt"></head></span> <span class="nt"><body></span> <span class="nt"><h1></span>Soll ich es tun?<span class="nt"></h1></span> <span class="nt"><p></span><span class="cp"><?php</span> <span class="k">echo</span> <span class="nb">rand</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span> <span class="o">?</span> <span class="s2">"Ja"</span> <span class="o">:</span> <span class="s2">"Nein"</span><span class="p">;</span> <span class="cp">?></span>!<span class="nt"></p></span> <span class="nt"></body></span> <span class="nt"></html></span> </code></pre> <footer> <ul> <li>Code kann direkt in HTML eingebettet werden</li> <li>Parser sucht nach öffnenden und schließenden PHP-Tags (Anfangs- und Abschluss-Verarbeitungsinstruktionen) und wechselt vom HTML- in den PHP-Modus</li> <li>Fehlenhafte Syntax (fehlende Semikolons, Klammern etc) führen zu Absturz</li> </ul> </footer> </div></section> <section class="slide" id="einbettung-1"><div><h2>Einbettung</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><!DOCTYPE html></span> <span class="nt"><html</span> <span class="na">lang=</span><span class="s">"de"</span><span class="nt">></span> <span class="nt"><head></span> <span class="nt"><meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span><span class="nt">></span> <span class="nt"><title></span>Entscheidungshilfe<span class="nt"></title></span> <span class="nt"></head></span> <span class="nt"><body></span> <span class="nt"><h1></span>Soll ich es tun?<span class="nt"></h1></span> <span class="nt"><p></span>Ja!<span class="nt"></p></span> <span class="nt"></body></span> <span class="nt"></html></span> </code></pre> </div></section> <section class="slide" id="tags-und-kommentare"><div><h2>Tags und Kommentare</h2> <p><img src="code_comments.jpg" alt="Code-Kommentare" class="right" width="200" style="margin-top:-50px" /></p> <pre class="highlight language-php" data-lang="php"><code>Zeit: <span class="cp"><?php echo date('H:i:s'); ?></span> Zeit: <span class="cp"><?= date('H:i:s') ?></span> <span class="cp"><?php</span> <span class="c1">// Kommentar</span> <span class="c1"># Kommentar</span> <span class="cm">/* Kommen- tar */</span> <span class="k">echo</span> <span class="s1">'Ohne schließendes Tag Interpretation bis zum Ende'</span><span class="p">;</span> </code></pre> <p class="note right">Quelle: <a href="https://twitter.com/nzkoz/status/538892801941848064">Michael Koziarski</a></p> <footer> <ul> <li>Gibt noch andere Tag-Formen, die hier nicht behandelt und auch nicht verwendet werden sollten (Portabilität)</li> <li>Kommentare in C- und Perl-Style</li> <li>Schließendes Tag wird häufig weggelassen, um nicht versehentlich Whitespace zu senden, da dann Header nicht mehr verändert werden können</li> <li>Zeilenumbruch ist Whitespace, Anweisungen werden mit Semikolon beendet</li> </ul> </footer> </div></section> <section class="slide" id="variablen"><div><h2>Variablen</h2> <ul> <li>Beginnen immer mit <code class="language-plaintext highlighter-rouge">$</code></li> <li>Dann Buchstabe oder Unterstrich, danach auch Zahlen</li> <li>Case Sensitive</li> </ul> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$name</span> <span class="o">=</span> <span class="s1">'Waldo'</span><span class="p">;</span> <span class="cp">?></span> <span class="nt"><strong></span>Hallo <span class="cp"><?=</span> <span class="nv">$name</span> <span class="cp">?></span>!<span class="nt"></strong></span> </code></pre> <footer> <ul> <li>wieder wie in Perl (und Shell-Script)</li> </ul> </footer> </div></section> <section class="slide" id="variablen-1"><div><h2>Variablen</h2> <ul> <li>Haben Function-Scope (kein Block = global)</li> <li>Datentypen: <code class="language-plaintext highlighter-rouge">boolean</code>, <code class="language-plaintext highlighter-rouge">integer</code>, <code class="language-plaintext highlighter-rouge">float</code>, <code class="language-plaintext highlighter-rouge">string</code>, <code class="language-plaintext highlighter-rouge">array</code>, <code class="language-plaintext highlighter-rouge">object</code>, <code class="language-plaintext highlighter-rouge">resource</code>, <code class="language-plaintext highlighter-rouge">callable</code>, <code class="language-plaintext highlighter-rouge">null</code></li> <li>Zugriff auf undefinierte Variable führt zu <code class="language-plaintext highlighter-rouge">E_NOTICE</code>, darum <code class="language-plaintext highlighter-rouge">empty()</code> oder <code class="language-plaintext highlighter-rouge">isset()</code> benutzen</li> </ul> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="k">if</span> <span class="p">(</span><span class="k">isset</span><span class="p">(</span><span class="nv">$var</span><span class="p">)</span> <span class="o">&&</span> <span class="nv">$var</span> <span class="o">==</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span> <span class="k">echo</span> <span class="s1">'Fünf'</span><span class="p">;</span> <span class="p">}</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Datentyp wird durch Kontext ermittelt</li> <li>4 skalare, 2 mixed, 3 spezielle</li> <li>Resource: Referenz zu einer externen Ressource (geöffnete Dateien, Datenbankverbindungen)</li> <li>Null: repräsentiert eine Variable ohne Wert (case insensitive), kann nur <code class="language-plaintext highlighter-rouge">NULL</code> sein</li> <li>callable: Callbacks und so</li> </ul> </footer> </div></section> <section class="slide" id="variablen-2"><div><h2>Variablen</h2> <ul> <li>PHP ist schwach und dynamisch typisiert</li> <li>Ermittlung des Typs zur Laufzeit</li> <li>Explizite Typangabe nicht unterstützt</li> <li>Hinting schon, allerdings nur für Objekte, Arrays, Interfaces und Callbacks (… und alles andere ab php7)</li> <li>Type Conversion / Type Coercion / Type Juggling</li> <li><code class="language-plaintext highlighter-rouge">==</code> vergleicht Wert (wenn nötig mit Typumwandlung)</li> <li><code class="language-plaintext highlighter-rouge">===</code> vergleicht Wert und Typ (ebenso <code class="language-plaintext highlighter-rouge">!==</code>)</li> <li><a href="http://php.net/manual/de/types.comparisons.php">Tabelle zu Typenvergleichen in PHP</a></li> </ul> </div></section> <section class="slide" id="variablen-3"><div><h2>Variablen</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$var</span> <span class="o">*=</span> <span class="p">(</span><span class="nv">$var</span> <span class="o">=</span> <span class="mi">5</span><span class="p">);</span> <span class="c1">// 25</span> <span class="nv">$var</span> <span class="o">=</span> <span class="s1">'5zig'</span><span class="p">;</span> <span class="k">echo</span> <span class="p">(</span><span class="n">bool</span><span class="p">)</span> <span class="nv">$var</span><span class="p">;</span> <span class="c1">// 1 (auch: !!$var)</span> <span class="nb">settype</span><span class="p">(</span><span class="nv">$var</span><span class="p">,</span> <span class="s1">'integer'</span><span class="p">);</span> <span class="k">echo</span> <span class="nv">$var</span><span class="p">;</span> <span class="c1">// 5</span> <span class="nv">$var</span> <span class="o">==</span> <span class="s1">'5'</span> <span class="c1">// true</span> <span class="nv">$var</span> <span class="o">===</span> <span class="s1">'5'</span> <span class="c1">// false</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>müssen nicht deklariert und können sofort initialisiert werden (wenn schon vorhanden, dann wird überschrieben)</li> <li>Zugriff, wenn nicht initialisiert, wirft Warnung, aber ist kein Fehler</li> </ul> </footer> </div></section> <section class="slide" id="weitere-operatoren"><div><h2>Weitere Operatoren</h2> <div class="parts "> <div class="part"> <ul> <li><code class="language-plaintext highlighter-rouge">+</code> für Addition</li> <li><code class="language-plaintext highlighter-rouge">.</code> für String Concatenation (auch <code class="language-plaintext highlighter-rouge">.=</code> statt <code class="language-plaintext highlighter-rouge">+=</code>)</li> <li><code class="language-plaintext highlighter-rouge">@</code> zur Fehlerunterdrückung</li> <li><code class="language-plaintext highlighter-rouge">++</code> für Inkrement</li> <li><code class="language-plaintext highlighter-rouge">--</code> für Dekrement</li> </ul> </div><div class="part"> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="k">echo</span> <span class="s1">'1'</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">+</span> <span class="s1">'3'</span><span class="p">;</span> <span class="c1">// 6</span> <span class="k">echo</span> <span class="s1">'1'</span> <span class="mf">.</span> <span class="mi">2</span> <span class="mf">.</span> <span class="s1">'3'</span><span class="p">;</span> <span class="c1">// 123</span> <span class="k">echo</span> <span class="s1">'Hallo '</span> <span class="mf">.</span> <span class="o">@</span><span class="nv">$jibbet_nich</span><span class="p">;</span> <span class="c1">// Hallo</span> <span class="nv">$var</span> <span class="o">=</span> <span class="s1">'y'</span><span class="p">;</span> <span class="nv">$var</span><span class="o">++</span><span class="p">;</span> <span class="c1">// z</span> <span class="o">++</span> <span class="nv">$var</span><span class="p">;</span> <span class="c1">// aa</span> <span class="cp">?></span> </code></pre> </div> </div> </div></section> <section class="slide" id="strings"><div><h2>Strings</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$name</span> <span class="o">=</span> <span class="s1">'Waldo'</span><span class="p">;</span> <span class="k">echo</span> <span class="s2">"Hallo </span><span class="se">\t</span><span class="s2"> </span><span class="nv">$name</span><span class="s2">"</span><span class="p">;</span> <span class="c1">// Hallo Waldo</span> <span class="k">echo</span> <span class="s1">'Hallo \t $name'</span><span class="p">;</span> <span class="c1">// Hallo \t $name</span> <span class="k">echo</span> <span class="s1">'Alles Gute '</span> <span class="mf">.</span> <span class="nv">$name</span><span class="p">;</span> <span class="k">echo</span> <span class="s2">"Heute ist </span><span class="si">{</span><span class="nv">$name</span><span class="si">}</span><span class="s2">s Geburtstag"</span><span class="p">;</span> <span class="k">echo</span> <span class="s2">"Auch: ${name}, </span><span class="si">{</span><span class="nv">$person</span><span class="o">-></span><span class="n">name</span><span class="si">}</span><span class="s2"> und </span><span class="si">{</span><span class="nv">$person</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span><span class="si">}</span><span class="s2">."</span><span class="p">;</span> <span class="k">echo</span> <span class="s2">"Gib mir ein </span><span class="nv">$name[0]</span><span class="s2">! Gib mir ein </span><span class="nv">$name[1]</span><span class="s2">! … Und was macht das? </span><span class="nv">$name</span><span class="s2">!"</span><span class="p">;</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Single / Double wie in Perl</li> <li>Empfehlung: Immer Singlequote, wenn keine Doublequote-Features benötigt werden</li> </ul> </footer> </div></section> <section class="slide" id="strings-1"><div><h2>Strings</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$name</span> <span class="o">=</span> <span class="s1">'Waldo'</span><span class="p">;</span> <span class="nv">$content</span> <span class="o">=</span> <span class="sh"><<<EOF Werter Herr $name,\n Ihre Nachricht mit dem Inhalt "'; DROP DATABASE --" wird alsbald bearbeitet. EOF;</span> <span class="k">echo</span> <span class="s1">'Hier liegen '</span> <span class="mf">.</span> <span class="nb">trim</span><span class="p">(</span><span class="sb">`ls *.php | wc -l`</span><span class="p">)</span> <span class="mf">.</span> <span class="s1">' PHP-Dateien'</span><span class="p">;</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Dritte Art: Heredoc (Nowdoc als nicht interpolierte Variante)</li> <li>Vierte Art: Backticks (synonym zur Shell, erlauben Variablen-Einschluss, aber Vorsicht!)</li> </ul> </footer> </div></section> <section class="slide" id="kontrollstrukturen"><div><h2>Kontrollstrukturen</h2> <div class="parts "> <div class="part"> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="k">if</span> <span class="p">(</span><span class="kc">true</span><span class="p">)</span><span class="o">:</span> <span class="cp">?></span> <span class="nt"><strong></span>Wahr.<span class="nt"></strong></span> <span class="cp"><?php</span> <span class="k">else</span><span class="o">:</span> <span class="cp">?></span> <span class="nt"><strong></span>Falsch.<span class="nt"></strong></span> <span class="cp"><?php</span> <span class="k">endif</span><span class="p">;</span> <span class="cp">?></span> </code></pre> </div><div class="part"> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="k">if</span> <span class="p">(</span><span class="nv">$name</span> <span class="o">==</span> <span class="s1">'A'</span><span class="p">)</span> <span class="k">echo</span> <span class="s1">'Hallo A'</span><span class="p">;</span> <span class="k">elseif</span> <span class="p">(</span><span class="nv">$name</span> <span class="o">==</span> <span class="s1">'B'</span><span class="p">)</span> <span class="k">echo</span> <span class="s1">'Hallo B'</span><span class="p">;</span> <span class="k">else</span> <span class="p">{</span> <span class="k">echo</span> <span class="s1">'Hallo'</span><span class="p">;</span> <span class="p">}</span> <span class="cp">?></span> </code></pre> </div> </div> <footer> <ul> <li>erste Form selten genutzt und eher für die Lesbarkeit in Verbindung mit HTML</li> <li>funktioniert auch für Schleifen (<code class="language-plaintext highlighter-rouge">while … endwhile</code>, <code class="language-plaintext highlighter-rouge">for … endfor</code>, <code class="language-plaintext highlighter-rouge">foreach … endforeach</code>)</li> <li><code class="language-plaintext highlighter-rouge">elseif</code> eigenes Schlüsselwort (<code class="language-plaintext highlighter-rouge">else if</code> geht auch; Perl: <code class="language-plaintext highlighter-rouge">elsif</code>, Python: <code class="language-plaintext highlighter-rouge">elif</code>)</li> <li><code class="language-plaintext highlighter-rouge">switch … case</code> gibt es auch und verhält sich wie üblich</li> <li>Yoda-Style um versehentliche Zuweisung statt Vergleich entgegenzuwirken</li> </ul> </footer> </div></section> <section class="slide" id="logische-operatoren"><div><h2>Logische Operatoren</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$a</span> <span class="o">&&</span> <span class="nv">$b</span> <span class="c1">// Und</span> <span class="nv">$a</span> <span class="k">and</span> <span class="nv">$b</span> <span class="c1">// TRUE wenn sowohl $a als auch $b TRUE ist.</span> <span class="nv">$a</span> <span class="o">||</span> <span class="nv">$b</span> <span class="c1">// Oder</span> <span class="nv">$a</span> <span class="k">or</span> <span class="nv">$b</span> <span class="c1">// TRUE wenn $a oder $b TRUE ist.</span> <span class="nv">$a</span> <span class="k">xor</span> <span class="nv">$b</span> <span class="c1">// Exklusives Oder</span> <span class="c1">// TRUE wenn entweder $a oder $b TRUE ist, aber nicht beide.</span> <span class="o">!</span> <span class="nv">$a</span> <span class="c1">// Nicht – TRUE wenn $a nicht TRUE ist.</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Unterschiedliche Operator-Rangfolge: <code class="language-plaintext highlighter-rouge">&&</code>, <code class="language-plaintext highlighter-rouge">||</code>, <code class="language-plaintext highlighter-rouge">?:</code>, <code class="language-plaintext highlighter-rouge">= += -= …</code>, <code class="language-plaintext highlighter-rouge">print</code>, <code class="language-plaintext highlighter-rouge">and</code>, <code class="language-plaintext highlighter-rouge">xor</code>, <code class="language-plaintext highlighter-rouge">or</code></li> <li><code class="language-plaintext highlighter-rouge">$e = false || true</code> ist nicht <code class="language-plaintext highlighter-rouge">$e = false or true</code></li> <li>trotzdem <code class="language-plaintext highlighter-rouge">if ( ! $a = foo() )</code></li> </ul> </footer> </div></section> <section class="slide" id="logische-operatoren-1"><div><h2>Logische Operatoren</h2> <p>Geben immer boolschen Wert zurück (nicht Wert der Variablen).</p> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$var</span> <span class="o">=</span> <span class="mi">0</span> <span class="o">||</span> <span class="s1">'foo'</span><span class="p">;</span> <span class="k">echo</span> <span class="s2">"Var: </span><span class="nv">$var</span><span class="s2">"</span><span class="p">;</span> <span class="c1">// Var: 1</span> <span class="nb">var_dump</span><span class="p">(</span><span class="nv">$var</span><span class="p">);</span> <span class="c1">// bool(true)</span> <span class="c1">// Setting defaults</span> <span class="nv">$name</span> <span class="o">=</span> <span class="nv">$name</span> <span class="o">||</span> <span class="s1">'anonymous'</span><span class="p">;</span> <span class="c1">// NEIN</span> <span class="nv">$name</span> <span class="o">=</span> <span class="nv">$name</span> <span class="o">?</span> <span class="nv">$name</span> <span class="o">:</span> <span class="s1">'anonymous'</span><span class="p">;</span> <span class="c1">// JA</span> <span class="nv">$name</span> <span class="o">=</span> <span class="nv">$name</span> <span class="o">??</span> <span class="s1">'anonymous'</span><span class="p">;</span> <span class="c1">// ab PHP7</span> <span class="cp">?></span> </code></pre> </div></section> <section class="slide" id="arrays"><div><h2>Arrays</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$neffen</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s1">'Tick'</span><span class="p">,</span> <span class="s1">'Trick'</span><span class="p">,</span> <span class="s1">'Track'</span><span class="p">);</span> <span class="nv">$zahlen</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">];</span> <span class="c1">// Syntax seit PHP 5.4</span> <span class="nv">$tmnt</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span> <span class="s1">'Leonardo'</span> <span class="o">=></span> <span class="s1">'two swords'</span><span class="p">,</span> <span class="s1">'Michelangelo'</span> <span class="o">=></span> <span class="s1">'pair of nunchucks'</span><span class="p">,</span> <span class="s1">'Raphael'</span> <span class="o">=></span> <span class="s1">'pair of sai'</span><span class="p">,</span> <span class="s1">'Donatello'</span> <span class="o">=></span> <span class="s1">'bō staff'</span><span class="p">,</span> <span class="p">);</span> <span class="nv">$neffen</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Tock'</span><span class="p">;</span> <span class="c1">// ändern</span> <span class="nv">$neffen</span><span class="p">[]</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span> <span class="c1">// anhängen, Typ egal</span> <span class="k">unset</span><span class="p">(</span><span class="nv">$neffen</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span> <span class="c1">// entfernen</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>numerisch indexierte und assoziative Arrays (Hashs)</li> <li>dynamische Länge</li> <li>Typen können gemischt werden</li> <li>Lücken möglich</li> <li>Komma hinter letztem Eintrag unschön, aber möglich (und halt praktisch)</li> <li>keine weiteren nativen Datenstrukturen (Bäume oder so)</li> </ul> </footer> </div></section> <section class="slide" id="schleifen"><div><h2>Schleifen</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$neffen</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s1">'Tick'</span><span class="p">,</span> <span class="s1">'Trick'</span><span class="p">,</span> <span class="s1">'Track'</span><span class="p">);</span> <span class="nv">$tmnt</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s1">'Leonardo'</span> <span class="o">=></span> <span class="s1">'two swords'</span><span class="p">);</span> <span class="c1">// etc</span> <span class="k">foreach</span> <span class="p">(</span><span class="nv">$neffen</span> <span class="k">as</span> <span class="nv">$val</span><span class="p">)</span> <span class="p">{</span> <span class="k">echo</span> <span class="nv">$val</span><span class="p">;</span> <span class="p">}</span> <span class="k">foreach</span> <span class="p">(</span><span class="nv">$tmnt</span> <span class="k">as</span> <span class="nv">$turtle</span> <span class="o">=></span> <span class="nv">$weapon</span><span class="p">)</span> <span class="p">{</span> <span class="k">echo</span> <span class="s2">"Name: </span><span class="nv">$turtle</span><span class="se">\t</span><span class="s2">Weapon: </span><span class="nv">$weapon</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span> <span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="nv">$neffen</span><span class="p">)</span> <span class="p">{</span> <span class="k">echo</span> <span class="nb">array_shift</span><span class="p">(</span><span class="nv">$neffen</span><span class="p">);</span> <span class="p">}</span> <span class="nb">sizeof</span><span class="p">(</span><span class="nv">$neffen</span><span class="p">);</span> <span class="c1">// 0</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li><code class="language-plaintext highlighter-rouge">foreach</code> mit <code class="language-plaintext highlighter-rouge">key=>value</code> auch für numerisch indexierte Arrays</li> <li>zudem noch <code class="language-plaintext highlighter-rouge">do statement while (condition)</code></li> </ul> </footer> </div></section> <section class="slide" id="schleifen-1"><div><h2>Schleifen</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$tmnt</span> <span class="o">=</span> <span class="p">[</span> <span class="p">[</span><span class="s1">'Leonardo'</span><span class="p">,</span> <span class="s1">'blue'</span><span class="p">,</span> <span class="s1">'two swords'</span><span class="p">],</span> <span class="p">[</span><span class="s1">'Michelangelo'</span><span class="p">,</span> <span class="s1">'orange'</span><span class="p">,</span> <span class="s1">'a pair of nunchucks'</span><span class="p">],</span> <span class="p">[</span><span class="s1">'Raphael'</span><span class="p">,</span> <span class="s1">'red'</span><span class="p">,</span> <span class="s1">'a pair of sai'</span><span class="p">],</span> <span class="p">[</span><span class="s1">'Donatello'</span><span class="p">,</span> <span class="s1">'purple'</span><span class="p">,</span> <span class="s1">'a bō staff'</span><span class="p">]</span> <span class="p">];</span> <span class="k">foreach</span> <span class="p">(</span><span class="nv">$tmnt</span> <span class="k">as</span> <span class="k">list</span><span class="p">(</span><span class="nv">$turtle</span><span class="p">,</span> <span class="nv">$color</span><span class="p">,</span> <span class="nv">$weapon</span><span class="p">))</span> <span class="p">{</span> <span class="k">echo</span> <span class="s2">"</span><span class="nv">$turtle</span><span class="s2"> waers a ${color} bandana and </span><span class="nv">$weapon</span><span class="s2">.</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span> <span class="p">}</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>list: Weist Variablen zu, als wären sie ein Array</li> </ul> </footer> </div></section> <section class="slide" id="funktionen"><div><h2>Funktionen</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="k">function</span> <span class="n">multiply</span><span class="p">(</span><span class="nv">$num1</span><span class="p">,</span> <span class="nv">$num2</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nv">$num1</span> <span class="o">*</span> <span class="nv">$num2</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// Default Parameter</span> <span class="k">function</span> <span class="n">greet</span><span class="p">(</span><span class="nv">$name</span> <span class="o">=</span> <span class="s1">'Unbekannter'</span><span class="p">)</span> <span class="p">{</span> <span class="k">echo</span> <span class="s2">"Hallo </span><span class="nv">$name</span><span class="s2">."</span><span class="p">;</span> <span class="p">}</span> <span class="nf">greet</span><span class="p">(</span><span class="s1">'Donald'</span><span class="p">);</span> <span class="c1">// Hallo Donald.</span> <span class="nf">greet</span><span class="p">();</span> <span class="c1">// Hallo Unbekannter.</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>keine Überladung (overloading) im klassischen Sinne (mit Magie möglich)</li> <li>Typen wieder nicht festgelegt, Hinting möglich</li> <li>Typ vom Rückgabewert ist nicht definiert</li> <li>Es gibt Parameter Defaults</li> <li>Parameter können als Wert oder Referenz übergeben werden</li> <li>Kein Fehler, wenn Funktionen mit zu vielen Parametern aufgerufen werden (aber bei zu wenig)</li> <li>Funktionen müssen immer mit Klammern aufgerufen werden (<code class="language-plaintext highlighter-rouge">echo</code> und so sind Ausnahmen, weil eigene Sprachkonstrukte und keine Funktionen)</li> <li>Können nicht undefiniert oder redefiniert werden</li> </ul> </footer> </div></section> <section class="slide" id="funktionen-1"><div><h2>Funktionen</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="k">function</span> <span class="n">nimmersatt</span><span class="p">(</span><span class="nv">$a</span><span class="p">,</span> <span class="nv">$b</span><span class="p">)</span> <span class="p">{</span> <span class="nv">$params</span> <span class="o">=</span> <span class="nb">implode</span><span class="p">(</span><span class="s1">', '</span><span class="p">,</span> <span class="nb">func_get_args</span><span class="p">());</span> <span class="k">echo</span> <span class="s2">"Parameter: </span><span class="nv">$params</span><span class="s2">.</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// Variadische Funktionen</span> <span class="k">function</span> <span class="n">nimmersatt2</span><span class="p">(</span><span class="nv">$a</span><span class="p">,</span> <span class="nv">$b</span><span class="p">,</span> <span class="p">...</span><span class="nv">$params</span><span class="p">)</span> <span class="p">{</span> <span class="k">echo</span> <span class="s1">'Anzahl weiterer Parameter: '</span> <span class="mf">.</span> <span class="nb">count</span><span class="p">(</span><span class="nv">$params</span><span class="p">);</span> <span class="p">}</span> <span class="nv">$neffen</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s1">'Tick'</span><span class="p">,</span> <span class="s1">'Trick'</span><span class="p">,</span> <span class="s1">'Track'</span><span class="p">);</span> <span class="nf">nimmersatt2</span><span class="p">(</span><span class="s1">'foo'</span><span class="p">,</span> <span class="mf">...</span><span class="nv">$neffen</span><span class="p">);</span> <span class="c1">// 2 // Argument Unpacking</span> <span class="cp">?></span> </code></pre><footer> <ul> <li>variadische Funktion: Funktion unbestimmter Arität (Parameteranzahl nicht bereits zur Deklaration festgelegt)</li> </ul> </footer> </div></section> <section class="slide" id="funktionen-2"><div><h2>Funktionen</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="c1">// Type Hinting</span> <span class="k">function</span> <span class="n">size</span><span class="p">(</span><span class="kt">Array</span> <span class="nv">$array</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">sizeof</span><span class="p">(</span><span class="nv">$array</span><span class="p">);</span> <span class="p">}</span> <span class="k">echo</span> <span class="nf">size</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">));</span> <span class="c1">// 3</span> <span class="k">echo</span> <span class="nf">size</span><span class="p">(</span><span class="s1">'nooooooooo'</span><span class="p">);</span> <span class="c1">// PHP Catchable fatal error …</span> <span class="c1">// Return Type Declarations</span> <span class="k">function</span> <span class="n">foo</span><span class="p">()</span> <span class="p">:</span> <span class="kt">array</span> <span class="p">{</span> <span class="k">return</span> <span class="p">[];</span> <span class="p">}</span> <span class="cp">?></span> </code></pre> </div></section> <section class="slide" id="rekursion"><div><h2>Rekursion</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="k">function</span> <span class="n">factorial</span><span class="p">(</span><span class="nv">$number</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$number</span><span class="p">)</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// 0 == false</span> <span class="k">return</span> <span class="nv">$number</span> <span class="o">*</span> <span class="nf">factorial</span><span class="p">(</span><span class="nv">$number</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span> <span class="p">}</span> <span class="k">echo</span> <span class="nf">factorial</span><span class="p">(</span><span class="mi">6</span><span class="p">);</span> <span class="c1">// 720</span> <span class="cp">?></span> </code></pre> </div></section> <section class="slide" id="referenzen"><div><h2>Referenzen</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$val</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> <span class="k">function</span> <span class="n">square1</span><span class="p">(</span><span class="nv">$number</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nv">$number</span> <span class="o">*</span> <span class="nv">$number</span><span class="p">;</span> <span class="p">}</span> <span class="k">echo</span> <span class="nf">square1</span><span class="p">(</span><span class="nv">$val</span><span class="p">);</span> <span class="c1">// 25</span> <span class="c1">// Objekt-Referenzen durch &-Operator</span> <span class="k">function</span> <span class="n">square2</span><span class="p">(</span><span class="o">&</span><span class="nv">$number</span><span class="p">)</span> <span class="p">{</span> <span class="nv">$number</span> <span class="o">=</span> <span class="nv">$number</span> <span class="o">*</span> <span class="nv">$number</span><span class="p">;</span> <span class="p">}</span> <span class="nf">square2</span><span class="p">(</span><span class="nv">$val</span><span class="p">);</span> <span class="k">echo</span> <span class="nv">$val</span><span class="p">;</span> <span class="c1">// 25</span> <span class="nf">square2</span><span class="p">(</span><span class="mi">11</span><span class="p">);</span> <span class="c1">// PHP Fatal error:</span> <span class="c1">// Only variables can be passed by reference</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>default ist value passing und durch lazy-krams (copy on write) ist das auch schnell genug, darum lieber so</li> </ul> </footer> </div></section> <section class="slide" id="pointers--variable-variables"><div><h2>Pointers / Variable Variables</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$zahl</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> <span class="nv">$name</span> <span class="o">=</span> <span class="s1">'zahl'</span><span class="p">;</span> <span class="nv">$$name</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span> <span class="k">echo</span> <span class="nv">$zahl</span><span class="p">;</span> <span class="c1">// 3</span> <span class="nv">$woot</span> <span class="o">=</span> <span class="s1">'name'</span><span class="p">;</span> <span class="nv">$$$woot</span> <span class="o">=</span> <span class="mi">7</span><span class="p">;</span> <span class="k">echo</span> <span class="nv">$zahl</span><span class="p">;</span> <span class="c1">// 7</span> <span class="err">$</span><span class="p">{</span><span class="s1">'za'</span> <span class="mf">.</span> <span class="s1">'hl'</span><span class="p">}</span> <span class="o">=</span> <span class="mi">11</span><span class="p">;</span> <span class="c1">// $zahl = 11;</span> <span class="cp">?></span> </code></pre> </div></section> <section class="slide" id="callbacks"><div><h2>Callbacks</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="k">function</span> <span class="n">yell</span><span class="p">()</span> <span class="p">{</span> <span class="k">echo</span> <span class="s1">'Yeah!'</span><span class="p">;</span> <span class="p">}</span> <span class="k">function</span> <span class="n">waitand</span><span class="p">(</span><span class="nv">$callback</span><span class="p">)</span> <span class="p">{</span> <span class="nb">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span> <span class="c1">// $callback(); // tollkühner, geht aber auch</span> <span class="nb">is_callable</span><span class="p">(</span><span class="nv">$callback</span><span class="p">)</span> <span class="o">&&</span> <span class="nb">call_user_func</span><span class="p">(</span><span class="nv">$callback</span><span class="p">);</span> <span class="p">}</span> <span class="nf">waitand</span><span class="p">(</span><span class="s1">'yell'</span><span class="p">);</span> <span class="c1">// nach 2 Sekunden: "Yeah!"</span> <span class="cp">?></span> </code></pre> </div></section> <section class="slide" id="callbacks-1"><div><h2>Callbacks</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="k">function</span> <span class="n">length</span><span class="p">(</span><span class="nv">$a</span><span class="p">,</span> <span class="nv">$b</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">strlen</span><span class="p">(</span><span class="nv">$a</span><span class="p">)</span> <span class="o">-</span> <span class="nb">strlen</span><span class="p">(</span><span class="nv">$b</span><span class="p">);</span> <span class="p">}</span> <span class="nv">$tiere</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s1">'Hund'</span><span class="p">,</span> <span class="s1">'Katze'</span><span class="p">,</span> <span class="s1">'Wal'</span><span class="p">,</span> <span class="s1">'Stirnlappenbasilisk'</span><span class="p">);</span> <span class="nb">uasort</span><span class="p">(</span><span class="nv">$tiere</span><span class="p">,</span> <span class="s1">'length'</span><span class="p">);</span> <span class="c1">// Wal, Hund, Katze, Stirnlappenbasilisk</span> <span class="cp">?></span> </code></pre> </div></section> <section class="slide" id="anonyme-funktionen"><div><h2>Anonyme Funktionen</h2> <p>A.k.a. Closures, Funktions-Literale, Lambda-Funktionen.</p> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nb">uasort</span><span class="p">(</span><span class="nv">$tiere</span><span class="p">,</span> <span class="k">function</span> <span class="p">(</span><span class="nv">$a</span><span class="p">,</span><span class="nv">$b</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">strlen</span><span class="p">(</span><span class="nv">$a</span><span class="p">)</span> <span class="o">-</span> <span class="nb">strlen</span><span class="p">(</span><span class="nv">$b</span><span class="p">);</span> <span class="p">});</span> <span class="nv">$greet</span> <span class="o">=</span> <span class="k">function</span><span class="p">(</span><span class="nv">$name</span><span class="p">)</span> <span class="p">{</span> <span class="k">echo</span> <span class="s2">"Hallo </span><span class="nv">$name</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span> <span class="p">};</span> <span class="nv">$greet</span><span class="p">(</span><span class="s1">'World'</span><span class="p">);</span> <span class="nv">$greet</span><span class="p">(</span><span class="s1">'PHP'</span><span class="p">);</span> <span class="cp">?></span> </code></pre> </div></section> <section class="slide" id="modules"><div><h2>Modules</h2> <ul> <li>Keine entsprechenden Strukturen, aber <code class="language-plaintext highlighter-rouge">require</code> und <code class="language-plaintext highlighter-rouge">include</code> (<code class="language-plaintext highlighter-rouge">*_once</code>)</li> <li>Quasi Kopiervorgang</li> <li>Kann überall verwendet werden</li> </ul> <div class="parts "> <div class="part"> <p><code class="language-plaintext highlighter-rouge">zahlen.php</code></p> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$zahlen</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">);</span> <span class="cp">?></span> </code></pre> </div><div class="part"> <p><code class="language-plaintext highlighter-rouge">index.php</code></p> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="k">require_once</span> <span class="s1">'zahlen.php'</span><span class="p">;</span> <span class="k">echo</span> <span class="nb">array_sum</span><span class="p">(</span><span class="nv">$zahlen</span><span class="p">);</span> <span class="c1">// 6</span> <span class="cp">?></span> </code></pre> </div> </div> <footer> <ul> <li>Urpsprünglich: Auslagerung von Seitenteilen, z.B. <code class="language-plaintext highlighter-rouge">header.php</code>, <code class="language-plaintext highlighter-rouge">footer.php</code> etc</li> </ul> </footer> </div></section> <section class="slide" id="modules-1"><div><h2>Modules</h2> <pre class="highlight language-php" data-lang="php"><code><span class="nt"><html></span> <span class="nt"><head></span> <span class="nt"><title></span>Home<span class="nt"></title></span> <span class="nt"></head></span> <span class="nt"><body></span> <span class="cp"><?php</span> <span class="k">include</span> <span class="n">header</span><span class="mf">.</span><span class="n">php</span> <span class="cp">?></span> … Content … <span class="nt"></body></span> <span class="nt"></html></span> </code></pre> </div></section> <section class="slide" id="debugging"><div><h2>Debugging</h2> <ul> <li><code class="language-plaintext highlighter-rouge">echo</code>, <code class="language-plaintext highlighter-rouge">print</code>, <code class="language-plaintext highlighter-rouge">print_r</code></li> <li><code class="language-plaintext highlighter-rouge">var_dump</code>, <code class="language-plaintext highlighter-rouge">var_export</code></li> <li><a href="http://xdebug.org/docs/">XDebug</a></li> <li><a href="http://phpdbg.com/docs">The interactive PHP debugger</a></li> <li><a href="http://en.wikipedia.org/wiki/Debugging#Techniques">Debugging-Techniken</a></li> </ul> </div></section> <section class="slide shout" id="web"><div><h2>Web</h2> </div></section> <section class="slide" id="superglobals"><div><h2>Superglobals</h2> <table> <tbody> <tr> <td><a href="http://php.net/manual/de/reserved.variables.globals.php"><code class="language-plaintext highlighter-rouge">$GLOBALS</code></a></td> <td>Alle Variablen im globalen Gültigkeitsbereich</td> </tr> <tr> <td><a href="http://php.net/manual/de/reserved.variables.get.php"><code class="language-plaintext highlighter-rouge">$_GET</code></a></td> <td>GET-Variablen</td> </tr> <tr> <td><a href="http://php.net/manual/de/reserved.variables.post.php"><code class="language-plaintext highlighter-rouge">$_POST</code></a></td> <td>POST-Variablen</td> </tr> <tr> <td><a href="http://php.net/manual/de/reserved.variables.cookies.php"><code class="language-plaintext highlighter-rouge">$_COOKIE</code></a></td> <td>Cookies</td> </tr> <tr> <td><a href="http://php.net/manual/de/reserved.variables.request.php"><code class="language-plaintext highlighter-rouge">$_REQUEST</code></a></td> <td>Zusammenfassung aus <code class="language-plaintext highlighter-rouge">$_GET</code>, <code class="language-plaintext highlighter-rouge">$_POST</code> und <code class="language-plaintext highlighter-rouge">$_COOKIE</code></td> </tr> <tr> <td><a href="http://php.net/manual/de/reserved.variables.files.php"><code class="language-plaintext highlighter-rouge">$_FILES</code></a></td> <td>Dateiupload-Variablen (hochgeladene Dateien)</td> </tr> <tr> <td><a href="http://php.net/manual/de/reserved.variables.server.php"><code class="language-plaintext highlighter-rouge">$_SERVER</code></a></td> <td>Informationen über Server</td> </tr> <tr> <td><a href="http://php.net/manual/de/reserved.variables.session.php"><code class="language-plaintext highlighter-rouge">$_SESSION</code></a></td> <td>Session-Variablen</td> </tr> <tr> <td><a href="http://php.net/manual/de/reserved.variables.environment.php"><code class="language-plaintext highlighter-rouge">$_ENV</code></a></td> <td>Umgebungsvariablen</td> </tr> </tbody> </table> <footer> <ul> <li>Immer und überall verfügbar</li> <li>Alles Arrays</li> <li>Formulare übergeben immer Strings (kein int, bool o.ä.)</li> <li>Früher auch <code class="language-plaintext highlighter-rouge">$HTTP_COOKIE_VARS</code>, <code class="language-plaintext highlighter-rouge">$HTTP_GET_VARS</code> und <code class="language-plaintext highlighter-rouge">$HTTP_POST_VARS</code> – nicht verwenden!</li> <li>gibt noch weitere (bspw. für Shell-Scripte), aber hier nicht relevant</li> </ul> </footer> </div></section> <section class="slide" id="_server"><div><h2>$_SERVER</h2> <p>Superglobale Variable, die alle Informationen über den Webserver enthält.</p> <table> <tbody> <tr> <td><code class="language-plaintext highlighter-rouge">REQUEST_METHOD</code></td> <td>HTTP-Requestmethode</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">DOCUMENT_ROOT</code></td> <td>Document Root-Verzeichnis</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">SCRIPT_FILENAME</code></td> <td>Pfad des aktuell ausgeführten Skripts</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">HTTP_USER_AGENT</code></td> <td>Formulardaten</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">HTTP_REFERER</code></td> <td>Angebliche Web-Herkunft des Besuchers</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">REMOTE_ADDR</code></td> <td>IP des Besuchers</td> </tr> </tbody> </table> </div></section> <section class="slide" id="_server-1"><div><h2>$_SERVER</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="k">if</span> <span class="p">(</span><span class="nb">strpos</span><span class="p">(</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">'HTTP_USER_AGENT'</span><span class="p">],</span> <span class="s1">'MSIE'</span><span class="p">)</span> <span class="o">!==</span> <span class="kc">FALSE</span> <span class="o">||</span> <span class="nb">strpos</span><span class="p">(</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">'HTTP_USER_AGENT'</span><span class="p">],</span> <span class="s1">'Trident'</span><span class="p">)</span> <span class="o">!==</span> <span class="kc">FALSE</span><span class="p">)</span> <span class="p">{</span> <span class="k">echo</span> <span class="s2">"Sie benutzen Microsofts Internet Explorer.<br />"</span><span class="p">;</span> <span class="p">}</span> <span class="cp">?></span> </code></pre> </div></section> <section class="slide" id="filter"><div><h2>Filter</h2> <ul> <li><q><a href="http://www.microsoft.com/mspress/books/sampchap/5957.aspx">All input is evil until proven otherwise.</a></q></li> <li>Validierung und Bereinigung durch <a href="http://php.net/manual/en/function.filter-var.php"><code class="language-plaintext highlighter-rouge">filter_var</code></a></li> <li>Liste an passenden <a href="http://php.net/manual/en/filter.filters.validate.php">Validate filters</a> und <a href="http://php.net/manual/en/filter.filters.sanitize.php">Sanitize filters</a></li> <li>Für HTML mit Zeilenumbrüchen: <a href="http://php.net/manual/en/function.htmlspecialchars.php"><code class="language-plaintext highlighter-rouge">htmlspecialchars</code></a></li> </ul> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$url</span> <span class="o">=</span> <span class="nb">filter_var</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">'url'</span><span class="p">],</span> <span class="no">FILTER_SANITIZE_URL</span><span class="p">);</span> <span class="nv">$safe_html</span> <span class="o">=</span> <span class="nb">htmlentities</span><span class="p">(</span><span class="nv">$input</span><span class="p">,</span> <span class="no">ENT_QUOTES</span><span class="p">,</span> <span class="s1">'UTF-8'</span><span class="p">);</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Wenn jemand fremdes an Ihrer Tür steht und Ihnen Essen anbietet – würden Sie es essen?</li> <li>Regel #2: <q>Data must be validated as it crosses the boundary between untrusted and trusted environments.</q></li> <li>Validate: boolean, email, float, int, ip, regex, url</li> <li>Sanitize:</li> <li>Flags: strip low, strip high, allow fraction, allow thousand, IPv4, IPv6,</li> </ul> </footer> </div></section> <section class="slide" id="http"><div><h2>HTTP</h2> <table> <tbody> <tr> <td><a href="http://php.net/manual/de/function.header.php"><code class="language-plaintext highlighter-rouge">header()</code></a></td> <td>Sendet einen HTTP-Header in Rohform</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.headers-list.php"><code class="language-plaintext highlighter-rouge">headers_list()</code></a></td> <td>Liste der gesendeten / zu sendenden Header</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.headers-sent.php"><code class="language-plaintext highlighter-rouge">headers_sent()</code></a></td> <td>Prüft, ob oder wo die Header bereits gesendet wurden</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.setrawcookie.php"><code class="language-plaintext highlighter-rouge">setcookie()</code></a></td> <td>Sendet ein Cookie</td> </tr> <tr> <td><a href="http://php.net/manual/de/function.setcookie.php"><code class="language-plaintext highlighter-rouge">setrawcookie()</code></a></td> <td>Sendet ein Cookie, ohne seinen Wert zu URL-kodieren</td> </tr> </tbody> </table> <footer> <ul> <li>Header und Cookies müssen vor jeglichem Inhalt kommen</li> </ul> </footer> </div></section> <section class="slide" id="header"><div><h2>Header</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="c1">// Wir werden eine PDF Datei ausgeben</span> <span class="nb">header</span><span class="p">(</span><span class="s1">'Content-type: application/pdf'</span><span class="p">);</span> <span class="nb">header</span><span class="p">(</span><span class="s1">'Content-Disposition: attachment; filename="downloaded.pdf"'</span><span class="p">);</span> <span class="nb">readfile</span><span class="p">(</span><span class="s1">'original.pdf'</span><span class="p">);</span> <span class="c1">// Neuer Benutzer wurde erfolgreich angelegt</span> <span class="nb">header</span><span class="p">(</span><span class="s1">'Location: http://www.example.com/user/3'</span><span class="p">,</span> <span class="mi">201</span><span class="p">);</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Prams: String, replace?, Status Code</li> </ul> </footer> </div></section> <section class="slide" id="cookies"><div><h2>Cookies</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$value</span> <span class="o">=</span> <span class="s1">'irgendetwas von irgendwo'</span><span class="p">;</span> <span class="nb">setcookie</span><span class="p">(</span><span class="s1">'TestCookie'</span><span class="p">,</span> <span class="nv">$value</span><span class="p">);</span> <span class="nb">setcookie</span><span class="p">(</span><span class="s1">'TestCookie'</span><span class="p">,</span> <span class="nv">$value</span><span class="p">,</span> <span class="nb">time</span><span class="p">()</span> <span class="o">+</span> <span class="mi">3600</span><span class="p">);</span> <span class="cm">/* verfällt in 1 Stunde */</span> <span class="nb">setcookie</span><span class="p">(</span><span class="s1">'TestCookie'</span><span class="p">,</span> <span class="nv">$value</span><span class="p">,</span> <span class="nb">time</span><span class="p">()</span> <span class="o">+</span> <span class="mi">3600</span><span class="p">,</span> <span class="s1">'/~rasmus/'</span><span class="p">,</span> <span class="s1">'.example.com'</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span> <span class="cp">?></span> <span class="cp"><?php</span> <span class="k">echo</span> <span class="nv">$_COOKIE</span><span class="p">[</span><span class="s1">'TestCookie'</span><span class="p">];</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Parameter <ul> <li><code class="language-plaintext highlighter-rouge">name</code>: Der Name des Cookies, einziger obligatorischer Parameter</li> <li><code class="language-plaintext highlighter-rouge">value</code>, <code class="language-plaintext highlighter-rouge">expire</code>, <code class="language-plaintext highlighter-rouge">path</code>, <code class="language-plaintext highlighter-rouge">domain</code>, <code class="language-plaintext highlighter-rouge">secure</code>, <code class="language-plaintext highlighter-rouge">httponly</code></li> </ul> </li> </ul> </footer> </div></section> <section class="slide" id="sessions"><div><h2>Sessions</h2> <p>Möglichkeit, mit Client assoziierte Daten serverseitig zu speichern.</p> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nb">session_start</span><span class="p">();</span> <span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'guthaben'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1000000</span><span class="p">;</span> <span class="cp">?></span> … nächste Anfrage … <span class="cp"><?php</span> <span class="nb">session_start</span><span class="p">();</span> <span class="k">echo</span> <span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'guthaben'</span><span class="p">];</span> <span class="nb">session_destroy</span><span class="p">();</span> <span class="cp">?></span> </code></pre> </div></section> <section class="slide" id="links"><div><h2>Links</h2> <ul> <li><a href="http://learnxinyminutes.com/docs/php/">Learn X in Y minutes – PHP</a></li> <li><a href="http://overapi.com/php/">PHP Cheat Sheet</a></li> <li><a href="https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md#php">Kostenlose Bücher</a></li> <li><a href="https://phpbestpractices.org/">PHP Best Practices</a></li> <li><a href="https://github.com/domnikl/DesignPatternsPHP">Design Patterns in PHP</a></li> <li><a href="https://github.com/ziadoz/awesome-php">Awesome PHP</a> – Eine kuratierte Liste von PHP-Ressourcen</li> <li><a href="http://www.troyhunt.com/2013/07/everything-you-wanted-to-know-about-sql.html">Everything you wanted to know about SQL injection (but were afraid to ask)</a></li> <li><a href="http://blog.astrumfutura.com/2013/04/20-point-list-for-preventing-cross-site-scripting-in-php/">20 Point List For Preventing Cross-Site Scripting In PHP</a></li> <li><a href="http://hhvm.com/">Facebooks HipHop Virtual Machine</a></li> </ul> </div></section>