以下是代码段:
function something() {
$include_file = 'test.php';
if ( file_exists($include_file) ) {
require_once ($include_file);
// global $flag;
// echo 'in main global scope flag='.$flag;
test();
}
}
something();
exit;
//in test.php
$flag = 4;
function test() {
global $flag;
echo '<br/>in test flag="'.$flag.'"';
if ($flag) {
echo 'flag works';
//do something
}
}
上面的代码片段正确地回应了'全局范围'$ flag值但是没有识别值为4的$ flag,假定$ flag为null值。 请指出访问该$ flag全局变量有什么问题。
提前致谢, Anitha
答案 0 :(得分:7)
您在这里遇到问题只是因为PHP当前正在解释您的文件。你有嵌套的函数。
以下是您的代码当前的执行方式:
function something() {
$include_file = 'test.php';
if ( file_exists($include_file) ) {
//require_once ($include_file);
$flag = 4;
function test() {
global $flag;
echo '<br/>in test flag="'.$flag.'"';
if ($flag) {
echo 'flag works';
//do something
}
}
//end require_once ($include_file);
test();
}
}
something();
exit;
正如您所看到的,当您将4
的值分配给$flag
($flag = 4
)时,您属于函数something()
的范围,而不是全球范围。
在test()
中,由于您在该函数中将$flag
声明为全局,因此$flag
是一个完全不同的变量,对整个脚本是全局的。
为避免此问题,请使用超级全局$GLOBALS
。它比使用global
更快,这样你就不会像上面那样混淆范围问题:
function something() {
$include_file = 'test.php';
if ( file_exists($include_file) ) {
//require_once ($include_file);
$GLOBALS['flag'] = 4;
function test() {
global $flag;
echo '<br/>in test flag="'.$GLOBALS['flag'].'"';
if ($GLOBALS['flag']) {
echo 'flag works';
//do something
}
}
//end require_once ($include_file);
test();
}
}
something();
echo $flag; //echos 4
exit;
答案 1 :(得分:2)
这条线可能会给你带来问题:echo 'global scope flag'=$flag;
将其更改为:echo 'global scope flag = '.$flag;
修改强>
现在您已经通过将代码包装在something()
函数中编辑了代码片段,问题变得更加清晰。我认为这里发生的事情是,当您使用$flag = 4;
初始化$ flag时,它的范围在something()
方法中。
尝试在行$flag = 4;
之上/之前放置function something() {
。那么一切都将与世界一致。
答案 2 :(得分:2)
$flag = 4;
不在全球范围内。
如果包含发生在 然后,调用文件中的函数 包含在中的所有代码 被调用的文件就像它一样 已在该功能中定义。
- include的PHP手册页,也适用于include_once,require和require_once
我要猜测你得到的错误是在if ($flag)
行,因为在那一点上,$ flag是未初始化的,因为全局$ flag变量从未被赋值
顺便说一下,echo 'global scope flag='.$flag;
也没有显示全局标记,因为您需要在该函数中使用global $flag;
来显示全局副本,这也会产生$flag = 4;
的副作用影响包含文件中的全局副本。
答案 3 :(得分:0)
不应echo 'global scope flag'=$flag;
为echo 'global scope flag =' . $flag;
我收到了不同的错误。这有助于我快速解决问题。
解析错误:解析错误,意外 '=',期待','或';'在 D:\网站(Apache)\测试 第6行的Site1 \ test.php
答案 4 :(得分:0)
做这样的事情:
$myFlag = getFlag();
echo $myFlag; // output: whatever
// test.php
$flag = 'whatever';
function getFlag(){
global $flag;
return $flag;
}
我永远不会在一个脚本中设置变量并从另一个文件中调用它。这将导致极端混乱。即使我的解决方案也不是最好的。理想情况下,我会做一个完整的课程。
答案 5 :(得分:0)
由于您的原始问题已经得到解答,因此我建议采用另一种方法来避免全局变量 你似乎有一个函数+一个你设置为全局变量的默认值。您还可以定义default values for function parameters。
<?php // test.php
function test($flags=4) {
echo '<br/>in test flag="'.$flags.'"';
if ($flags!=0) {
echo ' flag works';
}
}
没有全局变量,但你仍然可以在没有参数的情况下调用test(),函数将使用默认值 - 你可以通过传递参数来覆盖它。
function something() {
$include_file = 'test.php';
if ( file_exists($include_file) ) {
require_once ($include_file);
echo "\nwithout parameter: "; test();
echo "\nwith a parameter: "; test(16);
}
}
something();
exit;
打印
without parameter: <br/>in test flag="4" flag works
with a parameter: <br/>in test flag="16" flag works
那不是完全相同的行为,但它可能你想要的第一个......
编辑:另一点可能是
if ( file_exists($include_file) ) {
require_once ($include_file);
构建你正在使用。我没有强烈的意见(或任何有力的证据;-)),但你可能想考虑使用
$something = include $include_file;
if ( false!==$something ) { /* error handling here... */ }
代替。如果php无法包含该文件,则include“返回”false。所需的全部工作是包含的文件不显式返回FALSE。此可能缓存更友好(例如,当使用APC之类的内容时)。但同样:我手边没有证据,只是预感。至少它为你的代码提供了一个“优雅地”处理错误的机会。