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

时间:2010-01-13 20:04:17

标签: php variables global constants

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

8 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:9)

这里有一些事情。

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

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

另一方面,常数永远不会改变。你定义它们一次,它们保持定义,没有人可以改变它们。这就是为什么全局常量被认为比没有全局变量“更糟糕”的原因。

答案 2 :(得分:6)

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

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

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

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

答案 3 :(得分:2)

定义一旦定义,就无法更改。

不要将常量用作变量。如果需要在函数内使用变量,请将它们传递给函数本身。按照预期的方式使用所有内容。变量是变量,常量是常量

答案 4 :(得分:1)

一些不变的例子:

<?php

// Certainly constant
define('MINUTES_PER_HOUR', 60);
define('DOZEN', 12);

// Constant, but specific to this application
define('GREETING', 'Dear %s');
define('TIMEOUT', 30);

// Configurable, but constant for this installation
define('DATABASE', 'mydb');
define('IMAGES_DIRECTORY', '/tmp/images');

// Not constant, or some other reason why can't be constant
$user = $_POST['userid'];
$days_of_week = array('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su');

?>

答案 5 :(得分:0)

需要考虑的其他事项 - 常量不能存储数组或对象之类的东西,而定义为$ GLOBALS的东西可以是任何变量类型。所以在某些情况下,如果你需要某些东西是全局的但是它不能通过使用define()存储到常量,你可能想要使用$ GLOBALS。

另外,register_globals和$ GLOBALS不是一回事!

答案 6 :(得分:0)

如果两者具有相同的名称,则可以更改函数内的全局变量,因为局部变量会覆盖全局变量,但如果要在不同的函数中使用相同的名称变量,则不会更改全局变量outside.in常量的值不允许你给出错误,因为它定义了一次并在所有程序中使用,你不能在任何函数或块中更改此变量的值它是固定值。

答案 7 :(得分:-1)

尝试这个简单的测试:

fileA.php:

<?php
define('SOMEVAL', 2);
?>

fileB.php:

<?php
if(defined('SOMEVAL')) echo SOMEVAL;
else echo "SOMEVAL does not exists\n";
include 'fileA.php';
if(defined('SOMEVAL')) echo 'SOMEVAL='.SOMEVAL;
else echo "SOMEVAL does not exists\n";
?>

然后运行fileB.php,你会看到在包含fileA.php之前,没有定义SOMEVAL。所以这意味着在你定义任何东西之前,它将不会被脚本看到。

相关问题