Jump to content


Photo

__destruct()


  • Faça o login para participar
5 replies to this topic

#1 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 24/08/2007, 11:18

Olá pessoal

Eu tenho uma classe de conexão com o banco de dados, que utiliza adodb e tals :P

Dae eu inventei de colocar o método _destruct nele, para ele fechar a conexão quando terminasse o script.

PHP 5 introduces a destructor concept similar to that of other object-oriented languages, such as C++. The destructor method will be called as soon as all references to a particular object are removed or when the object is explicitly destroyed or in any order in shutdown sequence.



Na minha teoria, não chamaria ele só quando terminasse a execução do script/função?
Ou quando a chamada dele na classe termina?
Pois eu tenho métodos que acessam outros métodos (usando conexão o tempo todo).

Exemplo:
function algumacoisa($arrValores) {
		$o = new osForm();
		//Vários setters de dados vindas de uma consulta SQL, abrindo uma conexao
		$o->setCliente(clienteClass::getClienteCodigo($o->getCd_cliente()));
		$o->setUsuarioAtendente(usuarioClass::getUsuarioCodigo($o->getCd_usuario()));
		$o->setEquipamento(equipamentoClass::getEquipamentoCodigo($o->getCd_equipamento()));
		$o->setUsuario_abertura(usuarioClass::getUsuarioCodigo($o->getCd_usuario_abertura()));
	  }

Cada chamada de função tá abrindo conexão, e fechando no término de execução dela :S

Pensei agora, será que se eu passar elas para static ele irá chamar o destrutor somente quando termina a execução da função chamada inicialmente? :unsure:

Definição de static:

Another important feature of variable scoping is the static variable. A static variable exists only in a local function scope, but it does not lose its value when program execution leaves this scope. Consider the following example:


(espero que o PR leia isso... <_<')

-- EDIT --

Será que é porque eu fico fazendo novas chamadas da classe a cada método que eu vou executando? Pra mim que não, pois a variavel de conexao é estática :S

E bem antes de começar a chamar estas conexões eu já incluo ela no escopo, ou seja, ele não fica requerindo toda hora a classe, só fazendo a chamada >_>'

Alguem já passou por algo parecido?

[]'s

Edição feita por: savior, 24/08/2007, 12:10.

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#2 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 24/08/2007, 13:16

Eu mantenho somente 1 conexão aberta com o servidor, e como não utilizo as conexões persistentes, nem me preocupo em fechá-la, já que no final do script isso é feito automaticamente.

Uso is_resource para saber se a variável já está com um link e evitar abrir uma nova conexão, apenas passando como parâmetro adicional para a função do DB uma flag FALSE (mysql_connect -> newlink = FALSE [ver manual]).
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#3 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 24/08/2007, 19:53

Tava pensando se eu adotasse a Singleton Pattern não resolveria esse problema, mas dae será que eu teria que aplicar ele em todas as minhas classes para funfar?

Se sim ... nossa a migração iria demora tantoOOoooo ;x
Pq atualmente adotei padrão Java Beans nelas xD

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#4 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 24/08/2007, 22:56

Não acho necessário ... é o que eu te falei, se você fizer uma nova conexão ao banco de dados (instanciar um novo objeto no caso) com os mesmos parâmetros e passar a flag FALSE em "new link", ele irá usar a mesma conexão, o que seria correto levando em conta que você deve manipular o resultado assim que faz a operação.

E como a conexão é fechada no final do script automaticamente o __destruct é meio useless. Eu uso o destruct em classes de imagens, porque eu nunca lembro de depois de manipular chamar o image_destroy.
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#5 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 26/08/2007, 02:42

script automaticamente o __destruct é meio useless


Se o PR visse isso, você ganharia Warn, só pelo ódio dele eaoshuehsaouheo

Eu tentei até pelo jeito que você falo, mas a vontade de aprender singleton falo mais alto ;b
Fico até legal nos testes aqui em casa, mas esse pattern é complicado ,fundiu a cuca usar self:: e $this na mesma classe ;B

private static $_instancia = null;
		private $_conexao;
		private $_bd = null;
		private $_data = null;
		private $_qtd;
		private $_generated_key;
		private $_arrValores = null;
		private $_arrErros;

		/**
		 *  Construtor privado da classe, ou seja, somente a propria classe poderá acessar ele.
		 */		
		private function __construct() {
			$this->_newConnection();
		}
		
		/**
		 * Funcao que realiza uma nova conexao com o banco de dados.
		 */
		private function _newConnection() {			
			try {
				$this->_conexao = &NewADOConnection('mysqlt');
				@$this->_conexao->Connect("localhost", "root", "", "mysql");
				if ($this->_conexao->IsConnected()) {
					$this->_conexao->SetFetchMode(ADODB_FETCH_ASSOC);
				} else
					throw new Exception($this->_conexao->ErrorMsg());
			} catch (Exception $err) {
				$this->setErro($err->getMessage());
			}
		}

		public static function getConexao() {		
			if (!isset(self::$_instancia)) {
				$c = __CLASS__;
				self::$_instancia = new $c;
			}
			return self::$_instancia;
		}

Legal esse negócio de dar acesso de construção somente para classe.
Ainda não testei como ficaria com o destruct junto.
Mas acho que me atenderia O.o

A e o jeito que você falo pra fazer é supimpa tb ^^

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#6 bobmatador

bobmatador

    12 Horas

  • Usuários
  • 210 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR

Posted 27/08/2007, 10:37

o bom que usando o pattern singleton vc pode conectar em diferentes bancos de dados com apenas uma classe, passando apenas o tipo de bd que vc quer utilizar como parametro num método e nele setar o $instancia.

Abraços,
Sua fonte de Tutoriais na Web!
TutoriaisClube.com




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq