Page 1 of 1

Simple (?) Singleton Question

Posted: Tue Nov 13, 2007 4:11 am
by musetracks
Not being a seasoned PHP developer, tonight I started playing with the use of the Singleton pattern to store configuration information. What I was surprised to find was that the instance - at least the one I'm creating - isn't really a singleton. With each request, the constructor is called. Isn't that very much *not* a singleton or am I misunderstanding or doing something wrong? I'm using a pretty simple case:

Code: Select all

class Config
{
    private static $instance;

    private function __construct() { 
 		echo '<p>Constructing</p>';
	}

    public static function getInstance()
    {
        if ( is_null ( self::$instance ) )
        {
            self::$instance = new self();
        }

        return self::$instance;
    }
    public function clear() { 
		echo '<p>clearing...</p>';
		self::$instance    = null; 
    }
}
I've called this code on a dummy page and each time I refresh the page, the word "Constructing" is printed. What am I not doing or not understanding?

Any insight would be greatly appreciated.

Thanks.

Rob

Posted: Tue Nov 13, 2007 11:32 pm
by RobertGonzalez

Code: Select all

<?php
class Settings {
  private static $instance = null;

  private $settings = array();

  final private function __construct() {}

  public static function getInstance() {
    if (self::$instance === null) {
      self::$instance = new Settings();
    }

    return self::$instance;
  }

  public function set($name, $value) {
    if (!isset($this->settings[$name])) {
      $this->settings[$name] = $value;
    }
  }

  public function get($name) {
    if ($this->has($name)) {
      return $this->settings[$name];
    }
  }

  public function has($name) {
    return isset($this->settings[$name]);
  }
}

$settings = Settings::getInstance();
$settings->set('Everah', 'rocks');
echo $settings->get('Everah');
?>

Posted: Wed Nov 14, 2007 6:10 am
by jmut
Everah: mm don't really see how your code changed something.

musetracks: thats normal. You are making absolutely new request. Singleton will work within same request only. Or
if you make some session hold of objects....

Posted: Wed Nov 14, 2007 6:20 am
by vigge89
You will have to save the object like any other class instance you wish to store over multiple requests. Look up sessions and serializing in the documentation for examples.

Posted: Wed Nov 14, 2007 11:48 am
by RobertGonzalez
Sorry, didn't read the part about page refreshing.

That makes sense. PHP is essentially stateless, so everytime you refresh a page you are invoking the script all over again. The Singleton pattern is most suited to maintaining a single instance of an object throughout the life of a request (all 0.0034 seconds of it).