Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
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?
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();
qual o erro que retorna?
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.
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.
>
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.
Sim, usando a instância. Mostre o código, impossível ver o cenário atual.
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.
pq vc quer usar um objeto global?
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.
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.
um dos problemas da utlização de variaveis globais é q seu valor pode ser corrompido.
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.
É pelo seguinte: você está usando estado global, código procedural, vc precisa de uma melhor organização arquitetural.
É 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.
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: