php全局变量修饰符不起作用

时间:2009-04-18 21:45:28

标签: php global modifier

我正在使用全局修饰符的基本php示例,它对我不起作用: - |

$a = 1;
$b = 2;

function Sum()
{
    global $a, $b;

    $b = $a + $b;
} 

Sum();
echo "***: ".$b;

结果如下...... $ ***:2

php.ini上是否有可能影响这个的参数?

6 个答案:

答案 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"

如您所见,在嵌套函数定义中使用全局关键字时会出现问题

更多信息:php.net/manual/en/language.variables.scope.php#92868

答案 5 :(得分:0)

我唯一想象的错误是你在首先调用函数后在全局范围内分配变量。也就是说,您的函数实际上是声明变量,然后您只是在别处覆盖它们。例如,调用Sum()然后执行$a=1$b=2