PHP / Zend reclama variáveis ??indefinidas
-
13-09-2019 - |
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.
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