Raniel 0 Denunciar post Postado Abril 2, 2010 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
João Batista Neto 448 Denunciar post Postado Abril 2, 2010 @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
Raniel 0 Denunciar post Postado Abril 2, 2010 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
João Batista Neto 448 Denunciar post Postado Abril 2, 2010 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
Raniel 0 Denunciar post Postado Abril 3, 2010 Fico muito grato pelas explicações. Compartilhar este post Link para o post Compartilhar em outros sites