<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr - Blogs</title>
		<link>http://www.php-resource.de/forum/blogs/</link>
		<description>PHP resource - Hier treffen sich PHP und mySQL Enwickler und anfänger zum austausch von wissen und Informationen.</description>
		<language>de</language>
		<lastBuildDate>Wed, 08 Feb 2012 15:22:45 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>http://www.php-resource.de/forum/images/misc/rss.jpg</url>
			<title>PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr - Blogs</title>
			<link>http://www.php-resource.de/forum/blogs/</link>
		</image>
		<item>
			<title>hay</title>
			<link>http://www.php-resource.de/forum/blogs/dianapeppe/44-hay.html</link>
			<pubDate>Sun, 20 Nov 2011 22:14:59 GMT</pubDate>
			<description>hay ich liebe deisen ich habe nur eine frage wie kann ich ein chat erstellen</description>
			<content:encoded><![CDATA[<div>hay ich liebe deisen ich habe nur eine frage wie kann ich ein chat erstellen</div>

]]></content:encoded>
			<dc:creator>dianapeppe</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/dianapeppe/44-hay.html</guid>
		</item>
		<item>
			<title>Festplatte an PS3</title>
			<link>http://www.php-resource.de/forum/blogs/berni/43-festplatte-an-ps3.html</link>
			<pubDate>Fri, 16 Sep 2011 07:22:33 GMT</pubDate>
			<description>Externe USB-Festplatte an PS3 
 
Wer mal eben schnell seine Videos, Bilder oder Musik auf der PS3 abspielen möchte, der muss 2  Punkte beachten 
 
1....</description>
			<content:encoded><![CDATA[<div>Externe USB-Festplatte an PS3<br />
<br />
Wer mal eben schnell seine Videos, Bilder oder Musik auf der PS3 abspielen möchte, der muss 2  Punkte beachten<br />
<ol style="list-style-type: decimal"><li>Die Festplatte muss mit <b>FAT32 formatiert </b>werden. <br />
Windows 7 kann das so leider nicht mehr. Im Internet findet Ihr einige kostenlose Tools die Euch die Festplatte mit FAT32 formatieren können.<br /></li>
<li>	Wer jetzt denkt, Mediadaten auf die Platte kopieren und los geht’s. Der wird schnell enttäuscht werden. Ohne eine <b>angepasste Verzeichnisstruktur</b> geht nix. <br />
Legt man die jeweiligen Mediadaten in dieser Verzeichnisstruktur ab, so kann es loslegen und seine Videos betrachten. <br />
<br />
/VIDEO<br />
/MUSIC<br />
/PICTURES</li>
</ol><br />
Um seine Daten schneller zu finden, können <b>Unterverzeichnisse </b>angelegt werden <br />
Eigentlich alles sehr einfach, ich habe dafür einen Vormittag gebraucht um alles so am laufen zu haben wie ich das gerne hätte.</div>

]]></content:encoded>
			<dc:creator>Berni</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/berni/43-festplatte-an-ps3.html</guid>
		</item>
		<item>
			<title>Vererbung mit eingebauten Klassen</title>
			<link>http://www.php-resource.de/forum/blogs/amicanoctis/41-vererbung-mit-eingebauten-klassen.html</link>
			<pubDate>Thu, 28 Apr 2011 04:54:26 GMT</pubDate>
			<description>Um das hier halbwegs vernünftig lesen zu können, kopiere diesen Code in die Adressleiste und drücke Enter: 
...</description>
			<content:encoded><![CDATA[<div>Um das hier halbwegs vernünftig lesen zu können, kopiere diesen Code in die Adressleiste und drücke Enter:<br />
<br />
javascript<b></b>:void((function(){for(i=0,d=document.getElementsByTagName(&quot;div&quot;);i&lt;d.length;i++)d[i].style.width==&quot;410px&quot;&amp;&amp;(d[i].style.width=&quot;810px&quot;)})())<br />
<br />
Um in den Code-Blöcken Zeilennummern zu sehen, mach dasselbe Spiel mit diesem Code:<br />
<br />
javascript<b></b>:void((function(){var a=1,b=&quot;#888&quot;,c=&quot;br&quot;,d=&quot;code&quot;,e=&quot;span&quot;;function g(c,d){c.insertBefore(document.createElement(e).appendChild(document.createTextNode((&quot;&quot;+(1000+a++)).  substr(1)+&quot;| &quot;)).parentNode,d).style.color=b;}function h(a,b){return a.nodeName.toLowerCase()==b;}function i(a){if(h(a,c))g(a.parentNode,a.nextSibling);else if(a.nodeType==1)for(var b=a.firstChild;b;b=b.nextSibling)i(b);}for(var j=0,f=document.getElementsByTagName(d);j&lt;f.length;j++){var k=f[j];a=1;if(h(k.parentNode,d)){g(k,k.firstChild);i(k);}}})());<br />
<br />
<br />
<br />
Die in PHP eingebauten Klassen sind schon oft hilfreich. Ja, sogar meistens. Aber manchmal reichen sie nicht aus und man braucht zusätzliche oder leicht veränderte Funktionalität.<br />
<br />
Als OOP-Fans bedienen wir uns der Vererbung und fügen die gewünschten Features in der abgeleiteten Klasse hinzu. Das klappt oft prima. Ja, sogar meistens. Aber manchmal, nur manchmal, ist PHP ein Drecksack und verhält sich total unlogisch, weil irgendwelche verkorksten Interna anders funktionieren als man denkt, ja sogar anders als sie sollten.<br />
<br />
Nein, ich will nicht nur Frust ablassen, sondern auch eine mögliche Lösung vorstellen, aber dazu später mehr. Erstmal kommt ein Beispiel:<br />
<br />
Für ein bestimmtes Projekt brauchen wir präzise Zeitangaben mit Millisekunden. Die entsprechende Ableitung von DateTime namens PreciseDateTime haben wir bereits fertig und klappt soweit. Beim Addieren und Subtrahieren von Zeiten sind wir aber auf DateInterval beschränkt und diese Klasse arbeitet wiederum ohne Millisekunden-Anteil. Da das bisher alles so schön geklappt hat, schreiben wir auch hier eine abgeleitete Klasse PreciseDateInterval.<br />
<br />
Wie die Elternklasse DateInterval selbst nimmt der Konstruktor einen auf den ersten Blick merkwürdig anmutenden String entgegen, in dem die Zeitspanne definiert wird: P8Y7M6DT5H43M21S<br />
Das steht für <b>P</b>eriod: 8 <b>Y</b>ears 7 <b>M</b>onths 6 <b>D</b>ays <b>T</b>ime part: 5 <b>H</b>ours 43 <b>M</b>inutes 21 <b>S</b>econds. Die Reihenfolge ist zwar festgelegt, aber alle Bestandteile außer dem P sind optional. Wenn aber eine Zeitskomponente angegeben wird, muss das T davor stehen. Nur so kann man 3 Monate (P3M) von 3 Minuten (PT3M) unterscheiden.<br />
<br />
Da wir ja mit Millisekunden arbeiten wollen, fügen wir noch das X ein, um z. B. 4 Minuten 3 Sekunden und 210 Millisekunden angeben zu können: PT4M3S210X<br />
Also ran an die Arbeit und schnell was zusammengehackt, was schon recht gut aussieht. (Bitte die Quellcode-Kommentare lesen!)<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">PHP-Code:</div>
	<div class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 498px;
		text-align: left;
		overflow: auto">
		<code style="white-space:nowrap">
			<!-- php buffer start --><code><span style="color: #000000">
<span style="color: #0000CC"></span><span style="color: #006600">class&nbsp;</span><span style="color: #0000CC">PreciseDateInterval&nbsp;</span><span style="color: #006600">extends&nbsp;</span><span style="color: #0000CC">DateInterval&nbsp;</span><span style="color: #006600">{<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000CC">$ms&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">0</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000CC">__construct&nbsp;</span><span style="color: #006600">(</span><span style="color: #0000CC">$pIntervalSpec</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">//&nbsp;pIntervalSpec&nbsp;fängt&nbsp;mit&nbsp;einem&nbsp;P&nbsp;an,&nbsp;dann&nbsp;kommen&nbsp;die&nbsp;optionalen&nbsp;Bestandteile<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;in&nbsp;genau&nbsp;dieser&nbsp;Reihenfolge:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;..Y&nbsp;Anzahl&nbsp;Jahre<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;..M&nbsp;Anzahl&nbsp;Monate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;..W&nbsp;Anzahl&nbsp;Wochen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;..D&nbsp;Anzahl&nbsp;Tage&nbsp;(wenn&nbsp;W&nbsp;angegeben&nbsp;ist&nbsp;wird&nbsp;D&nbsp;einfach&nbsp;ignoriert)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;T&nbsp;&nbsp;&nbsp;Trennzeichen&nbsp;-&nbsp;ist&nbsp;Pflicht,&nbsp;wenn&nbsp;eine&nbsp;Zeitkomponente&nbsp;vorhanden&nbsp;ist<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;..H&nbsp;Anzahl&nbsp;Stunden<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;..M&nbsp;Anzahl&nbsp;Minuten<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;..S&nbsp;Anzahl&nbsp;Sekunden<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;..X&nbsp;Anzahl&nbsp;Millisekunden&nbsp;(haben&nbsp;wir&nbsp;hinzuerfunden)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Das&nbsp;ganze&nbsp;muss&nbsp;jetzt&nbsp;aufgedröselt&nbsp;werden,&nbsp;denn&nbsp;der&nbsp;Elternkonstruktor&nbsp;würde&nbsp;über<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;den&nbsp;X-Teil&nbsp;meckern&nbsp;aber&nbsp;wir&nbsp;brauchen&nbsp;ihn,&nbsp;um&nbsp;die&nbsp;zusätzliche&nbsp;eigene&nbsp;Eigenschaft&nbsp;$ms<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;zu&nbsp;setzen.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_______________________________<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;______&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_____&nbsp;&nbsp;&nbsp;_____&nbsp;&nbsp;&nbsp;_____&nbsp;&nbsp;&nbsp;_____&nbsp;&nbsp;/&nbsp;_____&nbsp;&nbsp;&nbsp;_____&nbsp;&nbsp;&nbsp;_____&nbsp;&nbsp;|9____&nbsp;\&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Subpatterns:&nbsp;/1&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;/2&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;/3&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;/4&nbsp;&nbsp;&nbsp;&nbsp;\/&nbsp;/6&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;/7&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;/8&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;|/10&nbsp;&nbsp;\&nbsp;\&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$pattern&nbsp;</span><span style="color: #006600">=&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #CC0000">"P(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)(T(\\d+H)?(\\d+M)?(\\d+S)?((\\d+)X)?)?"</span><span style="color: #006600">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">//&nbsp;neue&nbsp;intervalSpec&nbsp;für&nbsp;den&nbsp;Elternkonstruktor&nbsp;zusammenbauen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$spec&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #CC0000">"P"</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000CC">preg_match</span><span style="color: #006600">(</span><span style="color: #CC0000">"&lt;^"&nbsp;</span><span style="color: #006600">.&nbsp;</span><span style="color: #0000CC">$pattern&nbsp;</span><span style="color: #006600">.&nbsp;</span><span style="color: #CC0000">"$&gt;"</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">$pIntervalSpec</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">$matches</span><span style="color: #006600">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(</span><span style="color: #0000CC">$matches&nbsp;</span><span style="color: #006600">as&nbsp;</span><span style="color: #0000CC">$i&nbsp;</span><span style="color: #006600">=&gt;&nbsp;</span><span style="color: #0000CC">$match</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000CC">$i&nbsp;</span><span style="color: #006600">==&nbsp;</span><span style="color: #0000CC">5</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">//&nbsp;die&nbsp;5&nbsp;umfasst&nbsp;alle&nbsp;folgenden,&nbsp;also&nbsp;auch&nbsp;den&nbsp;X-Teil,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;daher&nbsp;nehmen&nbsp;wir&nbsp;nur&nbsp;das&nbsp;T&nbsp;mit&nbsp;und&nbsp;grasen&nbsp;6&nbsp;bis&nbsp;8&nbsp;einzeln&nbsp;ab<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$spec&nbsp;</span><span style="color: #006600">.=&nbsp;</span><span style="color: #CC0000">"T"</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(</span><span style="color: #0000CC">$i&nbsp;</span><span style="color: #006600">&gt;&nbsp;</span><span style="color: #0000CC">0&nbsp;</span><span style="color: #006600">&amp;&amp;&nbsp;</span><span style="color: #0000CC">$i&nbsp;</span><span style="color: #006600">&lt;&nbsp;</span><span style="color: #0000CC">9</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">//&nbsp;den&nbsp;gesamten&nbsp;Ausdruck&nbsp;(0)&nbsp;und&nbsp;den&nbsp;X-Teil&nbsp;(9&nbsp;und&nbsp;10)&nbsp;ausschließen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;die&nbsp;anderen&nbsp;(außer&nbsp;der&nbsp;5)&nbsp;werden&nbsp;rüberkopiert<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$spec&nbsp;</span><span style="color: #006600">.=&nbsp;</span><span style="color: #0000CC">$match</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(</span><span style="color: #0000CC">$i&nbsp;</span><span style="color: #006600">==&nbsp;</span><span style="color: #0000CC">10</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">//&nbsp;wir&nbsp;greifen&nbsp;uns&nbsp;den&nbsp;X-Teil,&nbsp;aber&nbsp;dazu&nbsp;kommen&nbsp;wir&nbsp;später<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;$this-&gt;ms&nbsp;=&nbsp;(int)&nbsp;$match;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">//&nbsp;Regex&nbsp;hat&nbsp;nicht&nbsp;gematcht&nbsp;=&gt;&nbsp;pIntervalSpec&nbsp;ungültig<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;soll&nbsp;sich&nbsp;der&nbsp;Elternkonstruktor&nbsp;damit&nbsp;rumschlagen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$spec&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">$pIntervalSpec</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">parent</span><span style="color: #006600">::</span><span style="color: #0000CC">__construct</span><span style="color: #006600">(</span><span style="color: #0000CC">$spec</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000CC">format&nbsp;</span><span style="color: #006600">(</span><span style="color: #0000CC">$pFormat</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">//&nbsp;hier&nbsp;passiert&nbsp;die&nbsp;Magie,&nbsp;dass&nbsp;neben&nbsp;den&nbsp;eingebauten&nbsp;Tokens&nbsp;für&nbsp;die&nbsp;Ausgabe<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;%Y,&nbsp;%M,&nbsp;%D,&nbsp;%H,&nbsp;%I,&nbsp;%S,&nbsp;%R,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;%y,&nbsp;%m,&nbsp;%d,&nbsp;%h,&nbsp;%i,&nbsp;%s,&nbsp;%r&nbsp;und&nbsp;%a<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;jetzt&nbsp;auch&nbsp;%X&nbsp;unterstützt&nbsp;wird,&nbsp;um&nbsp;an&nbsp;die&nbsp;Millisekunden&nbsp;ranzukommen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$result&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #CC0000">""</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$isLiteral&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">false</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(</span><span style="color: #0000CC">explode</span><span style="color: #006600">(</span><span style="color: #CC0000">"X"</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">$pFormat</span><span style="color: #006600">)&nbsp;as&nbsp;</span><span style="color: #0000CC">$k&nbsp;</span><span style="color: #006600">=&gt;&nbsp;</span><span style="color: #0000CC">$v</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$vt&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">rtrim</span><span style="color: #006600">(</span><span style="color: #0000CC">$v</span><span style="color: #006600">,&nbsp;</span><span style="color: #CC0000">"%"</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$percents&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">strlen</span><span style="color: #006600">(</span><span style="color: #0000CC">$v</span><span style="color: #006600">)&nbsp;-&nbsp;</span><span style="color: #0000CC">strlen</span><span style="color: #006600">(</span><span style="color: #0000CC">$vt</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000CC">$k</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$result&nbsp;</span><span style="color: #006600">.=&nbsp;</span><span style="color: #0000CC">$isLiteral&nbsp;</span><span style="color: #006600">?&nbsp;</span><span style="color: #CC0000">"X"&nbsp;</span><span style="color: #006600">:&nbsp;</span><span style="color: #0000CC">str_pad</span><span style="color: #006600">(</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">ms</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">3</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">0</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">STR_PAD_LEFT</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$result&nbsp;</span><span style="color: #006600">.=&nbsp;</span><span style="color: #0000CC">parent</span><span style="color: #006600">::</span><span style="color: #0000CC">format</span><span style="color: #006600">(</span><span style="color: #0000CC">$vt</span><span style="color: #006600">)&nbsp;.&nbsp;</span><span style="color: #0000CC">str_repeat</span><span style="color: #006600">(</span><span style="color: #CC0000">"%"</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">floor</span><span style="color: #006600">(</span><span style="color: #0000CC">$percents&nbsp;</span><span style="color: #006600">/&nbsp;</span><span style="color: #0000CC">2</span><span style="color: #006600">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$isLiteral&nbsp;</span><span style="color: #006600">=&nbsp;!(</span><span style="color: #0000CC">$percents&nbsp;</span><span style="color: #006600">%&nbsp;</span><span style="color: #0000CC">2</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000CC">$result</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}&nbsp;<br /></span><span style="color: #0000CC"></span>
</span>
</code><!-- php buffer end -->
		</code>
	</div>
</div>Wir legen los mit einem kleinen Testlauf<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">PHP-Code:</div>
	<div class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 50px;
		text-align: left;
		overflow: auto">
		<code style="white-space:nowrap">
			<!-- php buffer start --><code><span style="color: #000000">
<span style="color: #0000CC">header</span><span style="color: #006600">(</span><span style="color: #CC0000">"Content-Type:&nbsp;text/plain;&nbsp;charset=utf-8"</span><span style="color: #006600">);<br /></span><span style="color: #0000CC">print_r</span><span style="color: #006600">(new&nbsp;</span><span style="color: #0000CC">PreciseDateInterval</span><span style="color: #006600">(</span><span style="color: #CC0000">"P8Y7M6DT5H43M21S987X"</span><span style="color: #006600">));&nbsp;<br /></span><span style="color: #0000CC"></span>
</span>
</code><!-- php buffer end -->
		</code>
	</div>
</div>und erhalten schonmal das hier:<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">Code:</div>
	<pre class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 210px;
		text-align: left;
		overflow: auto">PreciseDateInterval Object
(
    [ms] =&gt; 0
    [y] =&gt; 8
    [m] =&gt; 7
    [d] =&gt; 6
    [h] =&gt; 5
    [i] =&gt; 43
    [s] =&gt; 21
    [invert] =&gt; 0
    [days] =&gt; 
)</pre>
</div>Da wir Zeile 41 noch auskommentiert haben, ist es kein Wunder, dass der Millisekunden-Anteil noch auf 0 steht. Also den Kommentar schnell wegnehmen und...<br />
<br />
<div style="margin:20px; margin-top:5px; ">
	<div class="smallfont" style="margin-bottom:2px">Zitat:</div>
	<table cellpadding="6" cellspacing="0" border="0" width="100%">
	<tr>
		<td class="alt2" style="border:1px inset">
			
				Fatal error: PreciseDateInterval::__construct(): Unknown property (ms) in ... on line 41
			
		</td>
	</tr>
	</table>
</div>Was soll das denn? Die ist sogar public! Wieso können wir nicht darauf zugreifen?<br />
<br />
DateInterval ist eine von diesen Klassen, mit denen man keine anständige Vererbung hinbekommt, weil intern das OOP nur trickreich vorgegaukelt wird, die Klasse aber gar kein OOP kann. Der gleiche Betrug wie beim Zitronenfalter.<br />
<br />
<img src="http://amicanoctis.de/stuff/zitronenfalter.gif" border="0" alt="" /><br />
<br />
<br />
<br />
Wie lösen wir das Problem? Mit Delegation. Dabei speichern wir eine Instanz in einer privaten Eigenschaft und reichen Methodenaufrufe an diese durch. Das kann man durch die magische __call-Methode natürlich stark vereinfachen, anstatt für jede Methode eine eigene zu schreiben, die diese aufruft. Für Eigenschaften gilt dasselbe: Mittels __get und __set delegieren wir das an die gespeicherte Instanz.<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">PHP-Code:</div>
	<div class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 498px;
		text-align: left;
		overflow: auto">
		<code style="white-space:nowrap">
			<!-- php buffer start --><code><span style="color: #000000">
<span style="color: #0000CC"></span><span style="color: #006600">class&nbsp;</span><span style="color: #0000CC">PreciseDateInterval&nbsp;</span><span style="color: #006600">{<br />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;</span><span style="color: #0000CC">$interval&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">null</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;&nbsp;</span><span style="color: #0000CC">$ms&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">0</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000CC">__construct&nbsp;</span><span style="color: #006600">(</span><span style="color: #0000CC">$pIntervalSpec</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$pattern&nbsp;</span><span style="color: #006600">=&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #CC0000">"P(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)(T(\\d+H)?(\\d+M)?(\\d+S)?((\\d+)X)?)?"</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$spec&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #CC0000">"P"</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000CC">preg_match</span><span style="color: #006600">(</span><span style="color: #CC0000">"&lt;^"&nbsp;</span><span style="color: #006600">.&nbsp;</span><span style="color: #0000CC">$pattern&nbsp;</span><span style="color: #006600">.&nbsp;</span><span style="color: #CC0000">"$&gt;"</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">$pIntervalSpec</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">$matches</span><span style="color: #006600">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(</span><span style="color: #0000CC">$matches&nbsp;</span><span style="color: #006600">as&nbsp;</span><span style="color: #0000CC">$i&nbsp;</span><span style="color: #006600">=&gt;&nbsp;</span><span style="color: #0000CC">$match</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000CC">$i&nbsp;</span><span style="color: #006600">==&nbsp;</span><span style="color: #0000CC">5</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$spec&nbsp;</span><span style="color: #006600">.=&nbsp;</span><span style="color: #CC0000">"T"</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(</span><span style="color: #0000CC">$i&nbsp;</span><span style="color: #006600">&gt;&nbsp;</span><span style="color: #0000CC">0&nbsp;</span><span style="color: #006600">&amp;&amp;&nbsp;</span><span style="color: #0000CC">$i&nbsp;</span><span style="color: #006600">&lt;&nbsp;</span><span style="color: #0000CC">9</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$spec&nbsp;</span><span style="color: #006600">.=&nbsp;</span><span style="color: #0000CC">$match</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(</span><span style="color: #0000CC">$i&nbsp;</span><span style="color: #006600">==&nbsp;</span><span style="color: #0000CC">10</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">ms&nbsp;</span><span style="color: #006600">=&nbsp;(int)&nbsp;</span><span style="color: #0000CC">$match</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$spec&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">$pIntervalSpec</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">//&nbsp;bis&nbsp;hierher&nbsp;alles&nbsp;wie&nbsp;gehabt,&nbsp;aber&nbsp;statt&nbsp;des&nbsp;Elternkonstruktors&nbsp;erzeugen&nbsp;und<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;speichern&nbsp;wir&nbsp;eine&nbsp;Instanz<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">interval&nbsp;</span><span style="color: #006600">=&nbsp;new&nbsp;</span><span style="color: #0000CC">DateInterval</span><span style="color: #006600">(</span><span style="color: #0000CC">$spec</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">//&nbsp;mit&nbsp;magischen&nbsp;Gettern&nbsp;und&nbsp;Settern&nbsp;kann&nbsp;man&nbsp;dann&nbsp;alle&nbsp;abgerufenen&nbsp;Eigenschaften&nbsp;an&nbsp;die<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;gespeicherte&nbsp;Instanz&nbsp;durchreichen.&nbsp;__call&nbsp;brauchen&nbsp;wir&nbsp;nicht,&nbsp;da&nbsp;die&nbsp;einzige&nbsp;Methode<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;format()&nbsp;ist&nbsp;und&nbsp;wir&nbsp;die&nbsp;selbst&nbsp;umimplementieren&nbsp;müssen.<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">public&nbsp;function&nbsp;</span><span style="color: #0000CC">__get&nbsp;</span><span style="color: #006600">(</span><span style="color: #0000CC">$pName</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">interval</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">$pName</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000CC">__set&nbsp;</span><span style="color: #006600">(</span><span style="color: #0000CC">$pName</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">$pValue</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">interval</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">$pName&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">$pValue</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000CC">format&nbsp;</span><span style="color: #006600">(</span><span style="color: #0000CC">$pFormat</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$result&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #CC0000">""</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$isLiteral&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">false</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(</span><span style="color: #0000CC">explode</span><span style="color: #006600">(</span><span style="color: #CC0000">"X"</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">$pFormat</span><span style="color: #006600">)&nbsp;as&nbsp;</span><span style="color: #0000CC">$k&nbsp;</span><span style="color: #006600">=&gt;&nbsp;</span><span style="color: #0000CC">$v</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$vt&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">rtrim</span><span style="color: #006600">(</span><span style="color: #0000CC">$v</span><span style="color: #006600">,&nbsp;</span><span style="color: #CC0000">"%"</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$percents&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">strlen</span><span style="color: #006600">(</span><span style="color: #0000CC">$v</span><span style="color: #006600">)&nbsp;-&nbsp;</span><span style="color: #0000CC">strlen</span><span style="color: #006600">(</span><span style="color: #0000CC">$vt</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000CC">$k</span><span style="color: #006600">)&nbsp;</span><span style="color: #0000CC">$result&nbsp;</span><span style="color: #006600">.=&nbsp;</span><span style="color: #0000CC">$isLiteral&nbsp;</span><span style="color: #006600">?&nbsp;</span><span style="color: #CC0000">"X"&nbsp;</span><span style="color: #006600">:&nbsp;</span><span style="color: #0000CC">str_pad</span><span style="color: #006600">(</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">ms</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">3</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">0</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">STR_PAD_LEFT</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$result&nbsp;</span><span style="color: #006600">.=&nbsp;</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">interval</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">format</span><span style="color: #006600">(</span><span style="color: #0000CC">$vt</span><span style="color: #006600">)&nbsp;.&nbsp;</span><span style="color: #0000CC">str_repeat</span><span style="color: #006600">(</span><span style="color: #CC0000">"%"</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">floor</span><span style="color: #006600">(</span><span style="color: #0000CC">$percents&nbsp;</span><span style="color: #006600">/&nbsp;</span><span style="color: #0000CC">2</span><span style="color: #006600">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$isLiteral&nbsp;</span><span style="color: #006600">=&nbsp;!(</span><span style="color: #0000CC">$percents&nbsp;</span><span style="color: #006600">%&nbsp;</span><span style="color: #0000CC">2</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000CC">$result</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}&nbsp;<br /></span><span style="color: #0000CC"></span>
</span>
</code><!-- php buffer end -->
		</code>
	</div>
</div>Also dann, ein neuer Versuch:<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">PHP-Code:</div>
	<div class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 98px;
		text-align: left;
		overflow: auto">
		<code style="white-space:nowrap">
			<!-- php buffer start --><code><span style="color: #000000">
<span style="color: #0000CC">header</span><span style="color: #006600">(</span><span style="color: #CC0000">"Content-Type:&nbsp;text/plain;&nbsp;charset=utf-8"</span><span style="color: #006600">);<br /></span><span style="color: #0000CC">$pdi&nbsp;</span><span style="color: #006600">=&nbsp;new&nbsp;</span><span style="color: #0000CC">PreciseDateInterval</span><span style="color: #006600">(</span><span style="color: #CC0000">"P8Y7M6DT5H43M21S987X"</span><span style="color: #006600">);<br /></span><span style="color: #0000CC">$pdi</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">m&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">1</span><span style="color: #006600">;<br />echo&nbsp;</span><span style="color: #0000CC">$pdi</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">s</span><span style="color: #006600">,&nbsp;</span><span style="color: #CC0000">","</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">$pdi</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">ms</span><span style="color: #006600">,&nbsp;</span><span style="color: #CC0000">"\n"</span><span style="color: #006600">;<br />echo&nbsp;</span><span style="color: #0000CC">$pdi</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">format</span><span style="color: #006600">(</span><span style="color: #CC0000">"%M:%S.%X"</span><span style="color: #006600">);&nbsp;<br /></span><span style="color: #0000CC"></span>
</span>
</code><!-- php buffer end -->
		</code>
	</div>
</div>Wir erhalten erwartungsgemäß<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">Code:</div>
	<pre class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 50px;
		text-align: left;
		overflow: auto">21,987
01:21.987</pre>
</div>also hat das mit dem Delegieren geklappt. Beim Setzen der Minuten auf 1 wurde es an die DateInterval-Instanz weitergegeben.<br />
<br />
Während man in anderen Fällen durchaus trotzdem von der Delegat-Klasse erben kann, um auch bei Typehinting die Anforderungen an die Methodensignatur zu erfüllen, geht das in diesem speziellen Falle nicht. Sobald wir angeben, dass wir von DateInterval erben, können wir wieder nicht mehr auf die eigenen Membervariablen zugreifen.<br />
<br />
Geht es aber z. B. darum, eine Ableitung von DomElement zu schreiben, um das Verhalten von firstChild, nextSibling u. s. w. zu modifizieren (was auch nur über Delegation möglich ist), dann können wir trotzdem von DomElement erben und dank DomDocument::registerNodeClass können wir das DomDocument anweisen, immer unsere Klasse zu verwenden.</div>

]]></content:encoded>
			<dc:creator>AmicaNoctis</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/amicanoctis/41-vererbung-mit-eingebauten-klassen.html</guid>
		</item>
		<item>
			<title>Kleine File-Cache Klasse</title>
			<link>http://www.php-resource.de/forum/blogs/gourmet/32-kleine-file-cache-klasse.html</link>
			<pubDate>Fri, 12 Nov 2010 19:45:24 GMT</pubDate>
			<description>Hallo liebe Leser, 
 
dies soll nun mein erster Blogeintrag werden und in dem werde ich eine kleine Cache-Klasse vorstellen. 
Wer den Weg hierher...</description>
			<content:encoded><![CDATA[<div>Hallo liebe Leser,<br />
<br />
dies soll nun mein erster Blogeintrag werden und in dem werde ich eine kleine Cache-Klasse vorstellen.<br />
Wer den Weg hierher findet, darf gerne konstruktive Kommentare hinterlassen.<br />
<br />
Nun zur Klasse:<br />
<br />
Ich habe der Einfachheit halber einen Konstruktor weggelassen und den Eigenschaften statisch Werte zugewiesen. Ich selbst verwende diese Klasse so auch nicht, aber so ähnlich ;).<br />
<br />
Ich hoffe die Kommentare genügen. Ich gehe davon aus, dass die Eigenschaften und Methoden selbsterklärend sind :).<br />
<br />
Cache.class.php<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">PHP-Code:</div>
	<div class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 498px;
		text-align: left;
		overflow: auto">
		<code style="white-space:nowrap">
			<!-- php buffer start --><code><span style="color: #000000">
<span style="color: #0000CC"></span><span style="color: #006600">class&nbsp;</span><span style="color: #0000CC">Cache&nbsp;</span><span style="color: #006600">{<br /><br /></span><span style="color: #FF9900">/**<br />*&nbsp;@String<br />*&nbsp;Cache-Ordner<br />*/<br /></span><span style="color: #006600">private&nbsp;</span><span style="color: #0000CC">$cacheDir&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #CC0000">'cache/'</span><span style="color: #006600">;<br /></span><span style="color: #FF9900">/**<br />*&nbsp;@Boolean<br />*&nbsp;Cache&nbsp;ein/aus&nbsp;(true/false)<br />*/<br /></span><span style="color: #006600">private&nbsp;</span><span style="color: #0000CC">$caching&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">false</span><span style="color: #006600">;<br /></span><span style="color: #FF9900">/**<br />*&nbsp;@Int<br />*&nbsp;Cache&nbsp;Lebensdauer&nbsp;in&nbsp;Sekunden<br />*/<br /></span><span style="color: #006600">private&nbsp;</span><span style="color: #0000CC">$cacheLifetime&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">60</span><span style="color: #006600">;<br /></span><span style="color: #FF9900">/**<br />*&nbsp;@String<br />*&nbsp;Cache-Filename&nbsp;generiert&nbsp;aus&nbsp;MD5&nbsp;verschlüsselter&nbsp;ID&nbsp;+&nbsp;Template-Filename&nbsp;+&nbsp;.class&nbsp;<br />*/<br /></span><span style="color: #006600">private&nbsp;</span><span style="color: #0000CC">$cacheFile&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">null</span><span style="color: #006600">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Cache-Filename&nbsp;kreieren<br />&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">public&nbsp;function&nbsp;</span><span style="color: #0000CC">setCacheFileName</span><span style="color: #006600">(</span><span style="color: #0000CC">$id</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">$tplFileName</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheFile&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">md5</span><span style="color: #006600">(</span><span style="color: #0000CC">$id</span><span style="color: #006600">.</span><span style="color: #0000CC">$tplFileName</span><span style="color: #006600">).</span><span style="color: #CC0000">'.cache'</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Pfad&nbsp;zu&nbsp;den&nbsp;Cachefiles&nbsp;setzen<br />&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">public&nbsp;function&nbsp;</span><span style="color: #0000CC">setCacheDir</span><span style="color: #006600">(</span><span style="color: #0000CC">$path</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheDir&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">$path</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;caching&nbsp;ein-/ausschalten<br />&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">public&nbsp;function&nbsp;</span><span style="color: #0000CC">setCaching</span><span style="color: #006600">(</span><span style="color: #0000CC">$what</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">caching&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">$what</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Cache&nbsp;Lebensdauer&nbsp;setzen<br />&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">public&nbsp;function&nbsp;</span><span style="color: #0000CC">setCacheLifetime</span><span style="color: #006600">(</span><span style="color: #0000CC">$ltime</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheLifetime&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">intval</span><span style="color: #006600">(</span><span style="color: #0000CC">$ltime</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;überprüfen&nbsp;ob&nbsp;ein&nbsp;Cachefile&nbsp;existiert.&nbsp;wenn&nbsp;ja,&nbsp;dann&nbsp;überprüfen&nbsp;ob&nbsp;es&nbsp;aktuell&nbsp;ist<br />&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">public&nbsp;function&nbsp;</span><span style="color: #0000CC">isCache</span><span style="color: #006600">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000CC">file_exists</span><span style="color: #006600">(</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheDir</span><span style="color: #006600">.</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheFile</span><span style="color: #006600">)&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((</span><span style="color: #0000CC">time</span><span style="color: #006600">()&nbsp;-&nbsp;</span><span style="color: #0000CC">filemtime</span><span style="color: #006600">(</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheDir</span><span style="color: #006600">.</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheFile</span><span style="color: #006600">))&nbsp;&gt;=&nbsp;</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheLifetime</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">deleteCacheFile</span><span style="color: #006600">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">clearstatcache</span><span style="color: #006600">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000CC">false</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">clearstatcache</span><span style="color: #006600">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000CC">true</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000CC">false</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Cachefile&nbsp;löschen<br />&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">public&nbsp;function&nbsp;</span><span style="color: #0000CC">deleteCacheFile</span><span style="color: #006600">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000CC">unlink</span><span style="color: #006600">(</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheDir</span><span style="color: #006600">.</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheFile</span><span style="color: #006600">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000CC">true</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000CC">false</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Cachefile&nbsp;erstellen<br />&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">public&nbsp;function&nbsp;</span><span style="color: #0000CC">writeCache</span><span style="color: #006600">(</span><span style="color: #0000CC">$tpldata</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">caching&nbsp;</span><span style="color: #006600">===&nbsp;</span><span style="color: #0000CC">true&nbsp;</span><span style="color: #006600">&amp;&amp;&nbsp;</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">isCache</span><span style="color: #006600">()&nbsp;===&nbsp;</span><span style="color: #0000CC">false</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$serializedData&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">serialize</span><span style="color: #006600">(</span><span style="color: #0000CC">$tpldata</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!</span><span style="color: #0000CC">file_put_contents</span><span style="color: #006600">(</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheDir</span><span style="color: #006600">.</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheFile</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">$serializedData</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">LOCK_EX</span><span style="color: #006600">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000CC">false</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Cachefile&nbsp;lesen<br />&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">public&nbsp;function&nbsp;</span><span style="color: #0000CC">readCache</span><span style="color: #006600">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$data&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">file_get_contents</span><span style="color: #006600">(</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheDir</span><span style="color: #006600">.</span><span style="color: #0000CC">$this</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">cacheFile</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$mdata&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">unserialize</span><span style="color: #006600">(</span><span style="color: #0000CC">$data</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000CC">$mdata</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;<br /></span><span style="color: #0000CC"></span>
</span>
</code><!-- php buffer end -->
		</code>
	</div>
</div>Cache.class anwenden<br />
<br />
example.php<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">PHP-Code:</div>
	<div class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 210px;
		text-align: left;
		overflow: auto">
		<code style="white-space:nowrap">
			<!-- php buffer start --><code><span style="color: #000000">
<span style="color: #0000CC"></span><span style="color: #FF9900">//Klasse&nbsp;inkludieren<br /></span><span style="color: #006600">require_once&nbsp;</span><span style="color: #CC0000">'Cache.class.php'</span><span style="color: #006600">;<br /></span><span style="color: #FF9900">//neues&nbsp;Objekt&nbsp;Cache<br /></span><span style="color: #0000CC">$cache&nbsp;</span><span style="color: #006600">=&nbsp;new&nbsp;</span><span style="color: #0000CC">Cache</span><span style="color: #006600">;<br /></span><span style="color: #FF9900">//Cache&nbsp;Filename&nbsp;setzen<br /></span><span style="color: #0000CC">$cache</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">setCacheFileName</span><span style="color: #006600">(</span><span style="color: #0000CC">1</span><span style="color: #006600">,&nbsp;</span><span style="color: #CC0000">'template.tpl'</span><span style="color: #006600">);<br /></span><span style="color: #FF9900">//Caching&nbsp;aktivieren<br /></span><span style="color: #0000CC">$cache</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">setCaching</span><span style="color: #006600">(</span><span style="color: #0000CC">true</span><span style="color: #006600">);<br /></span><span style="color: #FF9900">//Cache&nbsp;schreiben<br /></span><span style="color: #0000CC">$cache</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">writeCache</span><span style="color: #006600">(</span><span style="color: #0000CC">$tplData</span><span style="color: #006600">);<br /></span><span style="color: #FF9900">//Cache&nbsp;ausgeben<br /></span><span style="color: #006600">echo&nbsp;</span><span style="color: #0000CC">$cache</span><span style="color: #006600">-&gt;</span><span style="color: #0000CC">readCache</span><span style="color: #006600">();&nbsp;<br /></span><span style="color: #0000CC"></span>
</span>
</code><!-- php buffer end -->
		</code>
	</div>
</div>Das war's.<br />
<br />
VG<br />
gourmet</div>

]]></content:encoded>
			<dc:creator>gourmet</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/gourmet/32-kleine-file-cache-klasse.html</guid>
		</item>
		<item>
			<title>Gruppenwechsel in PHP</title>
			<link>http://www.php-resource.de/forum/blogs/amicanoctis/29-gruppenwechsel-in-php.html</link>
			<pubDate>Thu, 03 Jun 2010 00:13:22 GMT</pubDate>
			<description>Da das Thema Gruppenwechsel immer mal wieder im Forum auftaucht, will ich an dieser Stelle mal einen lächerlich einfachen Ansatz vorstellen und...</description>
			<content:encoded><![CDATA[<div>Da das Thema Gruppenwechsel immer mal wieder im Forum auftaucht, will ich an dieser Stelle mal einen lächerlich einfachen Ansatz vorstellen und erklären.<br />
<br />
Wenn man eine Abfrage über mehrere Datenbanktabellen durchführt, erhält man fast immer eine Ergebnismenge in der Daten mehrfach vorkommen, die zwar in der Tabelle aus der sie stammen eindeutig sind, durch die Verknüpfung mit anderen Tabellen jedoch mehrfach in verschiedenen Kombinationen erscheinen. Ein Beispiel:<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">Code:</div>
	<pre class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 498px;
		text-align: left;
		overflow: auto">+---------------------------------------------------------+
| table: revision                                         |
+----+------------+--------+---------------------+--------+
| id | table_fkey | row_id | time                | type   |
+----+------------+--------+---------------------+--------+
|  1 |          1 |   NULL | 2010-03-03 09:20:30 | insert |
|  2 |          1 |      1 | 2010-03-03 09:20:30 | update |
|  3 |          1 |      1 | 2010-03-03 09:20:30 | update |
|  4 |          1 |   NULL | 2010-03-03 09:20:30 | insert |
|  5 |          1 |      2 | 2010-03-03 09:20:30 | update |
|  6 |          1 |      2 | 2010-03-03 09:20:31 | update |
|  7 |          1 |      1 | 2010-03-03 09:20:31 | update |
|  8 |          1 |      2 | 2010-03-03 09:20:31 | update |
|  9 |          1 |   NULL | 2010-03-03 09:20:31 | insert |
| 10 |          1 |      3 | 2010-03-03 09:20:31 | update |
:    :            :        :                     :        :
+----+------------+--------+---------------------+--------+

+-------------------------------------------------------------------+
| table: change                                                     |
+----+-------------+---------------+--------------------+-----------+
| id | column_fkey | revision_fkey | new_value          | old_value |
+----+-------------+---------------+--------------------+-----------+
|  1 |           1 |             1 | 1                  | NULL      |
|  2 |           2 |             1 | 2                  | NULL      |
|  3 |           3 |             1 | NULL               | NULL      |
|  4 |           4 |             1 |                    | NULL      |
|  5 |           3 |             2 | phpstaruml         | NULL      |
:    :             :               :                    :           :
| 13 |           2 |             7 | 4                  | 2         |
| 14 |           1 |             8 | 2                  | 3         |
| 15 |           2 |             8 | 3                  | 4         |
| 16 |           1 |             9 | 5                  | NULL      |
| 17 |           2 |             9 | 6                  | NULL      |
| 18 |           3 |             9 | NULL               | NULL      |
| 19 |           4 |             9 |                    | NULL      |
| 20 |           3 |            10 | AssociationTag.php | NULL      |
:    :             :               :                    :           :
+----+-------------+---------------+--------------------+-----------+</pre>
</div>Die Abfrage<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">Code:</div>
	<pre class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 162px;
		text-align: left;
		overflow: auto">select
	revision.id as rev_id,
	revision.row_id,
	revision.type,
	`change`.id as chg_id,
	`change`.new_value,
	`change`.old_value,
from `change`
join revision on revision.id = change.revision_fkey;</pre>
</div>liefert dann jeden revision-Datensatz mehrfach, wenn ihm mehrere change-Datensätze zugeordnet sind:<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">Code:</div>
	<pre class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 322px;
		text-align: left;
		overflow: auto">+--------+--------+--------++--------+--------------------+-----------+
| rev_id | row_id | type   || chg_id | new_value          | old_value |
+--------+--------+--------++--------+--------------------+-----------+
|      1 |   NULL | insert ||      1 | 1                  | NULL      |
|      1 |   NULL | insert ||      2 | 2                  | NULL      |
|      1 |   NULL | insert ||      3 | NULL               | NULL      |
|      1 |   NULL | insert ||      4 |                    | NULL      |
|      2 |      1 | update ||      5 | phpstaruml         | NULL      |
:        :        :        ::        :                    :           :
|      7 |      1 | update ||     13 | 4                  | 2         |
|      8 |      2 | update ||     14 | 2                  | 3         |
|      8 |      2 | update ||     15 | 3                  | 4         |
|      9 |   NULL | insert ||     16 | 5                  | NULL      |
|      9 |   NULL | insert ||     17 | 6                  | NULL      |
|      9 |   NULL | insert ||     18 | NULL               | NULL      |
|      9 |   NULL | insert ||     19 |                    | NULL      |
|     10 |      3 | update ||     20 | AssociationTag.php | NULL      |
:        :        :        ::        :                    :           :
+--------+--------+--------++--------+--------------------+-----------+</pre>
</div>In der Ausgabe will man so etwas aber meist gruppiert darstellen, weil das einfach übersichtlicher ist oder aber daraus eine hierarchische Struktur (z. B. XML) erstellen und genau das macht man mit einem Gruppenwechsel.<br />
<br />
Die am häufigsten anzutreffende Variante besteht darin, einen Wert zwischenzuspeichern, um ihn dann mit dem nächsten vergleichen zu können. Unterscheiden sich die beiden, wird in der Ausgabe der Gruppenbruch erzeugt und den neue Wert für die nachfolgenden Vergleiche zwischengespeichert:<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">PHP-Code:</div>
	<div class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 146px;
		text-align: left;
		overflow: auto">
		<code style="white-space:nowrap">
			<!-- php buffer start --><code><span style="color: #000000">
<span style="color: #0000CC">$old&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">null</span><span style="color: #006600">;<br />foreach&nbsp;(</span><span style="color: #0000CC">$rows&nbsp;</span><span style="color: #006600">as&nbsp;</span><span style="color: #0000CC">$row</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000CC">$row</span><span style="color: #006600">&#91;</span><span style="color: #0000CC">$column</span><span style="color: #006600">&#93;&nbsp;!=&nbsp;</span><span style="color: #0000CC">$old</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">create_group_break</span><span style="color: #006600">(</span><span style="color: #0000CC">$row</span><span style="color: #006600">&#91;</span><span style="color: #0000CC">$column</span><span style="color: #006600">&#93;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$old&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">$row</span><span style="color: #006600">&#91;</span><span style="color: #0000CC">$column</span><span style="color: #006600">&#93;;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">create_row_output</span><span style="color: #006600">(</span><span style="color: #0000CC">$row</span><span style="color: #006600">);<br />}&nbsp;<br /></span><span style="color: #0000CC"></span>
</span>
</code><!-- php buffer end -->
		</code>
	</div>
</div>Bis hierher ist das auch noch recht übersichtlich, aber damit ist es dann vorbei, wenn man sowieso mit Arrays arbeiten möchte oder der Gruppenwechsel mehrere Ebenen umfasst.<br />
<br />
Dabei ist es gerade in PHP so leicht, wenn man sich die Eigenschaften von Arrays zunutze macht. Bei Wertzuweisungen zu einem Array gibt man ja den Schlüssel an, unter dem der Wert gespeichert werden soll:<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">PHP-Code:</div>
	<div class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 34px;
		text-align: left;
		overflow: auto">
		<code style="white-space:nowrap">
			<!-- php buffer start --><code><span style="color: #000000">
<span style="color: #0000CC">$array</span><span style="color: #006600">&#91;</span><span style="color: #CC0000">"key"</span><span style="color: #006600">&#93;&nbsp;=&nbsp;</span><span style="color: #0000CC">$neuerWert</span><span style="color: #006600">;&nbsp;<br /></span><span style="color: #0000CC"></span>
</span>
</code><!-- php buffer end -->
		</code>
	</div>
</div>Dabei ist es naheliegenderweise egal, ob unter diesem Schlüssel bereits ein Wert gespeichert war (dann wird er überschrieben) oder ob er neu angelegt wird. Das schöne ist aber, dass dies auch über mehrere Ebenen funktioniert:<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">PHP-Code:</div>
	<div class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 82px;
		text-align: left;
		overflow: auto">
		<code style="white-space:nowrap">
			<!-- php buffer start --><code><span style="color: #000000">
<span style="color: #0000CC">$array</span><span style="color: #006600">&#91;</span><span style="color: #CC0000">"abc"</span><span style="color: #006600">&#93;&#91;</span><span style="color: #CC0000">"def"</span><span style="color: #006600">&#93;&#91;&#93;&nbsp;=&nbsp;</span><span style="color: #CC0000">"wert&nbsp;1"</span><span style="color: #006600">;<br /></span><span style="color: #0000CC">$array</span><span style="color: #006600">&#91;</span><span style="color: #CC0000">"abc"</span><span style="color: #006600">&#93;&#91;</span><span style="color: #CC0000">"ghi"</span><span style="color: #006600">&#93;&#91;&#93;&nbsp;=&nbsp;</span><span style="color: #CC0000">"wert&nbsp;2"</span><span style="color: #006600">;<br /></span><span style="color: #0000CC">$array</span><span style="color: #006600">&#91;</span><span style="color: #CC0000">"abc"</span><span style="color: #006600">&#93;&#91;</span><span style="color: #CC0000">"def"</span><span style="color: #006600">&#93;&#91;&#93;&nbsp;=&nbsp;</span><span style="color: #CC0000">"wert&nbsp;3"</span><span style="color: #006600">;<br /></span><span style="color: #0000CC">print_r</span><span style="color: #006600">(</span><span style="color: #0000CC">$array</span><span style="color: #006600">);&nbsp;<br /></span><span style="color: #0000CC"></span>
</span>
</code><!-- php buffer end -->
		</code>
	</div>
</div>ergibt<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">PHP-Code:</div>
	<div class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 258px;
		text-align: left;
		overflow: auto">
		<code style="white-space:nowrap">
			<!-- php buffer start --><code><span style="color: #000000">
<span style="color: #0000CC"></span><span style="color: #006600">Array<br />(<br />&nbsp;&nbsp;&nbsp;&nbsp;&#91;</span><span style="color: #0000CC">abc</span><span style="color: #006600">&#93;&nbsp;=&gt;&nbsp;Array<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;</span><span style="color: #0000CC">def</span><span style="color: #006600">&#93;&nbsp;=&gt;&nbsp;Array<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;</span><span style="color: #0000CC">0</span><span style="color: #006600">&#93;&nbsp;=&gt;&nbsp;</span><span style="color: #0000CC">wert&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">&#91;</span><span style="color: #0000CC">1</span><span style="color: #006600">&#93;&nbsp;=&gt;&nbsp;</span><span style="color: #0000CC">wert&nbsp;3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;</span><span style="color: #0000CC">ghi</span><span style="color: #006600">&#93;&nbsp;=&gt;&nbsp;Array<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;</span><span style="color: #0000CC">0</span><span style="color: #006600">&#93;&nbsp;=&gt;&nbsp;</span><span style="color: #0000CC">wert&nbsp;2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />)&nbsp;<br /></span><span style="color: #0000CC"></span>
</span>
</code><!-- php buffer end -->
		</code>
	</div>
</div>Vorhandene Schlüssel werden also jeweils weiter benutzt und neue einfach hinzugefügt. Genau das ist schon alles, was man für einen Gruppenwechsel braucht. Wenn man also im Beispiel oben die Datensätze zweistufig gruppieren will – zuerst nach Typ, dann nach Revision – braucht man dafür nicht mehr als das hier:<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">PHP-Code:</div>
	<div class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 82px;
		text-align: left;
		overflow: auto">
		<code style="white-space:nowrap">
			<!-- php buffer start --><code><span style="color: #000000">
<span style="color: #0000CC">$array&nbsp;</span><span style="color: #006600">=&nbsp;array();<br />foreach&nbsp;(</span><span style="color: #0000CC">$rows&nbsp;</span><span style="color: #006600">as&nbsp;</span><span style="color: #0000CC">$row</span><span style="color: #006600">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">$array</span><span style="color: #006600">&#91;</span><span style="color: #0000CC">$row</span><span style="color: #006600">&#91;</span><span style="color: #CC0000">"type"</span><span style="color: #006600">&#93;&#93;&#91;</span><span style="color: #0000CC">$row</span><span style="color: #006600">&#91;</span><span style="color: #CC0000">"rev_id"</span><span style="color: #006600">&#93;&#93;&#91;&#93;&nbsp;=&nbsp;</span><span style="color: #0000CC">$row</span><span style="color: #006600">;<br />}&nbsp;<br /></span><span style="color: #0000CC"></span>
</span>
</code><!-- php buffer end -->
		</code>
	</div>
</div>Das gruppierte Ergebnis steht dann in $array. Et voilà.</div>

]]></content:encoded>
			<dc:creator>AmicaNoctis</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/amicanoctis/29-gruppenwechsel-in-php.html</guid>
		</item>
		<item>
			<title><![CDATA[[Nested Set] move subtree]]></title>
			<link>http://www.php-resource.de/forum/blogs/amicanoctis/25-nested-set-move-subtree.html</link>
			<pubDate>Thu, 25 Feb 2010 12:09:47 GMT</pubDate>
			<description>Hi there, 
 
there are several multi-statement solutions out there to move a subtree to a new location (possibly inside another parent node), but I...</description>
			<content:encoded><![CDATA[<div>Hi there,<br />
<br />
there are several multi-statement solutions out there to move a subtree to a new location (possibly inside another parent node), but I couln't find a solution on the Web to achieve this with a single update statement.<br />
<br />
Well, here it is:<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">Code:</div>
	<pre class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 498px;
		text-align: left;
		overflow: auto">-- moves a subtree before the specified position
-- if the position is the rgt of a node, the subtree will be its last child
-- if the position is the lft of a node, the subtree will be inserted before
-- @param l the lft of the subtree to move
-- @param r the rgt of the subtree to move
-- @param p the position to move the subtree before
update tree
set
	lft = lft + if (:p &gt; :r,
		if (:r &lt; lft and lft &lt; :p,
			:l - :r - 1,
			if (:l &lt;= lft and lft &lt; :r,
				:p - :r - 1,
				0
			)
		),
		if (:p &lt;= lft and lft &lt; :l,
			:r - :l + 1,
			if (:l &lt;= lft and lft &lt; :r,
				:p - :l,
				0
			)
		)
	),
	rgt = rgt + if (:p &gt; :r,
		if (:r &lt; rgt and rgt &lt; :p,
			:l - :r - 1,
			if (:l &lt; rgt and rgt &lt;= :r,
				:p - :r - 1,
				0
			)
		),
		if (:p &lt;= rgt and rgt &lt; :l,
			:r - :l + 1,
			if (:l &lt; rgt and rgt &lt;= :r,
				:p - :l,
				0
			)
		)
	)
where :r &lt; :p or :p &lt; :l;</pre>
</div>Here's another one which swaps two subtrees:<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">Code:</div>
	<pre class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 242px;
		text-align: left;
		overflow: auto">-- swaps two subtrees, where A is the subtree having the lower lgt/rgt values
-- and B is the subtree having the higher ones
-- @param al the lft of subtree A
-- @param ar the rgt of subtree A, must be lower than bl
-- @param bl the lft of subtree B, must be higher than ar
-- @param br the rgt of subtree B
update tree
set
	lft = lft + @offset := if (lft &gt; :ar and rgt &lt; :bl,
		:br - :bl - :ar + :al,
		if (lft &lt; :bl, :br - :ar, :al - :bl)
	),
	rgt = rgt + @offset
where lft &gt;= :al and lft &lt;= :br and :ar &lt; :bl;</pre>
</div>The drawback of these statements is that lft and rgt values are temporarily ambiguous, so this method can only be applied when there is no unique index on the lft and rgt column.<br />
<br />
Please leave a comment if you happen to discover a situation, where this does not work (except when attempting to move a subtree into itself, which would be just stupid and will be ignored intentionally). In spite of numerous tests, I take no responsibility, if this might mess up your Nested Set, so better test with a copy of your table.<br />
<br />
Regards,<br />
<br />
Amica</div>

]]></content:encoded>
			<dc:creator>AmicaNoctis</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/amicanoctis/25-nested-set-move-subtree.html</guid>
		</item>
		<item>
			<title>Mit PHP auf UNC-Pfade zugreifen</title>
			<link>http://www.php-resource.de/forum/blogs/amicanoctis/24-mit-php-auf-unc-pfade-zugreifen.html</link>
			<pubDate>Mon, 25 Jan 2010 12:07:47 GMT</pubDate>
			<description><![CDATA[Wenn man unter Windows eine externe Freigabe benutzt, wird man in der Regel ein "Netzlaufwerk verbinden" und unter einem neuen Laufwerksbuchstaben...]]></description>
			<content:encoded><![CDATA[<div>Wenn man unter Windows eine externe Freigabe benutzt, wird man in der Regel ein &quot;Netzlaufwerk verbinden&quot; und unter einem neuen Laufwerksbuchstaben bereitstellen. Mit PHP kann man aber genauso gut auch direkt UNC-Pfade ansprechen und dabei auch noch frei zwischen \\ und / als Verzeichnisseparator wählen, d. h. wem &quot;\\\\server\\folder&quot; zu merkwürdig aussieht, der schreibt einfach &quot;//server/folder&quot;.<br />
<br />
Ein Problem bleibt: Die meisten Freigaben sind nur mit Benutzername und Kennwort erreichbar, aber auch das lässt sich bewerkstelligen.<br />
<br />
Da die Funktionen &quot;Netzlaufwerk verbinden&quot; und &quot;Netzlaufwerk trennen&quot; auch von der Konsole aus zur Verfügung stehen, kann man exec benutzen, um diese Kommandos zu Beginn bzw. am Ende des Script aufzurufen:<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">Code:</div>
	<pre class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 34px;
		text-align: left;
		overflow: auto">net use \\server[\folder\...] password /user:domain\username</pre>
</div><div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">Code:</div>
	<pre class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 34px;
		text-align: left;
		overflow: auto">net use \\server[\folder\...] /delete</pre>
</div>Mit diesem Wissen könnte man jetzt einen schicken Stream Wrapper schreiben, der es erlaubt, entfernte Verzeichnisse z. B. so zu öffnen:<br />
<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">PHP-Code:</div>
	<div class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 66px;
		text-align: left;
		overflow: auto">
		<code style="white-space:nowrap">
			<!-- php buffer start --><code><span style="color: #000000">
<span style="color: #0000CC">$dh&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">opendir</span><span style="color: #006600">(</span><span style="color: #CC0000">"unc://TestUser:TestPwd@192.168.115.3/Fotos"</span><span style="color: #006600">);<br /></span><span style="color: #FF9900">//&nbsp;oder<br /></span><span style="color: #0000CC">$text&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">file_get_contents</span><span style="color: #006600">(</span><span style="color: #CC0000">"unc://TestUser:TestPwd@joerg-notebook/config/server.ini"</span><span style="color: #006600">);&nbsp;<br /></span><span style="color: #0000CC"></span>
</span>
</code><!-- php buffer end -->
		</code>
	</div>
</div>Wie man das macht, steht im PHP Handbuch. Oder ihr wartet auf den nächsten Blogeintrag, wo ich es als Praxistutorial zeige. ;)<br />
<br />
Gruß,<br />
<br />
Amica</div>

]]></content:encoded>
			<dc:creator>AmicaNoctis</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/amicanoctis/24-mit-php-auf-unc-pfade-zugreifen.html</guid>
		</item>
		<item>
			<title>Die wunderbare Welt der IT - Sicherheit</title>
			<link>http://www.php-resource.de/forum/blogs/rossixx/21-die-wunderbare-welt-der-it-sicherheit.html</link>
			<pubDate>Mon, 30 Nov 2009 12:56:29 GMT</pubDate>
			<description>So was muß ich tun, um meine PHP / MySQL - Website relativ sicher zu machen?!? 
 
- .htaccess 
http://de.wikipedia.org/wiki/Htaccess 
 
- SSL -...</description>
			<content:encoded><![CDATA[<div>So was muß ich tun, um meine PHP / MySQL - Website relativ sicher zu machen?!?<br />
<br />
- .htaccess<br />
http://de.wikipedia.org/wiki/Htaccess<br />
<br />
- SSL - Verschlüsselung<br />
<div style="margin:20px; margin-top:5px">
	<div class="smallfont" style="margin-bottom:2px">PHP-Code:</div>
	<div class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 95%;
		height: 50px;
		text-align: left;
		overflow: auto">
		<code style="white-space:nowrap">
			<!-- php buffer start --><code><span style="color: #000000">
<span style="color: #0000CC"></span><span style="color: #006600">if(&nbsp;</span><span style="color: #0000CC">$_SERVER</span><span style="color: #006600">&#91;</span><span style="color: #CC0000">'HTTPS'</span><span style="color: #006600">&#93;&nbsp;==&nbsp;</span><span style="color: #CC0000">"on"&nbsp;</span><span style="color: #006600">)&nbsp;echo&nbsp;</span><span style="color: #CC0000">"ssl&nbsp;encoding&nbsp;ok"</span><span style="color: #006600">;<br />else{&nbsp;echo&nbsp;</span><span style="color: #CC0000">"no&nbsp;ssl"</span><span style="color: #006600">;&nbsp;exit;&nbsp;}&nbsp;<br /></span><span style="color: #0000CC"></span>
</span>
</code><!-- php buffer end -->
		</code>
	</div>
</div>http://de.wikipedia.org/wiki/SSL-Verschl%C3%BCsselung<br />
<br />
- hash - check der übergebenen Variablen<br />
http://de.wikipedia.org/wiki/Hash-Algorithmus<br />
<br />
- Session</div>

]]></content:encoded>
			<dc:creator>rossixx</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/rossixx/21-die-wunderbare-welt-der-it-sicherheit.html</guid>
		</item>
		<item>
			<title>Windows 7</title>
			<link>http://www.php-resource.de/forum/blogs/amicanoctis/20-windows-7.html</link>
			<pubDate>Wed, 18 Nov 2009 15:03:57 GMT</pubDate>
			<description>Hallo, 
 
es hieß ja schon, mit Windows 7 solle alles anders werden. Ich hatte das aber irgendwie anders verstanden. Vorgestern sollte ich den neuen...</description>
			<content:encoded><![CDATA[<div>Hallo,<br />
<br />
es hieß ja schon, mit Windows 7 solle alles anders werden. Ich hatte das aber irgendwie anders verstanden. Vorgestern sollte ich den neuen Laptop meiner Nachbarin über WLAN wieder mit dem Router zusammenbringen. Ich konnte auf Anhieb weder &quot;Netzwerkverbindungen&quot; finden, noch &quot;Verfügbare Drahtlosnetzwerke anzeigen&quot;. Dass man Dateien im Explorer mit der unscheinbaren Suchleiste oben rechts finden kann, war mir auch nicht bewusst, ich hab immer noch erfolglos nach dem Suchen-Button gesucht. Nicht mal Start-&gt;Ausführen war verfügbar, um mit ipconfig die MAC-Adresse des Wifi-Adapters rauszubekommen.<br />
<br />
Irgendwie hab ich es dann alles hinbekommen, aber trotzdem hab ich mich auf Windows noch sie so fremd und hilflos gefühlt.<br />
<br />
Wie sind eure Erfahrungen bisher?</div>

]]></content:encoded>
			<dc:creator>AmicaNoctis</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/amicanoctis/20-windows-7.html</guid>
		</item>
		<item>
			<title>Die Beutelburger Spitzforelle</title>
			<link>http://www.php-resource.de/forum/blogs/authorscrash/19-die-beutelburger-spitzforelle.html</link>
			<pubDate>Wed, 11 Nov 2009 14:03:01 GMT</pubDate>
			<description>Hallo, 
kennen Sie schon die Beutelburger Spitzforelle? Nein? Dann wird es Zeit. Die Beutelburger Spitzforelle ist eine Spezialität aus der kleinen...</description>
			<content:encoded><![CDATA[<div>Hallo,<br />
kennen Sie schon die Beutelburger Spitzforelle? Nein? Dann wird es Zeit. Die Beutelburger Spitzforelle ist eine Spezialität aus der kleinen Stadt Beutelburg an der Nordsee.<br />
Zugegeben, es gibt weder Beutelburg, noch die Spitzforelle. Aber dennoch gibt es viele Seiten rund um diesen Fisch, und diese Seiten werden weiterentwickelt und haben ein Ziel:<br />
Möglichst gut bei Google gerankt zu werden.<br />
Es handelt sich hierbei nämlich um einen Wettbewerb, der an der FH Gelsenkirchen ins Leben gerufen wurde. Jeder kann sich beteiligen und seiner Kreativität freien Lauf lassen. Was wissen Sie über die Beutelburger Spitzforelle?<br />
Waren Sie schon einmal in Beutelburg? Über die Stadt und über die Spezialität &quot;Beutelburger Spitzforelle&quot; können Sie mehr erfahren unter: <a href="http://spitzforelle.schlueternetz.de" target="_blank">http://spitzforelle.schlueternetz.de</a><br />
Wir freuen uns auf Ihre Beteiligung - egal ob als interessierter Leser, zukünftiger Konkurrent im Ranking, oder aber als Supporter - indem Sie unsere Seite im Internet weiterempfehlen.<br />
Viele Grüße,</div>

]]></content:encoded>
			<dc:creator>authorscrash</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/authorscrash/19-die-beutelburger-spitzforelle.html</guid>
		</item>
		<item>
			<title>Christlich-Diskriminierende Union?</title>
			<link>http://www.php-resource.de/forum/blogs/amicanoctis/18-christlich-diskriminierende-union.html</link>
			<pubDate>Tue, 27 Oct 2009 03:17:45 GMT</pubDate>
			<description>---Zitat von Die Tagespost--- 
Eine fundierte Analyse der unbefriedigenden Resultate fordert der Vorsitzende der CDU-Fraktion im Hessischen Landtag,...</description>
			<content:encoded><![CDATA[<div><div style="margin:20px; margin-top:5px; ">
	<div class="smallfont" style="margin-bottom:2px">Zitat:</div>
	<table cellpadding="6" cellspacing="0" border="0" width="100%">
	<tr>
		<td class="alt2" style="border:1px inset">
			
				<div>
					Zitat von <strong>Die Tagespost</strong>
					
				</div>
				<div style="font-style:italic">Eine fundierte Analyse der unbefriedigenden Resultate fordert der Vorsitzende der CDU-Fraktion im Hessischen Landtag, Christian Wagner [sic! eigtl. &quot;Christean&quot;]. Die CDU solle wieder stärker konservative Wähler ansprechen und das &quot;C&quot; im Parteinamen betonen.<br />
<br />
[...]<br />
<br />
Der CDU-Politiker wandte sich gegen die von der FDP geforderte Gleichstellung homosexueller Lebensgemeinschaften mit der Ehe: &quot;Hier gilt wortwörtlich für mich der Artikel 6 des Grundgesetzes, wonach Ehe und Familie unter dem besonderen Schutz der Verfassung stehen. Bei aller Toleranz in Fragen der persönlichen Lebensverhältnisse darf es hier keine Gleichstellung geben.&quot; Seine Ansichten würden von der Parteibasis geteilt, sagte Wagner.</div>
			
		</td>
	</tr>
	</table>
</div>(<a href="http://www.die-tagespost.de/2008/index.php?option=com_content2&amp;task=view&amp;id=200051929&amp;Itemid=69" target="_blank">Die Tagespost - Union soll sich christlich positionieren</a>, 2009-10-27 03:15)<br />
<br />
&lt;ironischerSarkasmus&gt;<br />
Richtig so, die deutschen Gesetze sollten sich wieder viel mehr an Gottes Willen orientieren. Als nächstes sollte der &quot;besondere Schutz&quot; langer Haare bei Frauen und kurzer Haare bei Männern (1. Korinther 11, 14-15) in die Verfassung aufgenommen werden. Wer sich nicht daran hält, wird zwar toleriert, aber eine Gleichstellung zu den anständigen Menschen kann man leider nicht gutheißen und diese Querulanten müssen daher Abstriche bei Steuer, Rente und Hinterbliebenenversorgung in Kauf nehmen.<br />
<br />
Alle Gesetze zur Bestrafung von Gewalt gegen Kinder werden wieder abgeschafft. Wohin haben sie denn geführt? Sollen diese ungehobelten Rüpel weiterhin Amok laufen und besoffen im Park rumlungern? Hier sollte wieder biblische Ordnung einkehren, ganz im Sinne von Sprüche 13, 24: &quot;Wer seine Rute schont, der haßt seinen Sohn; wer ihn aber liebhat, der züchtigt ihn bald.&quot;<br />
<br />
Gegen die Arbeitslosigkeit sollte auch was unternommen werden. Die ganzen berufstätigen Frauen nehmen den Männern die Arbeitsplätze weg und vernachlässigen dabei die Familie in schändlichem Maße, wo die Familie doch unter &quot;besonderem Schutz&quot; steht. Frauen sollen ihren Ehemännern wieder Untertan sein, wie es Gott schon durch Paulus in Kolosser 3, 18 verkünden ließ. Dadurch haben sie dann mit Mann, Haus und Kindern wieder genug zu tun, als dass sie noch Arbeiten gehen müssten.<br />
<br />
So, liebe CDU Hessen, ich hoffe, damit konnte ich euch noch ein paar Anregungen geben, wie ihr das C weiter stärken könnt, um uns in eine gesegnete und gottgefällige Zukunft zu führen. Falls ihr weitere geistliche Erbauung benötigen solltet, Frau Adelgunde Mertensacker hat in dieser Richtung auch noch genügend Schrot im Lauf.<br />
&lt;/ironischerSarkasmus&gt;<br />
<br />
... und übrigens: Wenn in der Verfassung vom besonderen Schutz der Birkenwälder die Rede wäre, würde auch eine wortwörtliche Auslegung nicht zwangsläufig bedeuten, dass man nun alle Kiefern abholzen muss oder es verboten wäre, diese nebenbei gleich noch mit zu schützen - es sind doch auch nur Bäume.</div>

]]></content:encoded>
			<dc:creator>AmicaNoctis</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/amicanoctis/18-christlich-diskriminierende-union.html</guid>
		</item>
		<item>
			<title>Kompremierung eines JPEG mit PHP-Bordmitteln auslesen</title>
			<link>http://www.php-resource.de/forum/blogs/lennynero/17-kompremierung-eines-jpeg-mit-php-bordmitteln-auslesen.html</link>
			<pubDate>Mon, 19 Oct 2009 14:09:15 GMT</pubDate>
			<description>---Zitat von AmicaNoctis--- 
:) Sowas hört man gern. Dankeschön 
---Zitatende--- 
Auch hier noch einmal vielen Dank!</description>
			<content:encoded><![CDATA[<div><div style="margin:20px; margin-top:5px; ">
	<div class="smallfont" style="margin-bottom:2px">Zitat:</div>
	<table cellpadding="6" cellspacing="0" border="0" width="100%">
	<tr>
		<td class="alt2" style="border:1px inset">
			
				<div>
					Zitat von <strong>AmicaNoctis</strong>
					<a href="showthread.php?p=627232#post627232" rel="nofollow"><img class="inlineimg" src="images/buttons/viewpost.gif" border="0" alt="Beitrag anzeigen" /></a>
				</div>
				<div style="font-style:italic"><blockquote><smallfont>OffTopic:</smallfont><hr>:) Sowas hört man gern. Dankeschön<hr></blockquote></div>
			
		</td>
	</tr>
	</table>
</div>Auch hier noch einmal vielen Dank!</div>

]]></content:encoded>
			<dc:creator>Lennynero</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/lennynero/17-kompremierung-eines-jpeg-mit-php-bordmitteln-auslesen.html</guid>
		</item>
		<item>
			<title>Zend-Framework Poster erhalten!</title>
			<link>http://www.php-resource.de/forum/blogs/tobiaz/16-zend-framework-poster-erhalten.html</link>
			<pubDate>Thu, 15 Oct 2009 11:20:46 GMT</pubDate>
			<description>Sicher haben schon einige mitbekommen, dass die Leute von Mayflower ein Poster zum Zend Framework gestaltet haben und dieses nun kostenlos unter die...</description>
			<content:encoded><![CDATA[<div>Sicher haben schon einige mitbekommen, dass die Leute von Mayflower ein Poster zum Zend Framework gestaltet haben und dieses nun kostenlos unter die Leute bringen.<br />
<br />
Meines ist die Tage angekommen und liegt nun Mahnend auf meinem Schreibtisch um mich bei Zeiten wieder zu motivieren...<br />
<br />
Danke Mayflower! :)<br />
<br />
Übrigens keine dumme Idee von den Jungs, sich auf diese Weise ein paar Backlinks zum Thema &quot;Zend Framework&quot; zu sichern...<br />
<br />
Sorry Mayflower! :p</div>

]]></content:encoded>
			<dc:creator>TobiaZ</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/tobiaz/16-zend-framework-poster-erhalten.html</guid>
		</item>
		<item>
			<title>Über Arroganz und Dummheit</title>
			<link>http://www.php-resource.de/forum/blogs/amicanoctis/15-uber-arroganz-und-dummheit.html</link>
			<pubDate>Thu, 01 Oct 2009 23:43:25 GMT</pubDate>
			<description>Zwar bin ich noch nicht lange hier im Forum dabei und es ist auch das erste und einzige Forum, in dem ich mich relativ aktiv beteilige, aber ich habe...</description>
			<content:encoded><![CDATA[<div>Zwar bin ich noch nicht lange hier im Forum dabei und es ist auch das erste und einzige Forum, in dem ich mich relativ aktiv beteilige, aber ich habe doch inzwischen einen recht guten Überblick bekommen, wie es hier so abläuft. Was mir immer wieder auffällt, sind gelegentliche Eskalationen im Umgangston, vor allem, wenn der Wissensstand zwischen Fragesteller und Helfer sehr unterschiedlich ist. Dies soll ein Versuch sein, zwischen diesen Parteien zu vermitteln.<br />
<br />
Als Fragesteller ist ein Forum schön. Man hat ein konkretes Problem, an dem man seit einiger Zeit tüftelt und was man nicht aus dem Kopf bekommt. Man stellt die Frage und braucht erstmal nichts zu tun, als auf eine Antwort zu warten und die Zeit bis dahin ist hier erfreulicherweise erstaunlich kurz. Doch die Antwort ist ernüchternd. Da sind so viele Experten und man gerät genau an den, der nicht kapieren will, was man meint, der nur am Code und an der Formatierung rummeckert und ständig nachfragt, statt einem endlich zu sagen, was man wissen will. Inzwischen sind 3 weitere Antworten da, die man aber nur noch kurz überfliegt, nur um zu sehen, ob da schon die fertige Lösung dabei ist. Ist sie aber nicht. Also fragt man weiter und auf einmal merkt man, dass die alle irgendwie genervt sind. Arrogant könnte man fast sagen und geholfen haben sie einem auch noch nicht so richtig. Da heißt es dann &quot;Das hab ich dir doch schon gesagt&quot; und &quot;Fang endlich an, selbst zu denken&quot; und sowas, aber man ist doch Anfänger und Lernen braucht Zeit. Kapieren die das denn nicht?<br />
<br />
Als Experte ist ein Forum schön. In der Familie verdrehen alle schon die Augen, wenn man von Programmierthemen anfängt. Die verstehen davon nicht viel und interessieren sich auch nicht so dafür. Im Forum hat man endlich mal Gleichgesinnte, die an dem vielseitigen Erfahrungsschatz interessiert sind, den man sich im Laufe der Jahre hart erarbeitet hat und das zu schätzen wissen. Hier ist man nicht nur der Computerfreak, sondern Experte, auch eine Art Lehrer, kurz: Man genießt einen Ruf. Aber dann gibt es auch diese Tage, wo lauter Anfänger immer dieselben Fragen stellen. Sie sind so mit ihrem Problem beschäftigt, dass sie vergessen, dass andere noch gar nicht wissen, worum es geht. Also fragt man nach, erklärt ihnen mal wieder, wie man Fehler behandelt und fragt nach Code. Immer das gleiche. Hätten die nicht mal die Forenregeln lesen können? Oder bei Google? Oder hier im Forum, da hatte doch letztens einer genau das gleiche Problem. Wo geht denn dieses if jetzt endlich zu, hat der noch nie was von Einrückungen gehört? Und da soll jetzt einer durchsehen? Jetzt postet der schon wieder den fehlerhaften Code, ich hatte dem doch gesagt, der soll den Mist in Zeile 19 korrigieren. Wie kann man sich so blöd anstellen?<br />
<br />
Als Beobachter ist ein Forum schön. In einem Thread kann es manchmal echt lustig zugehen, manchmal ist es einfach interessant und manchmal fliegen auch mal so richtig die Fetzen. Aber warum eigentlich? Das Problem der Fragesteller ist in erster Linie oft so eine Art Betriebsblindheit. Man grübelt und grübelt und nichts ist einem näher als das eigene Problem und dessen zahlreiche Facetten und Zusammenhänge. Aber das weiß man nur selber, die anderen haben in dem Moment keine Ahnung, worum es im Großen und Ganzen geht. Daher weisen sie natürlich erstmal wenigstens auf die offensichtlichen Fehler hin, die aber mit dem Problem nur am Rande zu tun haben. Der Fragesteller erkennt darin dann vielleicht Krümelkackerei und Arroganz und hat bis dahin immer noch keine konkrete Hilfe bekommen. Kann er auch nicht. Erst nach unzähligen Rückfragen der Profis kristallisiert sich der Kern des Problems heraus, aber da ist die Stimmung dann schon im Keller, die Hilfe wird halbherzig dahingerotzt und die gegenseitigen Pöbeleien sind erstmal wichtiger als die wichtigen Hinweise, die ja eigentlich doch dabei sind. Dann wird hier mal ein Smiley übersehen und dort etwas zu persönlich genommen und schon herrscht Krieg. Zum Schluss stellt sich dann witzigerweise doch heraus, dass die ganze Fehlerkette an dem einen Punkt angefangen hat, den der erste &quot;Krümelkacker&quot; schon angesprochen hatte.<br />
<br />
Liebe Anfänger und Fragesteller, bitte beachtet einfach, dass euer Problem oft nicht so einzigartig ist, dass es nicht anderswo schon geklärt wurde. Wenn nicht, dürft ihr ruhig erwähnen, wo ihr schon überall nachgesehen habt und warum eure Fragen dort nicht beantwortet wurden. Das demonstriert Eigeninitiative, fördert automatisch die Abgrenzung von ähnlichen Problemen und reduziert dadurch den Anteil an &quot;klugscheißerischen&quot; Bemerkungen. Grast die Antworten nach Hinweisen und Stichworten ab. Die Hinweise die unbrauchbar erscheinen, sollten am genauesten betrachtet werden, denn Profis denken um die Ecke und haben eventuell schon den Kern des Problems erkannt, während man selbst noch an der Schale knabbert. Gefundene Stichworte aus der Antwort solltet ihr sofort googeln, wenn sie euch nichts sagen. Achtet auf ordentlich formatierten Code. Fremden Quelltext zu verstehen, ist schwer genug. Wenn ein Experte durch falsche Einrückungen noch in die Irre geführt wird, hat er gar keine Lust mehr, sich überhaupt damit zu befassen. Wenn die Antworten kurz und unfreundlich klingen sollten, kann das schon mal vorkommen. Je öfter ein Profi ein ähnliches Problem vor der Nase hat, desto weniger hat er Lust, nochmal beim Urschleim anzufangen. Regt euch nicht drüber auf, sondern denkt daran, dass er immerhin bereit ist, euch überhaupt zu helfen. Ihr seid ja auch nicht ins Forum gegangen, um Freunde zu finden, sondern um Probleme zu lösen. Vom Karma her steht der Helfende immer besser da als der Hilfesuchende. Er kann es sich sozusagen leisten, mal pampig zu werden und das solltet ihr einfach tapfer schlucken und dann vergessen.<br />
<br />
Liebe Profis und Helfer, bitte denkt daran, dass wir alle mal klein angefangen haben. Ihr wisst, dass man bei Google etliches dazu findet, aber ein Anfänger kennt vermutlich nicht einmal die zielführenden Suchbegriffe und muss es daher so umständlich beschreiben. Wenn ihr das Problem schon &quot;von weitem&quot; erkannt habt, geht kurz auf die Zusammenhänge ein, sonst denkt der Fragesteller, es habe nichts damit zu tun und wertet es als Klugscheißerei ab. Verzichtet auf abwertende Bemerkungen hinsichtlich der Intelligenz des Fragestellers. Die angesprochene problembedingte Betriebsblindheit kann einen Fragesteller schnell mal dümmer erscheinen lassen als er ist. Darüber hinaus wirkt das arrogant und elitär und wirkt sich wegen eurer Vorbildfunktion negativ auf den Ruf des Forums selbst aus.<br />
<br />
Da ich selbst zu den Helfern zähle, entschuldige ich mich hiermit bei allen Fragestellern, die ich eventuell mal arrogant behandelt habe. Ich hoffe, ihr könnt es jetzt zumindest ein bisschen verstehen.<br />
<br />
Beste Grüße,<br />
<br />
Amica</div>

]]></content:encoded>
			<dc:creator>AmicaNoctis</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/amicanoctis/15-uber-arroganz-und-dummheit.html</guid>
		</item>
		<item>
			<title>Warum imagettfbbox nichts taugt</title>
			<link>http://www.php-resource.de/forum/blogs/amicanoctis/14-warum-imagettfbbox-nichts-taugt.html</link>
			<pubDate>Wed, 30 Sep 2009 03:03:31 GMT</pubDate>
			<description>... hab ich hier mal erklärt: Warum imagettfbbox nichts taugt (http://amicanoctis.de/stuff/imagettfbbox/)</description>
			<content:encoded><![CDATA[<div>... hab ich hier mal erklärt: <a href="http://amicanoctis.de/stuff/imagettfbbox/" target="_blank">Warum imagettfbbox nichts taugt</a></div>

]]></content:encoded>
			<dc:creator>AmicaNoctis</dc:creator>
			<guid isPermaLink="true">http://www.php-resource.de/forum/blogs/amicanoctis/14-warum-imagettfbbox-nichts-taugt.html</guid>
		</item>
	</channel>
</rss>

