Singleton

dakata__92

Super Moderator
Как мога на един сингълтон да подам някакви външни параметри? Примерно да въведа опциите за класът от конфиг файла, като параметър на функцията, въпреки, че обикновенно на класовете си ги подавам през конструктора. :)
PHP:
<?php 
class Singleton{
	private static $instance = null;
	
	private function __construct(){
		//някаква логика имаща нужда от опциите
	}
	
	public static function getInstance(){
        if(self::$instance == null){
            self::$instance = new Singleton();
        }
        return self::$instance;
    }
	

}
$options = blabla['masiv'];
$s = Singleton::getInstance();
//Как тук при инициализацията да подам опциите ?
Дайте идеи за разновидности на сингълтон и по-точно как да подам външните опции на класът. Обикновенно примерно го подавам на конструктора:
$t = new Class($options);
 
PHP:
<?php 
class Singleton{
	private static $instance = null;
	private $params = array();
	
	private function __construct(){
			//някаква логика имаща нужда от опциите
	}
	
	public static function getInstance(){
		if(self::$instance == null){
			self::$instance = new Singleton();
		}
		return self::$instance;
	}
	
	public function setParams($params = array())
	{
		$this->params = $params;
	}
}
?
 
eLite каза:
PHP:
<?php 
class Singleton{
	private static $instance = null;
	private $params = array();
	
	private function __construct(){
			//някаква логика имаща нужда от опциите
	}
	
	public static function getInstance(){
		if(self::$instance == null){
			self::$instance = new Singleton();
		}
		return self::$instance;
	}
	
	public function setParams($params = array())
	{
		$this->params = $params;
	}
}
?
Принципно се опитвам да си направя връзка с база данни която да ми прави по една инстанция и да работя с нея.
PHP:
<?php
namespace CCF\DB;

class MySQLi{
	private $db;
	private $options;
	
	public function __construct($options){
		$this->options = $options;
		$this->db = new \MySQLi($options['host'],$options['user'],$options['pass'],$options['name']);
		if($this->db->connect_errno > 0){
			throw new \Exception($options['error'], $options['status']);
		}
	}	
	
	public function query($sql){
		$query = $this->db->query($sql);
		if($query){
			return $query;
		}
		else{
			throw new \Exception($this->options['sql'], $this->options['status']);
		}
	}
	
	public function close(){
        if($this->db){
            $this->db->close();
		}
    }
}
 
eLite каза:
Разбирам идеята, но не разбирам проблема?
Имам приложение тоест главен клас който управлява устаналите, в който си добавям лоадъри опции и прочие. Него го инклудвам в страницата в която ще използвам функциалността му, като той самият е Сингълтон. Обаче правя някъде грешно извикването на кода ако направя повече от едно извикване на метод с името db има спад в перформънса и си го обяснявам, че самият ми клас не е сингълтон и прави постоянно нови и нови конекции. Та ето и самият клас в който викам горният клас на базата и начинът по който викам него.
PHP:
namespace CCF;
include_once 'Loader.php';

class SAL{
	private static $instance = null;
	private $DC = null;
	private $db;
	
	private function __construct(){
		\CCF\Loader::registerNamespace('CCF', dirname(__FILE__) . DIRECTORY_SEPARATOR);
		\CCF\Loader::registerAutoLoad();
		$this->DC = \CCF\DC\DC::getInstance();
		new \CCF\Exceptions($this->DC->mainErrHandlers);
	}
	
	public static function getInstance(){
        if(self::$instance == null){
            self::$instance = new \CCF\SAL();
        }
        return self::$instance;
    }
	
	public function db(){
		return new \CCF\DB\MySQLi($this->DC->dbase);
	}

}
Викам го така:
include_once "../CCF/SAL.php";
$SAL = CCF\SAL::getInstance();

и ако добавя базата
$result = $SAL->db();
или и заявка $result = $SAL->db()->query('blabla');
естествено че ще има спад но ако направя ето така
$result = $SAL->db();
$result = $SAL->db();
$result = $SAL->db();
$result = $SAL->db();
$result = $SAL->db();

И вече стадът е много голям, което ме навежда на мисълта, че ми е нужен сингълтон или друга по-правилна идея.
 

Back
Горе