PHP-全局变量和常量之间的区别

Gal*_*Gal 7 php variables global constants

根据许多来源,在php.ini中应该禁用register_globals(全局变量). 我应该在我的代码中编写define()并在禁用全局变量时使用常量吗?那些甚至相关吗?

Par*_*ots 16

它们的相关性在于它们具有全局范围,但常量一旦定义就不会改变,不像页面可以随之修改的全局变量.因此,切换到使用define()而不是全局将无济于事.

如果你重构你的方法以将变量作为参数并依靠它来传递变量,那就更好了.

  • @Gal,是的,这是使用它们的一个很好的理由,因为你不会在运行时更改目录. (4认同)

Ala*_*orm 9

这里有一些事情.

首先,在php.ini中禁用的register_globals是指旧的PHP功能,其中通过查询字符串(GET)或表单(GET/POST)发送的任何变量都将转换为全局PHP变量.这是关闭register_globals时(并且应该)禁用的功能.即使关闭此选项,您仍可以在应用程序中定义全局变量.

在一般的编程术语中,全局变量(不是PHP的register_globals)被认为是"坏的",因为当你遇到一个程序员时,你不知道应用程序的其他部分可能正在使用或更改它,或者你对它的更改有何影响全球可能有.此外,如果您要定义一个新的全局变量,那么您可能会覆盖其他人依赖的现有变量.当变量在本地定义时(在单个函数中,或在其他语言中定义为单个块),您可以检查本地范围,并通常确定对该变量的更改将执行的操作.

另一方面,常数永远不会改变.你定义它们一次,它们保持定义,没有人可以改变它们.这就是为什么将全局常量视为"不太糟糕"而不是全局变量.


Bil*_*win 7

全局变量不是常量(您可以更改全局变量的值,但只能定义一次常量).

常量并不总是全局的(您可以在类中声明常量).

此外,全局变量可以是任何类型:标量,数组或对象.常量只能是标量.

我不会说常量或全局变量是好还是坏.如果使用得当,它们都有益.该register_globals功能存在安全问题,与更全面使用全局变量分开.