<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0IBRXszeyp7ImA9WxBUGEU.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244</id><updated>2010-03-06T05:19:14.583-08:00</updated><title>Cookie Pattern</title><subtitle type="html">Design Patterns for PHP developers and everyone who's interested in seeing short examples for some of the GoF, Fowler PoEAA or Evans DDD Pattern .... &lt;br/&gt;
in a tasty way :P</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.cookiepattern.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/CookiePattern" /><feedburner:info uri="cookiepattern" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/2.0/" /><feedburner:emailServiceId>CookiePattern</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;DkYCQn07eip7ImA9WxJaF0s.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-3434744572941745716</id><published>2009-08-08T13:40:00.000-07:00</published><updated>2009-08-08T13:42:43.302-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-08T13:42:43.302-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="php" /><title>www.encodingchain.com</title><content type="html">&lt;a href="http://www.encodechain.com/" mce_href="http://www.encodechain.com" target="_blank"&gt;encodechain.com&lt;/a&gt; was released today. A little tool which enables to combine various popular PHP conversion methods and to check how they affect your input... feel free to give me some feedback :) &lt;p&gt;Maybe someone could suggest a WebTwoOooo-Name for this service :P&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-3434744572941745716?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=JY3Ntj3D7II:Y75yQ-vPvmQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=JY3Ntj3D7II:Y75yQ-vPvmQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=JY3Ntj3D7II:Y75yQ-vPvmQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=JY3Ntj3D7II:Y75yQ-vPvmQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=JY3Ntj3D7II:Y75yQ-vPvmQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/3434744572941745716/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=3434744572941745716" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/3434744572941745716?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/3434744572941745716?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/JY3Ntj3D7II/wwwencodingchaincom.html" title="www.encodingchain.com" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2009/08/wwwencodingchaincom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEFQHg6cCp7ImA9WxdbEkw.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-9738554343947493</id><published>2008-08-08T10:30:00.000-07:00</published><updated>2008-08-08T10:30:11.618-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-08T10:30:11.618-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="php" /><title>bye bye version 4...</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;Ten years ago Andi Gutmans and Zeev Suraski started to renew the old PHP3 core and in 1999 PHP4 was published and became really famous among Web-Developers.&lt;br /&gt;Bute 5 years late the successor was published and since then everyone is wondering why the era of PHP4 will end.&lt;br /&gt;Today is the magical 8-8-8 where PHP4 is no longer supported so for everyone who still runs PHP4 for some reason&lt;br /&gt;YOU SHOW NOW REALLY HAVE A LOOK AT THIS PAGE: &lt;a href="http://www.php.net/manual/en/migration5.php"&gt;www.php.net/manual/en/migration5.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Detailed history of PHP can be found on &lt;a href="http://www.php.net/history"&gt;www.php.net/history&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;div id="codeblock" class="code"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-9738554343947493?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=mKs971gYGRU:5RUmwvDS1_c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=mKs971gYGRU:5RUmwvDS1_c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=mKs971gYGRU:5RUmwvDS1_c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=mKs971gYGRU:5RUmwvDS1_c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=mKs971gYGRU:5RUmwvDS1_c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/9738554343947493/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=9738554343947493" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/9738554343947493?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/9738554343947493?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/mKs971gYGRU/bye-bye-version-4.html" title="bye bye version 4..." /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/08/bye-bye-version-4.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEACQH4-eSp7ImA9WxdVEUk.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-356020359515099389</id><published>2008-07-15T10:26:00.000-07:00</published><updated>2008-07-15T10:26:01.051-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-15T10:26:01.051-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="offtopic" /><title>Working from home.</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;There's so much work in this week that I can't publish a article in the next days.&lt;br /&gt;But Natalie Jost from &lt;a href="http://www.alistapart.com/"&gt;A List Apart&lt;/a&gt; just published a very nice article which you really should read if you're (like me) working from home &lt;a href="http://www.alistapart.com/articles/walkingthelinewhenyouworkfromhome"&gt;read on..&lt;/a&gt; ... you'll like it.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-356020359515099389?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=uEL8gYsXuVs:oaNds_2WacY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=uEL8gYsXuVs:oaNds_2WacY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=uEL8gYsXuVs:oaNds_2WacY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=uEL8gYsXuVs:oaNds_2WacY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=uEL8gYsXuVs:oaNds_2WacY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/356020359515099389/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=356020359515099389" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/356020359515099389?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/356020359515099389?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/uEL8gYsXuVs/working-from-home.html" title="Working from home." /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/07/working-from-home.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4EQXg-eyp7ImA9WxdWF08.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-8757276208463500855</id><published>2008-07-10T14:55:00.000-07:00</published><updated>2008-07-10T14:55:00.653-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-10T14:55:00.653-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="shellscript" /><category scheme="http://www.blogger.com/atom/ns#" term="offtopic" /><title>track time for a subroutine within a shell-script</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;The following code-snippet is a shell-script which does the following:&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;Track the time for a block of shell commands&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;Check if the time was less than x seconds (the example uses 10 seconds)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;If the block run through too fast the script waits/sleeps a few seconds&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;Run all this within a loop so that the block of shell-commands is executed periodically&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;I used the script combined with a PHP script which processes a queue. The PHP script processes 1000 elements from the queue and takes about 30 seconds for that. Since just having a cronjob per minute would be not efficient enought I used this script.&lt;br /&gt;The waiting-block is necessary because now and then the queue is empty ... but I think there are lot's of situations where a script like this can be usefull:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;div id="codeblock" class="code" style="display: block;"&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;while [ 1 -ge 0 ]; do&lt;br /&gt;time_begin=`date +%s`&lt;br /&gt;&lt;br /&gt;###BLOCK 2 TRACK - BEGIN&lt;br /&gt;number=$RANDOM&lt;br /&gt;let "number %= 20"&lt;br /&gt;sleep $number&lt;br /&gt;###BLOCK 2 TRACK - END&lt;br /&gt;&lt;br /&gt;time_end=`date +%s`&lt;br /&gt;total=$((time_end-time_begin))&lt;br /&gt;&lt;br /&gt;if [[ $total -ge 10 ]]; then&lt;br /&gt;       echo "time taken was: $number : $total"&lt;br /&gt;else&lt;br /&gt;       echo "time take was too less  $number : $total"&lt;br /&gt;       sleep 10&lt;br /&gt;fi&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-8757276208463500855?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=k9gSMmYEcio:omfIdGoeAk0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=k9gSMmYEcio:omfIdGoeAk0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=k9gSMmYEcio:omfIdGoeAk0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=k9gSMmYEcio:omfIdGoeAk0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=k9gSMmYEcio:omfIdGoeAk0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/8757276208463500855/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=8757276208463500855" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/8757276208463500855?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/8757276208463500855?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/k9gSMmYEcio/track-time-for-subroutine-within-shell.html" title="track time for a subroutine within a shell-script" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/07/track-time-for-subroutine-within-shell.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYHR348fSp7ImA9WxdWFU0.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-3009246023517997627</id><published>2008-07-07T10:30:00.000-07:00</published><updated>2008-07-08T00:28:56.075-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-08T00:28:56.075-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="spl" /><category scheme="http://www.blogger.com/atom/ns#" term="pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="iterator" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="behavioral" /><title>Iterator [GoF]</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;Lot's of people like to write down things into lists, so that they can go through that list later and check whether everything was fine. Normally every recipe has a list ~ there's always a list of ingredients at the beginning of the recipe.&lt;br /&gt;This short example shows how such a list can be processed in PHP. So why would you want to have something else than a array to hold your objects? - My example still uses a array to hold the objects (uni- or bidirectional lists would also be possible) but it adds a kind of a facade to the array so that the common managements-tasks are handled within the List-Object. Everything you need for this example is present in PHP since version 5.0. The basic steps you need to do is to provide a &lt;span style="font-style: italic;"&gt;"Object"&lt;/span&gt; and an &lt;span style="font-style: italic;"&gt;"ObjectList" &lt;/span&gt;which implements the native &lt;a href="http://www.php.net/manual/en/language.oop5.iterations.php"&gt;&lt;span style="font-style: italic;"&gt;"Iterator"&lt;/span&gt;&lt;/a&gt; interface and then you're able to have very handy lists :)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;a href="#codeIt1" onclick="document.getElementById('codeblockIt1').style.display=((document.getElementById('codeblockIt1').style.display=='block')?'none':'block');"&gt;Show PHP Source Code&lt;/a&gt;&lt;div id="codeblockIt1" class="code"&gt;&lt;a name="codeIt1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Code start --&gt;&lt;span style="color: #007700"&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$name&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$amount&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;__construct&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$name&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$amount&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$name&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;amount&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$amount&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Recipe&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;implements&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Iterator&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$title&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$ingredients&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;__construct&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$title&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;title&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$title&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addIncredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&amp;nbsp;$in&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ingredients&lt;/span&gt;&lt;span style="color: #007700"&gt;[]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$in&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;current&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;()&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;current&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ingredients&lt;/span&gt;&lt;span style="color: #007700"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;key&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;key&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ingredients&lt;/span&gt;&lt;span style="color: #007700"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;valid&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;current&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ingredients&lt;/span&gt;&lt;span style="color: #007700"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;rewind&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;()&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;reset&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ingredients&lt;/span&gt;&lt;span style="color: #007700"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;next&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;next&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ingredients&lt;/span&gt;&lt;span style="color: #007700"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;!-- Code end --&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;br /&gt;&lt;div id="codeblockIt2" class="code" style="display:block"&gt;&lt;br /&gt;&lt;span style="color: #0000BB"&gt;$cookieRecipe&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Recipe&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"Chocolate&amp;nbsp;Cookie"&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cookieRecipe&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addIncredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Flour'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'2.5&amp;nbsp;cups'&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cookieRecipe&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addIncredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Baking&amp;nbsp;soda'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'1&amp;nbsp;teaspoon'&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cookieRecipe&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addIncredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Salt'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'0.5&amp;nbsp;teaspoon'&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cookieRecipe&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addIncredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Butter'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'1&amp;nbsp;cup'&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cookieRecipe&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addIncredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Sugar'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'1&amp;nbsp;cup'&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cookieRecipe&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addIncredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Brown&amp;nbsp;Sugar'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'0.5&amp;nbsp;cup'&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cookieRecipe&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addIncredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Vanilla&amp;nbsp;extract'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'1&amp;nbsp;teaspoon'&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cookieRecipe&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addIncredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Egg'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'1-2'&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cookieRecipe&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addIncredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Chocolate&amp;nbsp;chips'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'2&amp;nbsp;cups'&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;process&amp;nbsp;recipe:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;foreach(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cookieRecipe&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$inc&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$inc&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;name&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;nbsp;=&amp;gt;&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$inc&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;amount&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;lt;br/&amp;gt;"&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;As you see it's pretty easy to have lists of objects in PHP. You might also think that always creating to some list-object over and over again is very odd and you're right. For the most common tasks like &lt;a href="http://www.php.net/manual/en/class.arrayiterator.php"&gt;iterating through arrays&lt;/a&gt;, &lt;a href="http://www.php.net/manual/en/class.directoryiterator.php"&gt;directory-lists&lt;/a&gt; and a few more task you can use objects which are shipped with the Standard PHP Library ,which is also part of PHP since version 5 and mandatory in 5.3. So the example shown above could also look like this:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;div id="codeblockIt3" class="code" style="display:block"&gt;&lt;br /&gt;&lt;span style="color: #0000BB"&gt;$recipe&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;array();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$recipe&lt;/span&gt;&lt;span style="color: #007700"&gt;[]&amp;nbsp;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Flour'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'2.5&amp;nbsp;cups'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$recipe&lt;/span&gt;&lt;span style="color: #007700"&gt;[]&amp;nbsp;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Baking&amp;nbsp;soda'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'1&amp;nbsp;teaspoon'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$recipe&lt;/span&gt;&lt;span style="color: #007700"&gt;[]&amp;nbsp;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Salt'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'0.5&amp;nbsp;teaspoon'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$recipe&lt;/span&gt;&lt;span style="color: #007700"&gt;[]&amp;nbsp;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Butter'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'1&amp;nbsp;cup'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$recipe&lt;/span&gt;&lt;span style="color: #007700"&gt;[]&amp;nbsp;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Sugar'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'1&amp;nbsp;cup'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$recipe&lt;/span&gt;&lt;span style="color: #007700"&gt;[]&amp;nbsp;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Brown&amp;nbsp;Sugar'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'0.5&amp;nbsp;cup'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$recipe&lt;/span&gt;&lt;span style="color: #007700"&gt;[]&amp;nbsp;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Vanilla&amp;nbsp;extract'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'1&amp;nbsp;teaspoon'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$recipe&lt;/span&gt;&lt;span style="color: #007700"&gt;[]&amp;nbsp;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Egg'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'1-2'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$recipe&lt;/span&gt;&lt;span style="color: #007700"&gt;[]&amp;nbsp;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Incredient&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Chocolate&amp;nbsp;chips'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'2&amp;nbsp;cups'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$recipeIncObj&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ArrayObject&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$recipe&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$ingredientsIt&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$recipeIncObj&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getIterator&lt;/span&gt;&lt;span style="color: #007700"&gt;();&amp;nbsp;&lt;br /&gt;&lt;br /&gt;foreach(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$ingredientsIt&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$inc&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$inc&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;name&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;nbsp;=&amp;gt;&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$inc&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;amount&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;lt;br/&amp;gt;"&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;As I said at the beginning, there are lots of situations where you might want to have a list for something and if you store that list in PHP the Iterator-pattern can keep your code clean and tasty :)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-3009246023517997627?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=npVN24v_We8:FDCefT_aht0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=npVN24v_We8:FDCefT_aht0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=npVN24v_We8:FDCefT_aht0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=npVN24v_We8:FDCefT_aht0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=npVN24v_We8:FDCefT_aht0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/3009246023517997627/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=3009246023517997627" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/3009246023517997627?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/3009246023517997627?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/npVN24v_We8/iterator-gof.html" title="Iterator [GoF]" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/07/iterator-gof.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cMQH8_eSp7ImA9WxdXGU4.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-7516491250763750359</id><published>2008-07-01T10:58:00.000-07:00</published><updated>2008-07-01T10:58:01.141-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-01T10:58:01.141-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="null" /><category scheme="http://www.blogger.com/atom/ns#" term="pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="behavioral" /><title>Null-Object Pattern</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;Very often you create a object with a factory and before you really start using it, you check if your factory really created a object or returned NULL. Or maybe you have a method where a object is passed in and in this situation you'll have to do this check also.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;Instead of typing the "&lt;span style="font-style: italic;"&gt;if(object == null)&lt;/span&gt;" phrase again and again, you could use the &lt;span style="font-weight: bold;"&gt;Null-Object pattern&lt;/span&gt;, you'll see that this can make some situations much clearer.&lt;br /&gt;&lt;br /&gt;Basically Null-Object ensures that the client always receives a valid object for it's interaction, so that there's no need to do the check shown above again and again. This happens since your concrete Null-Object just shares the interface, or inherits from the same class as it's effective counterpart, but it's implementation just leaves out any effectiveness.&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_l5fIZzJyYfc/SGpiDZ9m-rI/AAAAAAAAACo/nVuiUHE4E90/s1600-h/nullobject_pattern.png"&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_l5fIZzJyYfc/SGpiDZ9m-rI/AAAAAAAAACo/nVuiUHE4E90/s400/nullobject_pattern.png" alt="" id="BLOGGER_PHOTO_ID_5218090928910564018" border="0" /&gt;&lt;/a&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;So a code-example could look like this:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;div id="nullobjcodeblock" class="code" style="display: block;"&gt;&lt;!-- Code start --&gt;&lt;br /&gt;&lt;span style="color: #007700"&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;CookieFactory&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;makeInstance&lt;/span&gt;&lt;span style="color: #007700"&gt;()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;date&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'l'&lt;/span&gt;&lt;span style="color: #007700"&gt;)==&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Monday'&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;return&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;NullCookie&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;RealCookie&lt;/span&gt;&lt;span style="color: #007700"&gt;();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;interface&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;iCookie&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getCalories&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;RealCookie&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;implements&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;iCookie&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$calories&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;250&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getCalories&lt;/span&gt;&lt;span style="color: #007700"&gt;()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;calories&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;NullCookie&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;implements&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;iCookie&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getCalories&lt;/span&gt;&lt;span style="color: #007700"&gt;()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;!-- Code end --&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;br /&gt;I think you can imagine what happens when you make use of the CookieFactory -&lt;span style="font-style: italic;"&gt; diet on monday ;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;There're also some disadvantages, your clients normally don't have a chance to react that there's something special &lt;/span&gt;&lt;span&gt;happening, also the clients must "share" the same expectation what "do nothing" means, &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span&gt;the number of required Null-Objects might be very large and unhandy and &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span&gt; the Null-Object shares a very deep knowledge with the real one, so that it might be a large effort to create it if the real object is complex too.&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;I'm so glad that today is tuesday :P&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-7516491250763750359?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=OQIXmA-zmHc:UbT46TvxYO0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=OQIXmA-zmHc:UbT46TvxYO0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=OQIXmA-zmHc:UbT46TvxYO0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=OQIXmA-zmHc:UbT46TvxYO0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=OQIXmA-zmHc:UbT46TvxYO0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/7516491250763750359/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=7516491250763750359" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/7516491250763750359?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/7516491250763750359?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/OQIXmA-zmHc/null-object-pattern.html" title="Null-Object Pattern" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp3.blogger.com/_l5fIZzJyYfc/SGpiDZ9m-rI/AAAAAAAAACo/nVuiUHE4E90/s72-c/nullobject_pattern.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/07/null-object-pattern.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcEQXY4eyp7ImA9WxdXGEk.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-2917472698776103476</id><published>2008-06-30T10:30:00.000-07:00</published><updated>2008-06-30T10:30:00.833-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-30T10:30:00.833-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="offtopic" /><title>YSlow - powerful FF extension</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_l5fIZzJyYfc/SF_826jzXhI/AAAAAAAAAB4/kZOhjpOL16k/s1600-h/yslow-stats.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://bp3.blogger.com/_l5fIZzJyYfc/SF_826jzXhI/AAAAAAAAAB4/kZOhjpOL16k/s320/yslow-stats.png" alt="" id="BLOGGER_PHOTO_ID_5215164913880882706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;I use &lt;a href="http://www.getfirebug.com/"&gt;firebug&lt;/a&gt; for a while and I love it especially for CSS and JS debugging. Today I stumbled over &lt;a href="http://developer.yahoo.com/yslow/"&gt;Yslow&lt;/a&gt; and did some tests with it one some of my clients pages and I love the results.&lt;br /&gt;YSlow can help you to analyze all the referenced elements on a webpage. It shows their sizes, how they behave when a page is taken from the browser-cache, shows optimization hints and enables a easy way to optimize the output of your dynamically created webpage :) ... you'll love it.&lt;br /&gt;&lt;a href="http://developer.yahoo.com/yslow/"&gt;Get YSlow here :)&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;div id="codeblock" class="code"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-2917472698776103476?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=HsJ1rIgFdOM:mOjoe6m7fEY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=HsJ1rIgFdOM:mOjoe6m7fEY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=HsJ1rIgFdOM:mOjoe6m7fEY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=HsJ1rIgFdOM:mOjoe6m7fEY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=HsJ1rIgFdOM:mOjoe6m7fEY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/2917472698776103476/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=2917472698776103476" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/2917472698776103476?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/2917472698776103476?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/HsJ1rIgFdOM/yslow-powerful-ff-extension.html" title="YSlow - powerful FF extension" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp3.blogger.com/_l5fIZzJyYfc/SF_826jzXhI/AAAAAAAAAB4/kZOhjpOL16k/s72-c/yslow-stats.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/06/yslow-powerful-ff-extension.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UCSXw9fyp7ImA9WxdWFU0.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-2747354083491137103</id><published>2008-06-23T11:20:00.000-07:00</published><updated>2008-07-08T00:14:28.267-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-08T00:14:28.267-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="factory" /><category scheme="http://www.blogger.com/atom/ns#" term="creational" /><title>Factory [GoF]</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;Do you remember the &lt;a href="http://www.cookiepattern.com/2008/06/faade-gof.html"&gt;Fa&lt;/a&gt;&lt;/span&gt;&lt;a href="http://www.cookiepattern.com/2008/06/faade-gof.html"&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;ç&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;a href="http://www.cookiepattern.com/2008/06/faade-gof.html"&gt;ade pattern&lt;/a&gt; post? Sure you do :) - I described a child which asked his granny whether she could bake some cookies. So how this happens in a formal way was describe within the&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;a href="http://www.cookiepattern.com/2008/06/faade-gof.html"&gt; Fa&lt;/a&gt;&lt;/span&gt;&lt;a href="http://www.cookiepattern.com/2008/06/faade-gof.html"&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;ç&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;a href="http://www.cookiepattern.com/2008/06/faade-gof.html"&gt;ade pattern&lt;/a&gt; post ;) but the basic action "to ask for sth." is described here...&lt;br /&gt;&lt;br /&gt;As you might remember we had a child, probably a lazy one, which was in the mood to eat some cookies but since the cookie tin was empty it asked his granny to bake some new. In OOP thats nearly the same - when you'd to have a (complex) object and if you don't already have one you need someone who creates it or you do it yourself but since you need remember all the steps to create it, that's something for programmers who likes to type :P&lt;br /&gt;&lt;br /&gt;So normally you create a method which wraps up all the code to create the complex object. Or maybe you have  a Aggregate and you don't want that everyone needs to know how it is build up then this method should be the only way to access the Aggregate.&lt;br /&gt;&lt;br /&gt;You see now how you can benefit when you have a Factory available - but there are also some drawbacks. Factories tend to be hard to extend - this happens because the factory has a very deep (mostly hard-coded) knowledge of the objects it creates and normally all the wiring happens statically. If you're looking for a dynamic way to wire up your objects you might end making heavy use of reflection. In normal projects this might be a bit too much ;)&lt;br /&gt;&lt;br /&gt;A normal factory method, for a cookie which requires to have 3 flavors, a predefined size and that it's baked before anyone consumes it, could look like this:&lt;br /&gt;&lt;div id="codeblock" class="code" style="display: block;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{ &lt;br /&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// ... &lt;br /&gt;&lt;br /&gt;  /*&lt;br /&gt;   * Create a Cookie object which consists&lt;br /&gt;   * of 3 flavors and has a defined size.&lt;br /&gt;   */ &lt;br /&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getInstance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$c &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$c&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;setFlavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;randomFlavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;());&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$c&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;setFlavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;randomFlavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;());&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$c&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;setFlavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;randomFlavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;());&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$c&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;setSize&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;randomSize&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;());&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$c&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;bakeIt&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;      return &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$c&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;     &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;If your software contains some complexity where you want to switch the used objects (created by a factory) without modifying the clients, which make use of the factory, you'll end up with the so called&lt;span style="font-weight: bold;"&gt; Abtract factory&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Let's say you have two types of Cookies - the first one is a high-quality cookie with a bunch of different flavors and the second one is a normal chocolate-cookie. The high-quality cookie is created by your granny (slow but mind-blowing taste), the cookies with the lower quality are the result of mass-production. Your "client" is a wrapping machine which does everything to deliver the cookies to some customers.&lt;br /&gt;So the wrapping machine won't care what kind of cookies are prepared for delivering and so it doesn't matter who the creator is - the only thing it has to know is how it can access the cookies... some kind of interface.&lt;br /&gt;So the entire szenario could look like this:&lt;br /&gt;&lt;div class="code" style="display: block;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;interface &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieFactory &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;  abstract function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;createCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Granny &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;implements &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieFactory &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;  public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;createCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$cookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// do some wierd cookie-creation stuff //&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;return &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;MassProduction &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;implements &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieFactory &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;  public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;createCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;      return new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;wrappingMachine &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;  public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;run&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieFactory $factory&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$i &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;6&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$package&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=array();&lt;br /&gt;      while(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$i&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;--) {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$package&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[] = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$factory&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;createCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();         &lt;br /&gt;      }&lt;br /&gt;      return &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$package&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Client-code could look like this;&lt;br /&gt;&lt;br /&gt;&lt;div class="code" style="display: block;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$wrapper &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;wrappingMachine&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$highQualityCookiePackage &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$wrapper&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;run&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Granny&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$lowQualityCookiePackage &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$wrapper&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;run&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;MassProduction&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;());&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Thats mostly what you can achieve with some normal Factories in the GoF-meaning. Some other interesting ways of object creation are the &lt;a href="http://www.cookiepattern.com/2008/06/plugin-poeaa.html"&gt;Plugin pattern&lt;/a&gt; and the  &lt;a href="http://www.cookiepattern.com/2008/05/prototype-gof.html"&gt;Prototype pattern&lt;/a&gt;. :)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-2747354083491137103?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=tlxbT3IlSpQ:nPwhGdujBKY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=tlxbT3IlSpQ:nPwhGdujBKY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=tlxbT3IlSpQ:nPwhGdujBKY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=tlxbT3IlSpQ:nPwhGdujBKY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=tlxbT3IlSpQ:nPwhGdujBKY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/2747354083491137103/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=2747354083491137103" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/2747354083491137103?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/2747354083491137103?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/tlxbT3IlSpQ/factory-gof.html" title="Factory [GoF]" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/06/factory-gof.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEMSHkzeCp7ImA9WxdXEkk.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-5572785069680943988</id><published>2008-06-20T10:29:00.000-07:00</published><updated>2008-06-23T10:54:49.780-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-23T10:54:49.780-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="query" /><category scheme="http://www.blogger.com/atom/ns#" term="pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="factory" /><category scheme="http://www.blogger.com/atom/ns#" term="creational" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><category scheme="http://www.blogger.com/atom/ns#" term="specification" /><title>Query Object [PoEEA]</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;Maybe you remember the &lt;a href="http://www.cookiepattern.com/2008/05/specification-ddd.html"&gt;Specification Pattern&lt;/a&gt; I explained some weeks ago. It enabled a easy and intuitive  searching within large object-collections. A drawback of my example was that I stored the objects in the memory. This can be really ineffective if you want a single object out of hundreds, because you have to create all of them to see which one fits the specification.&lt;br /&gt;Normally you want to limit the number of objects and you also don't store large datasets in memory. The idea of the&lt;span style="font-style: italic;"&gt; Query Object&lt;/span&gt; pattern is that it enables a usage, &lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;comparable to the specification pattern, for&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt; objects which are persisted in a database. The benefit is that it creates a query to exclude objects which won't satisfy your needs and therefore you wont mess up the memory anymore.&lt;br /&gt;Once you have a query-object in place you should not get in touch with SQL anymore because it can encapsulate SQL completely, at least if you also have some kind of data mapping (coming soon), which is a great benefit for everyone who is not so familiar with SQL. (But don't forget, regarding performance, SQL-optimization is a very important thing).&lt;br /&gt;&lt;br /&gt;So what we need for the &lt;span style="font-style: italic;"&gt;Query Object&lt;/span&gt; in first place is a object, I'll use the Cookie out of the &lt;a href="http://www.cookiepattern.com/2008/05/specification-ddd.html"&gt;specification pattern post&lt;/a&gt; again. Then we need criteria-objects which hold the information for a single criteria, (determined by "database-field", "operator" and "value") and we also need the &lt;span style="font-style: italic;"&gt;Query Objects&lt;/span&gt; itself to wrap up the SQL-querying and the object creation somehow.&lt;br /&gt;&lt;br /&gt;A very simple example could look like this:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;a href="#querycodeblock" onclick="document.getElementById('querycodeblock').style.display=((document.getElementById('querycodeblock').style.display=='block')?'none':'block');"&gt;Show PHP Source Code&lt;/a&gt;&lt;div id="querycodeblock" class="code"&gt;&lt;a name="code"&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Code start --&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;&lt;br /&gt;interface &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Critera &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;  public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getWhereClause&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieCriteria &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;implements &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Critera &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;&lt;br /&gt;  private &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$operator&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$field&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$value&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;  protected function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;__construct&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$operator&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$field&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$value&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;operator&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$operator&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;field&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$field&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$value&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getWhereClause&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;      return &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;implode&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;" "&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,array(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;field&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;operator&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public static function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;matches&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$field&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$value&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;      return new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieCriteria&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"LIKE"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$field&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'"'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$value&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'"'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;); &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public static function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;greaterThan&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$field&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$value&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;      return new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieCriteria&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"&amp;gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$field&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$value&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieFinder &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;  protected &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$criterias&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;  public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;addCriteria&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Critera $criteria&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;criterias&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[] = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$criteria&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;generateSQL&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$sql &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"SELECT * FROM cookies"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;      if(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;sizeof&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;criterias&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)) {         &lt;br /&gt;          &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$where&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=array();&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;reset&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;criterias&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;          while(list(,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$criteria&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;each&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;criterias&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)) {&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$where&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[] = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$criteria&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getWhereClause&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;          }&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$sql&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;sizeof&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$where&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)?&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;" WHERE "&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;implode&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;" AND "&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$where&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;):&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;""&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;         &lt;br /&gt;      }&lt;br /&gt;      return &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$sql&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;find&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$collection &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= array();&lt;br /&gt;      if(!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$result &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;mysql_query&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;generateSQL&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;())) {&lt;br /&gt;          throw new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Exception&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;mysql_errno&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;());&lt;br /&gt;      }&lt;br /&gt;      while(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$row &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;mysql_fetch_assoc&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$result&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)) {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$collection&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[] = new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$row&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'name'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;],&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$row&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'flavor'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;],&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$name&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'size'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;]);&lt;br /&gt;      }&lt;br /&gt;      return &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$collection&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;!-- Code end --&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;br /&gt;&lt;br /&gt;Possible client code could look like this:&lt;br /&gt;&lt;br /&gt;&lt;div class="code" style="display: block;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$finder &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieFinder&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$finder&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;addCriteria&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieCriteria&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;matches&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"name"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Granny%"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$finder&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;addCriteria&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieCriteria&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;greaterThan&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"size"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;100&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$cookies &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$finder&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;find&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;We just pick up the &lt;span style="font-style: italic;"&gt;Query Object&lt;/span&gt;, add one or more criteria and ask it to create the objects which fit them.&lt;br /&gt;&lt;br /&gt;So this example is not as powerful as the one I used for the &lt;a href="http://www.cookiepattern.com/2008/05/specification-ddd.html"&gt;Specification pattern&lt;/a&gt;, but it should be a easy task to create some kind of "nested criteria objects".&lt;br /&gt;Query objects normally make use of data-mapping so that you can handle various classes, stored in different tables/databases, with a single and generic Query Object. This also enables to avoid SQL-Injection, since you're able to validate the fields and values before you sent them to your database, also some kind of database abstraction would be possible.&lt;br /&gt;With the "&lt;span style="font-style: italic;"&gt;Query Object by example&lt;/span&gt;", which requires to build up a single object which is used as blueprint for the required objects, exists another flavor of this pattern which is very handy to use and more descriptive.&lt;br /&gt;But no matter which flavor you prefer, Query Objects bring some real benefits when you've to handle complex datasets - for smaller projects the effort might be to much so be careful where you use it.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-5572785069680943988?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=QJ5QkuXHrCg:c0hGQenCCBI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=QJ5QkuXHrCg:c0hGQenCCBI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=QJ5QkuXHrCg:c0hGQenCCBI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=QJ5QkuXHrCg:c0hGQenCCBI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=QJ5QkuXHrCg:c0hGQenCCBI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/5572785069680943988/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=5572785069680943988" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/5572785069680943988?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/5572785069680943988?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/QJ5QkuXHrCg/query-object-poeea.html" title="Query Object [PoEEA]" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/06/query-object-poeea.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08HQX4yfyp7ImA9WxdWFU0.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-3059324776553601122</id><published>2008-06-16T16:33:00.000-07:00</published><updated>2008-07-08T00:23:50.097-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-08T00:23:50.097-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="facade" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><title>Façade [GoF]</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;If a child is in the mood to eat a fresh cookie it normally asks his granny for one. Like this:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;Child:&lt;/span&gt; Grannyyyyy?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Granny:&lt;/span&gt; Yes my dear?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Child:&lt;/span&gt; Could you mix about 2 cups of sugar, 1/2 cup of butter and 1/2 cup of milk in a saucepan and boil it for a minute. And could you, after you removed the saucepan from the heat, mix in some cocoa powder and 3 cups quick cooking oats and form some cookies? Pleeease?&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Hm you're right that's not very realistic - it's more like: &lt;span style="font-style: italic;"&gt;"Grannyyyy? Could I have a cooookieee pleeeease?" &lt;/span&gt;....the granny knows what to do and the child will get it's cookie&lt;br /&gt;&lt;br /&gt;So what happens if you have a pice of software which provides &lt;strike&gt;cookies&lt;/strike&gt; some services for other parts of your software? The most people (especially programmers) are lazy and they won't remember all the details of a complex structure. They remember the place or object which can run a certain task but there's no need to know the deeper structure of that object - the only thing which is important if your using a service of an object is that it doesn't fail.&lt;br /&gt;So the Façade pattern is a structural pattern which more or less describes that you create a object with an simplified interface, so that you can hide complex structures. You can also use a Façade to wrap up some poorly designed APIs into a single well designed API. And the larges benefit of a Façade object is that it makes APIs more readable and therefore enables flexible and easy development.&lt;br /&gt;&lt;br /&gt;So maybe you're missing the example-code for this pattern, but since it's not that concrete as others, I've not implemented a  special example for it. But I already used a Facade in some way, if you look at the &lt;a href="http://www.cookiepattern.com/2008/05/specification-ddd.html"&gt;Specification pattern&lt;/a&gt;, you'll find the functions getSmallChocolateCookies() and getLargeCookies(). Both show in a tasty way what I described  here :)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-3059324776553601122?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=Dv-T8zc2aMU:RPdUL3IMhWQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=Dv-T8zc2aMU:RPdUL3IMhWQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=Dv-T8zc2aMU:RPdUL3IMhWQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=Dv-T8zc2aMU:RPdUL3IMhWQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=Dv-T8zc2aMU:RPdUL3IMhWQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/3059324776553601122/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=3059324776553601122" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/3059324776553601122?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/3059324776553601122?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/Dv-T8zc2aMU/faade-gof.html" title="Façade [GoF]" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/06/faade-gof.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcMQH88fSp7ImA9WxdQEkw.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-2913677013579876436</id><published>2008-06-11T13:28:00.000-07:00</published><updated>2008-06-11T13:28:01.175-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-11T13:28:01.175-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="errors" /><title>Inherit abstract functions....</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;A error I find from time to time when I work with inheritance is this one:&lt;br /&gt;&lt;div class="code" style="display: block;"&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Fatal error: Can't inherit abstract function Cookie::setFlavor() (previously declared abstract in ChocolateCookie) in ...&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This happens when you try to define multiple abstract classes or interfaces with the same abstract functions - it's right that this errors shows up, but today I stuck on this error for a while because I did not see the reason for that - so that's a reminder for me ;)&lt;br /&gt;&lt;br /&gt;And the tasty example to reproduce this error:&lt;br /&gt;&lt;div class="code" style="display: block;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;&lt;br /&gt;abstract class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;abstract public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;setFlavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$flavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;abstract class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;ChocolateCookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;extends &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;abstract public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;setFlavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$flavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;There are also some rejected bugreports about that :P &lt;a href="http://bugs.php.net/bug.php?id=35057"&gt;#35057&lt;/a&gt; &lt;a href="http://bugs.php.net/bug.php?id=35832"&gt;#35832&lt;/a&gt; &lt;a href="http://bugs.php.net/bug.php?id=41145"&gt;#41145&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-2913677013579876436?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=dMAMSSOUmaU:Nobuv8JVsrQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=dMAMSSOUmaU:Nobuv8JVsrQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=dMAMSSOUmaU:Nobuv8JVsrQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=dMAMSSOUmaU:Nobuv8JVsrQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=dMAMSSOUmaU:Nobuv8JVsrQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/2913677013579876436/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=2913677013579876436" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/2913677013579876436?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/2913677013579876436?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/dMAMSSOUmaU/inherit-abstract-functions.html" title="Inherit abstract functions...." /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/06/inherit-abstract-functions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8MQ345fyp7ImA9WxdQEUQ.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-7811399571704296961</id><published>2008-06-11T07:18:00.000-07:00</published><updated>2008-06-11T07:18:02.027-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-11T07:18:02.027-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="typo3" /><title>new TYPO releases</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;br /&gt;I just saw that the TYPO3 guys released a new version of the popular Enterprise CMS (&lt;a href="http://www.typo3.org"&gt;www.typo3.org&lt;/a&gt;). The changelog shows that they mainly changed some security issues and that a lot of  smaller changes in the backend happend - one change relates to the problems in the new Firefox 3 where all the frames in the backend are mixed up for some compatibility reason... this was also the reason why the also updates the 4.0.x branch and the 4.1.x branch ...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://typo3.org/download/packages/"&gt;TYPO3 source package downloads&lt;/a&gt; / &lt;a href="http://wiki.typo3.org/index.php/Upgrade"&gt;TYPO3 upgrading guide&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-7811399571704296961?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=RKAwujypbKo:t9zS2D71KKM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=RKAwujypbKo:t9zS2D71KKM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=RKAwujypbKo:t9zS2D71KKM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=RKAwujypbKo:t9zS2D71KKM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=RKAwujypbKo:t9zS2D71KKM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/7811399571704296961/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=7811399571704296961" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/7811399571704296961?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/7811399571704296961?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/RKAwujypbKo/new-typo-releases.html" title="new TYPO releases" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/06/new-typo-releases.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4BR3Y4eyp7ImA9WxdQEE4.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-669859466892824809</id><published>2008-06-09T09:52:00.000-07:00</published><updated>2008-06-09T10:02:36.833-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-09T10:02:36.833-07:00</app:edited><title>www.cookiepattern.com</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;To keep my motivation high I just registered www.cookiepattern.com - so for today this was $1 per visitor :P&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-669859466892824809?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=UYo8v-3V17I:BpwTvadzkpo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=UYo8v-3V17I:BpwTvadzkpo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=UYo8v-3V17I:BpwTvadzkpo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=UYo8v-3V17I:BpwTvadzkpo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=UYo8v-3V17I:BpwTvadzkpo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/669859466892824809/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=669859466892824809" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/669859466892824809?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/669859466892824809?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/UYo8v-3V17I/wwwcookiepatterncom.html" title="www.cookiepattern.com" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/06/wwwcookiepatterncom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIGQno6eSp7ImA9WxdRGEo.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-4638244718018499202</id><published>2008-06-07T14:30:00.000-07:00</published><updated>2008-06-07T15:08:43.411-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-07T15:08:43.411-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="extracting" /><category scheme="http://www.blogger.com/atom/ns#" term="zip" /><category scheme="http://www.blogger.com/atom/ns#" term="compression" /><title>Self-extracting PHP archive</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;The __halt_compiler(); function in php enables to store some additional data in a php-file without blowing up the memory. A very nice possibility is to use this for a self-extracting php file as installation-packages of your php application.&lt;br /&gt;A wile ago I created a script which automatically creates such a archive and I think you might like it....for the impatient ones: &lt;a href="http://588299e40f6cb98516d7458.googlepages.com/createziparchive-0.5.1.php"&gt;Download&lt;/a&gt; / &lt;a href="http://588299e40f6cb98516d7458.googlepages.com/createziparchive-0.5.1.zip"&gt;Download as Zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Before I start to show how the entire script works I'd like to show you a small example so that you can see how the __halt_compiler(); function can be used to store some data at the end of a file:&lt;br /&gt;&lt;div class="code" style="display: block;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;$fp &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;fopen&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;__FILE__&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'r'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;fseek&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$fp&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;__COMPILER_HALT_OFFSET__&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$i&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;while(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$buffer &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;fgets&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$fp&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)) {&lt;br /&gt;    echo (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$i&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;++). &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;":"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;. &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$buffer&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"&amp;lt;br/&amp;gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;__HALT_COMPILER();&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Line 1&lt;br /&gt;Line 2&lt;br /&gt;Line 3&lt;br /&gt;Last line&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The first thing you might mention is, that the closing "?&gt;" is missing, but since the function-name is nearly self-explaining you should realize very fast what the output of the script might be ;)&lt;br /&gt;&lt;br /&gt;If that's working the question is what's needed for a script which is meant to create and extract a archive? The first thing is a way to create the archive itself. I used the PHP-builtin &lt;a href="http://de3.php.net/manual/en/ref.zip.php"&gt;ZipArchive&lt;/a&gt; for that. The second thing is a script which is able to extract this archiv (using the method show above). That's handled by the following snippet:&lt;br /&gt;&lt;div class="code" style="display: block;"&gt;&lt;br /&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;try&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfilename&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;md5&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;time&lt;/span&gt;&lt;span style="color: #007700"&gt;()).&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'archive.zip'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//remove&amp;nbsp;with&amp;nbsp;tempname()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_tmp&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fopen&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfilename&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'w'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_cur&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fopen&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;__FILE__&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'r'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fseek&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_cur&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;__COMPILER_HALT_OFFSET__&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$buffer&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fread&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_cur&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;10240&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fwrite&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_tmp&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$buffer&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fclose&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_cur&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fclose&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_tmp&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfile&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ZipArchive&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfile&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;open&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfilename&lt;/span&gt;&lt;span style="color: #007700"&gt;)===&lt;/span&gt;&lt;span style="color: #0000BB"&gt;true&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(!&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfile&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;extractTo&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'.'&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Exception&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'extraction&amp;nbsp;failed...'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Exception&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'reading&amp;nbsp;archive&amp;nbsp;failed'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfile&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;close&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;unlink&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfilename&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;}&amp;nbsp;catch&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Exception&amp;nbsp;$e&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;printf&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"Error:&amp;lt;br/&amp;gt;%s&amp;lt;br&amp;gt;%s&amp;gt;"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$e&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getMessage&lt;/span&gt;&lt;span style="color: #007700"&gt;(),&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$e&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getTraceAsString&lt;/span&gt;&lt;span style="color: #007700"&gt;());&lt;br /&gt;};&lt;br /&gt;__HALT_COMPILER();[zipdata is appended here later]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;As you see that's no rocket-science just read the data, pass it to the ZipArchive object via a temporary file and extract the archive.&lt;br /&gt;If that's working then you need a script which brings the PHP extraction script and the zip-data together. And since we want to have a single script for the creation of our self extracting php archive, it would be very odd if we'd place the "template" for the extraction in a separate file. That's the reason why I just use the same method as above for this script and this time the data is php code instead of zip-data:&lt;br /&gt;&lt;br /&gt;&lt;div class="code" style="display: block;"&gt;&lt;br /&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;try&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$sourcefolder&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'compressthis/'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;maybe&amp;nbsp;you&amp;nbsp;want&amp;nbsp;to&amp;nbsp;get&amp;nbsp;this&amp;nbsp;via&amp;nbsp;CLI&amp;nbsp;argument&amp;nbsp;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$targetname&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'phparchive.php'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfilename&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;md5&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;time&lt;/span&gt;&lt;span style="color: #007700"&gt;()).&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'archive.zip'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;replace&amp;nbsp;with&amp;nbsp;tempname()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;create&amp;nbsp;a&amp;nbsp;archive&amp;nbsp;from&amp;nbsp;the&amp;nbsp;submitted&amp;nbsp;folder&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfile&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ZipArchive&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfile&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;open&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfilename&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ZipArchive&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;CREATE&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addFiles2Zip&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfile&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$sourcefolder&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;true&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfile&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;close&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;compile&amp;nbsp;the&amp;nbsp;selfextracting&amp;nbsp;php-archive&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_dest&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fopen&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$targetname&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'w'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_cur&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fopen&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;__FILE__&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'r'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fseek&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_cur&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;__COMPILER_HALT_OFFSET__&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$buffer&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fgets&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_cur&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fwrite&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_dest&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$buffer&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fclose&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_cur&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_zip&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fopen&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfilename&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'r'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$buffer&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fread&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_zip&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;10240&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fwrite&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_dest&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$buffer&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fclose&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_zip&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fclose&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp_dest&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;unlink&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zipfilename&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&amp;nbsp;catch&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Exception&amp;nbsp;$e&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$e&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getTraceAsString&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addFiles2Zip&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ZipArchive&amp;nbsp;$zip&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$path&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$removeFirstFolder&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;false&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$d&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;opendir&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$path&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$file&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;readdir&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$d&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$file&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;==&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"."&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;||&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$file&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;==&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;".."&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;continue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$curfile&lt;/span&gt;&lt;span style="color: #007700"&gt;=(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$removeFirstFolder&lt;/span&gt;&lt;span style="color: #007700"&gt;)?&lt;/span&gt;&lt;span style="color: #0000BB"&gt;substr&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$path&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$file&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;strpos&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$path&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'/'&lt;/span&gt;&lt;span style="color: #007700"&gt;)+&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;):&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$path&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$file&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;is_dir&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$path&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$file&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zip&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addEmptyDir&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$curfile&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addFiles2Zip&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zip&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$path&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$file&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'/'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$removeFirstFolder&lt;/span&gt;&lt;span style="color: #007700"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$zip&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;addFile&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$path&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$file&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$curfile&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;closedir&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$d&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #007700"&gt;&lt;br /&gt;__HALT_COMPILER();[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;the&amp;nbsp;script&amp;nbsp;shown&amp;nbsp;above&lt;/span&gt;&lt;span style="color: #007700"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If you all wrap up into a single script the you'll have something like the &lt;a href="http://588299e40f6cb98516d7458.googlepages.com/createziparchive-0.5.1.php"&gt;script I already mentioned.&lt;/a&gt;&lt;br /&gt;I think that it could be useful to have a version with a better error-handling and maybe also some CLI functions so that there's no need to edit the script itself everytime... I'll keep you updated as soon as I have something like that :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-4638244718018499202?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=4U6a8x8liCo:47UBJFMMSxM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=4U6a8x8liCo:47UBJFMMSxM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=4U6a8x8liCo:47UBJFMMSxM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=4U6a8x8liCo:47UBJFMMSxM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=4U6a8x8liCo:47UBJFMMSxM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/4638244718018499202/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=4638244718018499202" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/4638244718018499202?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/4638244718018499202?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/4U6a8x8liCo/self-extracting-php-archive.html" title="Self-extracting PHP archive" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/06/self-extracting-php-archive.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAFRn0zeip7ImA9WxdRFkk.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-93320643448753326</id><published>2008-06-04T18:11:00.000-07:00</published><updated>2008-06-04T23:35:17.382-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-04T23:35:17.382-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="plugin" /><category scheme="http://www.blogger.com/atom/ns#" term="pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="factory" /><category scheme="http://www.blogger.com/atom/ns#" term="creational" /><title>Plugin [PoEAA]</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;I'm sure you're pretty often in the situation that you have to switch something depending on the context you're currently in. For example most people change their eating habits before summer - I also do :P&lt;br /&gt;&lt;br /&gt;Sometimes this is what you also want to have in your software. To achieve different behaviour you normally just implement two different classes or aggregates and since they have the same "meaning" they normally share a interface (a.k.a &lt;span style="font-style: italic;"&gt;Separated Interface&lt;/span&gt;). But who decides which implementation fits into the current environment/context?&lt;br /&gt;&lt;br /&gt;The easiest way is to have a &lt;span style="font-style: italic;"&gt;Factory Method&lt;/span&gt; with a small condition to decide this, but this method might grow very fast if you have various options. In this situation its also a matter of form to move this decision into some kind of configuration(-file) so that there's only on file which differs in various environments.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://martinfowler.com/eaaCatalog/plugin.html"&gt;Martin Fowler&lt;/a&gt; suggests to place some kind of mapping into the configuration-file, so that your &lt;span style="font-style: italic;"&gt;Factory&lt;/span&gt; knows which implementation to instantiate in the current context. The key for the mapping in this case is the name of the &lt;span style="font-style: italic;"&gt;Separated Interface&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;As you see in the example code below, there are Cookie Tins which &lt;strike&gt;create&lt;/strike&gt; contain Cookies and depending on the current month you want to use a more or less restrictive Cookie Tin. In May, June and July you restrict your application to create max. 5 cookies, the rest of the year you don't care :P&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;a href="#codePlugin1" onclick="document.getElementById('codePlugin1').style.display=((document.getElementById('codePlugin1').style.display=='block')?'none':'block');"&gt;Show PHP Source - Main Classes&lt;/a&gt;&lt;div id="codePlugin1" class="code"&gt;&lt;a name="codePlugin1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Code start --&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// The Separated Interface&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;interface &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieTin &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;  public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getCookieInstance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;NormalTin &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;implements &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieTin &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;  public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getCookieInstance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;      return new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;DietTin &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;implements &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieTin &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;  protected &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$i&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;  public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getCookieInstance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;      return (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;++ &amp;lt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;5&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)?new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;():new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;NullCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// The Factory which supports Plugin-Creation&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieTinFactory &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;  public static function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getPlugin&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;( &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$class &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;      try {&lt;br /&gt;          return new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$GLOBALS&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Plugins'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;][&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$class&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;]();&lt;br /&gt;      } catch( &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Exception $e&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// maybe call some default implementation if the mapping is wrong&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;}&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;!-- Code end --&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;a href="#codePlugin3" onclick="document.getElementById('codePlugin3').style.display=((document.getElementById('codePlugin3').style.display=='block')?'none':'block');"&gt;Show PHP Code (less important part)&lt;/a&gt;&lt;div id="codePlugin3" class="code"&gt;&lt;a name="codePlugin3"&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Code start --&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;  public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;printCalories&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;      echo &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'200 '&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;; &lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;NullCookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;extends &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;  public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;printCalories&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() { }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;!-- Code end --&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;a href="#codePlugin2" onclick="document.getElementById('codePlugin2').style.display=((document.getElementById('codePlugin2').style.display=='block')?'none':'block');"&gt;Show PHP Client Code&lt;/a&gt;&lt;div id="codePlugin2" class="code"&gt;&lt;a name="codePlugin2"&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Code start --&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// This is usually in a configuration-file, normally this should&lt;br /&gt;// also sit in a XML structure....&lt;br /&gt;&lt;br /&gt;// That's what it would be in 300 days/year&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$GLOBALS&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Plugins'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;][&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'CookieTin'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;] = &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"NormalTin"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// That's what we have to turn it to before summer :P&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;if(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;in_array&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;date&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'n'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;),array(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;5&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;6&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;7&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;))) {&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$GLOBALS&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Plugins'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;][&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'CookieTin'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;] = &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"DietTin"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$tin &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieTinFactory&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getPlugin&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'CookieTin'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$i&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;while(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$i&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;--) {&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$cookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$tin&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getCookieInstance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;printCalories&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;!-- Code end --&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;br /&gt;A very common use-case for this is the changed behaviour in a testing-environment compared to the production-environment.&lt;br /&gt;There's something else in the example beside the &lt;span style="font-style: italic;"&gt;Plugin Pattern&lt;/span&gt; - I also made use of the &lt;span style="font-style: italic;"&gt;Special Case (the NullCookie)&lt;/span&gt; pattern  which I'm going to show in a future post....&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-93320643448753326?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=rD4k01eFFvQ:TuqIcfy5VIE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=rD4k01eFFvQ:TuqIcfy5VIE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=rD4k01eFFvQ:TuqIcfy5VIE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=rD4k01eFFvQ:TuqIcfy5VIE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=rD4k01eFFvQ:TuqIcfy5VIE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/93320643448753326/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=93320643448753326" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/93320643448753326?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/93320643448753326?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/rD4k01eFFvQ/plugin-poeaa.html" title="Plugin [PoEAA]" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/06/plugin-poeaa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcDQHs_fCp7ImA9WxdWFU0.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-6081676662194983086</id><published>2008-06-02T08:37:00.001-07:00</published><updated>2008-07-08T00:27:51.544-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-08T00:27:51.544-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="php" /><title>Comparing PHP Best Practises</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;If you're still wondering whether the single- or double quotes are processed faster in PHP you might want to look at &lt;a href="http://www.phpbench.com/"&gt;phpbench.com&lt;/a&gt;. They don't provide any ground breaking new insights, but they show in a very nice way what's best pratice when it comes to arrays, strings and loops...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-6081676662194983086?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=IMANSnB0cdo:fVtb5wQsk-8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=IMANSnB0cdo:fVtb5wQsk-8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=IMANSnB0cdo:fVtb5wQsk-8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=IMANSnB0cdo:fVtb5wQsk-8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=IMANSnB0cdo:fVtb5wQsk-8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/6081676662194983086/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=6081676662194983086" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/6081676662194983086?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/6081676662194983086?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/IMANSnB0cdo/comparing-php-best-practises.html" title="Comparing PHP Best Practises" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/06/comparing-php-best-practises.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08MRXw7fCp7ImA9WxdWFU0.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-869065166220513257</id><published>2008-05-29T21:39:00.000-07:00</published><updated>2008-07-08T00:24:44.204-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-08T00:24:44.204-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="value object" /><category scheme="http://www.blogger.com/atom/ns#" term="pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="behavioral" /><title>Value Object [DDD]</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="font-style: italic;"&gt;This metaphor does not fit completely, and the "Money-Example" is omnipresent, but I really like the pattern and so that's the story:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let's say you have your grannies recipe for a chocolate cookie and you want to keep this in mind, but also you like to somehow experiment with some new or different ingredients. Normally you just keep in mind what you changed and later you write down the new recipe. But from time to time you might want to compare the two recipes or maybe you want to make cookies with the new and the changed recipes. In this situation it's really good to have both written down on paper. ;)&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;br /&gt;In the world of OOP you could think of a solution using the &lt;a href="http://cookiepattern.blogspot.com/search/label/memento?max-results=100"&gt;Memento-Pattern&lt;/a&gt; but this doesn't really fit the situation and it's also some kind of overhead. That's the reason why the &lt;span style="font-weight: bold;"&gt;Value Object&lt;/span&gt; is the pattern of my choice.&lt;br /&gt;&lt;br /&gt;So let's look at the recipes again - we want to add and remove ingredients without modifying the original recipe and we want to compare the resulting recipes. We don't need to track a special identity of our recipes since we're only "collecting" ingredients.&lt;br /&gt;&lt;br /&gt;The idea of the Value Object is that every &lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt; every method which somehow transforms the state of a object always returns a new object and the old object stays untouched&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;. Whenever needed you should also implement a method to compare objects, I must concede that the common "Money Example" shows much better when that's needed ...&lt;br /&gt;&lt;br /&gt;Another edge of this pattern in PHP is that you can use method-chaining to perform multiple actions within a single line of code. So just have a look at the example you will like it's taste :)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;a href="#codeblockVO" onclick="document.getElementById('codeblockVO').style.display=((document.getElementById('codeblockVO').style.display=='block')?'none':'block');"&gt;Show PHP Source Code&lt;/a&gt;&lt;/span&gt;&lt;div id="codeblockVO" class="code"&gt;&lt;a name="codeblockVO"&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Code start --&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;&lt;br /&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Recipe &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;   protected &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$ingredients&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt; &lt;br /&gt;   public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;__construct&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$ingred&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;''&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {  &lt;br /&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;ingredients &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;implode&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;','&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;array_unique&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;explode&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;','&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$ingred&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)));&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;addIncredient&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$ingred&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;''&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;       return new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Recipe&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;ingredients&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;','&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$ingred&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;removeIncredien&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$ingred&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;''&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;       return new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Recipe&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;preg_replace&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'/,{0,1}'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$ingred&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;',{0,1}/'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;''&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;ingredients&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;','&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;));&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;printIncredients&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;       echo &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;str_replace&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;','&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'&amp;lt;br/&amp;gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;ingredients&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;equals&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Recipe $recipe&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;       return (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;strcmp&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;ingredients&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$recipe&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;ingredients&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)===&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)?&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;true&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;false&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;!-- Code end --&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;a href="#codeexampleVO" onclick="document.getElementById('codeexampleVO').style.display=((document.getElementById('codeexampleVO').style.display=='block')?'none':'block');"&gt;Show PHP Client Code&lt;/a&gt;&lt;/span&gt;&lt;div id="codeexampleVO" class="code"&gt;&lt;a name="codeexampleVO"&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Code start --&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$granniesRecipe &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Recipe&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'flour,baking soda,sugar,salt,butter,vanilla,chocolate'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$aNewRecipe &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$granniesRecipe&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;addIncredient&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'lemon'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$coconutRecipe &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$granniesRecipe&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;removeIncredien&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'chocolate'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;addIncredient&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'coconut'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// check if that worked:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;echo &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'&amp;lt;br/&amp;gt;&amp;lt;strong&amp;gt; Grannies Cookie Recipe - Incredients are:&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$granniesRecipe&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;printIncredients&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;echo &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'&amp;lt;br/&amp;gt;&amp;lt;strong&amp;gt; A new Cookie Recipe could look like:&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$aNewRecipe&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;printIncredients&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;echo &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'&amp;lt;br/&amp;gt;&amp;lt;strong&amp;gt; A coconut cookie would look like:&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$coconutRecipe&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;printIncredients&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;!-- Code end --&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="font-style: italic;"&gt;The implementation is a bit odd, since it only collects the names of the ingredients but not the amount, but including the amounts of incredients would not change the concept  and that's why I left it out. I hope you got a idea how the pattern works - the main thing is that there's no identity and that new objects are instantiated as soon as the state of the old one would change.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-869065166220513257?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=BrDvTuVOh2E:FV5j4vgSSmw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=BrDvTuVOh2E:FV5j4vgSSmw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=BrDvTuVOh2E:FV5j4vgSSmw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=BrDvTuVOh2E:FV5j4vgSSmw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=BrDvTuVOh2E:FV5j4vgSSmw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/869065166220513257/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=869065166220513257" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/869065166220513257?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/869065166220513257?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/BrDvTuVOh2E/value-object-ddd.html" title="Value Object [DDD]" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/05/value-object-ddd.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04EQXk5eyp7ImA9WxdSGEw.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-1374149620645813798</id><published>2008-05-27T16:17:00.000-07:00</published><updated>2008-05-26T08:31:40.723-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-26T08:31:40.723-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="prototype" /><category scheme="http://www.blogger.com/atom/ns#" term="creational" /><title>Prototype [GoF]</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;Imagine a cookie-oven which produces tasty cookies with &lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;chocolate crumbles. How do you ensure that the 1000th cookie still has the same taste as the first?&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;br /&gt;You might think that this is an easy task - just write down the recipe and follow the described steps...you know the result in real life - the 1000th cookie normally tasts like the 1st but you always had the "overhead" to read the recipe and go through the steps again and again.&lt;br /&gt;In OOP it's much easier to follow the recipe just instantiate a new Object and  there you go... no matter if it's the 1st or the 1000th - it'll always &lt;strike&gt;taste&lt;/strike&gt; look similar.&lt;br /&gt;But the "recipe-overhead" is still there in a way and especially when you have larger objects whose construction is time-consuming you might want to somehow get rid of it. And that's where a &lt;span style="font-style: italic;"&gt;Prototype&lt;/span&gt; can help you out - you just create the first &lt;strike&gt;Cookie&lt;/strike&gt; Object and then you use the handy magic method &lt;span style="font-weight: bold;"&gt;__clone&lt;/span&gt; to create new objects.&lt;br /&gt;Instead of just using __clone the pattern suggests a class (some kind of a factory-class) so that you can also encapsulate the creation of the objects (and also possible adjustments you might want to make after the creation/clone).&lt;br /&gt;&lt;br /&gt;So the example just shows a cookie-machine which makes use of the prototype-pattern to create new cookies (depending on the cookie you throw in before)... yummy&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_l5fIZzJyYfc/SDrXY97tyhI/AAAAAAAAABg/1sAhpbVe2kI/s1600-h/prototype_pattern.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_l5fIZzJyYfc/SDrXY97tyhI/AAAAAAAAABg/1sAhpbVe2kI/s400/prototype_pattern.png" alt="" id="BLOGGER_PHOTO_ID_5204709143321889298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;a href="#code1" onclick="document.getElementById('codeblockPrototype').style.display=((document.getElementById('codeblockPrototype').style.display=='block')?'none':'block');"&gt;Show PHP Source Code&lt;/a&gt;&lt;div id="codeblockPrototype" class="code"&gt;&lt;a name="code1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Code start --&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;abstract class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;__clone&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {    }&lt;br /&gt;abstract public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;printFlavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CoconutCookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;extends &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;printFlavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;   echo &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Coconut Flavor&amp;lt;br/&amp;gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;ChocolateCookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;extends &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;printFlavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;   echo &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Chocolate Flavor&amp;lt;br/&amp;gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieMachine &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;protected &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;__construct&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie $cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;cookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;}&lt;br /&gt;public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;makeCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;   return clone &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;!-- Code end --&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The client-code can look like this:&lt;br /&gt;&lt;a href="#code2" onclick="document.getElementById('codeblockPrototypeClient').style.display=((document.getElementById('codeblockPrototypeClient').style.display=='block')?'none':'block');"&gt;Show PHP Sample Code&lt;/a&gt;&lt;div id="codeblockPrototypeClient" class="code"&gt;&lt;a name="code2"&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Code start --&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$coconutCookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CoconutCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$coconutCookieMachine &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieMachine&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$coconutCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$chocolateCookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;ChocolateCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$chocolateCookieMachine &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieMachine&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$chocolateCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;//while(true) {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;for(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$i&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$i&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;5&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$i&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;++) {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$coconutCookieMachine&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;makeCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;()-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;printFlavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$chocolateCookieMachine&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;makeCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;()-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;printFlavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;!-- Code end --&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-1374149620645813798?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=k0ktk0SyvSE:1ZCLjzJAPgw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=k0ktk0SyvSE:1ZCLjzJAPgw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=k0ktk0SyvSE:1ZCLjzJAPgw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=k0ktk0SyvSE:1ZCLjzJAPgw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=k0ktk0SyvSE:1ZCLjzJAPgw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/1374149620645813798/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=1374149620645813798" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/1374149620645813798?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/1374149620645813798?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/k0ktk0SyvSE/prototype-gof.html" title="Prototype [GoF]" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp0.blogger.com/_l5fIZzJyYfc/SDrXY97tyhI/AAAAAAAAABg/1sAhpbVe2kI/s72-c/prototype_pattern.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/05/prototype-gof.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcERHw9fSp7ImA9WxdWFU0.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-4340783459952693279</id><published>2008-05-24T10:40:00.000-07:00</published><updated>2008-07-08T00:26:45.265-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-08T00:26:45.265-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="offtopic" /><title>PHP FastCGI vs. PHP as a module</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;The apachelounge.org guy published a very interesting stat which compares the &lt;a href="http://www.apachelounge.com/forum/viewtopic.php?p=10991"&gt;memory-usage of PHP/FastCGI and PHP/as module&lt;/a&gt; and that's really interesting:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_l5fIZzJyYfc/SDfQbt7tygI/AAAAAAAAABY/D72W5ZIj22c/s1600-h/httpd-ram-week.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_l5fIZzJyYfc/SDfQbt7tygI/AAAAAAAAABY/D72W5ZIj22c/s400/httpd-ram-week.png" alt="" id="BLOGGER_PHOTO_ID_5203857069055003138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There's no comment about performance and in early versions FastCGI/PHP was a bottleneck but maybe these days are gone :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-4340783459952693279?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=Cl8r8c-KYRo:ss75dn4ZQis:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=Cl8r8c-KYRo:ss75dn4ZQis:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=Cl8r8c-KYRo:ss75dn4ZQis:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=Cl8r8c-KYRo:ss75dn4ZQis:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=Cl8r8c-KYRo:ss75dn4ZQis:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/4340783459952693279/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=4340783459952693279" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/4340783459952693279?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/4340783459952693279?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/Cl8r8c-KYRo/php-fastcgi-vs-php-as-module.html" title="PHP FastCGI vs. PHP as a module" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp0.blogger.com/_l5fIZzJyYfc/SDfQbt7tygI/AAAAAAAAABY/D72W5ZIj22c/s72-c/httpd-ram-week.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/05/php-fastcgi-vs-php-as-module.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UERX0_fyp7ImA9WxdSGE4.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-9014794938805066641</id><published>2008-05-23T14:40:00.000-07:00</published><updated>2008-05-26T12:46:44.347-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-26T12:46:44.347-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="anti-pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="registry" /><category scheme="http://www.blogger.com/atom/ns#" term="singleton" /><category scheme="http://www.blogger.com/atom/ns#" term="creational" /><title>Singelton [GoF]</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;So this pattern is a very well know and a often discussed one.&lt;br /&gt;&lt;br /&gt;Explaining it the tasty way: let's say you have exactly one well know place where you store all your cookies and whenever you need one you can easy point to that place. Normally that's really comfortable because whatever you do with it, you don't have to search some place where you can find a cookie, you just go to that single "cookie tin" (or wherever you store cookies) and put a new cookie into it ;)&lt;br /&gt;&lt;br /&gt;In modern OOP the singleton is not very popular, Eric Evans simple calls it anti-pattern. It makes it much harder to test your software and normally the user of the class, not the class itself, should know how many instances are needed.&lt;br /&gt;&lt;br /&gt;But nevertheless for small applications it's very comfortable to use it in some situations and as long as you're also familiar with the drawbacks I think it's ok to consider using it....&lt;br /&gt;&lt;br /&gt;So the example shows a cookie tin and how to use it and by the way it also implements some kind of lowlevel registry by using the &lt;a href="http://www.php.net/manual/en/language.oop5.magic.php"&gt;PHP5 magic methods&lt;/a&gt;, but that's another story ;)&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;a href="#codeblockSingleton" onclick="document.getElementById('codeblockSingleton').style.display=((document.getElementById('codeblockSingleton').style.display=='block')?'none':'block');"&gt;Show PHP Source Code&lt;/a&gt;&lt;div id="codeblockSingleton" class="code"&gt;&lt;a name="codeblockSingleton"&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Code start --&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;/**&lt;br /&gt; * CookieTin a.k.a Singleton object&lt;br /&gt; * we what to force our application&lt;br /&gt;&lt;br /&gt; * to hold exactly one CookieTin object&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieTin &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;    private &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$_cookies&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=array();&lt;br /&gt;   &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;/* generic singleton part start*/&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;private static &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$_instance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// prevent instatiation from the outside&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;private function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;__construct&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() { }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// prevent cloning&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;private function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;__clone&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {}&lt;br /&gt;   &lt;br /&gt;    public static function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getInstance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;        if(!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$_instance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$_instance &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;        }&lt;br /&gt;        return &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$_instance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;/* generic singleton part end */   &lt;br /&gt;&lt;br /&gt;   &lt;br /&gt;    /* registry part start */&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;public static function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;__set&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$key&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie $value&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;&lt;br /&gt;        echo &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"call setter\n"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$_instance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;_cookies&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$key&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;] = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$value&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;    public static function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;__get&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$key&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;        echo &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"call getter\n"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;        return &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$_instance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;_cookies&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$key&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;];&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    public static function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;__isset&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$key&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {       &lt;br /&gt;        echo &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"call isset\n"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;        return isset(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$_instance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;_cookies&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$key&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;]);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    public static function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;__unset&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$key&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {   &lt;br /&gt;        echo &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"call unset\n"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;        unset(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$_instance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;_cookies&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$key&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;]);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;/* registry part end */&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;/**&lt;br /&gt; * Dummy Cookie&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;    public &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$name&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$flavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;!-- Code end --&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;a href="#codeblockSingletonClient" onclick="document.getElementById('codeblockSingletonClient').style.display=((document.getElementById('codeblockSingletonClient').style.display=='block')?'none':'block');"&gt;Show PHP Client Code&lt;/a&gt;&lt;div id="codeblockSingletonClient" class="code"&gt;&lt;a name="codeblockSingletonClient"&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Code start --&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$tin &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieTin&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getInstance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;if(!isset(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$tin&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;granniescookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)) {&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$tin&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;granniescookie &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$tin&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;granniescookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Grannies chocolate wonder"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$tin&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;granniescookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;flavor&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"chocolate"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieTin&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getInstance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;()-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;granniescookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;flavor &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"chocolte chips"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;var_dump&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$tin&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;unset(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieTin&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getInstance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;()-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;granniescookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;var_dump&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$tin&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;!-- Code end --&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;The really important things happen in the last lines where the CookieTin is accessed statically and this change also (as you will see yourself) is reflected in the local instance if the $tin.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-9014794938805066641?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=Bp4LQlJumuM:1fIatf00ZCY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=Bp4LQlJumuM:1fIatf00ZCY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=Bp4LQlJumuM:1fIatf00ZCY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=Bp4LQlJumuM:1fIatf00ZCY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=Bp4LQlJumuM:1fIatf00ZCY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/9014794938805066641/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=9014794938805066641" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/9014794938805066641?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/9014794938805066641?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/Bp4LQlJumuM/singelton-gof.html" title="Singelton [GoF]" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/05/singelton-gof.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFQXo5fyp7ImA9WxdSFE4.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-1957808279581413527</id><published>2008-05-21T23:35:00.000-07:00</published><updated>2008-05-21T23:45:10.427-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-21T23:45:10.427-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="php" /><title>PHP sucks? not really!</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;There are so many people from outside of the PHP World and lots of them are complaining about PHP and their reasons are mostly so ridiculous. In most cases they just say that PHP code sucks.&lt;br /&gt;The PHP 10.0 Blog brought up some good arguments about that and I fully agree - it's not the language that produces sucking code, it's the guy who wrote it down. &lt;a href="http://php100.wordpress.com/2008/05/21/secret-of-php/"&gt;Click&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-1957808279581413527?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=DraELtNTt5Q:rZo_ZmGSrAw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=DraELtNTt5Q:rZo_ZmGSrAw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=DraELtNTt5Q:rZo_ZmGSrAw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=DraELtNTt5Q:rZo_ZmGSrAw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=DraELtNTt5Q:rZo_ZmGSrAw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/1957808279581413527/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=1957808279581413527" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/1957808279581413527?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/1957808279581413527?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/DraELtNTt5Q/php-sucks-not-really.html" title="PHP sucks? not really!" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/05/php-sucks-not-really.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEDR3ozcCp7ImA9WxdRGEo.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-2316593073488144452</id><published>2008-05-20T14:40:00.000-07:00</published><updated>2008-06-07T15:11:16.488-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-07T15:11:16.488-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="errors" /><category scheme="http://www.blogger.com/atom/ns#" term="exceptions" /><title>error_reposting and exceptions....</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;I just found this line:&lt;br /&gt;&lt;div class="code" style="display: block;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;set_error_handler&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;create_function&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'$x, $y'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'throw new Exception($y, $x);'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;), &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;E_ALL~E_NOTICE&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;in the comments on php.net and did a short test to see whether it works. Normally I used to have a global function which passes all the errors through a logging-chain (FILE/MAIL/DISPLAY) but having exceptions could be more comfortable because you might &lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;sometimes want to make decisions locally and not on a global scope and just setting and re-setting the error-handler is not the best idea for this... I'm not sure if I get used to it, because the error-handling function did a good job for the last years ... we'll see :)&lt;br /&gt;So that's the full example code:&lt;br /&gt;&lt;div class="code" style="display: block;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;set_error_handler&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;create_function&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'$x, $y'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'throw new Exception($y, $x);'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;), &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;E_ALL&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;try {&lt;br /&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$errors &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= array(&lt;br /&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;E_USER_WARNING &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"something might be wrong"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;br /&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;E_USER_NOTICE &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"it works but I don't like it"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;br /&gt;                     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;E_USER_ERROR &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"something went completly wrong"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;//    echo $name; //should cause a E_NOTICE&lt;br /&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;foreach(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$errors &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;as &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$code&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$msg&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;     try {&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;trigger_error&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$msg&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$code&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;     }&lt;br /&gt;     catch (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Exception $e&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;         if(!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;in_array&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$e&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getCode&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(),array(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;E_USER_WARNING&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;E_USER_NOTICE&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;))) {&lt;br /&gt;             throw &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$e&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;         }&lt;br /&gt;         else {&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// not a big deal we can push this into a log-file and continue or work...&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;echo &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"local exception: ("&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$e&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getCode&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(). &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;") "&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$e&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getMessage&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;().&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"&amp;lt;br/&amp;gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;         } &lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;catch (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Exception $e&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt; echo &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"global exception:"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$e&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getMessage&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;().&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"&amp;lt;br/&amp;gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-2316593073488144452?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=nfCqfLBYURA:cAGKsfusC5A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=nfCqfLBYURA:cAGKsfusC5A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=nfCqfLBYURA:cAGKsfusC5A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=nfCqfLBYURA:cAGKsfusC5A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=nfCqfLBYURA:cAGKsfusC5A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/2316593073488144452/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=2316593073488144452" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/2316593073488144452?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/2316593073488144452?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/nfCqfLBYURA/errorreposting-and-exceptions.html" title="error_reposting and exceptions...." /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/05/errorreposting-and-exceptions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYEQHw6fCp7ImA9WxdSEUo.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-932131309727026561</id><published>2008-05-18T22:15:00.000-07:00</published><updated>2008-05-18T22:15:01.214-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-18T22:15:01.214-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="php" /><title>Preview to PHP 5.3</title><content type="html">&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;One of the mayor updates since PHP 5.0 is upcoming with the 5.3 version, this is also a major step forward to&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt; PHP 6 - I love to have namespaces and appreciate the split of E_NOTICE and E_DEPRECATED. Also other features like the native MySQL support ( I hope this really raises the performance), the array_replace/array_replace_recursive functions and also dynamic calls to static functions "$classname::$functionname($parameter);" sound very cool. So I really look forward to have it on the server (or at least on my laptop) :P&lt;br /&gt;&lt;br /&gt;Regarding the namespaces I've one idea: maybe someday someone will invent a common namespace "php::clean" which fixes all the small inconsistencies within function-names and parameter-styles ... that would be really great ;)&lt;br /&gt;&lt;br /&gt;A nice article with a more detailed look into namespaces and the other inventions in 5.3 can be found on &lt;a href="http://www.sitepoint.com/article/whats-new-php-5-3"&gt;sitepoint.com&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-932131309727026561?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=urWDo0i3FcI:-Lww34FGD5Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=urWDo0i3FcI:-Lww34FGD5Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=urWDo0i3FcI:-Lww34FGD5Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=urWDo0i3FcI:-Lww34FGD5Y:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=urWDo0i3FcI:-Lww34FGD5Y:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/932131309727026561/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=932131309727026561" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/932131309727026561?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/932131309727026561?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/urWDo0i3FcI/preview-to-php-53.html" title="Preview to PHP 5.3" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/05/preview-to-php-53.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcCQHw4eCp7ImA9WxdSEU8.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-1239246828085050728</id><published>2008-05-18T09:11:00.000-07:00</published><updated>2008-05-18T09:11:01.230-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-18T09:11:01.230-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="offtopic" /><title>Firefox 3 RC1</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;I just saw that the first Release Candidate of Firefox 3 is available for &lt;a href="http://www.mozilla.com/en-US/firefox/all-rc.html"&gt;download&lt;/a&gt; . As with the most of the Beta-versions I also checked this update because I'm really excited to get the &lt;a href="http://www.mozilla.com/en-US/firefox/3.0rc1/releasenotes/#whatsnew"&gt;new features&lt;/a&gt;, but after 5 minutes (&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;again)&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt; I removed it from my PC. Non of my extensions is working in FF3 (except the dictionary), it still destroys the Frames in TYPO3 (&lt;a href="http://typo3.org/extensions/repository/view/mn_ff3_be_bugfix/0.0.2/"&gt;there's a bugfix-extension for that&lt;/a&gt;) and the memory-usage is still very high,10% lower than in FF2 but still high.&lt;br /&gt;So I postponed the update and  kept on running &lt;a href="http://www.mozilla.com/en-US/firefox/all.html"&gt;Firefox 2&lt;/a&gt;, at least until the next Release Candidate ;)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-1239246828085050728?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=hzplmnl1Yco:0X72I9crPCw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=hzplmnl1Yco:0X72I9crPCw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=hzplmnl1Yco:0X72I9crPCw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=hzplmnl1Yco:0X72I9crPCw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=hzplmnl1Yco:0X72I9crPCw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/1239246828085050728/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=1239246828085050728" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/1239246828085050728?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/1239246828085050728?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/hzplmnl1Yco/firefox-3-rc1.html" title="Firefox 3 RC1" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/05/firefox-3-rc1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMCRno5eCp7ImA9WxdSEEs.&quot;"><id>tag:blogger.com,1999:blog-6883890973030717244.post-5055058470524801812</id><published>2008-05-17T13:02:00.000-07:00</published><updated>2008-05-17T16:37:47.420-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-17T16:37:47.420-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mock" /><category scheme="http://www.blogger.com/atom/ns#" term="tdd" /><category scheme="http://www.blogger.com/atom/ns#" term="phpunit" /><title>Using Mocks within Tests</title><content type="html">&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;Let's say you have some kind of process which creates cookies and which requires the cookies to bake before you deliver them to the customers. This process somehow touches two kinds of objects the cookie itself and a object which performs the process - the cookie oven.&lt;br /&gt;When you start to develop the oven how do you check whether the cookies are really baked or not? Since you can't get rid of the dependency between the oven and the cookie, you have to simulate a real object and do the checks by hand - but wait there's already a way to resolve it:&lt;br /&gt;PHPUnit ships with a very nice and comfortable function to create and check mock-objects and that's exactly what we need in this situation where we somehow need to find out if our cookie really gets baked.&lt;br /&gt;The testcase for this scenario could look like this:&lt;/span&gt;&lt;br /&gt;&lt;div class="code" style="display:block"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;&lt;br /&gt;class &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;TestCookieOven &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;extends &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;PHPUnit_Framework_TestCase &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{&lt;br /&gt;public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;testIfCookieIsBakenWithinFinishing&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;() {&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;/* create the mock and expect the&lt;br /&gt;    bakeIt method to be called at least once */&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$cookiemock &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getMock&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Cookie'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, array(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'bakeIt'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;));&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$cookiemock&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;expects&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;once&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;())-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;method&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'bakeIt'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);   &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;/* create the observed object and perform the required steps */&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$cookieoven &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieOven&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$cookieoven&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;finishCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$cookiemock&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;This first creates a mock and assigns the expectation that the "bakeIt"-function is called exactly once. [ b&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;eside the &lt;span style="font-style: italic;"&gt;-&gt;once()&lt;/span&gt;-call there are some alternatives: &lt;span style="font-style: italic;"&gt;-&gt;any()&lt;/span&gt;, &lt;/span&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;font-size:85%;"  &gt;-&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="font-style: italic;"&gt;never()&lt;/span&gt;, &lt;/span&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;font-size:85%;"  &gt;-&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="font-style: italic;"&gt;atLeastOnce()&lt;/span&gt;, &lt;/span&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;font-size:85%;"  &gt;-&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="font-style: italic;"&gt;exactly(int $count)&lt;/span&gt; and &lt;/span&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;font-size:85%;"  &gt;-&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;span style="font-style: italic;"&gt;at(int $index) ].&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt; Then it passes the mock to the oven and performs the method we want to check. To make this test green you need at least this:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code" style="display:block"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;CookieOven &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{ &lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;/**&lt;br /&gt;* Takes a cookie and prepares it to be ready&lt;br /&gt;* for a customer&lt;br /&gt;*&lt;br /&gt;* @param Cookie $cookie&lt;br /&gt;*/&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;public function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;finishCookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Cookie $cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$cookie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;bakeIt&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;  } &lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;So as soon you have these lines you have a green test and that's great because there is no need to have a real "cookie" class - someone else can take care of the cookies - oh wait ... I'd better do this myself :P&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6883890973030717244-5055058470524801812?l=www.cookiepattern.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=zXqWKnJVO0s:Cs63yDD3dSg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=zXqWKnJVO0s:Cs63yDD3dSg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=zXqWKnJVO0s:Cs63yDD3dSg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CookiePattern?a=zXqWKnJVO0s:Cs63yDD3dSg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CookiePattern?i=zXqWKnJVO0s:Cs63yDD3dSg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cookiepattern.com/feeds/5055058470524801812/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6883890973030717244&amp;postID=5055058470524801812" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/5055058470524801812?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6883890973030717244/posts/default/5055058470524801812?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CookiePattern/~3/zXqWKnJVO0s/using-mocks-within-tests.html" title="Using Mocks within Tests" /><author><name>Iljitsch</name><uri>http://www.blogger.com/profile/10571190438064431718</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00731883215099945123" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.cookiepattern.com/2008/05/using-mocks-within-tests.html</feedburner:origLink></entry></feed>
