PHP Registry Pattern
Solution 1
It's using PHP's hacked on property overloading to add entries to and retrieve entries from the private $vars
array.
To add a property, you would use...
$registry = new Registry;
$registry->foo = "foo";
Internally, this would add a foo
key to the $vars
array with string value "foo" via the magic __set
method.
To retrieve a value...
$foo = $registry->foo;
Internally, this would retrieve the foo
entry from the $vars
array via the magic __get
method.
The __get
method should really be checking for non-existent entries and handle such things. The code as-is will trigger an E_NOTICE
error for an undefined index.
A better version might be
public function __get($key)
{
if (array_key_exists($key, $this->vars)) {
return $this->vars[$key];
}
// key does not exist, either return a default
return null;
// or throw an exception
throw new OutOfBoundsException($key);
}
Solution 2
You might want to check out PHP.NET - Overloading
Basically, you would do...
$Registry = new Registry();
$Registry->a = 'a'; //Woo I'm using __set
echo $Registry->a; //Wooo! I'm using __get
So here, I'm using __set($a, 'This value is not visible to the scope or nonexistent')
Also, I'm using __get($a);
Hope this helped!
![Ian Hoar](https://i.stack.imgur.com/jACLQ.jpg?s=256&g=1)
Comments
-
Ian Hoar almost 2 years
I've found the piece of code below in several places around the web and even here on Stack Overflow, but I just can't wrap my head around it. I know what it does, but I don't know how it does it even with the examples. Basically it's storing values, but I don't know how I add values to the registry. Can someone please try to explain how this code works, both how I set and retrieve values from it?
class Registry { private $vars = array(); public function __set($key, $val) { $this->vars[$key] = $val; } public function __get($key) { return $this->vars[$key]; } }
-
Ian Hoar over 12 yearsThanks, I thought I was going crazy. This helped me go back and check what was going on. I was trying to set a form action, but it was always coming up blank. Turns out I was on the index page, so there was no value. DOH!. I tried the form on another page and it worked fine. Thanks for your help. When you say hacked on, does that mean it shouldn't be used this way?
-
Phil over 12 years@IanHoar Well, it definitely shouldn't be called overloading
-
Wolfpack'08 over 11 years@Phil I can see how you add the key, but how do you add a key-value pair?
-
Phil over 11 years@Wolfpack Not sure what you mean. When you set
$registry->key = 'value'
, internally it stores a key / value pair ofkey
andvalue
respectively but to the outside world, they appear as class properties -
Wolfpack'08 over 11 years
$foo = $registry->foo;
;$foo = $registry->foo = 'bar';
? I don't full understand the purpose of this code, honestly. I'm just reading articles. -
Phil over 11 years@Wolfpack still not sure what your question is. Your first snippet uses the
__get()
method to retrieve propertyfoo
and assign the value to local var$foo
. Your second assigns'bar'
to both the propertyfoo
and local variable$foo
. It's no different to$a = $b = 'some value'
-
Wolfpack'08 over 11 years@Phil I was just following the template:
$registry->key = 'value'