Ir para conteúdo

Arquivado

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

criatividade zero

__destruct nao funciona

Recommended Posts

exemplo do site do PHP

 

__destruct nao roda quando se tem ob_start???

é assim mesmo?

existe algum motivo?

 

 

ob_start('ob_gzhandler');

 

class MinhaClasseDestruivel {

function __construct() {

print "No construtor\n";

$this->name = "MinhaClasseDestruivel";

}

 

function __destruct() {

print "Destruindo " . $this->name . "\n";

}

}

 

$obj = new MinhaClasseDestruivel();

 

ob_end_flush();

Compartilhar este post


Link para o post
Compartilhar em outros sites

No seu código você só está instanciando a classe, não está destruíndo o objeto.

 

Se tivesse fora do buffer o objeto seria destruído no final da execução do script, mas como está dentro você deve matá-lo.

 

ob_start('ob_gzhandler');

class MinhaClasseDestruivel {
	function __construct()
	{
		print "No construtor\n";
		$this->name = "MinhaClasseDestruivel";
	}

	function __destruct()
	{
		print "Destruindo " . $this->name . "\n";
	}
}

$obj = new MinhaClasseDestruivel();

unset($obj);

ob_end_flush();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se é um bug eu não sei, mas pra mim não faz muito sentido você instanciar uma classe dentro de um buffer e ela ser destruída no final da execução do script, até porque a sessão de buffer já foi encerrada bem antes de finalizar o script. Talvez se destruísse quando encerrasse o buffer fosse o correto, mas você poderia também precisar utilizar o objeto instanciado depois de fechar o buffer.

 

Mas de qualquer maneira é sempre bom destruir um objeto no próprio script, principalmente se a função __destruct() for responsável por excluir arquivos temporários usados pela classe ou fechar conexões com banco de dados por exemplo.

 

Por exemplo, uma conexão com o banco de dados (a menos que seja persistente) sempre será fechada quando terminar a execução do script, no entanto sempre recomenda-se que seja utilizado uma função como mysql_close para garantir que de fato ela seja fechada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora que eu percebi que você está usando buffer para compactar o conteúdo e carregar as páginas mais rápido.

 

Acredito que essa não seja a melhor forma de fazer isso, pois compactando o conteúdo e usando buffer no PHP você acaba consumindo mais recursos, é necessário editar todos os arquivos PHP e arquivos como CSS e JS não são compactados.

 

Eu uso algo mais simples pra essa finalidade, o módulo DEFLATE do Apache.

 

Para usá-lo basta habiliá-lo com o auxílio de um arquivo .htaccess:

 

<IfModule mod_deflate.c>
	SetOutputFilter DEFLATE
</IfModule>

Você ainda pode escolher os tipos de arquivos que serão compactados dessa forma:

 

<IfModule mod_deflate.c>
	AddOutputFilterByType DEFLATE text/html text/plain text/css application/x-javascript
</IfModule>

 

Não quero dizer como você deve ou não fazer, só estou dando uma dica de como acredito ser melhor e mais simples. E isso só funciona se sua aplicação estiver rodando no Apache.

 

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual versão do PHP está utilizando?

 

PHP Version 5.2.14

 

 

Se é um bug eu não sei

esta no link como Bug

se não fizesse sentido o codigo, não falariam que o bug foi corrigido, iriam dizer que o codigo esta errado... concorda?

 

Não quero dizer como você deve ou não fazer, só estou dando uma dica de como acredito ser melhor e mais simples.

compreendo e fico grato de verdade

mas não acredito que seja simplemente um erro de codigo, pois senão estaria um warm dizendo que __destruct() nao se aplica com buffer

 

vou dar uma olhada nesse esquema do htaccess citado

mas ainda aguardo sobre a atualização desse tal repositorio

 

 

a proposito

localhost não exibe o 'echo $a;', mas no servidor funciona :huh:

ob_start('ob_gzhandler');
$a = 'a';
ob_end_flush();
echo $a;

[]s

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.