<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>// der php hacker &#187; Theorie</title>
	<atom:link href="http://phphacker.net/category/theorie/feed/" rel="self" type="application/rss+xml" />
	<link>http://phphacker.net</link>
	<description>ein php blog</description>
	<lastBuildDate>Wed, 27 Jan 2010 12:06:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Frankenstein spielen: Objektmutation mit PHP</title>
		<link>http://phphacker.net/2009/05/14/frankenstein-spielen-objektmutation-mit-php/</link>
		<comments>http://phphacker.net/2009/05/14/frankenstein-spielen-objektmutation-mit-php/#comments</comments>
		<pubDate>Thu, 14 May 2009 19:57:43 +0000</pubDate>
		<dc:creator>Cem Derin</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Theorie]]></category>

		<guid isPermaLink="false">http://phphacker.net/?p=888</guid>
		<description><![CDATA[Wagen wir Heute ein Experiment: Ich möchte eine Instanz einer beliebigen Klasse mutieren lassen. Und zwar so, dass am Ende eine Instanz einer vollkommen anderen Klasse dabei herauskommt – die Daten aber immer noch die selben sind.
Wozu man das brauchen könnte? Nehmen wir einfach mal an, wir verwenden eine Bibliothek. Eine Klasse dieser Bibliothek leiten wir [...]]]></description>
			<content:encoded><![CDATA[<p>Wagen wir Heute ein Experiment: Ich möchte eine Instanz einer beliebigen Klasse mutieren lassen. Und zwar so, dass am Ende eine Instanz einer vollkommen anderen Klasse dabei herauskommt – die Daten aber immer noch die selben sind.</p>
<p><span>Wozu man das brauchen könnte? Nehmen wir einfach mal an, wir verwenden eine Bibliothek. Eine Klasse dieser Bibliothek leiten wir ab und fügen ein oder mehrere Methoden hinzu. Korrespondierende Klassen aus der Bibliothek allerdings geben immer eine Instanz der Ursprungsklasse zurück. Wir müssten nun also alle Methoden in denen das der Fall ist kopieren, und die Ursprungsklasse durch unsere Ableitung ersetzen.</span></p>
<p><span><span id="more-888"></span></span></p>
<p><span>Das ist aus mehreren Gründen nicht besonders schlau: Zum einen haben wir eine ganze Menge Duplicate Code (wer das mal in den Untiefen des Zend Frameworks gemacht hat, der wird wissen, was ich meine), zum anderen haben wir ein Problem, sollte genau diese Methode von einem Update betroffen sein. Ohne es zu merken, verwenden wir eine veraltete Methode und sorgen evtl. sogar dafür, dass die Applikation nicht mehr lauffähig ist.</span></p>
<h2><span>Mögliche Lösung: Mutation</span></h2>
<p><span>Wäre es nicht wesentlich bequemer, wenn wir die Methode zwar ableiten, aber nur die Rückgabe der Parent-Methode entgegen nehmen und diese mutieren lassen, bevor wir sie weiterreichen?</span></p>
<p><span>Ein kleines Beispiel. Ein von uns verwendetes Framework hat eine Klasse <em>Baum</em>. Instanzen dieser Klasse haben eine Methode namens <em>holeBlatt</em>, welche eine Instanz der Klasse <em>Blatt</em> zurückliefert.</span></p>
<pre>
<pre class="brush: php">
class Baum {
	public function holeBlatt() {
		/**
		 * Komplexer Algorithmus zum ermitteln des Blattes
		 */
		return new Blatt();
	}
}
</pre>
</pre>
<p><span>Wollen wir nun aber, dass unser Objekt bei besagter Methode eine Instanz der Klasse MeinBlatt zurückgibt, müssen wir auch den Baum ableiten. Viele würden dies wie folgt lösen.</span></p>
<pre>
<pre class="brush: php">
class MeinBaum extends Baum {
	public function holeBlatt() {
		/**
		 * kompletter, komplexe Algorithmus erneut hierher kopiert
		 */
		return new MeinBlatt();
	}
}
</pre>
</pre>
<p><span>Wir sehen, dass wir den kompletten (imaginären) Körper der Methode mitkopieren mussten, und nur am Ende eine andere Instanz zurückgeben.</span></p>
<p><span>Nehmen wir nun an, wir haben eine Funktion namens <em>mutateTo</em>, der man eine Objektinstanz einer beliebigen Klasse sowie einen Klassennamen übergibt, und die diese dann entsprechend „mutieren“ lässt. Dann wäre folgende Vorgehensweise denkbar.</span></p>
<pre>
<pre class="brush: php">
class MeinBaum {
	public function holeBlatt() {
		$return = parent::holeBlatt();
		return mutateTo($return, &#039;MeinBlatt&#039;);
	}
}
</pre>
</pre>
<p><span>Viel cooler. Wir können so gut wie ohne Bedenken das Framework updaten, ohne das unser Code davon beeinflusst wird. Ist das doch der Fall, haben wir wesentlich weniger Code zu durchsuchen. Und wir haben ein paar Wiederholungen verhindert.</span></p>
<p><span>Einfach toll. Wo kann ich diese Funktion kaufen?</span></p>
<h2><span>Serialisierung als Übergangszustand</span></h2>
<p><span>Um das Objekt mutieren zu lassen, müssen wir es dummerweise erst einfrieren. Dazu serialisieren wir das Objekt. Serialisieren wir eine Instanz der Klasse <em>Blatt</em>, so erhalten wir eine Zeichenkette die ungefähr so aussieht.</span></p>
<pre><span>O:5:"Blatt":0:{}</span></pre>
<p><span>Dabei enthält das Objekt keinerlei Informationen. Nehmen wir nun aber einmal an, innerhalb des Objektes wird ein Wert gespeichert, der angibt, ob das Blatt grün oder gelb ist, dann würde unsere Zeichenkette so aussehen.</span></p>
<pre><span>O:5:"Blatt":1:{s:9:"*_color";s:5:"Gruen";}</span></pre>
<p><span>Hier ist also die Interne Objektinformation in unsere Ausgabe mit eingefügt worden – sie wurde serialisiert. Der Aufmerksame Leser wird bemerkt haben, dass in dieser Serialisierung ebenfalls festgehalten ist, um was für eine Objekt-Instanz es sich handelt.</span></p>
<p><span>Ersetzen wir <em>Blatt</em> doch einfach mal gegen <em>MeinBlatt</em>, deserialisieren die Zeichenkette wieder und sehen was passiert.</span></p>
<pre><span>Notice: unserialize() [<span>function.unserialize</span>]: Error at offset 10 of 46 bytes</span></pre>
<p><span>Oh, das hat wohl nicht geklappt. Woran könnte es liegen? Untersuchen wir die Fehlermeldung genauer, dann bemängelt die Funktion <em>unserialize </em>Einen Punkt mitten innerhalb unseres veränderten Klassennamens. Um genau zu sein, die Stelle, an der der ursprüngliche geendet wäre. Das liegt daran, dass vor dem Klassennamen festgehalten wird, wie lange der Klassenname ist. Die Klasse <em>Blatt</em> hat 5 Zeichen, <em>MeinBlatt</em> hingegen hat 9 Zeichen. Verändern wir also auch diesen Wert und wagen einen zweiten Versuch. Kein Fehler. Wir übrprüfen das erstelle Objekt: Und siehe da: Es handelt sich um eine Instanz unserer Klasse. Das funktioniert sogar, wenn unsere Klasse <em>MeinBlatt</em> gar keine Ableitung der Klasse <em>Blatt</em> mehr ist.</span></p>
<h2><span>Frisch aus Dimension X: Mutagen</span></h2>
<p><span>Man verzeihe mir den Verweis auf Helden meiner Kindheit. Wie dem auch sei. Eine konkrete Implementation einer Mutationsfunktion könnte so aussehen.</span></p>
<pre>
<pre class="brush: php">
function mutateTo($object, $newClass) {
	$originalClass = get_class($object);
	$freezed = serialize($object);

	$lookFor = &#039;O:&#039;. strlen($originalClass). 	&#039;:&quot;&#039;. $originalClass 	.&#039;&quot;&#039;;
	$replace = &#039;O:&#039;. strlen($newClass). 		&#039;:&quot;&#039;. $newClass 		.&#039;&quot;&#039;; 

	$manipulated = substr_replace($freezed, $replace, 0, strlen($lookFor));

	return unserialize($manipulated);
}
</pre>
</pre>
<p><span>Ausprobiert, geht. Cool, das war einfach.</span></p>
<h2><span>Das große Aber</span></h2>
<p><span>Tja, leider gibt es immer einen Haken: Alle Referenzen auf dieses Objekt gehen flöten. Falls jemand hier eine Möglichkeit kennt: Ich würde mich freuen, wenn er mir sie nennt. Auch so würde ich mich über Feedback freuen – noch mehr sogar über aktive Mitwirkung <img src='http://phphacker.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://phphacker.net/2009/05/14/frankenstein-spielen-objektmutation-mit-php/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>Kennst du Entwickler, die besser sind als du?</title>
		<link>http://phphacker.net/2009/03/24/kennst-du-entwickler-die-besser-sind-als-du/</link>
		<comments>http://phphacker.net/2009/03/24/kennst-du-entwickler-die-besser-sind-als-du/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 08:40:15 +0000</pubDate>
		<dc:creator>Cem Derin</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Theorie]]></category>

		<guid isPermaLink="false">http://phphacker.net/?p=529</guid>
		<description><![CDATA[Ich habe einen Artikel gelesen, auf den ich mit mehr als nur einem Twitter-Link eingehen will: Are You The Best Developer You Know? Dustin erklärt dort, dass er sich immer für die Jobs entscheidet, wo er das meiste lernen kann bzw. wo er am meisten gefordert wird. Wie auch ich lernt Dustin beim Arbeiten &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe einen Artikel gelesen, auf den ich mit mehr als nur einem <strong><a href="http://twitter.com/unset">Twitter</a></strong>-Link eingehen will: <strong><a href="http://marxsoftware.blogspot.com/2009/03/are-you-best-developer-you-know.html">Are You The Best Developer You Know</a>?</strong> Dustin erklärt dort, dass er sich immer für die Jobs entscheidet, wo er das meiste lernen kann bzw. wo er am meisten gefordert wird. Wie auch ich lernt Dustin beim Arbeiten &#8211; also bei der <em>Anwendung </em>einer neuen Technik, einer neuen <strong>Bibliothek</strong>, eines neuen <strong>Frameworks</strong>, etc. Bei mir ist es sogar so, dass ich ohne <strong>realen Einsatzfall</strong> nicht wüsste, was ich überhaupt entwickeln sollte &#8211; Jenseits von &#8220;Hello, World!&#8221;.</p>
<p>Alerdings finde ich die Aussage, dass man sich einen Job suchen sollte, in dem man mit Leuten zu tun hat, von denen man etwas lernen kann ziemlich interessant. So ist es &#8211; zumindest in Deutschland &#8211; doch eher so, dass die Leute sich Job gerne dannach aussuchen, was sie selbst können um zumindest nicht als derjenige da zu stehen, der am &#8220;wenigsten&#8221; kann.</p>
<p>Das bedeutet jedoch, dass man sich selbst daran hindert sich zu entwickeln; darüberhinaus läuft man auch Gefahr dem Irrglauben zu unterliegen, dass man das gar nicht mehr nötig habe &#8211; immerhin sind die anderen ja noch schlechter. Was dabei rauskommt kann man sich denken: <strong>Schlechte Software, schlechte Entwickler</strong>. Das wird sich auch nicht mehr ändern, denn tatsächlich gute Entwickler werden kein Interesse haben, diesem Team beizutreten. Alles in allem tritt hier ein Ähnlicher Effekt ein wie beim <strong>Anti-Pattern</strong> des <strong><a href="http://de.wikipedia.org/wiki/Anti-Pattern#Meta-Patterns">Programmer <a href="http://de.wikipedia.org/wiki/Anti-Pattern#Meta-Patterns">Experience Clumping</a></a></strong>.</p>
<p>Daher mein abschließender Rat: Versucht immer darauf bedacht zu sein, von Kollegen lernen zu können. Das ist nicht nur persönlich fördernd, sondern sorgt auch für eine ganz andere <strong>Arbeitsmoral</strong>. Darüberhinaus auch ein Aspekt was <strong>Selbstmotivation </strong>angeht. Aber dazu habe ich Morgen noch einen Artikel für euch parat <img src='http://phphacker.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://phphacker.net/2009/03/24/kennst-du-entwickler-die-besser-sind-als-du/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mein Arbeitsplatz (oder: Dinge die man nicht mehr missen will, Teil 2)</title>
		<link>http://phphacker.net/2009/03/22/mein-arbeitsplatz-oder-dinge-die-man-nicht-mehr-missen-will-teil-2/</link>
		<comments>http://phphacker.net/2009/03/22/mein-arbeitsplatz-oder-dinge-die-man-nicht-mehr-missen-will-teil-2/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 15:19:27 +0000</pubDate>
		<dc:creator>Cem Derin</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Freelancing]]></category>
		<category><![CDATA[Theorie]]></category>

		<guid isPermaLink="false">http://phphacker.net/?p=493</guid>
		<description><![CDATA[Ich möchte heute mal meiner exhibitionistischen Ader freien Lauf lassen, und euch einen Blick auf meinen Arbeitsplatz erlauben. Keine Sorge, ihr werdet hier keine Fotos von meinem Schreibtisch bekommen, auf dem ich mit meiner handvoll Cinemascope-LCDs protze, meine Designerleuchte zur Schau stelle oder meine teuren Gadgets prominent positioniere. Nein, mir gehts es um die inneren [...]]]></description>
			<content:encoded><![CDATA[<p>Ich möchte heute mal meiner exhibitionistischen Ader freien Lauf lassen, und euch einen Blick auf meinen Arbeitsplatz erlauben. Keine Sorge, ihr werdet hier keine Fotos von meinem Schreibtisch bekommen, auf dem ich mit meiner handvoll <strong>Cinemascope-LCD</strong>s protze, meine <strong>Designerleuchte </strong>zur Schau stelle oder meine teuren <strong>Gadgets </strong>prominent positioniere. Nein, mir gehts es um die inneren Werte: Was nutze ich für <strong>Software</strong>. Dabei überschneidet sich das, was ich privat bzw. zu Zeiten als freiberuflicher Entwickler einsetzte bzw. einsetze und was beruflich auf den Desktop kommt zum allergrößten Teil. Daheim lege ich ein bisschen mehr Wert auf<strong> Open Source </strong>(auch wenn ich hier kein Dogmatiker bin). Im beruflichen Alltag kann &#8211; und will &#8211; man das nicht immer. Wie dem auch sei &#8230;</p>
<p><span id="more-493"></span></p>
<h2>PDT</h2>
<p>Da ich hauptsächlich PHP entwickle, brauche ich eine gute <strong>PHP-IDE</strong>. Lange habe ich mit einem Texteditor der <strong>Syntaxhighlighting </strong>beherrschte gearbeitet, habe <strong>Auto Code Completion</strong> als unnützen Schnickschnack abgetan (da war ich <strong>Virtual Studio</strong> Geschädigt. Da war das Auto Complete früher unter aller Kanone) und habe auf die Integration anderer Tools weitestgehend verzichtet. Wenn man aber das erste mal an schlecht dokumentierten Code von Dritten muss, wird man Code Completion schnell zu schätzen lernen.</p>
<p>Als die beste IDE hat sich meiner Meinung nach das <strong>PDT</strong>-Projekt herausgestellt. Basierend auf <strong>Eclipse </strong>habe ich direkt eine IDE im Haus, die eine ganze Menge anderer Sprachen bedienen kann, wenn sie denn will. Für so gut wie alle weiteren Entwicklungswerkzeuge habe ich <strong>Plug-Ins </strong>um diese direkt zu integrieren und jedes kleine Feature wird man mit der Zeit nicht nur brauchen, sondern nicht mehr missen wollen.</p>
<p>Großartig Plug-Ins verwende ich allerdings nicht, PDT bringt soweit eigentlich alles mit was ich brauche.</p>
<p><a href="http://www.eclipse.org/pdt/">PDT-Project</a></p>
<h2>Subversion</h2>
<p>Früher habe ich alleine gearbeitet. Da ist <strong>Versionskontrolle </strong>kein Thema mit besonders großer Wichtigkeit. Als ich das erste mal im <strong>Team </strong>gearbeitet habe, funktioniere der <strong>Workflow </strong>nicht mehr. Man kam sich in die Quere, das zusammenführen wurde im laufe des fortschreitenden Projektes immer Zeit- und Nervenraubender. Damals war <strong>Subversion </strong>der neue heiße Scheiß. <strong>CVS </strong>fand man überall, aber <strong>SVN </strong>schien mir einfacher. Ich habe mich da nicht getäuscht. Ich muss allerdings gestehen: Den vollen Umfang von SVN habe ich erst in den letzten zwei Jahren kennen und schätzen gelernt.</p>
<p><a href="http://subversion.tigris.org/">Subversion</a></p>
<h2>Navicat</h2>
<p>Navicat ist ein <strong>Datenbankbrowser</strong>, der verschiedene <strong>SQL-Datenbanken</strong> unterstützt. Bei kleinen Projekten hat mir <a href="http://www.phpmyadmin.net/home_page/index.php"><strong>phpMyAdmin</strong></a><strong> </strong>immer ausgereicht &#8211; aber wenn <strong>Sicherheitspolicies </strong>und Laufzeitbeschränkungen phpMyAdmin nicht mehr erlauben, ist Navicat ein wirklich mächtiges Tool mit einer Menge toller Funktionen &#8211; und Macken <img src='http://phphacker.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><a href="http://www.navicat.de/">Navicat</a></p>
<h2>Notepad++</h2>
<p>Wenn es denn mal schnell gehen muss, und ich eine Datei eines beliebigen Textformates bearbeiten woll, so greife ich auf den schnellen und einfach zu bedienenden Editor <strong>Notepad++</strong> zurück. Synatx Highlighting und Code Completion für die meisten Sprachen und das schnelle starten haben ihn zu einem <strong>festen Bestandteil</strong> meiner Arbeitsumgebung gemacht.</p>
<p><a href="http://notepad-plus.sourceforge.net/de/site.htm">Notepad++</a></p>
<h2>Firefox</h2>
<p>Nicht nur privat sondern auch beruflich wahrscheinlich das am meisten Benutzte Werkzeug, Stück Lieblingssoftware und die am häufigsten bediente Plattform. Auf <strong>Firefox </strong>hat mich ein alter Freund vor vielen Jahren gebracht (damals hieß das gute Stück noch <strong>Phoenix</strong>). Die Erweiterbarkeit und das ambitionierte Open Source auftreten haben meinen Freund zu der Annahme gebracht, dass dieser Browser <em>der </em>Browser wird. Und auch er hat Recht behalten. Bis heute das, was ich auf jedem Rechner, den ich einrichte als erste Installiere, sobald eine Verbindung zum Netz besteht <img src='http://phphacker.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Firefox hat es sich zur Philosophie gemacht, dass der Browser nur mit dem nötigsten ausgestattet aus der Box kommt. <strong>Spezialisierungen </strong>für den Alltag (oder den Job) kann man mittels <strong>Add-Ons</strong> vornehmen. Beruflich habe ich ein paar Pflichtaddons, die direkt drauf müssen.</p>
<p><a href="http://www.mozilla-europe.org/de/firefox/">Mozilla Firefox</a></p>
<h3><a href="https://addons.mozilla.org/de/firefox/addon/60">Webdeveoper Toolbar</a></h3>
<p>Wer kennt sie nicht. Eines der ersten Add-Ons die ich beruflich instaliert habe. Und seit dem nicht mehr wegzudenken. In einem Firefox ohne die <strong>Webdeveloper Toolbar</strong> fühle ich mich schon unwohl <img src='http://phphacker.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3><a href="https://addons.mozilla.org/de/firefox/addon/1843">Firebug</a> &amp; <a href="https://addons.mozilla.org/de/firefox/addon/6149">FirePHP</a></h3>
<p>Wenn es ans JavaScript oder CSS-Debugging geht, dann ist Firebug unschlagbar. Wenn man dann auch noch keinen Debugger zur Vefügung hat, sich mit den Debug-Ausgaben aber nicht das Layout zerschießen will, ist FirePHP Gold wert. Und mit <a href="http://framework.zend.com/manual/en/zend.wildfire.html">Zend_Wildfire</a> hat man da auch noch direkt eine bequeme und einfach Implementation auf PHP-Seite.</p>
<h3><a href="https://addons.mozilla.org/de/firefox/addon/3829">Live HTTP Headers</a></h3>
<p>Wenn man mal schnell Header checken will: Live HTTP Headers. Unschlagbar. Firebug kann das zwar auch, aber irgendwie finde ich Live HTTP Headers für einen Quicky doch besser.</p>
<h3><a href="https://addons.mozilla.org/de/firefox/addon/5369">YSlow</a></h3>
<p><strong>YSlow </strong>bewertet eine Seite anhand von <strong>Yahoo </strong>festgelegter Kriterien, und ordnet bestimmten Aspekten Schulnoten (A-F) zu. Schön: Es werden konkrete <strong>Verbesserungsvorschläge</strong> gemacht. Ein kleiner Block auf YSlow kann in der finalen Phase eines Projektes nie schaden.</p>
<h3><a href="https://addons.mozilla.org/de/firefox/addon/2079">Selenium IDE</a></h3>
<p>Nicht nur um Tests für Selenium zu schreiben, sondern auch im lästige Ausfüll- und Klickarien zu automatisieren eignet sich die <strong>Selenium-IDE</strong> für Firefox hervorragend. Ein Must-Have!</p>
]]></content:encoded>
			<wfw:commentRss>http://phphacker.net/2009/03/22/mein-arbeitsplatz-oder-dinge-die-man-nicht-mehr-missen-will-teil-2/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Meine Backup-Nemesis</title>
		<link>http://phphacker.net/2009/03/18/meine-backup-nemesis/</link>
		<comments>http://phphacker.net/2009/03/18/meine-backup-nemesis/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 21:11:28 +0000</pubDate>
		<dc:creator>Cem Derin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Kurioses]]></category>
		<category><![CDATA[Theorie]]></category>

		<guid isPermaLink="false">http://phphacker.net/?p=507</guid>
		<description><![CDATA[Ich gebe es zu: Ich bin eine Backup-Niete. Ich lege Backups immer nur sporadisch, schlampig und hastig an. Und meistens arbeite ich an dieser Strategie nur, wenn ich einmal auf Backups angewiesen war und &#8211; Überraschung &#8211; keine zur Verfügung hatte. Beruflich ist das kein Problem: Da übernehmen andere Leute die Arbeit für mich. Leute, [...]]]></description>
			<content:encoded><![CDATA[<p>Ich gebe es zu: Ich bin eine <strong>Backup-Niete</strong>. Ich lege Backups immer nur sporadisch, schlampig und hastig an. Und meistens arbeite ich an dieser Strategie nur, wenn ich einmal auf Backups angewiesen war und &#8211; Überraschung &#8211; keine zur Verfügung hatte. Beruflich ist das kein Problem: Da übernehmen andere Leute die Arbeit für mich. Leute, die Ahnung von dem haben was sie tun &#8211; und keine Ahnung von dem was ich tue. Aber privat ist und war das schon immer ein Problem (vor allem in meiner Freelancer-Zeit).</p>
<p>Ich muss allerdings dazu sagen, dass ich mich immer irgendwie aus dem ärgsten rauswinden konnte. <strong>Quelltexte </strong>hatte ich verstreut zwischengelagert und konnte das meiste innerhalb einer angemessenen Zeitspanne wieder zusammenklauben. <strong>Layouts </strong>waren irgendwo mal als eMail verschickt worden, wenn auch in früheren Versionen. Und <strong>eMail</strong>-Korrespondenz hat man durch Weiterleitungen ohnehin auf mehreren <strong>IMAP</strong>-Servern.</p>
<p>Da ich in vielen Bereichen meines digitalen Lebens ein pedantisches Arschloch bin und auf meinem Desktop mehr Ordnung herrscht als in meiner WG-Stube, meine MP3&#8217;s wie meine Platten penibel nach Jahrgang und Genre Sortiert sind, ist mir das Thema Backups immer ein übles Dorn im Auge gewesen und befleckte meine ansonsten blütenweiße Nerdweste. Aus diesem Grund will ich mal meine (laut Feedbruner nicht mehr so kleine) Leserschaft zu rate ziehen, und mir ein paar <strong>Best Practices für &#8220;Desktop&#8221;-Backups</strong> abholen. Evtl. gibt es ja auch ein paar <strong>Buchempfehlungen </strong>o.ä. <img src='http://phphacker.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Ich freue mich schon.</p>
]]></content:encoded>
			<wfw:commentRss>http://phphacker.net/2009/03/18/meine-backup-nemesis/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Conventions over configuration</title>
		<link>http://phphacker.net/2009/02/13/conventions-before-configuration/</link>
		<comments>http://phphacker.net/2009/02/13/conventions-before-configuration/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 06:31:48 +0000</pubDate>
		<dc:creator>Cem Derin</dc:creator>
				<category><![CDATA[Buchtipps]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Theorie]]></category>

		<guid isPermaLink="false">http://phphacker.net/?p=456</guid>
		<description><![CDATA[Derzeit lese ich Agile Webdevelopment with Rails. Das Buch ist zwar von 2006, aber mir ging es auch in erster Linie um das Prinzip von Ruby on Rails. Wie dem auch sei, keine Sorge, ich werde jetzt nicht über Ruby berichten oder gar komplett auf Ruby umsteigen (obwohl ich gerne was produktives mit Rails bauen [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://ecx.images-amazon.com/images/I/51KxXNu8g3L._SL500_AA240_.jpg" alt="" width="240" height="240" />Derzeit lese ich <strong><a href="http://www.amazon.com/Agile-Web-Development-Rails-2nd/dp/0977616630/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1234504342&amp;sr=8-1">Agile Webdevelopment with Rails</a></strong>. Das Buch ist zwar von 2006, aber mir ging es auch in erster Linie um das Prinzip von <strong>Ruby on Rails</strong>. Wie dem auch sei, keine Sorge, ich werde jetzt nicht über Ruby berichten oder gar komplett auf Ruby umsteigen (obwohl ich gerne was produktives mit Rails bauen würde, hehe). Es geht mir viel mehr um eines des Kernprinzipien von Ruby on Rails: <strong>Conventions over configuration</strong>.</p>
<p>Dieses Grundprinzip ist das, was Ruby eigentlich so bekannt gemacht hat. Was dafür gesorgt hat, dass man eine Applikation mit Rails in wenigen Minuten aufbauen kann (<strong>Scaffolding</strong>) und nur noch der Feinschliff gemacht werden muss. Aber was bedeutet conventions over configuration genau und wie kann man es auf PHP anwenden?</p>
<p><span id="more-456"></span>Ruby abstrahiert bei der Webentwicklung ständig auftretende Probleme und löst diese Eiheitlich. Auf eine <strong>MVC-Struktur</strong> bezogen hätten wir folgenden Fall: Wie haben es ständig mit <strong>Modellen </strong>zu tun, die eigene <strong>Controller </strong>bekommen. Diese Modelle werden in der <strong>Datenbank</strong> gespeichert und sollen über den controller aufgelistet, angelegt und einzeln editiert werden können. Statt das also für jedes Modell immer und immer wieder von Hand zu machen, gibt es in Rails ein <strong>Script</strong>, dem man den Namen und die Properties für das Model übergibt und das alles selbst anlegt.</p>
<p>Hierbei kommt dann obiges Prinzip zum Einsatz: Convetions over configuration. Statt also in der Modellklasse anzugeben, in welcher Tabelle die Daten für dieses Modell liegen (<em>configuration</em>), nimmt die Modellklasse an, dass die Daten in einer Tabelle liegen, die dem Plural des Modells entspricht (<em>convention</em>). Das Modell &#8220;<em>article</em>&#8221; wird seine Daten also in der Tabelle &#8220;<em>articles</em>&#8221; finden.</p>
<p>Dieses Prinzip setzt sich natürlich weiter fort. Ich möchte gar nicht weiter auf das konkrete Rails-Beispiel eingehen. Ich habe das Buch noch gar nicht zuende gelesen und laufe Gefahr, hier Lösungen für Probleme vorzuschlagen, die Rails wesentlich besser gelöst hat. Viel interessanter ist die Frage: Wie führe ich das in <strong>PHP </strong>ein?</p>
<p>Obiges Beispiel ist noch sehr einfach. Die Umsetzung sollte jeder, der seine Brötchen mit PHP verdient hinbekommen. Es gibt aber meiner Meinung nach eine ganze Reihe von Fällen, in denen solche Konventionen abgelehnt werden, da sie die Applikation ihrer <strong>Flexibilität </strong>rauben: Prominentes Beispiel sind Benamungen von <strong>Tabellenspalten in Datenbanken</strong>. In der Vergangenheit musste ich häufiger erleben, dass eine Benamung von Fremdschlüsseln im Sinne von &#8220;&lt;zieltabelle&gt;_&lt;zielfeld&gt;&#8221; zzgl. evtl. führender Zieldatenbank abgelehnt wurde. Konkrete Argumente fehlten oder beruhten auf mythischen &#8220;Ich meine mal gehört zu haben &#8230; &#8221; und &#8220;da hatte ich mal Probleme mit, die ich jetzt aber nicht mehr erklären kann &#8230; &#8221; Argumenten.</p>
<p>Ich sehe leider auch immer wieder, dass <strong>Methodenparameter </strong>so angeordnet sind, dass man um häufig genutzte Parameter zu erreichen andere übergeben muss, obwohl diese sich selten Ändern oder ermittelbar wären. Um das zu vermeiden, wird hier dann häufiger auf ein <strong>Array </strong>zurückgegriffen, in dem nur die Parameter, die man setzen will übergeben werden. Das ist augenscheinlich eine gute Lösung, leider kann einem die <strong>IDE </strong>dann keine Unterstützung mehr bzgl. der Typen oder generell der <strong>DocSyntax </strong>mitgeben. Sinnvoller wäre hier aber, dass man so wenig Parameter wie möglich übergeben muss. <strong>Lediglich wenn etwas mal nicht mehr der Konvetion entspricht, sollte man auf Konfiguration zurückgreifen.</strong></p>
<p>Das beißt sich jetzt auch alles ein bisschen mit<a href="http://www.phphatesme.com/blog/qualitatssicherung/assert-null/"> Nils&#8217; <strong>Assert Null</strong> Artikel</a> <img src='http://phphacker.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://phphacker.net/2009/02/13/conventions-before-configuration/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Von Foo, Bar und Fnord</title>
		<link>http://phphacker.net/2009/01/26/von-foo-bar-und-fnord/</link>
		<comments>http://phphacker.net/2009/01/26/von-foo-bar-und-fnord/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 07:54:11 +0000</pubDate>
		<dc:creator>Cem Derin</dc:creator>
				<category><![CDATA[Hintergrund]]></category>
		<category><![CDATA[Kurioses]]></category>
		<category><![CDATA[Theorie]]></category>

		<guid isPermaLink="false">http://phphacker.net/?p=314</guid>
		<description><![CDATA[
Jeder kennt sie, viele benutzen sie. Aber woher kommen eigentlich Hello World, asdf und 42? Diese Frage möchte ich heute beantworten, auch wenn das nur indirekt mit PHP zu tun hat. Ein bisschen Hintergrundwissen hat noch niemandem geschadet  

Solche Platzhalter nennen sich metasyntaktische Variablen und sind in erster Linie tatsächlich nichts anderes als Platzhalter. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-315" src="http://phphacker.net/wp-content/uploads/2009/01/glasses.jpg" alt="" width="1000" height="175" /><br />
Jeder kennt sie, viele benutzen sie. Aber woher kommen eigentlich Hello World, asdf und 42? Diese Frage möchte ich heute beantworten, auch wenn das nur indirekt mit PHP zu tun hat. Ein bisschen Hintergrundwissen hat noch niemandem geschadet <img src='http://phphacker.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h2><span id="more-314"></span></h2>
<p>Solche Platzhalter nennen sich <a href="http://en.wikipedia.org/wiki/Metasyntactic_variable">metasyntaktische Variablen</a> und sind in erster Linie tatsächlich nichts anderes als Platzhalter. Man greift immer dann auf solche Platzhalter zurück, wenn konkrete Benamung nicht möglich oder Kontraproduktiv ist. Das kommt in der Regel bei Referenzimplementierungen, Tutorials &amp; HowTos sowie in kurzen Erklärungen in Foren und Newsgroups vor. Fasst selbstverständlich nutzen die meisten von uns wenigstens ein paar der Nachfolgend aufgezählten Beispiele &#8211; wollen wir also mal beleuchten, wo sie genau her kommen.</p>
<h2>Foo, Bar</h2>
<p>Die wahrscheinlich am häufigst genutzten Platzhalter sind <strong>Foo </strong>&amp; <strong>Bar</strong>. Ihren Ursprung haben sie aller wahrscheinlichkeit aus dem Militärischen Jargon. Im zweiten Weltkrieg verwendeten US-Soldaten den Begriff &#8220;<strong>FUBAR</strong>&#8221; zunächst in negativem Zusammenhang. Man findet im Netz eine ganze Reihe Versuche die Herkunft von &#8220;FUBAR&#8221; (später auch &#8220;<strong>Foobar</strong>&#8220;) zu erklären, aber so sinnig viele Theorien erscheinen, konkret sagen kann es niemand. Fakt ist aber, dass laut Wikipedia Foo und Bar in ca. 300 <a href="http://en.wikipedia.org/wiki/Request_for_Comments">RFC</a>s erwähnt werden.</p>
<h2>Alice &amp; Bob</h2>
<p>Wenn Interaktionen dargestellt werden sollen, so wird oft auf <strong>Alice </strong>und <strong>Bob </strong>zurückgegriffen. Alice und Bob sind im Grunde nur die vermenschlichte Variante von &#8220;Person A &amp; Person B&#8221;. Werden mehr Personen benötigt, so greift man auf Namen zurück, die mit dem entpsprechend nächsten Buchstaben im Alphabet beginnen (<strong>Carol </strong>und <strong>Dave</strong>, usw).</p>
<p>Das erste mal tauchten Alice und Bob in einem Aufsatz über <strong>Verschlüsselungsverfahren </strong>auf. Dahingehend findet man Alice, Bob und Konsorten sehr häufig in Schriften, die sich mit <strong>Kryptografie </strong>oder <strong>Computersicherheit </strong>befassen. Und vor allem in diesem speziellen Einsatzgebiet gibt es noch eine Reihe anderer Namen, die sich von entsprechenden Rollen ableiten:</p>
<ul>
<li><strong>Eve </strong>steht für Passiver Zuhörer (<em>eavesdropper</em>) oder Umgebung (<em>environment</em>)</li>
<li><strong>Isaac </strong>wird gerne für ISPs genommen (<em>Internet Service Provider</em>)</li>
<li><strong>Mallory </strong>oder <strong>Marvin</strong> stehen repräsentativ für Angreifer (<em>malicious</em>)</li>
<li><strong>Trudy </strong>stellt Eindringlinge dar (intruder)</li>
<li><strong>Zoe </strong>wird häufig als letzte Instanz eines Ablaufes gewählt. Gewählt wurde der Name aufgrund des Z.</li>
</ul>
<h2>Hello, world!</h2>
<p>&#8220;<strong>Hello, world!</strong>&#8221; wird wohl jedem von uns schon einmal über den Weg gelaufen sein. Es Bezeichnet ein Stück Programmcode der die Ausgabe dieser Wörter in einer beliebigen Sprache macht und stellt in der Regel das <strong>kleinste Ausführbare Programm</strong> dieser Sprache dar.</p>
<p>Das erste mal tauchte &#8220;Hello, world&#8221; in einer Tutorial für die <strong>Sprache B</strong> auf, dort allerdings in einem weniger einfachen Zusammenhang als zwei Jahre später in einem Guide für die Sprache C. Dort war es erstmals das, als dass wir die &#8220;Hello, world!&#8221;-Programme heute kennen: Ein paar Zeilen <strong>einfachster Code</strong>.</p>
<h2>ASDF</h2>
<p>Hier muss man eigentlich nicht viele Worte verlieren. <strong>ASDF </strong>ist eine Buchstabenfolge, die auf deutschen Tastaturen (bzw. <strong>QWERTZ</strong>-Layouts) direkt hintereinander in zweiter Reihe vorkommen. Häufig trifft man &#8220;ASDF&#8221; während der Entwicklung als Testeingabe für Beispielsweise eMail-Adressen (asdf@example.com) oder ähnliches an.</p>
<h2>42, 5 &amp; 23, 08/15, 4711</h2>
<p>Eine Reihe Zahlen, von denen die ein oder andere sicherlich bekannt vorkommt. Diese Zahlen werden gerne als metasyntaktische Variablen bzw. für deren Inhalt benutzt. Der Urpsrung ist meist weniger spektakulär, wenn doch häufig interessant.</p>
<h3>42</h3>
<p>42 stammt aus dem Buch &#8220;<strong>The hitchhicker&#8217;s guide to the galaxy</strong>&#8220;. Es ist innerhalb der durchaus skurrilen Abenteuer von Arthur Dent die Antwort auf die Frage nach dem &#8220;<strong>Leben, dem Universum und allem</strong>&#8220;. Sie ist somit eine Hommage an einen klassischen Roman aus der <strong>Science-Fiction-Literatur</strong>.</p>
<h3>5 &amp; 23</h3>
<p>Die Zahl <strong>23 </strong>und ihre Quersumme <strong>5</strong> stammen aus der Zahlenmystik rund um die Romanreihe <strong>Iluminatus</strong>. Dort stehen sie <strong>Unglück </strong>und <strong>Zerstörung </strong>sowie die Illuminaten selbst.</p>
<h3>08/15</h3>
<p>Die Zahlenfolge &#8220;<strong>08/15</strong>&#8221; ist ausschließlich in Deutschland geläufig und bezeichnet in der Regel etwas gewöhnliches, nicht besonderes oder herausragendes. Ihren Ursprung findet man im <strong>ersten Weltkrieg</strong>, in dem ein Maschienengewehr mit dem Namen <strong>MG 08/15</strong> an deutsche Soldaten ausgegeben wurde und sozusagen zur einheitlichen Bewaffnung wurde.</p>
<h3>4711</h3>
<p>Auch <strong>4711 </strong>hat seinen Ursprung in Deutschland und ist der Markenname des berühmten <strong>Kölner Eau de toilette</strong>. Der Markenname leitet sich wiederum von der <strong>Hausnummer </strong>des Herstellungsbetriebes ab.</p>
<h2>Spam &amp; Eggs</h2>
<p><strong>Spam </strong>&amp; <strong>eggs </strong>werden häufig in Zusammenhang mit der Sprache <strong>Python </strong>verwendet. Hintergrund ist der, dass der berühmte <strong>Spam-Sketch</strong> aus der Serie der Komikergruppe &#8220;<strong>Monty Python&#8217;s Flying Circus</strong>&#8221; stammt, von dem sich wiederum der Name der Programmiersprache ableitet.</p>
<h2>John Doe und Erika Mustermann</h2>
<p>Wenn Benutzerdaten testweise benötigt werden, so greift man häufig auf erfundene Daten zurück. Dabei haben sich in Deutschland die Namen <strong>Max </strong>und <strong>Erika Mustermann</strong> als Semi-Standard herausgebildet. In den USA werden sie <strong>John </strong>und <strong>Jane Doe</strong> genannt. Im Gegensatz zu Deutschland wird John bzw. Jane Doe auch für nicht identifizierte Leichen verwendet. In Deutschland wird in solchen Fällen das Kürzel N.N. (<strong>Nomen nominandum</strong>, lat.: &#8220;Name noch zu nennen&#8221;) benutzt.</p>
<h2>Fnord</h2>
<p><strong>Fnord </strong>ist der Klang einer einzelnen klatschenden Hand. Nicht erklärbar. Wer bin ich, dass ich das unmögliche Versuchen sollte? Daran sind <a href="http://koeln.ccc.de/ablage/artikel/fnord.xml">schon andere gescheitert</a> &#8230; <img src='http://phphacker.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h2>Schlusswort</h2>
<p>Ich hoffe, ich konnte hier dem ein oder anderen was neues erzählen. Ich habe hier bei weitem kein komplettes Verzeichnis erstellt. Aber das, was mir häufiger über den Weg lief und ich erklären konnte, habe ich so gut wie möglich versucht wiederzugeben. Evtl. werde ich häufiger mal ein wenig &#8220;sinnlosen&#8221; Hintergrund erläutern &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://phphacker.net/2009/01/26/von-foo-bar-und-fnord/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>&#8220;Alles ist eine Klasse&#8221;</title>
		<link>http://phphacker.net/2009/01/18/alles-ist-eine-klasse/</link>
		<comments>http://phphacker.net/2009/01/18/alles-ist-eine-klasse/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 13:13:39 +0000</pubDate>
		<dc:creator>Cem Derin</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Theorie]]></category>

		<guid isPermaLink="false">http://phphacker.net/?p=233</guid>
		<description><![CDATA[
Vorweg die gute Nachricht: Objektorientierung hat sich in der PHP-Welt durchaus durchgesetzt. Große Projekte werden immer öfter Objektorientiert angegangen, es werden Design Pattern umgesetzt und PHP spielt einem mit jeder neuen Version mehr und mehr in die Hände. Frameworks wie das Zend Framework oder CakePHP tragen ihren Teil oftmals dazu bei.
Kommen wir aber zur schlechten [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://phphacker.net/wp-content/uploads/2009/01/bricks.jpg"><img class="alignnone size-full wp-image-278" title="Bauklötze" src="http://phphacker.net/wp-content/uploads/2009/01/bricks.jpg" alt="bricks" width="640" height="174" /></a></p>
<p>Vorweg die gute Nachricht: Objektorientierung hat sich in der PHP-Welt durchaus durchgesetzt. Große Projekte werden immer öfter Objektorientiert angegangen, es werden Design Pattern umgesetzt und PHP spielt einem mit jeder neuen Version mehr und mehr in die Hände. Frameworks wie das Zend Framework oder CakePHP tragen ihren Teil oftmals dazu bei.</p>
<p>Kommen wir aber zur schlechten Nachricht: Die Klassenabstraktion wird oftmals nicht sehr weit geführt. Oft werden bestimmte Untermengen nicht mehr Objektorientiert strukturiert, sondern man verfällt innerhalb der ersten Klasse schnell dazu, Eigenschaften primitiv abzubilden.</p>
<p><span id="more-233"></span>Als Negativbeispiel kann man hier die in vielen Projekten vorkommende User-Klasse anführen. Ein Benutzer hat eine Reihe von grundlegenden Eigenschaften:</p>
<ul>
<li>eMail-Adresse</li>
<li>Passwort</li>
<li>Benutzerrolle/n</li>
</ul>
<p>Das sind wahrscheinlich die Daten, die jeder Benutzer innerhalb einer Webapplikation haben sollte. Darüberhinaus kommen aber noch eine Reihe weiterer, je nach Zweck der Software:</p>
<ul>
<li>Vorname</li>
<li>Nachname</li>
<li>Adresse</li>
</ul>
<p>Diese Liste kann man endlos weiterführen, wir wollen uns aber mal mit diesen Daten begnügen. Meistens werden diese Daten in Properties des Users primitv gespeichert. Warum auch nicht, denk man sich vielleicht?!</p>
<p>Kommen wir also nun zum Titel dieses Artikels und wenden ihn auf diese Daten an: Ich plädiere dafür, diese Daten alle in eigenen Klassen abzubilden. Warum?</p>
<h3>eMail-Adresse</h3>
<p>Eine eMail-Adresse sollte aus mehreren Gründen in eine eigene Klasse gekapselt werden. Nehmen wir an, wir wollen die eMail-Adresse verschlüsseln um sie gegen Harvester abzusichern. Oder wir wollen bestimmte Informationen wie den Host und ähnliches herausfiltern. Das sind alles Operationen, die auf die eMail-Adresse angewandt werden. In schlecht bzw. nicht sauber strukturierter Software lägen diese Methoden meist innerhalb des Models &#8220;User&#8221;.</p>
<h3>Passwort</h3>
<p>Das Passwort ist ebenfalls eine Entität, auf die wir sicherlich früher oder später zugreifen wollen: Wir wollen es ändern, zurücksetzen, anders verschlüsseln, etc. Wieder Methoden, die nichts im User verloren haben.</p>
<h3>Benutzerrollen</h3>
<p>In der Regel wollen wir nicht nur die Information haben, welche Rollen dem Benutzer zugewiesen sind, sondern wollen auch mit diesen arbeiten. Wir wollen dem Benutzer neue Rollen zuweisen oder auch alte entfernen. Wenn wir diese Abfragen machen, bekommen wir direkt die Rollen-Objekte und nicht nur blanke IDs aus der Datenbank.</p>
<h3>Name</h3>
<p>Der Name des Benutzers ist ebenfalls ein interessantes Attribut. Manchmal wollen wir den Vornamen, manchmal wollen wir den Nachnamen. Manchmal beide, manchmal mit Anrede. Eine ganze Menge Dinge also, die wir mit dem Namen anstellen können. Da macht es nur Sinn, diesen ebenfalls in eine eigene Klasse auszulagern. Der &#8220;Name&#8221; setzt sich aber wieder aus den Klassen &#8220;Vorname&#8221; und &#8220;Nachname&#8221; zusammen.</p>
<h3>Adresse</h3>
<p>Der Benutzer hat eine Adresse. Eine Adresse besteht aber aus Straße, Hausnummer, ggf. einem Zusatz, einer Postleitzahl (jaja, in Irland nicht, ich weiß Mario <img src='http://phphacker.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ) eine Stadt, ggf. einem Bundesland o.ä. und einem Land. Eine ganze Menge Dinge, die sich auch immer unterschiedlich zusammensetzen, unterschiedlich abgekürzt werden können und so weiter. Aber der Benutzer hat immer ein Bündel davon. Daher gibt es die Klasse Adresse. Diese hat eine Reihe von Unterklassen: Die Straße, die sich aus Straßenname, Hausnummer und Zusatz auszeichent, die Stadt, die sich aus PLZ und Stadt zusammensetzt sowie das Bundesland und das Land. Alles eigene Klassen.</p>
<h2>Aggregieren</h2>
<p>Natürlich müssen Methoden vorgehalten werden, um zusammengehörende Daten aus einer Menge von Klassen zu aggregieren. Diese Methoden gehören immer in die jeweilige Unterklasse. Will man die komplette Adresse (für zum Beispiel einen generierten Briefkopf) so gibt es eine Aggregatsmethode in der Überklasse (Also User), die Adresse ohne Name wird von der Adressklasse zusammengebaut, während die Straße mit Hausnummer und Zusatz von der Straßenklasse zusammengebaut wird.</p>
<p><em>Foto von <a href="http://www.sxc.hu/profile/danzo08">Daniel Wildmann</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://phphacker.net/2009/01/18/alles-ist-eine-klasse/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Objektdatenbanken in Webapplikationen</title>
		<link>http://phphacker.net/2008/12/30/objektdatenbanken-in-webapplikationen/</link>
		<comments>http://phphacker.net/2008/12/30/objektdatenbanken-in-webapplikationen/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 00:44:59 +0000</pubDate>
		<dc:creator>Cem Derin</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Theorie]]></category>

		<guid isPermaLink="false">http://phphacker.net/?p=201</guid>
		<description><![CDATA[Vor ein paar Tagen habe ich meine Zeitschriftensammlung aufgeräumt, dabei fiel mir eine Ausgabe des Linux Magazins wieder in die Hände, der ich bei Erscheinen nicht die nötige Aufmerksamkeit geschenkt habe. In dieser Ausgabe gab es eine Reihe von Artikeln rund um das Thema Datenbanken. Ausschlaggebend für den Text den ich hier schreibe ist aber [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://phphacker.net/wp-content/uploads/2008/12/database.png"><img class="alignleft size-full wp-image-206" title="database" src="http://phphacker.net/wp-content/uploads/2008/12/database.png" alt="database" width="128" height="128" /></a>Vor ein paar Tagen habe ich meine Zeitschriftensammlung aufgeräumt, dabei fiel mir <a href="http://www.linux-magazin.de/heft_abo/ausgaben/2007/09">eine Ausgabe des Linux Magazins</a> wieder in die Hände, der ich bei Erscheinen nicht die nötige Aufmerksamkeit geschenkt habe. In dieser Ausgabe gab es eine Reihe von Artikeln rund um das Thema Datenbanken. Ausschlaggebend für den Text den ich hier schreibe ist aber der Artikel über <a href="http://www.db4o.com/">db4o</a>.</p>
<p>Nach dem ich den Artikel aufmerksam(er) gelesen hatte, malte ich mir eine PHP-Welt aus, in der Objekte direkt in die Datenbank geschrieben und aus ihr geladen werden können, dabei Referenzen und Integrität berücksichtigt und das ganze nativ in PHP abgefragt werden kann. Für Webapplikationen &#8211; wenn es denn so einfach geht wie mit db4o &#8211; wäre das eine erhebliche Arbeitserleichterung.</p>
<p><span id="more-201"></span></p>
<h2>Was sind Objektdatenbanken?</h2>
<p>Wem Objekdatenbanken (oder <a href="http://en.wikipedia.org/wiki/ODBMS">ODBMS</a>) nicht sagen, für den möchte ich das Thema mal kurz umreissen: In der Welt von PHP kennen wir eigentlich nur relationale Datenbanken. In relationalen Datenbanken werden Daten in Tabellen mit einer festen Struktur hinterlegt, ggf. auf mehrere Tabellen aufgeteilt (Stichwort <a href="http://en.wikipedia.org/wiki/Database_normalization">Normalisierung</a>). Um diese Datenbanken abzufragen, gibt es eine einheitliche Sprache namens SQL (<a href="http://en.wikipedia.org/wiki/SQL">Structured Query Language</a>).</p>
<p>Hier steht man vor einem Konflikt, wenn eine Applikation einem strengen objektorientierten Ansatz folgt. Objekte müssen wieder ein ein Datensatzschema geformt werden, damit diese wiederum in einer relationalen Datenbank abgelegt werden können. Vor dem selben Dilemma steht man, wenn man diese Daten wieder auslesen möchte. Das ganze verhält sich noch relativ simpel, wenn es um eindimensionale Objekte ohne Referenzen auf andere Objekte geht. Hat ein Objekt aber Referenzen auf wiederum andere Objekte, kann das Initialisieren eines Objekts inklusive Unterobjekte schnell zu einer hohen Anzahl an Datenbankabfragen führen.</p>
<p>Es gibt zwar in PHP verschiedene Pattern, die dieses Problem schon sehr gut in den Begriff bekommen &#8211; zum Beispiel ARP (<a href="http://en.wikipedia.org/wiki/Active_record_pattern">Active Record Pattern</a>) oder DAO (<a href="http://en.wikipedia.org/wiki/Data_Access_Object">Data Access Object</a>) &#8211; das speichern und laden der Objekte erfolgt aber immer noch über SQL und relational.</p>
<p>Objektdatenbanken schaffen hier eine Schnittstelle, um Objekte direkt in der Datenbank ablegen und auslesen zu können. In Objektorientierter Programmierung ist also eine Objektdatenbank anstrebenswert.</p>
<h2>Objektdatenbanken für PHP</h2>
<p>Ich habe zwar intensiv nach Objektdatenbanken für PHP gesucht, bin jedoch leider nicht fündig geworden. Daher ist dieser Text nur theoretisch. Ich habe zwar bereits mit einem in PHP implementierten Layer experimentiert, der Objekte generisch in relationale Datenbanken schiebt und ausliest. Das ganze ist jedoch alles andere als trivial. Wer weiß. Evtl. werde ich hier demnächst was vorstellen können.</p>
<p>Falls jemand Hinweise auf ODBMS für PHP findet, würde ich mich über eine kurze Rückmeldung freuen.</p>
<h2>Einsatzgebiet Webapplikationen</h2>
<p>Grade Webapplikationen, die in der Regel nur ein begrenztes Set an Daten pro Ansicht benötigen, würden sich für Objektdatenbanken perfekt eignen. Das ganze würde eine Reihe Vorteile mit sich bringen.</p>
<h3>Wesentlich schnellere Entwicklung</h3>
<p>Mehrere Elemente einer Applikation müssen nicht mehr Berücksichtigt werden: Speicher- und Lösch-Methoden müssen nicht mehr implementiert werden. Der Datenbanklayer kann theoretisch auch vernachlässigt werden, wenn das DMBS einen eigenen mitbringt. Theoretisch sollte jedoch ein Austausch möglich sein.</p>
<h3>Keine Code-Vermischung</h3>
<p>Ich höre oft, dass man HTML und PHP nicht vermischen sollte. Auch sollte man auf die Vermischung von HTML und JavaScript verzichten. Klar, es gibt für alles Möglichkeiten es auszulagern und prinzipiell teile ich diese Meinung auch. Aber in puncto SQL war das immer eher schwierig &#8211; ein Thema das mit ODBMS gegessen wäre.</p>
<h3>Eine Sprache weniger, die erlernt werden muss</h3>
<p>Stop. Jetzt gehen sicher einige Gemüter auf die Barrikaden. Wer PHP lernen will muss sich auch weiterhin mit HTML und SQL auseinandersetzen. Aber sind wir doch mal ehrlich: Meist hat man seine Präferenzen auf einer oder zwei dieser Sprachen. Aussagen will ich mit diesem Punkt eigentlich nur, dass es nicht mehr unbedingt nötig ist, die Sprache perfekt zu verstehen, wenn man weiß, wie man das ODBMS bedient.</p>
<h2>Ausblick</h2>
<p>Wie schon erwähnt, habe ich ein wenig mit einem PHP-Layer herumexperimentiert. Ich finde das Thema äußerst Interessant. Ich werde meine Experimente weiter Verfolgen und ggf. hier auch schon bald ein paar Ergebnisse zur Verfügung stellen können. Bis dahin werden aber doch noch ein paar Tage vergehen.</p>
<h2><em>Nachtrag 30. Dezember 2008</em></h2>
<p>Da stolper ich doch zufällig bei den Recherchen für einen anderen Artikel über das <a href="http://flow3.typo3.org/documentation/reference/persistence/">Persistenz-Konzept von Flow3</a> (der Kern des neuen Typo3). Die Herrschaften machen genau das, was ich eben beschrieben habe. Leider gibt es noch keine stabile Version von Flow3, aber man sollte das im Auge behalten.<em><br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://phphacker.net/2008/12/30/objektdatenbanken-in-webapplikationen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
