PHP:全局变量替代品?

时间:2011-08-02 22:51:33

标签: php global-variables

我正在开发一个PHP项目,并且不时介绍我在线阅读的内容和我在论坛中看到的内容等等。我一直在阅读你不应该使用php全局。确保我没有把它与PHP register_globals混淆,因为我不是,我一直在研究,但我还没有真正找到原因或任何类型的替代品。

所以,我的问题很简单。我不应该在PHP中使用global关键字吗?另外,如果我不应该(或应该),还有其他选择吗?原因是,我注意到我需要访问另一个文件中定义的变量,我需要在一个函数中引用或调用这个变量,很多函数,我有点累或使用{{1}代码那么多。

任何想法(或者我是完全错的)?

5 个答案:

答案 0 :(得分:3)

静态类和单例只比全局变量好一点。静态类只是对全局变量进行分组,但变量本身仍然是全局可达的单实例变量。单身人士也是如此。虽然它们有它们的用途,但它们不应该被用作全局变量的一般替代品。 PHP使它很诱人,特别是因为必须在函数中声明全局变量,而静态类总是随处可用。

您最好将变量放在类中(如'AppConfig'或更具体的类),并创建该类的实例以保存特定值。然后,将该实例传递给框架中的所有方法。这样,您就不依赖于特定的Singleton实现,而且非常灵活。

但是,我必须承认这是很多工作,特别是当你还没有经验的时候。因此,现在使用单身人士可能没问题,只要你在将来感觉到你的单身人士瘙痒时就会记住这个答案。

答案 1 :(得分:2)

你没错,你只需要为你的应用程序考虑一些架构。 :)

如果您在类之间共享数据,则应使用包含该共享数据的模型,并且所有类都可以访问API以检索该变量。

为简单起见,您可以使用Singleton来包含任何共享数据。

PHP Patterns Page有一个Singleton的例子。 Singleton背后的想法是你总是访问该类的相同实例(版本),这样如果你在那里更改变量,它将自动在其他地方更改。

答案 2 :(得分:2)

如果您正在编写面向对象的代码,那么全局变量很糟糕。如果你的代码是程序性的,那么全局变量就好了。 如果使用对象,则需要使用依赖注入(new Object(new Collaborator))。 要管理它,您可能最终需要使用依赖注入容器。 如果你开始使用静态类和单例,你实际上不再编写100%的OO代码。

但是底线,如果它的常规程序代码,全局变量没有任何问题。

答案 3 :(得分:2)

正如其他人所说,使用全局变量没有任何问题;特别是在一个简短的脚本上,它实际上可以使你的代码更具可读性,而不是用太多的OO结构来掩盖它。

但你写道:   “我需要[这个变量]很多函数,我有点厌倦或使用全局$ var_name;代码那么多”

这表明你真正想要的是使用$ var_name在一个类中的所有函数。作为第一阶段重构,您将变量从其他文件传递到构造函数,并将所有$var_name引用替换为$this->var_name,然后删除所有global $var_name;

你最终可能会得到这个类的一个全局实例,但这没关系。全局不是邪恶的,但随着代码变得越来越复杂,它们应该被仔细管理和记录。

如果你还没有它,马丁福勒的重构书是一个很好的阅读,以帮助你应对当你的100行脚本现在是1000行并让你失望。 (示例在java中,但仍可供PHP程序员访问。)

答案 4 :(得分:0)

通常,全局变量会引入代码的安全性和可维护性问题。如果您使用的是现代PHP,那么一个好的解决方案就是拥有一个静态类,它可以作为您需要的所有全局变量的持有者。例如,Symfony Framework的sfConfig就是一个很好的例子。您可以查看文档和代码here,了解如何创建自己的文档(或者只是清理在您自己的项目中使用的代码......它非常独立)。

相关问题