Pergunta

A situação:

index.php:

<?php
    include("foo.php");
    include("baz.php");
        foo("bar.php");
?>

baz.php:

<?php
    $x = 42;
?>

foo.php:

<?php
    function foo($p) {
        include_once($p); // please dont mind the inclusion hole
    }
?>

bar.php:

<?php
    echo $x;
?>

Zend aviso : Undefined variable: x

A colocação global $ X; em bar.php remove o aviso prévio, mas eu entendo porque é que há um aviso sobre isso em primeiro lugar .. Não inclui praticamente trabalho como incluindo cabeçalhos C? Isso significaria que o código interpretado ficaria assim:

<?php
    function foo($p) {
        include_once($p); // please dont mind the inclusion hole
    }
    $x = 42;

    // this however, is included by a function...
    // does the function's scope influence the stuff it includes?
    echo $x; // undefined variable
?>

Meu editor é o pacote Eclipse / Zend.

Foi útil?

Solução

Não sou especialista, então por favor não me chama se eu estiver errado, mas acho que o arquivo chamado por include_once ou require_once é chamado no contexto do chamador. Como a função foo () não saberá cerca de US $ x, em seguida, nem será qualquer dos seus chamados inclui. Você poderia experimentar por 'declarar' $ x dentro de foo () função com a mesma configuração como acima.

Outras dicas

Eu recebo um monte desses avisos, já que estou quase allways vai com "$ o. = 'Foo'" sem qualquer definição. Eu estou apenas escondendo-os com error_reporting (E_ALL ^ ??E_NOTICE), mas eu não sei se é a maneira ideal neste caso.

Não funciona mesmo se a variável e a função estão no mesmo arquivo.

  1 <?php
  2
  3 $x = 3;
  4
  5 function t()
  6 {
  7   echo $x;
  8 }
  9
 10 t();

Prints nada.

Mas adicionar um mundial

  1 <?php
  2
  3 $x = 3;
  4
  5 function t()
  6 {
  7   global $x;
  8   echo $x;
  9 }
 10
 11 t();

e você pode ver "3".

Em uma função que não pode ver as variáveis ??globais a menos que você declará-lo.

sim seu escopo função que está causando problemas

Se você substituir

foo("bar.php");

com

include("bar.php");

Você verá que tudo funciona bem, pois coloca-lo no escopo atual e não funções escopo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top