【问题标题】:php global variable modifier not workingphp全局变量修饰符不起作用
【发布时间】:2010-10-20 08:10:05
【问题描述】:

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

$a = 1;
$b = 2;

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

    $b = $a + $b;
} 

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

这是结果... $ ***: 2

php.ini 上是否有任何可能影响此的参数?

【问题讨论】:

  • 这是准确的代码吗?你要在这里留下任何信息吗?
  • 他当然有 - 比如 PHP 的确切版本...?
  • 请参阅 3v4l.org/IsvLd 以获取该问题的可重现版本。

标签: php global modifier


【解决方案1】:

您上面的示例代码对我有用。但您也可以使用$GLOBALS 超变量。

function Sum()
{
    $a = $GLOBALS["a"];
    $b =& $GLOBALS["b"];
    $b = $a + $b;
} 

如果您能提供帮助,则不应使用全局变量。有更好的方法来制作你的函数。请改用parameters (arguments)(可能是pass byreference)和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,您还可以在编写函数时获得解释和参数顺序。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      信不信由你,我也得到了答案:2。 这意味着确实存在一些全局无法正常工作的情况。

      尝试查找原因: 似乎如果您有一个函数并将 OP 的代码(这是一个 php.net 示例)放入该函数中,您将得到答案 2。 这有点奇怪,在某种程度上有点道理......

      (我在 Win XP 的 Apache 2.2.8 下使用 PHP 5.2.5)

      乐: 我的解决方案 好的,解决了这个问题:当你在第二个函数中使用 global 时,你显然会得到超全局变量,每个人都可以使用(即在任何函数之外声明),但由于 $a 和 $b 在第一个函数内声明,它们不是该范围的一部分,不适用于第二个功能。 我对解决方案的猜测是在第二个函数之外,也就是在第一个函数内部声明 $a 和 $b 全局。 !!请注意,由于各种原因,第一个可能不那么明显,例如您的文件(仅包含第二个函数)被包含在不同文件中不同函数的主体中的某处。

      【讨论】:

        【解决方案4】:

        我和你一样同样的问题,终于找到答案了

        工作代码 / 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】:

        我也遇到过你的问题。由于我使用的是框架 (Yii),我并不完全知道我的代码确实嵌套在函数中,因此 global 的行为与预期不符(正如 omadmedia 和其他人所解释的那样)。

        我的解决方案很简单:

        global $a;
        global $b;
        $a = 1;
        $b = 2;
        
        function Sum()
        {
            global $a, $b;
        
            $b = $a + $b;
        } 
        
        Sum();
        echo "***: ".$b;
        

        【讨论】:

        • 也适用于 Laravel!
        • 我遇到了完全相同的问题,但是在一个顶部有全局变量和嵌套函数的类中。但是,我可以通过对象的 $this->myglobalvar 访问嵌套函数中的这些全局变量。
        【解决方案6】:

        正如@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() 的一部分。

        因此,当您的全局关键字不起作用时,请检查它是否包含在函数中。由于这个问题的解决方案在其他答案中得到了很好的解释,所以我没有在这里添加它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-21
          • 1970-01-01
          • 2013-07-13
          • 2016-12-30
          • 2017-07-19
          相关资源
          最近更新 更多