Posted: August 17th, 2009 | Author: tolleiv | Tags: php, phpunit | 1 Comment »
If you look into the PHPUnit documentation ( http://www.phpunit.de/manual/3.3/en/test-doubles.html#test-doubles.mock-objects ) you’ll see some nice examples but non of them shows how to translate a function with multiple arguments into a mock-assumption.
Within the examples you’ll find:
$observer->expects($this->once())->method('update')
->with($this->equalTo('something'));
So what if the “update” function has two arguments, pretty easy:
$observer->expects($this->once())->method('update')
->with($this->equalTo('something'), $this->equalTo('something else'));
I guess Sebastian though that that there’s no need for documentation if something is so obvious
Posted: August 8th, 2009 | Author: tolleiv | Tags: encodingchain, jQuery, php, web | Comments Off
I just “released” encodechain.com. 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
I’m also not sure whether I choose the right name for it … O_o
Posted: May 28th, 2009 | Author: tolleiv | Tags: php | Comments Off
If you’re still wondering whether the single- or double quotes are processed faster in PHP you might want to look at phpbench.com. 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…
Posted: July 7th, 2008 | Author: tolleiv | Tags: behavioral, iterator, pattern, php, spl | Comments Off
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.
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 “Object” and an “ObjectList” which implements the native “Iterator” interface and then you’re able to have very handy lists 
class Incredient {
public $name,$amount;
public function __construct($name,$amount) {
$this->name = $name;
$this->amount = $amount;
}
}
class Recipe implements Iterator {
public $title;
private $ingredients;
public function __construct ($title) {
$this->title = $title;
}
public function addIncredient(Incredient $in) {
$this->ingredients[] = $in;
}
public function current () { return current ($this->ingredients); }
public function key () { return key($this->ingredients); }
public function valid () { return current ($this->ingredients); }
public function rewind () { return reset ($this->ingredients); }
public function next () { return next ($this->ingredients); }
}
$cookieRecipe = new Recipe(“Chocolate Cookie”);
$cookieRecipe->addIncredient(new Incredient(‘Flour’,’2.5 cups’));
$cookieRecipe->addIncredient(new Incredient(‘Baking soda’,’1 teaspoon’));
$cookieRecipe->addIncredient(new Incredient(‘Salt’,’0.5 teaspoon’));
$cookieRecipe->addIncredient(new Incredient(‘Butter’,’1 cup’));
$cookieRecipe->addIncredient(new Incredient(‘Sugar’,’1 cup’));
$cookieRecipe->addIncredient(new Incredient(‘Brown Sugar’,’0.5 cup’));
$cookieRecipe->addIncredient(new Incredient(‘Vanilla extract’,’1 teaspoon’));
$cookieRecipe->addIncredient(new Incredient(‘Egg’,’1-2′));
$cookieRecipe->addIncredient(new Incredient(‘Chocolate chips’,’2 cups’));
// process recipe:
foreach($cookieRecipe as $inc) {
echo $inc->name.“ => ”.$inc->amount.“<br/>”;
}
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 iterating through arrays, directory-lists 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:
$recipe = array();
$recipe[] = new Incredient(‘Flour’,’2.5 cups’);
$recipe[] = new Incredient(‘Baking soda’,’1 teaspoon’);
$recipe[] = new Incredient(‘Salt’,’0.5 teaspoon’);
$recipe[] = new Incredient(‘Butter’,’1 cup’);
$recipe[] = new Incredient(‘Sugar’,’1 cup’);
$recipe[] = new Incredient(‘Brown Sugar’,’0.5 cup’);
$recipe[] = new Incredient(‘Vanilla extract’,’1 teaspoon’);
$recipe[] = new Incredient(‘Egg’,’1-2′);
$recipe[] = new Incredient(‘Chocolate chips’,’2 cups’);
$recipeIncObj = new ArrayObject($recipe);
$ingredientsIt = $recipeIncObj->getIterator();
foreach($ingredientsIt as $inc) {
echo $inc->name.“ => ”.$inc->amount.“<br/>”;
}
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
Posted: July 1st, 2008 | Author: tolleiv | Tags: behavioral, null, pattern, php | 1 Comment »
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.
Instead of typing the “if(object == null)” phrase again and again, you could use the Null-Object pattern, you’ll see that this can make some situations much clearer.
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.
So a code-example could look like this:
class CookieFactory {
public function makeInstance() {
if(date(‘l’)==‘Monday’) return new NullCookie();
return new RealCookie();
}
}
interface iCookie {
function getCalories();
}
class RealCookie implements iCookie {
protected $calories=250;
public function getCalories() {
return $this->calories;
}
}
class NullCookie implements iCookie {
public function getCalories() {
return 0;
}
}
I think you can imagine what happens when you make use of the CookieFactory - diet on monday
There’re also some disadvantages, your clients normally don’t have a chance to react that there’s something special happening, also the clients must “share” the same expectation what “do nothing” means, the number of required Null-Objects might be very large and unhandy and 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.
I’m so glad that today is tuesday