替换全局变量,如何以及为什么

时间:2011-08-09 15:45:48

标签: php global-variables

好的,所以到目前为止我已经工作并使用了我的全局变量,只需调用$ USER来获取用户ID就没有问题。

大部分时间来自SO的人和一些人在这里和那里阅读,这对使用全局变量都是如此负面。

所以现在我准备改变方式而不是使用全局变量。

现在我包含一个函数,protect(),它检查你的会话并创建全局变量,如$ USER,$ USERTYPE。

然后我可以在文件中尽可能多地使用这些变量。

有什么可以取代这个?我想过赚$ USER = grabUserid();这将返回用户ID,对于用户类型也是如此,那已经是2个函数,我需要为每个变量创建数据库查询函数吗?

那我的$ connect,这是一个数据库的PDO对象,处理我的所有查询,我需要做$ connect = connectdb();太

然后用js到另一个php文件的http请求怎么样,我需要传递它,但在那之间它可能是不安全的(如果你想到安全性)因为你可以只在那里操纵用户ID .. < / p>

或者也许这是第三种解决方案吗?或者我应该坚持全局?一劳永逸请提到为什么全局变量如此糟糕?安全吗?还是脏编码的样子?

2 个答案:

答案 0 :(得分:9)

所以这个问题实际上是两个问题:为什么我会停止使用全局变量,我应该如何用另一个结构实现类似的功能。

首先,您可能想要停止使用全局变量:
让我说,不使用全局变量不是一个规则,而是一个指导原则。虽然这个问题的双方都有狂热者,但有一些充分的理由支持和反对它(尽管我听到的反对的不仅仅是反对)。您可能希望避免全局变量的一些原因:

  1. 访问控制
    这可能是不使用全局变量的最大和最坚实的原因。使用全局变量构造,任何代码都可以以任何方式使用存储在变量中的数据,而不管范围或原因如何。可以破坏访问规则,并且可以通过鲁莽写入使数据无效。未经验证的访问意味着不可靠的数据。

  2. 并发
    如果你有一个全局变量,根据定义它没有明确的访问规则,并发可能是一个真正的问题。如果两个并发运行的实例或函数正在访问相同的数据,则无法保证读取或写入的顺序 - 进一步污染您的数据。

  3. 耦合/结构/代码清晰度
    简而言之,当您在OOPHP中使用全局变量时,您可能正在以更直接的方式编写传递数据的方式。使用全局变量写入意味着使用该数据的过程之间的紧密耦合,并且使得难以理解数据流。在大多数情况下,重构几乎是必要的。

  4. 其次,如何避免全局变量:

    1. 静态变量/物体
      避免全局变量的最佳方法之一是将“全局”数据包装在静态对象中。这允许您在数据周围创建getter和setter的最低代码安全级别,这些数据可以绑定检查,访问限制,或者至少在必要时锁定全局变量。它可能需要额外的编码,但您获得的数据安全级别是值得的。

    2. 重构
      想想你使用全局数据的原因。您是否只是想在函数之间传递数据?您是否尝试创建可以通过$ Session轻松(并且更有效)处理的持久数据?通常全局变量是快速简便的配置或会话工作的权宜之计。使用配置文件或会话可以增加一定程度的功能,可扩展性和安全性,这通常值得额外的工作。

    3. 在某些情况下,全局变量可能很有用。在非常小程序中,数据安全性完全不相关,或者您的数据在整个代码中使用完全没有明确的传递方式或避免范围问题,使用全局变量可能没问题,但总的来说,这是不好的做法。

      考虑它的一个好方法是“如果我的全局数据变成垃圾,我的脚本会发生什么。”如果答案不是“真的不多”,那么你应该找到一种方法来保护这些数据或重新思考你使用它的方式。

答案 1 :(得分:2)

您需要使用会话和会话变量。

会话允许php为每个当前用户创建唯一标识符。通过识别每个用户,php可以创建特定于此会话的变量。

例如,您可能会创建会话变量,如$ Session [“memberID”],$ Session [“last_page_visited”]等...关于这个的美容部分是每个Session只能访问他们的变量,而没有人别人的。

此外,会话本身将在一段时间后超时。这将清除与此会话关联的所有变量。这就是为什么使用全局变量有点不好。

  1. 全局变量允许意外结果。你不知道变量来自何处,或者最后触摸过谁。
  2. 存在全局范围,因此安全性是一个问题
  3. 内存使用情况。如果使用全局变量来存储大量信息,因为数据不会长时间存在。我不确定何时清除全局变量(如果有的话)。