Ir para conteúdo

POWERED BY:

Arquivado

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

Raniel

[Resolvido] Executar class dentro de class

Recommended Posts

Olá pessoal

Tenho uma class php e gostaria de executar uma função, veja:

function zipFiles($archive, $add, $new){
  $zip = new ZipArchive;
  if ($zip = open($archive, ZIPARCHIVE::CREATE) === TRUE){
    $zip = addFile($add, $new);
    $zip = close();
  }
}
Esta função está dentro de uma outra class, quando chamo a mesma, dá erro de programação.

Gostaria da ajuda de vocês.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Raniel,

 

Primeiro, tome muito cuidado ao fazer uma atribuição dentro de uma condição, isso é extremamente perigoso e pode levar a bugs realmente difíceis de se detectar, veja só:

 

if ( $zip = open( $arquivo , ZIPARCHIVE::CREATE ) == TRUE ){

 

Nesse fragmento existe um erro de lógica que destruirá seu objeto, pela prioridade, a comparação será feita primeiro, nesse caso a verificação open() == TRUE, se open de fato retornar true a variável $zip receberá TRUE caso contrário, receberá FALSE, destruindo seu objeto, utilize parênteses nesses casos, isso garantirá que sua variável receba o esperado:

 

if ( ( $zip = open( $arquivo , ZIPARCHIVE::CREATE ) ) == TRUE ){

 

Dessa forma, dizemos para atribuir o retorno da função open() à variável $zip e somente depois comparar o valor da variável com o boolean TRUE, o resultado será o mesmo nesse caso, mas é mais seguro em outros casos. Porém, ainda assim, você estará destruindo seu objeto $zip porque estará atribuindo um boolean à um objeto e não é o que você quer fazer.

 

Um outro ponto no seu fragmento são as chamadas a open(), addFile() e close(), essas não são funções e sim métodos do objeto $zip, seu código deveria estar assim:

 

function zipFiles( $archive , $add , $new ){
$zip = new ZipArchive();

if ( $zip->open( $archive , ZIPARCHIVE::CREATE ) !== false ){
	$zip->addFile( $add , $new );
	$zip->close();
}
}

 

Perceba que, para chamar um método de um objeto, utilizamos seta ->, veja o manual, na parte sobre orientação a objetos, para compreender como se trabalhar com eles no PHP http://forum.imasters.com.br/public/style_emoticons/default/seta.gif Classes e Objetos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado pelo alerta.

Uma classe pode ser chamada dentro da outra de que forma?

Tipo tenho uma classe e tenho esta função dentro dela.

 

Agradecido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma classe pode ser chamada dentro da outra de que forma?

 

Sim, pode;

 

Existem várias formas de se fazer isso, algumas elegantes outras nem tanto. Uma forma simples, porém, não reutilizável é criar a instância diretamente dentro de seu objeto, porém, isso obrigará a classe Client conhecer o objeto a instanciar e você perderá a abstração e, consequentemente, a reutilização.

 

class Classe1 {
public function umMetodo(){
	echo 'Método da Classe1 chamado.' , PHP_EOL;
}
}

class Classe2 {
public function outroMetodo(){
	echo 'Método da Classe2 chamado.' , PHP_EOL;

	$obj1 = new Classe1();
	$obj1->umMetodo();
}
}

$obj2 = new Classe2();
$obj2->outroMetodo();

 

A saída desse fragmento deverá ser:

Método da Classe2 chamado.

Método da Classe1 chamado.

 

Mas, como eu disse, obrigando sua Classe2 a conhecer qual o tipo de objeto deverá ser instanciado fará com que seu código não seja reutilizável.

 

Caso tenha interesse em reutilização, dedique parte de seus estudos em Design Patterns, visite também o fórum Modelagem e Design Patterns para dúvidas sobre reutilização e padrões de projeto.

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.