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];
}
}
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);
}
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!