这是我的情景:
$foo = bar;
one()
{
two()
{
three()
{
// need access to $foo here
}
}
}
我知道我可以将$ foo传递给所有三个函数,但这不是很理想,因为你可能需要也可能不需要它,此外,还有其他参数,我不想添加到该列表如果我可以阻止它只有当你到达three()
时才需要$foo
。我知道我也可以在global $foo;
中指定three()
,但我读到这不是一个好习惯。
$foo
是否有另一种方式可以three()
使用three()
而不执行其中任何一种操作?
为了提供更多信息,在这种情况下,$ foo是关于如何连接到数据库的信息,例如server,user,pass,但仅在{{1}}中确实需要该信息。当然,我可以在文档加载时直接连接到数据库,但如果文档可能不需要它,则感觉不必要。
有什么想法吗?
更新:对不起,我不是故意在每个函数的开头都有“函数”,暗示我是以嵌套的方式创建的。
答案 0 :(得分:2)
是的,您可以使用global
,或将其作为参数传递。两者都是公平的方式。但是,我会做后者。或者,您也可以使用closures和use
关键字:
$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