Ir para conteúdo

POWERED BY:

Arquivado

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

visitante_php

iniciante em singleton

Recommended Posts

um amigo e prof pediu q eu criasse uma classe singleton com com metodo getUser, entao vou postar aki pra saber se eu fiz certo a classe...

 

classe em singleton

 

<?php

class SGBD_TUser
{
	
	/**
	 * Instancia da classe
	 *
	 * @var unknown_type
	 */
	private static $user = NULL;
	
	private function __construct( $id_user )
	{
		self::getUser();
	}
	
	
	private function getUser()
	{
		echo $this->id_user;
	}
	
	public function getInstancia( $id_user )
	{
		if(self::$user == NULL)
		{
			self::$user = new self( $id_user );
		}
		return self::$user;
	}
	
	private function __clone()
	{
		//
	}
}

 

e esse eh o arquivo q faz a chamada

 

<?php

include("bootstrap/config.php");
include("bootstrap/bootstrap.php");

SGBD_TUser::getInstancia('igor');

keira saber se fiz certo, nao estou conseguindo testar aki, meu servidor deu pau...

Compartilhar este post


Link para o post
Compartilhar em outros sites

ta resolvida NAO

 

eu refiz a classe assim

 

<?php

class SGBD_TUser
{

	/**
	 * Instancia da classe
	 *
	 * @var unknown_type
	 */
	private static $user = NULL;

	/**
	 * Identificador do usuario
	 *
	 * @var String
	 */
	private static $usuario = array(); // porque array ???? o   ieud seentii estfeica deemploro sempre será um inteiro

	/**
	 * metodo construtor, chamando o metodo que retorna o usuario
	 *
	 * @param String $id_user Identificador do usuario
	 */
	private function __construct( )
	{
		//
	}

	/**
	 * metdo que recupera o usuario
	 *
	 * @return String
	 */
	public function getUser( $id )
	{
		$id = ( int )$id;
		return self::$usuario[$id];
	}

	/**
	 * Indica o usuario
	 *
	 * @param Integer $id Identificador numerio do usuario
	 * @param String $name Nome do usuario
	 */
	public function setUser( $id, $name )
	{
		$id = ( int )$id;
		$name = trim( $name );
		self::$usuario[$id] = $name;
	}

	/**
	 * Obtem a instancia da classe
	 *
	 * @param String $id_user Identificador do usuario
	 * @return unknown
	 */
	public function getInstancia( )
	{
		if( self::$user == NULL )
		{
			self::$user = new self( );
		}
		return self::$user;
	}

