Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP Registry Pattern

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];
    }
}
like image 797
Ian Hoar Avatar asked Nov 16 '11 05:11

Ian Hoar


People also ask

What is registry pattern?

The registry pattern is where you establish a single point of access, but not a single methodology. This very registry access will have at least 3 methods: put, find, and delete. These methods rely on a singleton pattern to work.

What is registry in laravel?

An alternative for managing application configurations and settings. Now with the magic of caching, so no more database calls to simply get site setting.


2 Answers

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);
}
like image 104
Phil Avatar answered Sep 23 '22 19:09

Phil


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!

like image 38
Manuel Fernández Avatar answered Sep 22 '22 19:09

Manuel Fernández