Webtechnologien
Wintersemester 2024
PHP – Objektorientierung
♯
♫
PHP – Objektorientierung
<section id="php" class="slide cover"><div><h2>PHP</h2> <p>Objektorientierung</p> </div></section> <section class="slide" id="klassen"><div><h2><a href="http://php.net/manual/de/language.oop5.php">Klassen</a></h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="kd">class</span> <span class="nc">ClassName</span> <span class="p">{</span> <span class="k">public</span> <span class="nv">$public_member_var</span><span class="p">;</span> <span class="k">private</span> <span class="nv">$private_member_var</span><span class="p">;</span> <span class="k">public</span> <span class="k">function</span> <span class="n">publicMemberFunc</span><span class="p">()</span> <span class="p">{</span> <span class="nv">$this</span><span class="o">-></span><span class="nf">privateMemberFunc</span><span class="p">(</span><span class="nv">$this</span><span class="o">-></span><span class="n">private_member_var</span><span class="p">);</span> <span class="k">self</span><span class="o">::</span><span class="nf">privateMemberFunc</span><span class="p">(</span><span class="nv">$this</span><span class="o">-></span><span class="n">private_member_var</span><span class="p">);</span> <span class="p">}</span> <span class="k">private</span> <span class="k">function</span> <span class="n">privateMemberFunc</span><span class="p">(</span><span class="nv">$param</span><span class="p">)</span> <span class="p">{</span> <span class="nv">$this</span><span class="o">-></span><span class="n">public_member_var</span> <span class="o">=</span> <span class="nv">$param</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Ähnlich zu C++</li> </ul> </footer> </div></section> <section class="slide" id="klassen-1"><div><h2>Klassen</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="kd">class</span> <span class="nc">Person</span> <span class="p">{</span> <span class="k">public</span> <span class="nv">$name</span><span class="p">;</span> <span class="k">function</span> <span class="n">__construct</span><span class="p">(</span><span class="nv">$name</span> <span class="o">=</span> <span class="s1">'Unbekannt'</span><span class="p">)</span> <span class="p">{</span> <span class="nv">$this</span><span class="o">-></span><span class="n">name</span> <span class="o">=</span> <span class="nv">$name</span><span class="p">;</span> <span class="nv">$this</span><span class="o">-></span><span class="nf">me</span><span class="p">(</span><span class="s1">'hallo'</span><span class="p">);</span> <span class="p">}</span> <span class="k">function</span> <span class="n">__destruct</span><span class="p">()</span> <span class="p">{</span> <span class="nv">$this</span><span class="o">-></span><span class="nf">me</span><span class="p">(</span><span class="s1">'auf Wiedersehen'</span><span class="p">);</span> <span class="p">}</span> <span class="k">function</span> <span class="n">me</span><span class="p">(</span><span class="nv">$text</span> <span class="o">=</span> <span class="s1">''</span><span class="p">)</span> <span class="p">{</span> <span class="k">echo</span> <span class="s2">"</span><span class="si">{</span><span class="nv">$this</span><span class="o">-></span><span class="n">name</span><span class="si">}</span><span class="s2"> sagt </span><span class="nv">$text</span><span class="s2">.</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Destruktor: Wird vor Zerstörung der Klasse aufgerufen (wenn keine Referenzen mehr vorhanden sind oder das Skript beendet)</li> </ul> </footer> </div></section> <section class="slide" id="objekte"><div><h2>Objekte</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="nv">$anon</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Person</span><span class="p">;</span> <span class="c1">// Unbekannt sagt hallo.</span> <span class="nv">$bob</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Person</span><span class="p">(</span><span class="s1">'Bob'</span><span class="p">);</span> <span class="c1">// Bob sagt hallo.</span> <span class="nv">$bob</span><span class="o">-></span><span class="n">alter</span> <span class="o">=</span> <span class="nb">strlen</span><span class="p">(</span><span class="nv">$bob</span><span class="o">-></span><span class="n">name</span><span class="p">)</span> <span class="o">*</span> <span class="mi">8</span><span class="p">;</span> <span class="c1">// 24</span> <span class="nv">$bob</span><span class="o">-></span><span class="nf">me</span><span class="p">(</span><span class="s2">", er sei </span><span class="si">{</span><span class="nv">$bob</span><span class="o">-></span><span class="n">alter</span><span class="si">}</span><span class="s2"> Jahre alt"</span><span class="p">);</span> <span class="k">unset</span><span class="p">(</span><span class="nv">$bob</span><span class="p">);</span> <span class="c1">// Bob sagt auf Wiedersehen.</span> <span class="nv">$anon</span> <span class="k">instanceof</span> <span class="nc">Person</span><span class="p">;</span> <span class="c1">// true</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li><code class="language-plaintext highlighter-rouge">unset</code> entfernt die einzige Referenz, damit Freigabe für den GC</li> <li>Type Operator <code class="language-plaintext highlighter-rouge">instanceof</code></li> </ul> </footer> </div></section> <section class="slide" id="statische-klassen"><div><h2>Statische Klassen</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="kd">class</span> <span class="nc">Math</span> <span class="p">{</span> <span class="k">static</span> <span class="k">function</span> <span class="n">isPrime</span><span class="p">(</span><span class="nv">$num</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nv">$num</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="k">return</span> <span class="kc">true</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="nv">$num</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">||</span> <span class="nv">$num</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="kc">false</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="nv">$i</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span> <span class="nv">$i</span> <span class="o"><=</span> <span class="nb">ceil</span><span class="p">(</span><span class="nb">sqrt</span><span class="p">(</span><span class="nv">$num</span><span class="p">));</span> <span class="nv">$i</span> <span class="o">=</span> <span class="nv">$i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span> <span class="k">if</span> <span class="p">(</span><span class="nv">$num</span> <span class="o">%</span> <span class="nv">$i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="kc">false</span><span class="p">;</span> <span class="k">return</span> <span class="kc">true</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="nc">Math</span><span class="o">::</span><span class="nf">isPrime</span><span class="p">(</span><span class="mi">2147483647</span><span class="p">);</span> <span class="c1">// true</span> <span class="cp">?></span> </code></pre> <p class="note right">Quelle: <a href="http://stackoverflow.com/questions/16763322/a-formula-to-find-prime-numbers-in-a-loop">Stack Overflow</a></p> <footer> <ul> <li><code class="language-plaintext highlighter-rouge">unset</code> entfernt die einzige Referenz, damit Freigabe für den GC</li> </ul> </footer> </div></section> <section class="slide" id="vererbung"><div><h2>Vererbung</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="kd">class</span> <span class="nc">Basis</span> <span class="p">{</span> <span class="k">private</span> <span class="nv">$price</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span> <span class="k">function</span> <span class="n">getPrice</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="nv">$this</span><span class="o">-></span><span class="n">price</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="kd">class</span> <span class="nc">Premium</span> <span class="kd">extends</span> <span class="nc">Basis</span> <span class="p">{</span> <span class="k">function</span> <span class="n">getPrice</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="k">parent</span><span class="o">::</span><span class="nf">getPrice</span><span class="p">()</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="p">(</span><span class="k">new</span> <span class="nc">Basis</span><span class="p">)</span><span class="o">-></span><span class="nf">getPrice</span><span class="p">();</span> <span class="c1">// 100</span> <span class="p">(</span><span class="k">new</span> <span class="nc">Premium</span><span class="p">)</span><span class="o">-></span><span class="nf">getPrice</span><span class="p">();</span> <span class="c1">// 200</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Klassen können <code class="language-plaintext highlighter-rouge">final</code> sein (keine Vererbung möglich)</li> <li>Methoden können <code class="language-plaintext highlighter-rouge">final</code>, <code class="language-plaintext highlighter-rouge">abstract</code> und <code class="language-plaintext highlighter-rouge">protected</code> sein</li> <li>Mama-Konstruktor wird nicht aufgerufen, wenn Kind Konstruktor implementiert (<code class="language-plaintext highlighter-rouge">parent::__construct()</code>)</li> </ul> </footer> </div></section> <section class="slide" id="interfaces"><div><h2><a href="http://php.net/manual/de/language.oop5.interfaces.php">Interfaces</a></h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="kd">interface</span> <span class="nc">iTemplate</span> <span class="p">{</span> <span class="k">public</span> <span class="k">function</span> <span class="n">setVariable</span><span class="p">(</span><span class="nv">$name</span><span class="p">,</span> <span class="nv">$var</span><span class="p">);</span> <span class="k">public</span> <span class="k">function</span> <span class="n">getHtml</span><span class="p">(</span><span class="nv">$template</span><span class="p">);</span> <span class="p">}</span> <span class="kd">class</span> <span class="nc">Template</span> <span class="kd">implements</span> <span class="nc">iTemplate</span> <span class="p">{</span> <span class="k">public</span> <span class="k">function</span> <span class="n">setVariable</span><span class="p">(</span><span class="nv">$name</span><span class="p">,</span> <span class="nv">$var</span><span class="p">)</span> <span class="p">{</span> <span class="mf">...</span> <span class="p">}</span> <span class="k">public</span> <span class="k">function</span> <span class="n">getHtml</span><span class="p">(</span><span class="nv">$template</span><span class="p">)</span> <span class="p">{</span> <span class="mf">...</span> <span class="p">}</span> <span class="p">}</span> <span class="kd">interface</span> <span class="nc">iSpecialTemplate</span> <span class="kd">extends</span> <span class="nc">iTemplate</span> <span class="p">{</span> <span class="mf">...</span> <span class="p">}</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Ein Interface ist eine Klasse mit Methoden ohne Body.</li> <li>Eine Klasse <q>erbt</q> von einem Interface durch das Schlüsselwort implements.</li> <li>Von Interfaces können keine Instanzen gebildet werden.</li> <li>Können wie Klassen erweitert werden</li> <li>Klasse kann mehrere Interfaces implementieren, wobei Funktionsnamen einzigartig sein müssen</li> <li>Vordefinierte Interfaces <ul> <li><code class="language-plaintext highlighter-rouge">ArrayAccess</code>: Interface, um Objekte als Arrays ansprechen zu können</li> <li><code class="language-plaintext highlighter-rouge">Iterator</code>: Interface für externe Iteratoren oder Objekte, die selbstiterierend sind.</li> <li><code class="language-plaintext highlighter-rouge">Serializable</code>: Interface für benutzerdefiniertes Serialisieren</li> </ul> </li> </ul> </footer> </div></section> <section class="slide" id="namespaces"><div><h2><a href="http://php.net/manual/de/language.namespaces.php">Namespaces</a></h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="kn">namespace</span> <span class="nn">htw\beier\beispiele</span><span class="p">;</span> <span class="k">function</span> <span class="n">foo</span><span class="p">()</span> <span class="p">{</span> <span class="k">echo</span> <span class="s1">'Hmm'</span><span class="p">;</span> <span class="p">}</span> <span class="cp">?></span> … woanders … <span class="cp"><?php</span> <span class="k">echo</span> <span class="nf">htw\beier\beispiele\foo</span><span class="p">();</span> <span class="c1">// uargs</span> <span class="kn">use</span> <span class="n">htw\beier\beispiele</span> <span class="k">as</span> <span class="n">bsp</span><span class="p">;</span> <span class="k">echo</span> <span class="nf">bsp\foo</span><span class="p">();</span> <span class="kn">use</span> <span class="n">htw\beier\beispiele\foo</span><span class="p">;</span> <span class="k">echo</span> <span class="nf">foo</span><span class="p">();</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Versuch, verschmutzten Namensraum zu ordnen und Kollisionen zu vermeiden</li> <li>Namespace muss der erste Ausdruck im Skript sein</li> </ul> </footer> </div></section> <section class="slide" id="exceptions"><div><h2><a href="http://php.net/manual/de/class.exception.php">Exceptions</a></h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="k">try</span> <span class="p">{</span> <span class="k">echo</span> <span class="s2">"Moin</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span> <span class="k">throw</span> <span class="k">new</span> <span class="nc">Exception</span><span class="p">(</span><span class="s1">'Ich bin eine Fehlermeldung.'</span><span class="p">);</span> <span class="k">echo</span> <span class="s1">'Ich werde nie ausgeführt.'</span><span class="p">;</span> <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nc">Exception</span> <span class="nv">$e</span><span class="p">)</span> <span class="p">{</span> <span class="k">echo</span> <span class="s2">"Exception gefangen: </span><span class="si">{</span><span class="nv">$e</span><span class="o">-></span><span class="nf">getMessage</span><span class="p">()</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span> <span class="p">}</span> <span class="k">finally</span> <span class="p">{</span> <span class="k">echo</span> <span class="s2">"Mir doch egal.</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span> <span class="p">}</span> <span class="k">echo</span> <span class="s2">"War was?</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span> <span class="cp">?></span> </code></pre><footer> <ul> <li>Enthalten <ul> <li><code class="language-plaintext highlighter-rouge">message</code>: Die Exceptionmeldung</li> <li><code class="language-plaintext highlighter-rouge">code</code>: Die Fehlernummer der Exception</li> <li><code class="language-plaintext highlighter-rouge">file</code>: Der Name der Datei, in der die Exception aufgetreten ist (geworfen wurde)</li> <li><code class="language-plaintext highlighter-rouge">line</code>: Die Zeilennummer, in der die Exception aufgetreten ist (geworfen wurde)</li> </ul> </li> </ul> </footer> </div></section> <section class="slide" id="magische-methoden"><div><h2>Magische Methoden</h2> <p><a href="http://fi1.php.net/manual/de/language.oop5.decon.php#object.construct"><code class="language-plaintext highlighter-rouge">__construct()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.decon.php#object.destruct"><code class="language-plaintext highlighter-rouge">__destruct()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.overloading.php#object.call"><code class="language-plaintext highlighter-rouge">__call()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.overloading.php#object.callstatic"><code class="language-plaintext highlighter-rouge">__callStatic()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.overloading.php#object.get"><code class="language-plaintext highlighter-rouge">__get()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.overloading.php#object.set"><code class="language-plaintext highlighter-rouge">__set()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.overloading.php#object.isset"><code class="language-plaintext highlighter-rouge">__isset()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.overloading.php#object.unset"><code class="language-plaintext highlighter-rouge">__unset()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.magic.php#object.sleep"><code class="language-plaintext highlighter-rouge">__sleep()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.magic.php#object.wakeup"><code class="language-plaintext highlighter-rouge">__wakeup()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.magic.php#object.tostring"><code class="language-plaintext highlighter-rouge">__toString()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.magic.php#object.invoke"><code class="language-plaintext highlighter-rouge">__invoke()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.magic.php#object.set-state"><code class="language-plaintext highlighter-rouge">__set_state()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.cloning.php#object.clone"><code class="language-plaintext highlighter-rouge">__clone()</code></a>, <br /> <a href="http://fi1.php.net/manual/de/language.oop5.magic.php#object.debuginfo"><code class="language-plaintext highlighter-rouge">__debugInfo()</code></a></p> </div></section> <section class="slide" id="autoloading"><div><h2>Autoloading</h2> <pre class="highlight language-php" data-lang="php"><code><span class="cp"><?php</span> <span class="c1">// meh</span> <span class="k">require_once</span> <span class="s1">'classes/Basis.php'</span><span class="p">;</span> <span class="k">require_once</span> <span class="s1">'classes/Premium.php'</span><span class="p">;</span> <span class="nv">$angebot</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Premium</span><span class="p">;</span> <span class="cp">?></span> <span class="cp"><?php</span> <span class="c1">// ahhh</span> <span class="nb">spl_autoload_register</span><span class="p">(</span><span class="k">function</span> <span class="p">(</span><span class="nv">$class</span><span class="p">)</span> <span class="p">{</span> <span class="k">include</span> <span class="s1">'classes/'</span> <span class="mf">.</span> <span class="nv">$class</span> <span class="mf">.</span> <span class="s1">'.php'</span><span class="p">;</span> <span class="p">});</span> <span class="cp">?></span> </code></pre> <footer> <ul> <li>Wird schnell unübersichtlich und Abhängigkeiten müssen bedacht werden</li> </ul> </footer> </div></section>