繁体   English   中英

PHP-全局变量和常量之间有什么区别

[英]PHP -What's the difference between global variables and constants

根据许多消息来源,您应该在php.ini中禁用register_globals(即全局变量)。 如果禁用了全局变量,是否应该在代码中编写define()并使用常量? 那些甚至有关系吗?

它们之间的联系在于它们具有全局范围,但是常量一旦定义就意味着不会更改,这与页面可以随其进行修改的全局变量不同。 因此,仅切换到使用define()而不是使用global不会有太大帮助。

最好是重构您的方法以将变量作为参数并依靠它来传递变量。

这里有几件事。

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

用一般的编程术语来说,全局变量(不是PHP的register_globals)被认为是“不好的”,因为当您遇到一个程序员时,您不知道应用程序的其他部分可能正在使用或更改它,或者您对该更改的影响如何?全球可能有。 另外,如果您要定义一个新的全局变量,则有可能覆盖其他人所依赖的现有变量。 当变量在本地定义时(在一个函数中,或者在其他语言中,在一个块中),您可以检查本地范围并通常确定对该变量所做的更改。

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

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

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

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

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

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

不要将常量用作变量。 如果需要在函数内使用变量,请将其传递给函数本身。 按照预期使用方式使用一切。 变量是变量 ,常数是常量

一些不变的例子:

<?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');

?>

需要考虑的其他事项-常量不能存储诸如数组或对象之类的东西,而为$ GLOBALS定义的内容可以是任何变量类型。 因此,在某些情况下,如果需要全局的某些内容,但无法使用define()将其存储为常量,则可能需要使用$ GLOBALS。

另外,register_globals和$ GLOBALS也不一样!

如果名称相同,则可以在函数内部更改全局变量,因为局部变量将覆盖全局变量,但不会更改outside.in全局变量的值。如果要在不允许使用的其他函数中使用相同名称的变量,则为常量给您一个错误,因为它定义了一次并在所有程序中使用,并且您无法在任何函数中更改此变量的值或将其固定为固定值。

试试这个简单的测试:

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。 因此,这意味着在定义任何内容之前,脚本将看不到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM