我正在使用全局修饰符的基本php示例,它对我不起作用: - |
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo "***: ".$b;
结果如下...... $ ***:2
php.ini上是否有可能影响这个的参数?
答案 0 :(得分:21)
我也遇到了你的问题。当我使用框架(Yii)时,我并不完全清楚我的代码确实嵌套在函数内部,因此global
的行为不符合预期(正如omadmedia和其他人所解释的那样)。
我的解决方案非常简单:
global $a;
global $b;
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo "***: ".$b;
答案 1 :(得分:14)
信不信由你,我得到答案:2。 这意味着确实存在一些全局无效的情况。
试图找到原因: 看来如果你有一个函数并将OP的代码(这是一个php.net示例)放在该函数中,你将得到答案2。 这有点奇怪,有点意义......
(我在Win XP中使用Apache 2.2.8下的PHP 5.2.5)
LE: 我的解决方案 好的,解决了这个问题:当你在第二个函数中使用global时,你显然得到了超全局变量,那些可供每个人使用的变量(即在任何函数之外都是decalared),但是因为在第一个函数中声明了$ a和$ b,所以它们不是该范围的一部分,不适用于第二功能。 我对一个解决方案的猜测是在第二个函数之外声明$ a和$ b global,它位于第一个函数内部。 !请注意,由于各种原因,第1个可能不那么明显,例如您的文件(仅包含第2个函数)被包含在不同文件中不同函数体内的某个位置。
答案 2 :(得分:3)
正如@AgelessEssence所回答的那样,如果您有嵌套函数,则全局关键字不起作用。在他的例子中很明显。但是,如果不清楚是否包含文件。这是一个例子。
//a.php
function f() {
require_once('./a_inc.php');
}
f();
//a_inc.php
$a = 12;
function g() {
global $a;
var_dump($a);
}
g();
//result
null
在上面的代码中,$ a看起来像一个全局变量。实际上,它不是因为它包含在a.php中的函数f()中,而$ a是函数f()的一部分。
因此,当您的global关键字不起作用时,请检查它是否包含在函数中。由于在其他答案中很好地解释了这个问题的解决方案,所以我没有在这里添加它。
答案 3 :(得分:2)
上面的示例代码适合我。但您也可以使用$GLOBALS超变量。
function Sum()
{
$a = $GLOBALS["a"];
$b =& $GLOBALS["b"];
$b = $a + $b;
}
如果您可以提供帮助,则不应使用全局变量。有更好的方法来实现您的功能。请改为使用parameters (arguments)(可能是pass by reference)和return a value。
/**
* Calculate the sum of the parameters
* @param int|float $a one or more parameter
* @param int|float $a, ...
* @return int|float
*/
function sum($a)
{
$args = func_get_args();
return array_sum($args);
}
$a = 1;
$b = 2;
$b = sum($a, $b);
使用PHPDOC,您可以在不阅读代码的情况下了解您的功能在几年后的作用。使用好的IDE,您还可以在编写函数时获得解释和参数顺序。
答案 4 :(得分:1)
我和你一样有相同的问题,终于找到了答案
工作代码 / DEMO
$a=1;
function showA() {
global $a;
var_export($a);
}
showA(); // outputs "1"
非工作代码 / DEMO
function encapsulation() {
$a=1;
function showA() {
global $a;
var_export($a);
};
showA();
}
encapsulation(); // outputs "NULL"
如您所见,在嵌套函数定义中使用全局关键字时会出现问题
答案 5 :(得分:0)
我唯一想象的错误是你在首先调用函数后在全局范围内分配变量。也就是说,您的函数实际上是声明变量,然后您只是在别处覆盖它们。例如,调用Sum()
和然后执行$a=1
,$b=2
。