Simple (?) Singleton Question

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
musetracks
Forum Newbie
Posts: 3
Joined: Mon Nov 12, 2007 7:55 pm

Simple (?) Singleton Question

Post 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
User avatar
RobertGonzalez
Site Administrator
Posts: 14293
Joined: Tue Sep 09, 2003 6:04 pm
Location: Fremont, CA, USA

Post 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');
?>
jmut
Forum Regular
Posts: 945
Joined: Tue Jul 05, 2005 3:54 am
Location: Sofia, Bulgaria
Contact:

Post 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....
User avatar
vigge89
Forum Regular
Posts: 875
Joined: Wed Jul 30, 2003 3:29 am
Location: Sweden

Post 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.
User avatar
RobertGonzalez
Site Administrator
Posts: 14293
Joined: Tue Sep 09, 2003 6:04 pm
Location: Fremont, CA, USA

Post 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).
Post Reply