在PHP中正确使用常量

时间:2016-03-23 11:51:05

标签: php variables constants

所以我最近在PHP中学习了常量。幸运的是,没有什么可以学习它们,它们似乎只是一个存储某些东西价值的实体,就像一个变量。

我能看到的唯一不同(如果我错了就纠正我)是一个常量不能分配一个新值(就是这个?)。例如,如果您使用不应更改的配置创建配置文件,那么这在理论上是有道理的。

但它肯定会带来其他好处/用法,而不仅仅是使用变量? 在什么情况下我应该选择使用常量?

3 个答案:

答案 0 :(得分:1)

如果您发现自己设置变量以方便使用并且在脚本期间从不更改变量,那么您应该使用常量代替。常量就像变量一样,除了定义它们之后它们不能被定义或改变 - 它们是不变的,顾名思义。在许多语言中,常量比变量更快,因此建议使用,但在PHP中情况并非如此 - 虽然它们可能更快一点,但使用常量的主要优点是它们没有美元这一事实在前面签字,因此与变量明显不同。此外,与变量不同,常量在整个脚本中自动是全局的。

要设置常量,请使用define()函数 - 它需要两个参数,第一个是要设置的常量的名称,第二个是您希望设置它的值。例如,以下代码行将变量CURRENT_TIME设置为time()函数的返回值,然后将其打印出来:

using (ApplicationDbContext db = ApplicationDbContext.Create())
{
   db.Database.ExecuteSqlCommand(@" BULK
    INSERT SecurityFiles
    FROM 'your file path'
    WITH
    (
    FIRSTROW
    = 1,
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '\n',
    )");
}

请注意,它不是$ CURRENT_TIME或Current_Time - 常量(如变量)区分大小写,但与变量不同,它们不以美元符号开头。您可以通过将true作为第三个参数传递给define()来更改此行为,这会使常量不区分大小写:

define("CURRENT_TIME", time());
print CURRENT_TIME;

有两个有用的函数可用于处理常量,它们是defined()和constant()。 defined()函数基本上是isset()的常量等价,因为如果已经定义了传递给它的常量字符串,它返回true。例如:

define("CURRENT_TIME", time(), true);
print Current_TiMe;

请注意,您应该将常量名称传递给引号内的defined()。

答案 1 :(得分:1)

常量的一个关键特性是它们的行为类似于函数和类,在您尝试使用它们时需要定义它们,否则PHP将产生错误;并且它们是全球性的,并且不受范围的影响。这使得它们非常适用于函数参数中的标志,其中相对不重要,但需要唯一标识。看看PHP本身如何使用常量:

json_encode($foo, JSON_UNESCAPED_UNICODE)
pathinfo($bar, PATHINFO_FILENAME)
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)

替代方案是什么?

$pdo->setAttribute('errmode', 'exception')

无法检查字符串的存在方式与常量相同,错别字更容易并且需要在函数内部进行更多的手动错误处理,并且字符串无法以内省PDO为其常量进行内省,因此可用选项的可发现性降低。

$pdo->setAttribute(1, 2)

魔术数字显然更差,意义更小,执法和发现性也相同。

在这些情况下,常数是理想的。它们为含义提供强制的,可读的标识符;常数保持的实际值相对不重要。

答案 2 :(得分:-1)

常量适用于其他人可能阅读并尝试安装代码的情况,但不知道他们应该更改哪些内容以添加自己的详细信息。如果您不这样做,它会特别有用。有一个安装脚本,因为新的管理员需要设置自己的详细信息。

实施例: 您需要在您的网站上安装使用某种数据库的新脚本。您打开主文件,编辑需要在数据库连接详细信息中添加的常量。因为它们是常量,你知道它们不应该改变 - 而且它们不应该,否则你的数据库就不会工作!如果使用变量,则可能会在脚本中意外更改这些值。更清楚地知道您必须更改哪些部分 - 因为它们通常位于文档的开头或单独的文件中也很容易识别。