PHP中的全局变量是否被视为不良实践?如果是,为什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)
function foo () {
    global $var;
    // rest of code
}

在我的小型PHP项目中,我通常采用过程化的方式。我通常有一个包含系统配置的变量,当我需要在函数中访问这个变量时,我会这样做。global $var;...

这做法不好吗?

提问于
用户回答回答于

当人们用其他语言谈论全局变量时,它的含义与PHP中的不同。那是因为变量不是真的全局PHP。典型PHP程序的作用域是一个HTTP请求。会话变量实际上比PHP“全局”变量的范围更广,因为它们通常包含许多HTTP请求。

通常(总是?)您可以在方法中调用成员函数,如preg_replace_callback()就像这样:

preg_replace_callback('!pattern!', array($obj, 'method'), $str);

关键是对象已经被栓在PHP上,在某些方面导致了一些尴尬。

不要过分关注如何将不同语言的标准或构造应用到PHP中。另一个常见的缺陷是试图通过将对象模型添加到所有东西之上,将PHP转换为一种纯OOP语言。

和其他任何东西一样,使用“全局”变量、过程代码、特定框架和面向对象(OOP),因为它有意义,解决了问题,减少了需要编写的代码量,或者使它更易于维护和易于理解,而不是因为你认为应该这样做。

用户回答回答于

如果不小心使用全局变量,就会使问题更难找到。假设请求了一个php脚本,并收到警告,表示正在尝试访问某个函数中不存在的数组索引。

如果要访问的数组是函数的本地数组,则检查该函数,以查看是否在该函数中出错。这可能是函数输入的问题,所以可以检查函数调用的位置。

但是,如果该数组是全局的,则需要检查使用该全局变量的所有位置,不仅如此,还必须确定对全局变量的引用是按什么顺序访问的。

如果代码中有一个全局变量,那么很难分离该代码的功能。为什么要隔离功能?所以可以测试它,并在其他地方重用它。如果有一些代码不需要测试,也不需要重用,那么使用全局变量就可以了。

扫码关注云+社区