是否正在使用这样的全局变量来减少对数据库可接受的实践的调用?

时间:2010-07-02 21:47:13

标签: php variables global-variables

所以我从这个网站得到了很多回复,全局变量很糟糕并且杀死了小狗。

如果我使用这样的变量怎么办:

function get_stuff(){
  global $stuff;
  if(!stuff) $stuff = 'candy';
  return $stuff;
}

function screen_output(){
  $stuff = get_stuff;
  echo $stuff;
}

这会使代码比在两个函数中使用'global'更好吗?

ps:如果你想知道我需要使用全局变量的原因,那是因为我需要从数据库中检索一些设置,而且我不想从每个函数调用db。

4 个答案:

答案 0 :(得分:2)

情况更糟。你正在为另一个($stuff)交换一个全局符号(get_stuff),加上你使用它们的方式加剧了这个因素。

顺便说一句,我想你想说

if ($stuff === null) $stuff = 'candy';

或至少

if (!$stuff) $stuff = 'candy'; //also reset when stuff is '', 0, etc.

答案 1 :(得分:2)

理想情况下,您将拥有一个处理数据的类,并在数据被检索和/或用于数据库中的每个记录或一组记录时进行实例化。以这种方式创建的对象将根据需要从一个函数传递给另一个函数。 这种想法通常会导致人们最终使用对象关系映射软件,该软件专门用于处理数据库或其他持久性(ish)存储中的移动数据。也就是说,理解ORM的目的需要一些面向对象编程的知识和范例的常用模式,因此研究OOP可能是开始寻找答案的更好的地方。维基百科搜索这些主题将是一个好主意。

作为一般规则,考虑到当各个部件彼此封装(隔离)时,计算机系统更好(更可测试,可修复,可扩展,可替换)。因此,通过以全局方式执行某些操作(这远不仅仅是声明全局内容),您可以互连系统中可能不需要连接的部分。

这种隔离是如何完成的,以及您和您正在构建的系统类型决定了什么程度。如果您只是编写一些简单的测试代码或简单的原型,您可以根据需要滥用全局空间,因为代码永远不会看到光明(关键字在这里很简单)。如果您正在构建一个简单的脚本来帮助生成几个网页,并且该脚本永远不会演变成更多的东西,那么您仍然不必担心全局空间。但是,一旦你超越了这个小问题,你真的应该开始隔离系统的各个部分,因为它会为你提供更好的代码来处理这个问题(意思是在输入和编译时很快就会出现)

项目越复杂,部件应该越孤立,因此一个区域的变化不会“波及”整个系统。这种涟漪可能被视为必须在一百个地方改变代码中的某些东西,而不仅仅是少数几个,或者在事后发生的结果错误,因为并非一切都被改变或正确改变(人为错误将永远胜出这里)。

答案 2 :(得分:1)

不,它没有。你应该完全避免使用全局变量,而是将东西作为参数传递。

答案 3 :(得分:1)

您不需要全局变量来完成该代码。您可以创建一个Singleton对象,使您的脚本只能访问数据库连接的一个实例。全局变量很糟糕,因为它可以被整个应用程序访问,甚至是不需要它的部分。