在嵌套函数中访问全局变量

时间:2011-05-13 20:21:28

标签: php function variables

这是我的情景:

$foo = bar;

one()
{
   two()
   {
      three()
      {
         // need access to $foo here
      }
   }
}

我知道我可以将$ foo传递给所有三个函数,但这不是很理想,因为你可能需要也可能不需要它,此外,还有其他参数,我不想添加到该列表如果我可以阻止它只有当你到达three()时才需要$foo。我知道我也可以在global $foo;中指定three(),但我读到这不是一个好习惯。

$foo是否有另一种方式可以three()使用three()而不执行其中任何一种操作?

为了提供更多信息,在这种情况下,$ foo是关于如何连接到数据库的信息,例如server,user,pass,但仅​​在{{1}}中确实需要该信息。当然,我可以在文档加载时直接连接到数据库,但如果文档可能不需要它,则感觉不必要。

有什么想法吗?

更新:对不起,我不是故意在每个函数的开头都有“函数”,暗示我是以嵌套的方式创建的。

3 个答案:

答案 0 :(得分:2)

是的,您可以使用global,或将其作为参数传递。两者都是公平的方式。但是,我会做后者。或者,您也可以使用closuresuse关键字:

$foo = 'bar';

$one = function() use($foo) {
   $two = function() use($foo) {
      $three = function () use($foo) {
         // access to $foo here
      };
   };
};

如果您需要修改use(&$foo)

中的最高$foo值,也可以$three()

答案 1 :(得分:1)

如果使用得当,使用global并不是一种不好的做法。这种情况下你会使用global,它会完全没问题。

由于global使函数可以访问全局变量,因此存在数据损坏风险。 只要确保谨慎使用,你就知道自己在做什么(即不要意外地改变你不希望它改变的数据。这有时会导致一些难以追踪的令人讨厌的错误。)

总结:global在这种情况下完全没问题。

嵌套函数真的很糟糕,至少在PHP中是什么。

答案 2 :(得分:0)

不要听任何谈论global的人 阅读有关OOP的书籍(例如this one),阅读有关依赖注入,工厂模式的内容 依赖注入是创建灵活且易于维护的代码的最佳方式,通过DI哲学,您将在参数中将$ foo从第一个函数传递到第三个函数,或者将Context对象与所有必需的变量一起传递(如果您想要最小化计数)论据) 有关DI的更多信息,请参阅此处:http://components.symfony-project.org/dependency-injection/trunk/book/00-Introduction