Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.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.
>
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.
Fico muito grato pelas explicações.
@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:
if ( $zip->open( $archive , ZIPARCHIVE::CREATE ) !== false ){
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