Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lucas Renan

[Resolvido] qdo usar Singleton?

Recommended Posts

Singleton, é um padrão de projeto de software (do inglês Design Pattern). Este padrão garante a existência de apenas uma instância de uma classe, mantendo um ponto global de acesso ao seu objeto. (by wikipedia)

 

então fikei com uma dúvida,

 

qdo usar singleton, ou melhor..qdo clonar objetos em php ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

qdo usar singleton, ou melhor..qdo clonar objetos em php ?

Bom, acho que você não entendeu muito bem o que é o pattern Singleton. Não tem nada haver com clonagem.

A clonagem serve para fazer uma cópia de um objeto em um determinado momento, preservando seu estado. Não vou explicar isso aqui porque senão o tópico irá se extender muito.

 

Imagine o seguinte:

 

Você tem uma loja, e nessa loja, existem os usuários dela.

Quando o usuário se loga, é criado um objeto TUser. Como garantir que sempre haverá uma única instância de TUser?

Aí entra o Singleton.

 

Normalmente, funciona assim:

 

$User = TUserSession::getInstance(); // $User é o objeto 'X'

$OutroUser = TUserSession::getInstance(); // $OutroUser é a mesma coisa que $User.

Se você fizer assim:

 

$User->nome = 'Márcio';
echo $OutroUser->nome;
Irá imprimir 'Márcio'.

 

Pra isso serve o Singleton http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

ah tah..

 

acho q comecei a entender a idéia..

 

então eu devo usar Singleton aonde o objeto é igual para "td mundo", por exemplo que acessar o site, ou o sistema.

assim irá "economizar" espaço na memória do server?

correto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

por acaso seria na mesma idéia de um método estático por exemplo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que a ideia nem e muito economizar o Server e talz, e sim unificar uma coisa que e padrao no sistema para futuras manutenções ...

 

o exemplo mais simples de singleton e a conexao de banco de dados única para todo o sistema....

 

é, pode ser comparado de certa forma com um metodo estatico de uma classe..

 

 

eu nao conheço muita coisa de patterns nao, entao me corrijam se estiver errado

Compartilhar este post


Link para o post
Compartilhar em outros sites

sakei..

valeus as explicações..

 

mas to com um problema..pq não tah funcionando..

peguei esse exemplo no laboratório de scripts;

 

mas não está funcionando corretamente

 

config.php (classe de conexão)

class DB extends Mysqli
{
	private $db_config		= array();
	private static $status	= false;
	private static $conectado = false;
	private $mysqli;
	
	public function __construct()
	{				
		$this->db_config[0] = "192.168.1.101";
		$this->db_config[1] = "adm";
		$this->db_config[2] = "";
		$this->db_config[3] = "teste";
		
	   // if(is_array($this->db_config) or !in_array("", $this->db_config))
	   // {
			self::$status = true;// aqui é para dizer que aparentemente os dados de conexao estao ok.	
			@parent::__construct(
				$this->db_config[0], 
				$this->db_config[1], 
				$this->db_config[2], 
				$this->db_config[3]
			);	

			if(!mysqli_connect_errno())
			{
				self::$conectado = true;//aqui é para dizer se a conexao ta aberta
				return true;
			}
		//}	
	}

	public function __destruct() 
	{
		   $this->Fechar();
	}	

	public function Fechar() 
	{
		if(self::$conectado)//se tiver conectado fecha
		{
			parent::close();
			self::$conectado = false;//seta para status da conexao = false
		}	
	}
	
	public function Executar($sql)
	{
		if(self::$conectado)// só executa a query se a conexao foi bem sucedida
		{
			if ($re = parent::query($sql))
			{
				return $re;
/* teste simples e retorna o resultado da conexao, nao recomendo trabalhar assim
em vez disso voce pode tratar melhor as execuções e retorno da query, isso que ue mostrei foi só um exemplo
*/	
			}		
		}	
	}
}

singleton.class.php (classe singleton)

final class Singleton
{
	private static $instance = array();

	final private function __construct()
	{}

	public final function __clone()
	{
		trigger_error('Nao é possivel clonar uma classe singleton', E_USER_ERROR);
	}

	static public function &factory($className)
	{
		if(!isset(self::$instance[$className]))
		{
			self::$instance[$className] = new $className;
		}
		return self::$instance[$className];
	}
}

pagina.php

require_once('config.php');
			require_once('singleton.class.php');  
			
			$classe =& Singleton::factory( "DB" );// cria a estancia de 1 objeto de conexao DB
			$re = $classe->Executar("select * from usuarios");// passa o select do banco
			
			while ($l = $re->fetch_array(MYSQLI_ASSOC))
			{
				echo $l["Nome"]."<br />";	   
			}
			#fecho a conexao com o banco
			$classe->Fechar();

obs.. dentro da classe singleton se eu criar uma classe teste..com um método qualquer..funciona normal..

Compartilhar este post


Link para o post
Compartilhar em outros sites

obs..

 

no server de produção funciona normal

e local

parece q soh num funciona com a classe DB, mesmo se eu colocar DB no lugar de 'new $className;'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, não é isso.

 

Imagine um sistema de loja.

 

Como garantir que sempre haverá uma única instancia de um usuário logado ? É pra isso que serve.

Cada usuário logado terá sua instância, mas eu, por exemplo, quando me logar, terei a instancia da classe User única, e não haverá como instanciar outra instancia de User para mim.

 

private static $instance = array();
Errado. A variável $instance armazenará o próprio objeto, e não um array.

Compartilhar este post


Link para o post
Compartilhar em outros sites

intendi intendi..

 

agora tah funfando..

 

vlw as explicações

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.