【问题标题】:PHP variable scope - How to share variable between two functions without using arguments?PHP 变量范围 - 如何在不使用参数的情况下在两个函数之间共享变量?
【发布时间】:2014-02-22 09:10:44
【问题描述】:

我的脚本有一个小问题,我无法自己解决。研究了有关变量范围的 PHP 文档后,我不确定这是否可行。

举个例子:

function my_funct_a() {
    // Do stuff
    return $a;
}

function my_funct_b() {
    // Do other stuff
    return $a + $b;
}

你看,问题是在my_funct_b 中,$a 不可用,因为它在my_funct_a 中声明(并返回)。

通常我会将此变量作为参数传递,但由于某种框架限制,此时这是不可能的。

所以我试着这样做:

function my_funct_a() {
    // Do stuff
    global $a;
    return $a;
}

function my_funct_b() {
    // Do other stuff
    global $a;
    return $a + $b;
}

这也不起作用,我认为是因为global“反过来”起作用。与其在函数内部将变量声明为全局变量以使其在函数外部可用,不如将其声明为函数外部的全局变量以便在函数内部可用。

问题是$a的值是在my_funct_a中创建的,所以在知道值之前我不能全局化它。
因此,我尝试这样做:

// global variable, but no value assigned yet
global $a

function my_funct_a() {
   // Do stuff
   global $a;
   $a = 1; 
   return $a;
}

function my_funct_b() {
   // Do other stuff
   global $a;
   return $a + $b;
}

这也不起作用。为什么?甚至可以不将变量作为参数传递吗?

【问题讨论】:

  • 这是类代码吗?
  • my_funct_b(),你如何得到$bmy_funct_a() btw 的同样问题。
  • @DonCallisto 否,该项目中使用了过程 PHP。
  • @Jack $a 是在该函数内部创建的动态值,$b 是使用该动态值的字符串。恐怕我必须使用这两个功能来实现它
  • 您对global 工作原理的理解是错误的。您在函数内部声明它,它允许该函数访问具有该名称的全局变量。您的第二次尝试应该成功了。

标签: php global-variables scope


【解决方案1】:

封装数据和功能的最佳方式是类:

class Foo {

    protected $val = 1;

    public function inc() {
        return $this->val += 1;
    }

    public function dec() {
        return $this->val -= 1;
    }

}

我展示这个是因为它应该用于尝试全局变量。

但是,这应该可以:

$val = 1;

function inc() {
    global $val;
    return $val += 1;
}


function dec() {
    global $val;
    return $val -= 1;
}

【讨论】:

    【解决方案2】:

    如果您需要$a 的值并且它只能使用my_funct_a() 创建,则将其作为依赖项添加到my_funct_b() 中:

    function my_funct_b() 
    {
        $a = my_funct_a();
        // Do other stuff
    
        return $a + $b;
    }
    

    【讨论】:

    • 对我来说似乎是最好的解决方案,但也许 - 正如你在编辑之前所说 - 我没有得到真正的问题......
    【解决方案3】:

    您将global 声明放在函数中。这会导致在该函数中使用变量来引用全局变量,而不是局部变量。如果两个函数都访问同一个全局变量,它们将看到相同的值。

    function my_funct_a() {
        global $a;
        $a = 10;
        return $a;
    }
    
    function my_funct_b() {
        $b = 5;
        global $a;
        return $a + $b;
    }
    
    echo my_funct_a() . "\n";
    echo my_funct_b();
    

    DEMO

    【讨论】:

      【解决方案4】:
      $a = 1;
      $b = 2;
      
      function Sum()
      {
          global $a, $b;
      
          $b = $a + $b;
      } 
      
      Sum();
      echo $b;
      

      上述脚本将输出 3。通过在内部声明 $a 和 $b 全局 函数,对任一变量的所有引用都将引用 全球版本。

      http://www.php.net/manual/en/language.variables.scope.php

      【讨论】:

      • 这不是 OP 的要求
      • 这正是他要问的。在声明全局变量(外部函数)时,他不应该使用“全局”一词,仅此而已。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2016-03-25
      • 2017-11-19
      • 1970-01-01
      • 2019-11-27
      • 2019-10-28
      相关资源
      最近更新 更多