i am not a good person to define things, but any way , when you feel you need only one instance from a class then you need a singleton!
Did computer scientists waste their time to instantiate only one object?
absolutely no , it is a very useful solution , some time having multiple copies of objects can lead to chaos , resource looking , resource over used , …. etc
When it is needed?
Most of the common usage is to handle global setting like database connections , registry settings , who is online now ? , .etc
here is an example to implement singleton while connecting to MYSQL connection
<?php//ConnectionConf.phpclass ConnectionConf{public $Username;public $Password;public $ServerAddress;public $Database;}?>
<?phprequire_once 'ConnectionConf.php';class Connection{/*** Varaible to hold the unique instance* @var Connection*/private static $UniqueInstance;/*** Connetion User name* @var string*/private $_strUsername;/*** Connection Password* @var string*/private $_strPassword;/*** Connection Address* @var string*/private $_strServerAddress;/*** Database Name* @var string*/private $_strDatabase;/*** Last Error happend* @var string*/private $_strLastError;/*** mysql link identfier* @var mysql resource*/private $_resConnectionResource;/*** Class constructor , it is private ,* so no way you can create it using new Connection* @param $ConnectionConf ConnectionConf* @return void*/private function __construct($ConnectionConf){$this->_strUsername=$ConnectionConf->Username;$this->_strPassword=$ConnectionConf->Password;$this->_strServerAddress=$ConnectionConf->ServerAddress;$this->_strDatabase=$ConnectionConf->Database;$this->StartConnection();}/*** @param $ConnectionConf ConnectionConf* @return Connection*/public static function GetInstance ($ConnectionConf=null){if (Connection::$UniqueInstance==null){if ($ConnectionConf==null)throw new Exception("Connection Configuration Can't be null at first time");Connection::$UniqueInstance = new Connection($ConnectionConf);return Connection::$UniqueInstance ;}return Connection::$UniqueInstance ;}/////////////////////////////// Sets and Gets Start///////////////////////////////////public function GetUsername (){return $this->_strUsername;}public function GetPassword (){return $this->_strPassword;}public function GetServerAddress (){return $this->_strServerAddress;}public function GetDatabaseName(){return $this->_strDatabase;}public function GetConnectionResource (){return $this->_resConnectionResource;}public function GetLastError (){return $this->_strLastError;}////////////////////////////Sets And Gets End//////////////////////////////////////////////////////**** @return bool*/public function StartConnection (){try{$this->_resConnectionResource=mysql_connect($this->_strServerAddress,$this->_strUsername,$this >_strPassword);mysql_select_db($this->_strDatabase);}catch(Exception $e){$this->_strLastError=$e->getMessage();return 0 ;}return 1;}public function CloseConnection (){try{mysql_close($this->_resConnectionResource);}catch (Exception $e){$this->_strLastError=$e->getMessage();return 0 ;}return 1;}public function RestartConnection (){$this->CloseConnection();$this->StartConnection();}}$Config = new ConnectionConf();$Config->Username= "root";$Config->Password= "";$Config->ServerAddress= "localhost";$Config->Database= "road";//First instance$Connection = Connection::GetInstance($Config);var_dump($Connection);//will return the same instance declared before$Connection1 = Connection::GetInstance();var_dump($Connection1);?>
here are the files
http://www.4shared.com/file/9d_RHQ0I/ConnectionConf.html
http://www.4shared.com/file/DoOt0KUh/singleton.html