<?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>LocalDev &#187; OOP</title>
	<atom:link href="http://localdev.de/tags/oop/feed/" rel="self" type="application/rss+xml" />
	<link>http://localdev.de</link>
	<description>Web, Desktop &#38; Mobile Development</description>
	<lastBuildDate>Thu, 01 Dec 2011 18:54:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Ich schäme mich &#8230; am Developers Shame Day</title>
		<link>http://localdev.de/2010/11/ich-schame-mich-am-developers-shame-day/</link>
		<comments>http://localdev.de/2010/11/ich-schame-mich-am-developers-shame-day/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 11:45:07 +0000</pubDate>
		<dc:creator>Fabian Martin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Developers Shame Day]]></category>
		<category><![CDATA[eval]]></category>
		<category><![CDATA[global]]></category>
		<category><![CDATA[Negativbeispiel]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://localdev.de/?p=1276</guid>
		<description><![CDATA[Jeder Programmierer hat mal klein angefangen und dabei Code produziert, für den er sich im Nachhinein schämt, und von dem er hofft, dass er nie an die Öffentlichkeit gerät. Doch heute ist alles anders. Der PHP Hacker ist aus der Versenkung zurückgekehrt und hat alle Entwickler dazu aufgerufen ihren schlimmsten Code Schnipsel am Developers Shame [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://localdev.de/wp-content/uploads/2010/11/shame-day.png"><img class="alignright size-full wp-image-1285" title="shame day" src="http://localdev.de/wp-content/uploads/2010/11/shame-day.png" alt="" width="200" height="267" /></a>Jeder Programmierer hat mal klein angefangen und dabei Code produziert, für den er sich im Nachhinein schämt, und von dem er hofft, dass er nie an die Öffentlichkeit gerät.</p>
<h2 style="text-align:center;">Doch heute ist alles anders.</h2>
<p>Der PHP Hacker ist aus der Versenkung zurückgekehrt und hat alle Entwickler dazu aufgerufen ihren schlimmsten Code Schnipsel am <a href="http://phphacker.net/2010/10/26/der-developers-shame-day/" target="_blank">Developers Shame Day</a> zu veröffentlichen. Neueinsteiger sollen sehen, dass auch die Profis von heute mal klein angefangen haben und es keine Schande ist, wenn der Code am Ende doch nur Murks ist.</p>
<p>Ich habe mich also daran gemacht und meine Archive der letzten 10 Jahre durchforstet um das richtige zu finden. Und nach langem Suchen habe ich nun endlich den passenden Code Schnipsel gefunden, bei dem ich alles falsch gemacht habe, was man nur falsch machen kann. Er ist aus dem Jahr 2001 und gehört zu einem meiner ersten PHP Projekte.<br />
<span id="more-1276"></span></p>
<pre class="brush: php; title: ; notranslate">
function shoutbox ($messages,$info,$id,$ip_test) {
	global $template, $ip, $PHP_SELF, $werbeart_1,$werbeart_2, $appurl, $appname, $admin_email, $admin_name;
	while (list($key,$value) = each($info)) {
		$$key = $value;
	}
	if (!$css)
		$css_file = &quot;no_css.css&quot;;
else
$css_file = $id . &quot;.css&quot;;
	$i = 1;
	for ($z=0; $z&lt;count($messages); $z++) {
		$thx = $messages[$z];
		$thx[name] = replace($thx[name]);
		$thx[url] = replace($thx[url],1);
		$datum = get_time($thx[datum],1,1);
		if ($thx[url]) {
			$uname = &quot;&lt;b title=\&quot;Geschrieben: $datum\&quot;&gt;&lt;a href=\&quot;$thx[url]\&quot; target=\&quot;_blank\&quot;&gt;&quot; . $thx[name] . &quot;:&lt;/a&gt;&lt;/b&gt;&quot;;
		} else {
			$uname = &quot;&lt;b title=\&quot;Geschrieben: $datum\&quot;&gt;&quot; . $thx[name] . &quot;:&lt;/b&gt;&quot;;
		}
		$thx[chat] = replace($thx[chat]);
		$time = time() - $deletetime;
		if ($thx['datum'] &gt; $time &amp;&amp; $thx[ip] == $ip &amp;&amp; $ip_test) {
			$thx[chat] = $thx[chat] . &quot;&lt;br&gt;&lt;a href=\&quot;&quot; . $PHP_SELF . &quot;?id=$id&amp;action=$action&amp;mode=delete&amp;mid=&quot; . $thx[id] . &quot;\&quot;&gt;Nachricht löschen&lt;/a&gt;&quot;;
		}
		if ($smilies) {
			$thx[chat] = smile($thx[chat],$smilietheme,$smiliecolor);
		}
		$color = $info[('table_' . $i)];
		@eval (&quot;\$entry .= \&quot;&quot;.$template-&gt;get(&quot;shoutbox_entry&quot;).&quot;\&quot;;&quot;);
		if ($i == 1) $i++; else $i--;
	}
	if ($newpost)
		$scroll = 999999;
else
$scroll = 0;
	if ($werbeart_1 &amp;&amp; $werbung) {
		$werbung_1 = @implode(&quot;&quot;,@file(&quot;./temp/banner_1.htm&quot;));
	}
	if ($werbeart_2 &amp;&amp; $werbung) {
		$werbung_2 = @implode(&quot;&quot;,@file(&quot;./temp/banner_2.htm&quot;));
	}
	if ($hp)
		@eval (&quot;\$hp_feld = \&quot;&quot;.$template-&gt;get(&quot;shoutbox_hp&quot;).&quot;\&quot;;&quot;);
	if ($rbutton)
		@eval (&quot;\$reset = \&quot;&quot;.$template-&gt;get(&quot;shoutbox_reset&quot;).&quot;\&quot;;&quot;);
	if ($old &amp;&amp; !$help)
		@eval (&quot;\$links = \&quot;&quot;.$template-&gt;get(&quot;shoutbox_links_1&quot;).&quot;\&quot;;&quot;);
	if (!$old &amp;&amp; $help)
		@eval (&quot;\$links = \&quot;&quot;.$template-&gt;get(&quot;shoutbox_links_2&quot;).&quot;\&quot;;&quot;);
	if ($old &amp;&amp; $help)
		@eval (&quot;\$links = \&quot;&quot;.$template-&gt;get(&quot;shoutbox_links_3&quot;).&quot;\&quot;;&quot;);
	if ($reload)
		@eval (&quot;\$reload = \&quot;&quot;.$template-&gt;get(&quot;shoutbox_reload&quot;).&quot;\&quot;;&quot;);
	else
		unset($reload);
	@eval (&quot;\$inhalt = \&quot;&quot;.$template-&gt;get(&quot;shoutbox_view&quot;).&quot;\&quot;;&quot;);
	return $inhalt;
}
</pre>
<p>Auch wenn die Fehler eigentlich offensichtlich sind, will ich sie dennoch einmal auflisten, allein der Vollständigkeit wegen.</p>
<ol>
<li>Keine ordentliche Formatierung. Für den Beitrag habe ich den Code nachformatiert. Im Original sieht er <a href="http://localdev.de/wp-content/uploads/2010/11/Developers-Shame-Day.txt" target="_blank">so</a> aus. (Der restliche Code des Projekts ist eigenartigerweise ordentlich formatiert)</li>
<li>Keine einheitliche Klammerung</li>
<li>Vermischung von Deutsch und Englisch</li>
<li>(Kein OOP)</li>
<li>Verwendung von global</li>
<li>Ein übergebenes Array ohne Prüfung in reguläre Variablen verwandelt (mit <em>while</em>!)</li>
<li>Variablen ohne Prüfung auf ihre Existenz verwendet</li>
<li><em>count</em> im Schleifenkopf</li>
<li>Array Schlüssel ohne Häkchen verwendet</li>
<li>Keine ordentliche Konkatenierung von Strings und Variablen.</li>
<li><em>eval</em> is evil</li>
<li>Fehlermeldungen mit @ unterdrückt.</li>
</ol>
<p>Mit dem Code Schnipsel dürfte ich wahrscheinlich an der Spitze aller Negativbeispiele liegen, aber jeder fängt mal klein an und wird mit der Zeit immer besser. Damals habe ich noch für mich persönlich programmiert, heute mache ich es beruflich. So kann sich die Zeit ändern.</p>
<p><strong>Weitere Beiträge zum Developers Shame Day:</strong></p>
<ul>
<li><a href="http://softwareentwickler.blogspot.com/2010/11/mein-beitrag-zum-developers-shame-day.html" target="_blank">Software-Entwickler Blog</a></li>
<li><a href="http://www.phphatesme.com/blog/aktuelles/der-developers-shame-day/" target="_blank">PHP hates me</a></li>
<li><a href="http://phphacker.net/2010/11/03/meine-erste-template-engine/" target="_blank">PHP Hacker</a></li>
<li><a href="http://www.phpmonkeys.de/2010/11/03/developers-shame-day/" target="_blank">Phpmonkeys</a></li>
</ul>
<p><small><em>Das <a href="http://www.sxc.hu/photo/880394" target="_blank">Bild</a> wurde der Seite <a href="http://www.sxc.hu/" target="_blank">sxc.hu</a> entnommen und stammt vom Benutzer &#8220;<a href="http://www.sxc.hu/profile/dreamer07" target="_blank">dreamer07</a>&#8220;</em></small></p>
]]></content:encoded>
			<wfw:commentRss>http://localdev.de/2010/11/ich-schame-mich-am-developers-shame-day/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>PHP: Welche Interfaces implementiert eine Klasse</title>
		<link>http://localdev.de/2010/04/php-welche-interfaces-implementiert-eine-klasse-reflection/</link>
		<comments>http://localdev.de/2010/04/php-welche-interfaces-implementiert-eine-klasse-reflection/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 21:22:31 +0000</pubDate>
		<dc:creator>Fabian Martin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Feature]]></category>
		<category><![CDATA[Interface]]></category>
		<category><![CDATA[Klasse]]></category>
		<category><![CDATA[Objekt]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://localdev.de/?p=681</guid>
		<description><![CDATA[Auf Phpmonkeys ist letzte Woche ein Artikel über Marker Interfaces erschienen, der einem kurz die Idee dahinter erläutert und wie man sie am Beispiel eines Caches nutzen kann. Ich selber nutze Marker Interfaces in verschiedenen Projekten um darüber zu bestimmen, ob ein bestimmtes Feature für ein Objekt zur Verfügung steht. Ich vereinfache damit u.a. die [...]]]></description>
			<content:encoded><![CDATA[<p>Auf <a href="http://www.phpmonkeys.de/">Phpmonkeys</a> ist letzte Woche ein Artikel über <a href="http://www.phpmonkeys.de/2010/04/06/marker-interfaces-ein-beispiel/">Marker Interfaces</a> erschienen, der einem kurz die Idee dahinter erläutert und wie man sie am Beispiel eines Caches nutzen kann. </p>
<p>Ich selber nutze Marker Interfaces in verschiedenen Projekten um darüber zu bestimmen, ob ein bestimmtes Feature für ein Objekt zur Verfügung steht. Ich vereinfache damit u.a. die Generierung des Administrations Oberfläche. Aber wie bekommt man heraus, welche Interfaces eine Klasse implementiert?</p>
<p>Wir haben die Möglichkeit über <em>instanceof</em> und <em>is_a</em> zu prüfen ob eine bestimmtes Interface implementiert wird, oder wir lassen uns von den Reflection Klassen, die seit PHP 5.0 zur Verfügung stehen, alle implementierten Interfaces zurückgeben.</p>
<p><strong>Unsere Testobjekte</strong></p>
<pre class="brush: php; title: ; notranslate">
interface AdminFeature
{

}

class Admin implements AdminFeature
{

}

$objAdmin = new Admin();
</pre>
<p><strong>Instanz der Reflection Klasse erzeugen</strong></p>
<pre class="brush: php; title: ; notranslate">
$objReflection = new ReflectionClass('Admin');

// Oder direkt vom Objekt
// $objReflection = new ReflectionClass($objAdmin);
</pre>
<p>Die Reflection Klasse enthält die Methoden <em>getInterfaceNames</em> und <em>getInterfaces</em>, die uns alle genutzten Interfaces zurückgeben. Möchten wir auf ein bestimmtes Interface prüfen, stehen uns die Methode <em>implementsInterface</em> bzw. die Prüfung mittels <em>instanceof</em> und <em>is_a</em> zur Verfügung.</p>
<p><strong>getInterfaceNames</strong><br />
getInterfaceNames gibt uns ein Array mit den Namen der Interfaces zurück.</p>
<pre class="brush: php; title: ; notranslate">
$arrResult = $objReflection-&gt;getInterfaceNames();

/*
array(1) {
  [0]=&gt;
  string(12) &quot;AdminFeature&quot;
}
*/
</pre>
<p><strong>getInterfaces</strong><br />
getInterfaces gibt uns ein Array mit allen Interfaces zurück. Die Elemente des Arrays enthalten für jedes Interface ein Objekt der Relection Klasse.</p>
<pre class="brush: php; title: ; notranslate">
$arrResult = $objReflection-&gt;getInterfaces();

/*
array(1) {
  [&quot;AdminFeature&quot;]=&gt;
  &amp;object(ReflectionClass)#3 (1) {
    [&quot;name&quot;]=&gt;
    string(12) &quot;AdminFeature&quot;
  }
}
*/
</pre>
<p><strong>implementsInterface, instanceof und is_a</strong><br />
Haben wir ein Objekt der Klasse erzeugt, können wir instanceof und is_a nutzen um herauszufinden, ob die gewünschte Klasse implementiert wird. Der Weg über die Reflection Klasse ist hier nicht nötig.</p>
<p>Möchten wir vor der Erzeugung des Objekts herausfinden, ob ein Interface implementiert wird, können wir die Methode implementsInterface unseres Reflection Objekts nutzen.</p>
<pre class="brush: php; title: ; notranslate">
$boolReturn = $objReflection-&gt;implementsInterface('AdminFeature');
// bool(true)
$boolReturn = $objAdmin instanceof AdminInterface;
// bool(true)
$boolReturn = is_a($objAdmin, 'AdminInterface');
// bool(true)
</pre>
<p>is_a ist seit PHP 5.3 übrigens nicht mehr als deprecated markiert.</p>
<p>Über Reflection kann man aber mehr als nur die Interfaces ermitteln. Wer möchte kann sich z.B. die Kommentare zurückgeben lassen und über diese z.B <a href="http://de.wikipedia.org/wiki/Annotation_(Programmierung)">Annotations</a> implementieren. Ein Blick ins <a href="http://de2.php.net/manual/de/book.reflection.php">PHP Handbuch</a> lohnt sich. </p>
]]></content:encoded>
			<wfw:commentRss>http://localdev.de/2010/04/php-welche-interfaces-implementiert-eine-klasse-reflection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP: Getter und Setter mit PDT generieren</title>
		<link>http://localdev.de/2010/02/php-getter-und-setter-mit-pdt-generieren/</link>
		<comments>http://localdev.de/2010/02/php-getter-und-setter-mit-pdt-generieren/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 11:40:25 +0000</pubDate>
		<dc:creator>Fabian Martin</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Getter]]></category>
		<category><![CDATA[Klassen]]></category>
		<category><![CDATA[Kostenlos]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PDT]]></category>
		<category><![CDATA[Properties]]></category>
		<category><![CDATA[Setter]]></category>

		<guid isPermaLink="false">http://localdev.de/?p=518</guid>
		<description><![CDATA[Eine Möglichkeit, automatisch Getter und Setter mit PDT zu generieren, habe ich noch nicht gefunden. Mit dem unten genannten Code, könnt Ihr das Erstellen von Gettern und Settern mit PDT aber beschleunigen. Erstellt hierzu ein neues Code Template (Window -> Preferences -> PHP -> Editor -> Templates) und gebt ihm den Namen &#8216;get&#8217;. In das [...]]]></description>
			<content:encoded><![CDATA[<p>Eine Möglichkeit, automatisch Getter und Setter mit PDT zu generieren, habe ich noch nicht gefunden. Mit dem unten genannten Code, könnt Ihr das Erstellen von Gettern und Settern mit PDT aber beschleunigen.</p>
<p>Erstellt hierzu ein neues Code Template (<em>Window</em> -> <em>Preferences</em> -> <em>PHP</em> -> <em>Editor</em> -> <em>Templates</em>) und gebt ihm den Namen &#8216;get&#8217;. In das Feld Pattern, fügt ihr den unten gezeigten Code ein.</p>
<p>Um nun Getter und Setter zu generieren, müsst ihr nur noch &#8216;get&#8217; in euren Editor tippen und die Tastenkombination STRG+Leertaste drücken. Der Code sollte erscheinen und der Cursor in der ersten Variable blinken. Mit Tab könnt ihr zwischen den Werten springen.</p>
<pre class="brush: php; title: ; notranslate">
/**
* Legt ${field} fest
*
* @param ${type} ${dollar}${field}
* @return void
*/
public function set${funcName}(${dollar}${field})
{
	${dollar}this-&gt;${field} = ${dollar}${field};
}

/**
* Gibt ${field} zurück
*
* @return ${type}
*/
public function get${funcName}()
{
	return ${dollar}this-&gt;${field};
}
</pre>
<p>Das ganze geht natürlich auch mit statischen Werten:</p>
<pre class="brush: php; title: ; notranslate">
/**
* Legt ${field} fest
*
* @param ${type} ${dollar}${field}
* @return void
*/
public static function set${funcName}(${dollar}${field})
{
	self::${dollar}${field} = ${dollar}${field};
}

/**
* Gibt ${field} zurück
*
* @return ${type}
*/
public static function get${funcName}()
{
	return self::${dollar}${field};
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://localdev.de/2010/02/php-getter-und-setter-mit-pdt-generieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

