Hamilcar 1 Denunciar post Postado Março 1, 2013 Estou tendo um problema, vou tentar explicar, tenho uma página php que chama os módulos existentes, esta página chama os módulos através de uma função existente em uma outra página php que tenho com várias funções, o problema é que quando a página é incluída pela função, as variáveis criadas antes deste chamada, não ficam visíveis no restante da página, será que alguém poderia me esclarecer o porquê disto e como contornar essa situação? Compartilhar este post Link para o post Compartilhar em outros sites
Eisenheim 67 Denunciar post Postado Março 1, 2013 Olá amigo. Se tiver como, poste um exemplo do seu código para que possamos analisar e entender o que pode estar acontecendo. Até a próxima. :thumbsup: Compartilhar este post Link para o post Compartilhar em outros sites
rockrgo 138 Denunciar post Postado Março 1, 2013 Cara não entendi muito bem. ve se estou certo... Você inclui o arquivo funcoes.php na pagina.php, vc chama a função da funcoes.php na pagina.php e as variaveis que estão antes do include e da chamada de função na pagina.php vc não consegue utilizar no resto do codigo da pagina.php . É isso? Compartilhar este post Link para o post Compartilhar em outros sites
Hamilcar 1 Denunciar post Postado Março 1, 2013 Vou tentar explicar melhor . tenho esta variavel que cria um objeto: $obj = new obj(); Tenho uma pagina que chama os modulos: loadModulo("modulo", "tela"); este loadModulo é uma função da pagina funcoes.php: function loadModulo($modulo=NULL, $tela=NULL){ if($modulo == NULL || $tela == NULL){ echo("Erro"); }else{ if(file_exists(MODULOSPATH."$modulo/$tela.php")){ include_once(MODULOSPATH."$modulo/$tela.php"); }else{ echo("Modulo inexistente neste sistema."); } } } O problema é que quando chamo a função, as variáveis que existem antes desta chamada não mais existem, se eu fizer uma chamada de dentro do modulo incluído dá erro: $obj->funcao(); Compartilhar este post Link para o post Compartilhar em outros sites
rockrgo 138 Denunciar post Postado Março 1, 2013 qual o erro que retorna? Compartilhar este post Link para o post Compartilhar em outros sites
Hamilcar 1 Denunciar post Postado Março 1, 2013 Não existe a variavel fiz um teste colocando pra incluir sem passar pela função, e fica tudo certo, mas queria saber porque acontece isso usando a função. Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Março 1, 2013 Bem, mostre o erro. E tem algo bem estranho neste código, é uma redundância. function loadModulo($modulo=NULL, $tela=NULL){ if($modulo == NULL || $tela == NULL){ echo("Erro"); }else{ if(file_exists(MODULOSPATH."$modulo/$tela.php")){ include_once(MODULOSPATH."$modulo/$tela.php"); }else{ echo("Modulo inexistente neste sistema."); } } } Para que colocar o $modulo e o $tela com default? Se você necessita deles, como é o caso, simplesmente deixe-os como obrigatório. function loadModulo($modulo, $tela){ if (file_exists(MODULOSPATH."$modulo/$tela.php")) { include_once(MODULOSPATH."$modulo/$tela.php"); } else { echo("Modulo inexistente neste sistema."); } } E outra, que classe obj é essa? mostre. Compartilhar este post Link para o post Compartilhar em outros sites
Hamilcar 1 Denunciar post Postado Março 1, 2013 Bem, mostre o erro. E tem algo bem estranho neste código, é uma redundância. Para que colocar o $modulo e o $tela com default? Se você necessita deles, como é o caso, simplesmente deixe-os como obrigatório. E outra, que classe obj é essa? mostre. colega, está funcionando tudo, o código foi só montado pra ver se vocês entenderiam o meu problema, se instanciar novamente o objeto dentro do modulo incluído, passa a funcionar, mas eu queria saber se não dá pra aproveitar a instancia já existente, uma vez que a classe já foi instanciada lá no início. Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Março 1, 2013 Sim, usando a instância. Mostre o código, impossível ver o cenário atual. Compartilhar este post Link para o post Compartilhar em outros sites
Hamilcar 1 Denunciar post Postado Março 1, 2013 não tenho o código aqui agora, estou tentando passar o cenário, 1- acesso pagina.php 2-inclue funcoes.php em pagina.php 3- cria uma instancia de classe : $obj = new objeto 3-chama o modulo com a funcao loadModulo() 4-a função inclue pagina2.php 5- dentro desta pagina2.php não há como usar o $obj Se eu instanciar o objeto dentro da pagina2.php o problema fica resolvido, mas eu queria saber se há como usar o objeto já criado. Compartilhar este post Link para o post Compartilhar em outros sites
shini 318 Denunciar post Postado Março 1, 2013 pq vc quer usar um objeto global? Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Março 1, 2013 pq vc quer usar um objeto global? Pergunta perfeita! Para que, pelo que eu entendi são duas execuções diferentes. Se eu instanciar o objeto dentro da pagina2.php o problema fica resolvido, mas eu queria saber se há como usar o objeto já criado. Para que isso? Você resolveu seu problema e quer criar um outro. Compartilhar este post Link para o post Compartilhar em outros sites
Hamilcar 1 Denunciar post Postado Março 1, 2013 Cara não é preciso ser um objeto não, dei a opção de ser um objeto, porque ali faço uma busca no banco de dados e recebo dados, por exemplo, se eu tiver que incluir um formulario e quizer preencher ele, não há como, pois as variaveis não são reconhecidas. Compartilhar este post Link para o post Compartilhar em outros sites
shini 318 Denunciar post Postado Março 1, 2013 um dos problemas da utlização de variaveis globais é q seu valor pode ser corrompido. Compartilhar este post Link para o post Compartilhar em outros sites
Hamilcar 1 Denunciar post Postado Março 1, 2013 acabo de chegar em casa vou postar o cod pra vocês verem: painel.php <?php ini_set('display_errors', 1); error_reporting(E_ALL); try{ include('header.php'); if(isset($_GET['m'])){$modulo = $_GET['m'];} if(isset($_GET['t'])){$tela = $_GET['t'];} ?> <div id="content"> <?php if(!empty($modulo) AND !empty($tela)){ loadModulo($modulo, $tela); }else{ loadModulo("funcionario", "listar"); } ?> </div> <!-- content --> <?php include('sidebar.php'); include('footer.php'); } catch (Exception $e) { printMSG('<a href="?m=funcionario&t=listar">Listar cadastros</a><br><br>Ocorreu um erro: '.$e->getMessage(), "ERRO"); } ?> listar.php <?php require_once(dirname(dirname(dirname(dirname(__FILE__))))."/funcoes.php"); protegeArquivo(basename(__FILE__)); limpaSession(array("pessoa", "funcionario", "usuario", "cnh", "dependentes", "tituloEleitor", "telefones", "endereco", "ferias")); if($_GET['c']=='sucesso'){ printMSG("Cadastro efetuado com sucesso", "sucesso"); } echo '<h2>Funcionários cadastrados.</h2>'; loadCSS('data-table', NULL, TRUE); loadJS('jquery-datatable'); ?> <script type="text/javascript"> $(document).ready(function(){ $("#listaUsers").dataTable({ "sScrollY": 300, "oLanguage": { "sLengthMenu": "Mostrar _MENU_ cadastros por página", "sZeroRecords": "Cadastro não encontrado.", "sInfo": "Mostrando _START_ a _END_ de _TOTAL_ cadastros", "sInfoEmpty": "Nenhum cadastro encontrado.", "sInfoFiltered": "(Total de _MAX_ Cadastros)", "sSearch": "Pesquisar Cadastros : " }, "sPaginationType": "full_numbers", "aaSorting": [[0, "asc"]] }); }); </script> <div class="novoCad"> <a href="?m=funcionario&t=incluir&action=pessoa" title="Novo cadastro"> Novo cadastro <img src="imagens/add.png" alt="Novo cadastro" align="middle" /> </a> </div> <table cellspacing="0" cellpadding="0" border="0" class="display" id="listaUsers"> <thead> <tr> <th>Nome</th><th>Matrícula</th><th>Email</th><th>Dt. Nascimento</th><th>Telefone</th><th>Ações</th> </tr> </thead> <tbody> <?php try{ $user = new Usuario(); //gostaria de tirar isto aqui, porque a classe é instanciada no início em header.php $nivel = (int)$user->isNivel(); if($nivel > 1){ $sql = "SELECT funcionarios.idfuncionarios, funcionarios.nomeGuerra, funcionarios.matricula, pessoas.email, pessoas.dtNascimento, telefones.codArea, telefones.numero FROM funcionarios INNER JOIN pessoas ON ( pessoas.idpessoas = funcionarios.idpessoas_pessoas ) INNER JOIN telefones ON ( telefones.idpessoas_pessoas = pessoas.idpessoas ) ORDER BY pessoas.nome"; }elseif($nivel == 1){ $id = $user->sessao->getVar('idUsuario'); $sql = "SELECT funcionarios.idfuncionarios, funcionarios.nomeGuerra, funcionarios.matricula, pessoas.email, pessoas.dtNascimento, telefones.codArea, telefones.numero FROM funcionarios INNER JOIN pessoas ON ( pessoas.idpessoas = funcionarios.idpessoas_pessoas ) INNER JOIN telefones ON ( telefones.idpessoas_pessoas = pessoas.idpessoas ) WHERE funcionarios.idfuncionarios = $id ORDER BY pessoas.nome"; } $result = $user->bd->query($sql); while($res = $user->bd->retornaDados($result)){ echo '<tr>'; printf('<td>%s</td>', $res->nomeGuerra); printf('<td>%s</td>', $res->matricula); printf('<td>%s</td>', $res->email); printf('<td>%s</td>', $res->dtNascimento); printf('<td>(%s)%s</td>', $res->codArea, $res->numero); printf('<td class="center"> <a href="?m=funcionario&t=editar&id=%s&nome=%s" title="Editar cadastro"><img src="imagens/edit.gif" alt="Editar cadastro" /></a> <a href="?m=funcionario&t=excluir&id=%s" title="Excluir cadastro"><img src="imagens/del.png" alt="Excluir cadastro" /></a> <a href="?m=usuario&t=senha&id=%s" title="Alterar senha"><img src="imagens/pass.png" alt="Alterar senha" /></a> <a href="?m=funcionario&t=visualizar&id=%s&nome=%s" title="Visualizar cadastro"><img src="imagens/view.gif" alt="Alterar cadastro" /></a> </td>', $res->idfuncionarios, $res->nomeGuerra, $res->idfuncionarios, $res->idfuncionarios, $res->idfuncionarios, $res->nomeGuerra); echo '</tr>'; } }catch (Exception $e) { throw new Exception($e); } ?> </tbody> </table> Desta forma postada funciona, mas vejo que estou instanciando uma classe duas vezes, uma no início, e outra no modulo inserido, este é um exemplo, tenho no código outras vezes em que busco dados no bd e incluo o modulo para receber este dado com a função loadModulo, mas os dados não mais existem no modulo, fiz um teste se eu incluir sem usar a função loadModulo, ou seja em vez dela incluir o arquivo direto, funciona, gostaria de saber o porque disto. Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Março 1, 2013 É pelo seguinte: você está usando estado global, código procedural, vc precisa de uma melhor organização arquitetural. Compartilhar este post Link para o post Compartilhar em outros sites
Hamilcar 1 Denunciar post Postado Março 1, 2013 É pelo seguinte: você está usando estado global, código procedural, vc precisa de uma melhor organização arquitetural. O que sugere, não entendi muito bem. Compartilhar este post Link para o post Compartilhar em outros sites