	private function __clone( )
	{
		trigger_error('Esta classe não pode ser clonada', E_USER_ERROR);
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa; Obrigado por despertar minha curiosidade sobre singleton... não conheçia até o momento, ai resolvi pesquisar... muito interesante.. rsrs

 

Explicação.. para os que não sabem.

 

_____________________

 

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.

 

Muitos projetos necessitam que algumas classes tenham apenas uma instância. Por exemplo, em uma aplicação que precisa de uma infraestrutura de log de dados, pode-se implementar uma classe no padrão singleton. Desta forma existe apenas um objeto responsável pelo log em toda a aplicação que é acessível unicamente através da classe singleton.

 

Fonte: wikipedia

Compartilhar este post


Link para o post
Compartilhar em outros sites

um amigo me pediu pra fazer uma classe singleton....o outro topico foi fechad antes q eu pudesse mostrar o resultado...eu achei q tivesse sido resolvido....mas ele se comportou de uma maneira estranha

 

 

a classe eh essa

 

<?php

class SGBD_TUser
{

	/**
	 * Instancia da classe
	 *
	 * @var unknown_type
	 */
	private static $user = NULL;

	/**
	 * Identificador do usuario
	 *
	 * @var String
	 */
	private static $usuario = array(); // porque array ???? o   ieud seentii estfeica deemploro sempre será um inteiro

	/**
	 * metodo construtor, chamando o metodo que retorna o usuario
	 *
	 * @param String $id_user Identificador do usuario
	 */
	private function __construct( )
	{
		//
	}

	/**
	 * metdo que recupera o usuario
	 *
	 * @return String
	 */
	public function getUser( $id )
	{
		$id = ( int )$id;
		return self::$usuario[$id];
	}

	/**
	 * Indica o usuario
	 *
	 * @param Integer $id Identificador numerio do usuario
	 * @param String $name Nome do usuario
	 */
	public function setUser( $id, $name )
	{
		$id = ( int )$id;
		$name = trim( $name );
		self::$usuario[$id] = $name;
	}

	/**
	 * Obtem a instancia da classe
	 *
	 * @param String $id_user Identificador do usuario
	 * @return unknown
	 */
	public function getInstancia( )
	{
		if( self::$user == NULL )
		{
			self::$user = new self( );
		}
		return self::$user;
	}

	private function __clone( )
	{
		trigger_error('Esta classe não pode ser clonada', E_USER_ERROR);
	}
}

 

chamada da classe

 

<?php

include("bootstrap/config.php");
include("bootstrap/bootstrap.php");

header( 'Content-type: text/html; charset=' . DEFAULT_ENCODING );

$User = SGBD_TUser::getInstancia( );
$User2 = SGBD_TUser::getInstancia( );

$User->setUser( 0, 'Igor' );
$User2->setUser( 0 , 'João' );


echo $User->getUser( 0 );
echo $User2->getUser( 0 );

so retorna João, esta certo?

 

 

uma outra duvida, a classe singleton nao pode ser extendida, mas pode extender....?

Compartilhar este post


Link para o post
Compartilhar em outros sites

e esta dando erro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, aqui esta um exemplo, espero que possa ajudar, e talvez esteja correto.

 

<?php
class TUser{
	
	 private static $instancia  = array();
	 private $usuario;

	 
	 
	 /**
	 * Recebe o valor da id_usuario, e retorna a id acessivel para o objeto.
	 *
	 * @param  (String) $id_usuario;
	 * @return (String) $this->usuario;
	 */
	private function __construct($id_usuario){

		$this->usuario = $id_usuario;
		return $this->usuario;
	}
	/**
	 * Recebe a id_usario e verifica se o Objeto ja existe,caso
	 *exista cria um novo objeto, caso contrário retorna o objeto atual.
	 * @param (String)  $id_usuario;
	 * @return (Object) self::$instancia;
	 */
	public  static function getInstancia ($id_usuario){
				
		if(!array_key_exists($id_usuario, self::$instancia)){
		   self::$instancia[$id_usuario] = new self($id_usuario);
		}
		return self::$instancia[$id_usuario];
	}
	/**
	 * Retorna a Id do Usuário.
	 *
	 * @return String $this->usuario;
	 */
	public function getNome(){
	   return $this->usuario;
	}
}


$User = TUser::getInstancia('Ola');
$User2 = TUser::getInstancia('Mundo');
echo $User2->getNome(); echo $User->getNome();

Comentem...

Compartilhar este post


Link para o post
Compartilhar em outros sites

topicos mesclados

resolvido retirado

 

nao crie novos topicos para assuntos em andamento

se foi dado por resolvido foi porque voce disse e poderia ter dito o contrario tambem

 

mesmo com o titulo escrito resolvido voce podia continuar postando normalmente

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu refiz a classe, mas me parece estar com erro....

 

USER_TUser

 

USER/TUser.class.php

 

<?php


/**
 * Class Tuser -> Padrao singleton
 *
 */
class USER_TUser
{

	/**
	 * Instancia da classe
	 *
	 * @var Object
	 */
	private static $instancia = NULL;
	
	/**
	 * Retorno do objeto
	 *
	 * @var String
	 */
	private $user;
	
	
	 
	 /**
	  * Construtor da classe
	  *
	  * @param unknown_type $id
	  */
	private function __construct( )
	{
		//
	}
	
	/**
	 * VErifica a instancia da classe
	 *
	 * @param Integer $id
	 * @return Object
	 */
	public function getInstancia( $id = NULL )
	{
		$id = ( int )$id;
		if(self::$instancia == NULL)
		{
			self::$instancia = new self( );
		}
		
		return self::$instancia;
	}
	
	/**
	 * Indica um usuario
	 *
	 * @param Integer $id Indice numerico do usuario
	 * @param String $user Nome do usuario
	 */
	public function setUser( $id, $user )
	{
		$id = ( int )$id;
		$this->user[$id] = $user;
	}
	
	/**
	 * Obtem o usuario por seu indice numerico
	 *
	 * @param Integer $id Indice numerico do usuario
	 * @return String
	 */
	public function getUser( $id )
	{
		$id = ( int )$id;
		return $this->user[$id];
	}
	
}

 

arquivo q faz a chamada

 

 

<?php

include("bootstrap/config.php");
include("bootstrap/bootstrap.php");

header( 'Content-type: text/html; charset=' . DEFAULT_ENCODING );
/*
$User = SGBD_TUser::getInstancia( );
$User2 = SGBD_TUser::getInstancia( );

$User->setUser( 0, 'Igor' );
$User2->setUser( 0 , 'Márcio' );
*/


$User = USER_TUser::getInstancia( 0 );
$User2 = USER_TUser::getInstancia( 0 );

$User->setUser( 0, 'Igor' );
$User->setUser( 1, 'joao');
$User2->setUser( 0, 'marcio');
$User2->setUser( 1, 'jorge');


echo $User->getUser( 0 );
echo '<br>';
echo $User->getUser( 1 );
echo '<br>';
echo $User2->getUser( 0 );
echo '<br>';
echo $User2->getUser( 1 );

 

retorno...

 

 

marcio

jorge

marcio

jorge

estou fazendo certo...?

Compartilhar este post


Link para o post
Compartilhar em outros sites

no método que verifica a instância,

 

se prestar um pouco de atenção você verá o erro para esse seu caso em específico

 

original

public function getInstancia( $id = NULL )
	{
		$id = ( int )$id;
		if(self::$instancia == NULL)
		{
			self::$instancia = new self( );
		}
		
		return self::$instancia;
	}

 

 

sugestão:

public function getInstancia( $id = NULL )
	{
		$id = ( int )$id;
		if($id == NULL)
		{
			self::$instancia = new self( );
		}
		
		return self::$instancia;
	}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Queria entender pra que serve o parâmetro $id ...

public function getInstancia( $id = NULL )
{
		$id = ( int )$id;
		if(self::$instancia == NULL)
		{
			self::$instancia = new self( );
		}
		
		return self::$instancia;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

o resultado era pra ser esse mesmo ?

 

também nao sei pra quê serve o ID ali na instância...

só achei estranho porque estava declarado mas nao usava em canto algum...

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.