【问题标题】:PHP multiple encapsulated functions global variable scopePHP多重封装函数全局变量作用域
【发布时间】:2011-08-20 20:41:41
【问题描述】:

这是我遇到的问题的解决方案,但无法在任何地方找到答案。它涉及全局变量范围和多个功能。

基本上,我希望一个函数声明变量,然后让第二个嵌套函数使用这些变量。当脚本声明变量并在声明 global $var1, $var2; 后调用使用这些变量的函数时,这可以正常工作。

但是,我在嵌套函数看到父函数声明的变量时遇到问题,使用与调用函数的脚本相同的代码逻辑。

解决办法是这样写:

function function_1(){
  global $var1, $var2;
  $var1=0;
  $var2=0;
  function function_2(){
     global $var1, $var2;
  }
  function_2();//call to nested function.
}

在这种情况下,所有变量都能正常交互。

如果在 function_1 中声明变量后声明“全局”,则只需清除变量的值(您声明没有值的新变量?)。

希望这可以帮助某人:)

格雷格

【问题讨论】:

  • 问题是内部函数最终在全局范围内。在 PHP 中,您可以使用匿名(内部)函数或类来实现您想要的。

标签: php function global-variables


【解决方案1】:

不要使用全局变量。使用use ($var1,$var2),这样你就不需要全球化你的变量了

【讨论】:

    【解决方案2】:

    为了说明创世纪所说的内容,请执行以下操作:

    function func1($a, $b) // <-- function DEFINITION for func1
    {
        // do stuff wit $a and $b
    
        func2($a, $b); // <-- function INVOCATION of func2 within func1
    }
    
    func2($y, $z) // <-- function DEFINITION for func2
    {
        // do stuff with $y and $z
    }
    
    // --------------------------------
    
    $param1 = "some value";
    $param2 = "some other value";
    
    func1($param1, $param2); // <-- explicit INVOCATION of func1... func2 is also invoked within
    

    从不使用“全局”关键字将参数传递给函数。函数有参数列表是有原因的。

    【讨论】:

    • 我将重新审视关闭的想法。我首先使用参数尝试了这个,但它对我不起作用。函数 2 正在更新函数 1 在调用函数 2 时使用的变量。我需要在不使用“返回”的情况下从函数 2 中获取更新变量的值。
    • 您是否尝试过通过引用将它们传递给函数 2? PHP 中将变量传递给函数的默认机制是按值传递。这意味着制作了变量的副本,并将其传递给函数。这就是为什么如果您希望保留更改需要返回一个值 - 副本就是更改的内容,如果没有返回,它将在函数结束时被销毁,并且其范围内的所有内容都被销毁。
    • 按引用传递意味着您将变量的引用传递给函数。您对函数内部变量所做的任何更改都将保留在函数外部,从而完全无需返回新值。
    • 你能详细说明为什么我不应该使用“全球”关键字吗?
    • 函数应该有一个清晰的签名——它们的名字,需要什么参数才能让它们工作,以及将返回什么样的值。 “全局”向函数添加了隐式要求,并将其绑定到特定范围。为了使函数工作,全局值必须存在于全局范围内。祝你好运,尝试开发一个干净的模块化系统,其中隐藏的警告隐藏在你的函数中。如果你是唯一一个在系统上工作的人,这似乎没什么大不了的,但这是一场噩梦。
    【解决方案3】:

    你应该使用闭包: 函数 function_2 使用 ($var1, $var2)() { }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      相关资源
      最近更新 更多