<?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>blog.dennis.io &#187; php</title>
	<atom:link href="http://blog.dennis.io/category/coding/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.dennis.io</link>
	<description>... geek and proud of it</description>
	<lastBuildDate>Thu, 08 Dec 2011 18:34:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>phpUnit und Klassen mit __call</title>
		<link>http://blog.dennis.io/phpunit-und-klassen-mit-__call/</link>
		<comments>http://blog.dennis.io/phpunit-und-klassen-mit-__call/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 18:34:18 +0000</pubDate>
		<dc:creator>dennis</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[__call]]></category>

		<guid isPermaLink="false">http://blog.dennis.io/?p=386</guid>
		<description><![CDATA[Nutzt man phpUnit mit Klassen die MagicMethods wie z.B. __call() enthalten ist Vorsicht geboten. Ich habe gerade recht lange gebraucht um herauszufinden, warum folgender Test nicht funktioniert. Zunächst zwei Klassen, eine davon definieren wir als abstract class: &#60;?php class AnotherRealObject { public function __call($method, $args) { return 'AnotherRealObject->'.$method.'()'; } } abstract class SomeAbstractClassWithConcreteMethods { private [...]]]></description>
			<content:encoded><![CDATA[<p>Nutzt man phpUnit mit Klassen die MagicMethods wie z.B. __call() enthalten ist Vorsicht geboten. Ich habe gerade recht lange gebraucht um herauszufinden, warum folgender Test nicht funktioniert.</p>

<p>Zunächst zwei Klassen, eine davon definieren wir als <em>abstract class</em>:</p>

<div><pre class="brush:php">
&lt;?php
    class AnotherRealObject {
    
        public function __call($method, $args) {
            return 'AnotherRealObject->'.$method.'()'; 
        }
    
    }

    abstract class SomeAbstractClassWithConcreteMethods {

        private $anotherObject;
    
        abstract public function abstractMethod();
    
       public function concreteMethodToSetObject($o) {
            $this->anotherObject = $o;
        }

        public function concreteMethod() {
            return $this->anotherObject->aMethod();
        }
    
    }        
?&gt;   
</pre></div>

<p><span id="more-386"></span>
Soweit nichts aufregendes. AnotherRealObject enthält lediglich eine Methode, die bei einem beliebigen Methoden-Aufruf einen String zurückgibt, der angibt welche Methode auf dem Objekt aufgerufen wurde. Mal kurz in einer interaktiven PHP-Shell getestet sieht das ganze so aus:</p>

<div><pre class="brush:bash">
    php > $stub = new AnotherRealObject();
    php > echo $stub->blubb();
    AnotherRealObject->blubb()
    php > echo $stub->someMethodWithAnArbitraryName();
    AnotherRealObject->someMethodWithAnArbitraryName()  
</pre></div>

<p>Die zweite Klasse ist abstract definiert. Das hat für diesen Beitrag keinen besonderen Grund, ich wollte in meinen Tests einfach nur ausschließen, dass das Problem darauf zurückzuführen ist. Die Klasse hat zwei konkrete Methoden. Eine zum Setzen der Abhängigkeit $anotherObject und eine weitere, die auf diesem Objekt eine Methode aufruft und deren Rückgabewert zurückgibt.</p>

<p>Ein phpUnit Test um die abstrakte Klasse zu testen könnte wie folgt aussehen:</p>

<div><pre class="brush:php">
    class phpUnitBugTest extends PHPUnit_Framework_TestCase {

        private $uut;
        private $stub;

        public function setUp() {

            $this->uut = $this->getMockForAbstractClass('SomeAbstractClassWithConcreteMethods');

            $this->stub = $this->getMock('AnotherRealObject');
            $this->stub->expects( $this->any() )
                          ->method('aMethod')
                       ->will ( $this->returnValue('StubOfAnotherRealObject->aMethod()') );

            $this->uut->concreteMethodToSetObject($this->stub);
        }


        public function testBug() {
            $this->assertEquals('StubOfAnotherRealObject->aMethod()', $this->uut->concreteMethod());
        }


    }
</pre></div>

<p>Mit der durch phpUnit bereitgestellten Methode <em>getMockForAbstractClass()</em> instanzieren wir eine Instanz der abstrakten Klasse (das Testobjekt). Außerdem instanzieren wir ein Stub von <em>AnotherRealObject</em> und legen fest, dass beim Aufruf der Methode <em>aMethod</em> auf diesem Stub der String <em>StubOfAnotherRealObject->aMethod()</em> zurückgegeben wird. Anschließend wird das Stub noch in die Instanz der abstrakten Klasse injected.</p>

<p>Soweit so gut &#8211; fehlt der eigentliche Test. Was sollte passieren, wenn auf dem TestObjekt die Methode <em>concreteMethod()</em> aufgerufen wird? Nun ja, die Methode ruft auf dem Feld $anotherObject die Methode <em>aMethod</em> auf. Dem Feld <em>$anotherObject</em> ist unser Stub zugewiesen und dem Stub haben wir gesagt, dass es beim Aufruf von <em>anotherMethod</em> den String <em>StubOfAnotherRealObject->aMethod()</em> zurückgeben soll. Dementsprechend sollte ein aufruf von <em>concreteMethod()</em> genau diesen String zurückliefern.</p>

<p>Leider spielt phpUnit hier nicht mit. Der Test schlägt fehl:</p>

<div><pre class="brush:bash">
    There was 1 failure:

    1) phpUnitBugTest::testBug
    Failed asserting that two strings are equal.
    --- Expected
    +++ Actual
    @@ @@
    -StubOfAnotherRealObject->aMethod()
    +

    dev/phpUnitBugTest.php:45   
</pre></div>

<p>Wie man sieht gibt es gar keinen Rückgabewert. 
Aber warum ist das so? PhpUnit erstellt nur Method-Stubs für Methoden, die es tatsächlich in der Klasse gibt. Die Methode <em>aMethod</em> gibt es aber nicht wirklich, also erstellt phpUnit auch kein Stub dafür. Es gibt allerdings eine einfache Lösung für das Problem &#8211; auch wenn ich sie nicht besonders schön finde: Man sagt phpUnit einfach explizit, dass es einen Stub für die Methode <em>aMethod</em> erstellen soll. Dies geschieht beim erzeugen des Stubs:</p>

<div><pre class="brush:php">
    $this->stub = $this->getMock('AnotherRealObject', array('aMethod'));
</pre></div>

<p>Mit dieser Änderung läuft der Test durch. Aber Vorsicht: PhpUnit erstellt jetzt nur Stubs, die durch den Parameter festgelegt wurden. D.h. es müssen alle Methoden in diesem Array übergeben werden, für die Subs angelegt werden sollen &#8211; egal ob diese in der eigentlichen Klassen existieren oder nicht. Und genau dies ist auch der Grund, warum ich diese Lösung nicht schön finde.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dennis.io/phpunit-und-klassen-mit-__call/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Getter/Setter Generator</title>
		<link>http://blog.dennis.io/php-gettersetter-generator/</link>
		<comments>http://blog.dennis.io/php-gettersetter-generator/#comments</comments>
		<pubDate>Sat, 30 Oct 2010 13:10:29 +0000</pubDate>
		<dc:creator>dennis</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[getter]]></category>
		<category><![CDATA[setter]]></category>

		<guid isPermaLink="false">http://blog.dennis.io/?p=381</guid>
		<description><![CDATA[Ich benutze seit kurzem die PHP Development Tools von Eclipse zum Entwickeln von PHP Code. Eclipse selbst ist eine sehr gute IDE, allerdings hat das PDT Plugin hier und da doch noch einige Schwächen. Zum Beispiel war ich gerade dabei, eine neue Klasse für das IRD Bogenoffset Tool zu schreiben, die insgesamt auf 52 Felder [...]]]></description>
			<content:encoded><![CDATA[<p>Ich benutze seit kurzem die <a href="http://www.eclipse.org/pdt/">PHP Development Tools</a> von <a href="http://www.eclipse.org/" title="Eclipse.org home">Eclipse</a> zum Entwickeln von PHP Code. Eclipse selbst ist eine sehr gute IDE, allerdings hat das PDT Plugin hier und da doch noch einige Schwächen. Zum Beispiel war ich gerade dabei, eine neue Klasse für das <a href="http://ird-online.de/wissen/ird-online-prozessrating/">IRD Bogenoffset Tool</a> zu schreiben, die insgesamt auf 52 Felder kam. Jetzt bin ich es von Java natürlich gewohnt, dass die IDE mir für diese Felder automatisch Getter und Setter generiert &#8211; leider geht das mit den PDT nicht <img src='http://blog.dennis.io/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> .</p>

<p>Nach einer kurzen Google Recherche musste ich feststellen, dass im Netz auch kein brauchbarer PHP Getter/Setter Generator aufzutreiben ist. Also, nicht lange rumdümpeln, schreibe ich mir halt schnell selbst einen &#8211; sowieso die Gelegenheit sich mal die <a href="http://php.net/manual/en/book.reflection.php" title="PHP: Reflection - Manual">PHP Reflection API</a> anzuschauen. Hier das Ergebnis nach 10 Minuten Arbeit:</p>

<div><pre class="brush:php">
#!/usr/bin/php
&lt;?php

    if (!is_file($argv[2])) 
        die('Use this way: '.$argv[0].' &lt;class_name&gt; &lt;path_to_your_class`s_php_file&gt;'."\n");

    require_once($argv[2]);

    $class = new $argv[1]();
    $reflection = new ReflectionClass($argv[1]);
    $fields = $reflection->getProperties(
        ReflectionProperty::IS_PRIVATE
        | ReflectionProperty::IS_PROTECTED
    );

    foreach ($fields AS $f) {

        // getter
        echo 'public function get'.ucfirst($f->getName()).'() {'."\n";
        echo "\t".'return $this->'.$f->getName().';'."\n";
        echo '}'."\n";
        // setter
        echo 'public function set'.ucfirst($f->getName()).'($val) {'."\n";
        echo "\t".'$this->'.$f->getName().' = $val;'."\n";
        echo '}'."\n\n";

    }
    echo 'Generated Getter and Setter for '.count($fields).' fields'."\n\n";
?&gt;   
</pre></div>

<p>Das ganze ist ein PHP-Konsolenscript. Als Parameter den Namen eurer Klasse und den Pfad zur PHP Datei mitgeben in der die Klasse deklariert ist. Als Ausgabe erhält man die Getter- und Setter-Methoden für alle Felder, die als <code>private</code> oder <code>protected</code> deklariert sind. Vielleicht hat ja noch jemand anders Verwendung dafür &#8211; mir hats eine Menge Zeit gespart <img src='http://blog.dennis.io/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dennis.io/php-gettersetter-generator/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>WP: Email-Absender</title>
		<link>http://blog.dennis.io/wp-email-absender-aendern/</link>
		<comments>http://blog.dennis.io/wp-email-absender-aendern/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 20:47:12 +0000</pubDate>
		<dc:creator>dennis</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wordpress-plugins]]></category>
		<category><![CDATA[action]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[getting started]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://blog.kips-world.de/?p=226</guid>
		<description><![CDATA[Ich habe heute angefangen die Kundendatenbank des IRD an WordPress anzukoppeln damit sich unsere Kunden direkt auf unserer Webseite anmelden können und sich nicht extra über WordPress registrieren müssen. Beim Testen der Funktionen hat mich der Absender der Passwort-Erinnerungs-Mails extrem gestört. WordPress benutzt hier standardmäßig den Namen &#8220;WordPress&#8221; und die Email-Adresse &#8220;wordpress@domain.tld&#8221; (wobei domain.tld natürlich [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe heute angefangen die Kundendatenbank des IRD an WordPress anzukoppeln damit sich unsere Kunden direkt auf unserer Webseite anmelden können und sich nicht extra über WordPress registrieren müssen. Beim Testen der Funktionen hat mich der Absender der <code>Passwort-Erinnerungs-Mails</code> extrem gestört. WordPress benutzt hier standardmäßig den Namen &#8220;WordPress&#8221; und die Email-Adresse &#8220;wordpress@domain.tld&#8221; (wobei domain.tld natürlich durch die Domain ersetzt wird auf der WordPress läuft).</p>

<p>Zum Glück muss man bei WordPress mit solchen Schönheitsfehlern nicht leben &#8211; ein kleines MiniPlugin genügt um seine eigene Email-Adresse und den Absendernamen festzulegen. Hier erstmal der Code:</p>

<div><pre class="brush:php">
&lt;?php
/*
Plugin Name: myemail
Plugin URI: http://blog.kips-world.de
Description: Some wordpress hacks for my website
Version: 1.0
Author: Dennis Saenger
Author URI: http://blog.kips-world.de
*/

function kip_from_mail($f) {

        $admin = get_userdata(1);
        return $admin->user_email;
}
function kip_from_name($f) {

        $admin = get_userdata(1);
        return $admin->display_name;
}
add_filter('wp_mail_from', 'kip_from_mail', 0, 1);
add_filter('wp_mail_from_name', 'kip_from_name', 0, 1);
?&gt;
</pre></div>

<p>Um den Absendernamen und die Emailadresse zu ändern benutze ich hier je einen WordPress-Filter. Immer wenn WordPress eine Email verschicken will, werden diese beiden Filter automatisch aufgerufen. Als Parameter übergibt WordPress die Default-Werte an die Funktionen. Bei <em>kip_from_mail()</em> übergibt WordPress &#8220;wordpress -ät- blog.kips-world.de&#8221;, bei <em>kip_from_name()</em> wird &#8220;WordPress&#8221; übergeben. Man könnte diese Werte jetzt modifizieren und zurückgeben, aber ich habe mich dafür entschieden einfach den Nickname und die Emailadresse des Admin als Absender zu nutzen. Ich ignoriere die Variablen (<em>$f</em>) in beiden Funktionen also einfach und hole mir mit der Funktion <em>get_userdata()</em> einfach die Werte des admin Users (der admin hat die User-ID <em>1</em>).</p>

<p>Um das ganze selbst auszuprobieren erstellst du in deinem WordPress-Pluginordner einfach eine Datei &#8220;myemail.php&#8221; und kopierst den obigen PHP-Code dort hinein. Im Admin-Bereich von WordPress wird es dann ein neues Plugin &#8220;myemail&#8221; geben. Dieses noch schnell aktivieren und schon sendet WordPress Emails mit einem schönen Absender!</p>

<p>Wer jetzt Lust bekommen hat selbst kleine Modifikationen an WordPress vorzunehmen findet im WordPress-Codex alles was er wissen muss. In der <a href="http://codex.wordpress.org/Plugin_API">Plugin-API</a> gibt es eine Einführung zu Filtern und Actions (die beiden Plugin-Schnittstellen von WordPress). In der <a href="http://codex.wordpress.org/Function_Reference">Function Reference</a> werden alle WordPress-Funktionen inklusive Beschreibung aufgelistet. Und auf der Homepage von <a href="http://adambrown.info/">Adam</a> findet man eine komplette <a href="http://adambrown.info/p/wp_hooks">Liste mit allen Filtern und Actions</a> (sehr wichtig!).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dennis.io/wp-email-absender-aendern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>aptana &#8211; die web ide</title>
		<link>http://blog.dennis.io/aptana-die-web-ide/</link>
		<comments>http://blog.dennis.io/aptana-die-web-ide/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 23:26:50 +0000</pubDate>
		<dc:creator>dennis</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[html/css]]></category>
		<category><![CDATA[javascript/jQuery]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[aptana]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ide]]></category>

		<guid isPermaLink="false">http://blog.kips-world.de/?p=57</guid>
		<description><![CDATA[Viele Entwickler von Webanwendungen sind der Meinung ein einfacher Text-Editor reicht für die tägliche Arbeit. Für kleine Projekte oder um mal schnell eine Änderung zu machen stimmt das sicherlich, aber wenn es an größere Projekte geht erleichtert eine gute IDE die Arbeit erheblich. Ich arbeite schon seit längerem mit Aptana. Die Standard Version von Aptana [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.kips-world.de/wp-content/uploads/2009/08/logo.png" alt="aptana" title="aptana" width="54" height="53" class="alignright size-full wp-image-97" />
Viele Entwickler von Webanwendungen sind der Meinung ein einfacher Text-Editor reicht für die tägliche Arbeit. Für kleine Projekte oder um mal schnell eine Änderung zu machen stimmt das sicherlich, aber wenn es an größere Projekte geht erleichtert eine gute IDE die Arbeit erheblich.</p>

<p><span id="more-57"></span></p>

<p>Ich arbeite schon seit längerem mit <a href="http://aptana.com/">Aptana</a>. Die Standard Version von Aptana Studio ist kostenlos und bringt alle wichtigen Funktionen die ich benötige mit sich. Das schöne an Aptana, es basiert auf <a href="http://de.wikipedia.org/wiki/Eclipse_(IDE)">Eclipse</a> und ist als Standalone Anwendung aber auch als Eclipse Plugin zu haben. Da ich Eclipse sowieso auf dem Rechner habe, benutze ich die Plugin-Version von Aptana.</p>

<p>Die Plugin-Version von Aptana wird wie jede andere Erweiterung für Eclipse installiert. In der Eclipse IDE auf &#8220;Hilfe&#8221; > &#8220;Neue Software installieren&#8221; und die Aptana Update Seite hinzufügen. In den folgenden Dialogen sicherstellen, dass die Kästchen für Aptana Studio aktiviert sind &#8211; fertig.</p>

<p><a href="http://blog.kips-world.de/wp-content/uploads/2009/08/aptana1.png"><img src="http://blog.kips-world.de/wp-content/uploads/2009/08/aptana1-150x150.png" alt="aptana1" title="aptana1" width="150" height="150" class="alignleft size-thumbnail wp-image-101" /></a>
Wenn Aptana Studio installiert ist und Eclipse neu gestartet wurde, wird man mit einem neuen Fenster begrüßt. In diesem Fenster können weitere Aptana Plugins installiert werden. Ich habe hier <strong>Aptana PHP</strong>, <strong>jQuery Support</strong> und <strong>Subversive</strong> nachinstalliert. Der Aptana CSS und HTML Editor ist im Studio schon integriert.</p>

<p><a href="http://blog.kips-world.de/wp-content/uploads/2009/08/aptana2.png"><img src="http://blog.kips-world.de/wp-content/uploads/2009/08/aptana2-150x150.png" alt="aptana2" title="aptana2" width="150" height="150" class="alignright size-thumbnail wp-image-102" /></a>
Wenn alles fertig installiert ist sollte man noch ein paar Einstellungen machen. Unter den Eclipse Einstellungen findet man nun einen neuen Unterpunkt &#8220;Aptana&#8221;. In &#8220;Aptana&#8221; unter &#8220;Editoren&#8221; > &#8220;PHP&#8221; > &#8220;PHP Bibliotheken&#8221; kann man zunächst <a href="http://smarty.net/">Smarty</a> aktivieren und dann zusätzlich eigene Bibliotheken hinzufügen. Ich habe hier mein PHP Framework <a href="http://blog.kips-world.de/pew">pew</a> hinzugefügt. Die hier aktivierten Bibliotheken liest Apatana ein und bietet eine <a href="http://de.wikipedia.org/wiki/Autovervollständigen">Autovervollständigung</a> für die Befehle der Bibliotheken an. Für PHP, HTML und CSS macht Aptana das selbstverständlich schon standardmäßig.</p>

<p>So, jetzt kann es endlich losgehen. Über &#8220;Datei&#8221; > &#8220;Neu&#8221; > &#8220;Aptana Projekte&#8221; > &#8220;PHP Projekt&#8221; kann nun ein neues Aptana PHP Projekt gestartet werden! Demnächst werde ich dann noch beschreiben wie man das SVN Plugin Subversive richtig installiert und konfiguriert.</p>

<p>Wem der Funktionsumfang von Eclipse + Aptana immernoch nicht genug ist, der kann sich einmal auf <a href="http://www.eclipseplugincentral.com/">eclipseplugincentral.com</a> umschauen. Dort finden sich noch über 1000 andere Plugins für Eclipse! Wer was gutes findet darf mir gerne Bescheid sagen <img src='http://blog.dennis.io/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dennis.io/aptana-die-web-ide/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

