Sometimes while you are coding, you need some kind of a wrap for some primitive data type such as an integer, just to add some feature that is not available directly from that primitive data type, or just to give it some identity.
A Date, Integer, or Dollar class is a handy – and inexpensive – encapsulation, easily copied, compared, or created when needed.
For example managing Bytes and printing them can be something annoying, for example, when ever you need to print the number of Bytes in a file, you would like to check if it can be represented in KB, MB, or GB.
So what I’m going to do here is to wrap the integer datatype into a Byte class, and override it’s __toString function (one of the magic functions in PHP 5) so every time time I need to print it a simple print would do the issue.
Our example here would be for a mailbox, every mailbox has a quota, I want to give it a starting quota, then increase it, so first I’m going to write the Test for it (Using simpletest).
Here I created to Mailboxes, and gave them a starting quota of 1 MB, after that I added 512 KB to one of them, and checked that it was added, and that the other mailbox and starting Quota was not changed.
OK Let’s run the test.
1/1 test cases complete: 3 passes, 2 fails and 0 exceptions.
What happened here? this code now points to ($this->assertEqual(1048576,$mailbox2->getQuota()->getBytes());) and ($this->assertEqual(1048576,$startingQuota->getBytes());) lines, Any Idea?
Here is a hint: in PHP 5 Objects are passed By Handle (Something like reference, yes similar to Java) not by value, is it clear now?
Another hint: They all point to the same Byte Object.
So actually changing one of them is changing them all.
So, how do you implement a lightweight, or easy to construct, descriptive object like Byte?
Lightweight objects should behave like PHP integers: if you assign the same object to two different variables and then change one of the variables, the other variable should remain unaffected. And indeed this is the goal of the Value Object pattern.So now we need to make the Byte Object immutable (i.e does not change once it’s been set).
1/1 test cases complete: 5 passes, 0 fails and 0 exceptions.