PHP Conference Japan 2024

define

(PHP 4, PHP 5, PHP 7, PHP 8)

define定义一个命名常量

描述

define(字符串 $constant_name, 混合 $value, 布尔值 $case_insensitive = false): 布尔值

在运行时定义一个命名常量。

参数

constant_name

常量的名称。

注意:

可以使用保留的或无效的名称来 define() 常量,其值只能通过 constant() 来检索。但是,不建议这样做。

value

常量的值。在 PHP 5 中,value 必须是 标量 值(整数浮点数字符串布尔值null)。在 PHP 7 中,也接受 数组 值。

警告

虽然可以定义 资源 常量,但不建议这样做,因为它可能会导致不可预测的行为。

case_insensitive

如果设置为 true,则常量将被定义为不区分大小写。默认行为是区分大小写;即 CONSTANTConstant 表示不同的值。

警告

从 PHP 7.3.0 开始,定义不区分大小写的常量已弃用。从 PHP 8.0.0 开始,仅 false 是可接受的值,传递 true 将产生警告。

注意:

不区分大小写的常量存储为小写。

返回值

成功时返回 true,失败时返回 false

变更日志

版本 描述
8.0.0 true 传递给 case_insensitive 现在会发出 E_WARNING。仍然允许传递 false
7.3.0 case_insensitive 已弃用,将在 8.0.0 版本中删除。
7.0.0 允许 数组 值。

示例

示例 #1 定义常量

<?php
define
("CONSTANT", "Hello world.");
echo
CONSTANT; // 输出 "Hello world."
echo Constant; // 输出 "Constant" 并发出通知。

define("GREETING", "Hello you.", true);
echo
GREETING; // 输出 "Hello you."
echo Greeting; // 输出 "Hello you."

// 从 PHP 7 开始有效
define('ANIMALS', array(
'dog',
'cat',
'bird'
));
echo
ANIMALS[1]; // 输出 "cat"

?>

示例 #2 带有保留名称的常量

此示例说明了定义与 魔术常量 同名的常量的 可能性。由于结果行为显然令人困惑,因此不建议在实践中这样做。

<?php
var_dump
(defined('__LINE__'));
var_dump(define('__LINE__', 'test'));
var_dump(constant('__LINE__'));
var_dump(__LINE__);
?>

上面的示例将输出

bool(false)
bool(true)
string(4) "test"
int(5)

参见

添加注释

用户贡献的注释 11 条注释

101
ravenswd at gmail dot com
9 年前
请注意,如果关闭了“Notice”级别的错误报告,那么尝试将常量用作变量将导致将其解释为字符串,前提是它尚未定义。

我正在处理一个程序,该程序包含一个包含以下内容的配置文件

<?php
define
('ENABLE_UPLOADS', true);
?>

由于我想删除上传功能,因此我将文件更改为读取

<?php
//define('ENABLE_UPLOADS', true);
?>

但是,令我惊讶的是,程序仍然允许上传。深入研究代码后,我发现了这个

<?php
if ( ENABLE_UPLOADS ):
?>

由于“ENABLE_UPLOADS”未定义为常量,因此 PHP 将其用作字符串常量进行解释,这当然会评估为 True。
24
@SimoEast on Twitter
7 年前
不确定为什么文档会省略这一点,但在尝试 define() 一个已定义的常量时,它将失败,触发 E_NOTICE,并且常量的值将保持其最初定义的值(忽略新值)。

(我想这就是为什么它们被称为“常量”的原因。)
30
danbettles at yahoo dot co dot uk
15 年前
define() 将完全按照指定的定义常量。因此,如果要在一个命名空间中定义一个常量,则需要在对 define() 的调用中指定命名空间,即使是在命名空间内调用 define() 也是如此。以下示例将使这一点更加清楚。

以下代码将在全局命名空间(即“\MESSAGE”)中定义常量“MESSAGE”。

<?php
命名空间 test;
define('MESSAGE', 'Hello world!');
?>

以下代码将在“test”命名空间中定义两个常量。

<?php
命名空间 test;
define('test\HELLO', 'Hello world!');
define(__NAMESPACE__ . '\GOODBYE', 'Goodbye cruel world!');
?>
5
Dale Landry
7 年前
使用 php 7,您现在可以定义数组。

考虑以下代码
<?php

define
( "EXPLENATIVES", [1 => "Foo Bar", 2 => "Fehw Bahr", 3 => "Foo Bahr", 4 => "Fooh Bar", 5 => "Fooh Bhar", 6 => "Foo Barr", 7 => "Foogh Bar", 8 => "Fehw Barr", 9 => "Fu bar", 10 => "Foo Bahr", 11 => "Phoo Bar", 12 => "Foo Bawr", 13 => "Phooh Baughr", 14 => "Foogan Bargan", 15 => "Foo Bahre", 16 => "Fu Bahar", 17 => "Fugh Bar", 18 => "Phou Baughr"]);

// 使用混合值设置 define 方法;数组和非数组值
define("NAVBTNS", [EXPLENATIVES, "Nouns", "Verbs", "Adjectives"]);

// 使用 EXPLENATIVES 数组创建下拉菜单的函数 $btn=EXPLENATIVES=assoc_array

function construct_navbar_buttons(){

$btns = '<ul class="nav navbar-nav">';

foreach(
NAVBTNS as $button => $btn){
if(
is_array($btn)){
$btns .= '<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="?id='
.$btn.'">
<i class="glyphicon glyphicon-user"></i> You Dare Say? <i class="glyphicon glyphicon-collapse-down"></i>
</a>
<ul class="dropdown-menu dropdown-user">'
;
foreach(
EXPLENATIVES as $key => $button){
$btns .= '<li><a href="#">'.$button.'</a></li>';
}
$btns .= '</ul>';
}else{
$btns .= '<li><a href="#">'.$btn.'</a></li>';
}
}

$btns .= '</ul>';
return
$btns;
}

喜欢这个 新的 实现!

?>
2
eparkerii at carolina dot rr dot com
16 年前
发现了一些有趣的东西。以下定义

<?php
define
("THIS-IS-A-TEST","This is a test");
echo
THIS-IS-A-TEST;
?>

将返回“0”。

而这个

<?php
define
("THIS_IS_A_TEST","This is a test");
echo
THIS_IS_A_TEST;
?>

将返回“This is a test”。

这可能是常识,但我只是在几分钟前才发现。

[由 danbrown AT php DOT net 编辑:原发帖人指的是连字符与下划线。连字符在 define 或变量中不起作用,这是预期的行为。]
1
chris at peeto dot net
14 年前
常量的值可以是另一个常量的值。

<?php

define
("NEW_GOOD_NAME_CONSTANT", "I have a value");
define("OLD_BAD_NAME_CONSTANT", NEW_GOOD_NAME_CONSTANT);

echo
NEW_GOOD_NAME_CONSTANT; // 当前
echo OLD_BAD_NAME_CONSTANT; // 遗留

?>
0
Jamie
13 年前
这很明显,但很容易忘记:如果您包含一个文件,则包含文件只能使用已定义的常量。例如

<?php
define
("VEG","cabbage");
require(
"another file");
define("FRUIT","apple");

// "another file":
echo VEG; // cabbage
echo FRUIT; // FRUIT
?>
-2
swisschocolate at cmail dot nu
8 年前
我认为值得一提的是,define() 似乎忽略了无效的常量名称。
这似乎的一个直接含义是,如果您使用无效的常量名称,则必须使用 constant() 来访问它,并且显然您无法使用 define() 的返回值来判断所使用的常量名称是否无效。

例如
$name = '7(/!§%';
var_dump(define($name, "hello")); // 输出 bool(true)
var_dump(constant($name)); // 输出 string(5) "hello"
-3
axew3 at axew3 dot com
8 年前
Php 7 - Define:“在运行时定义一个命名常量。在 PHP 7 中,也接受数组值。”

但在 PHP 7 之前,您可以尝试这样做,以使用 define 将数组传递到其他地方

$to_define_array = serialize($array);
define( "DEFINEANARRAY", $to_define_array );

... 等等 ...

$serialized = DEFINEANARRAY; // 直接传递定义的将不起作用
$our_array = unserialize($serialized);

print_r($our_array);
-3
Anonymous
7 年前
将第三个参数设置为 true(不区分大小写的常量)有一个未记录的副作用:这些常量实际上可以被“重新定义”为区分大小写,除非它是全小写(无论如何您不应该定义全小写)。

事实是,区分大小写的常量按原样存储,而不区分大小写的常量在内部以小写形式存储。您仍然可以定义其他具有相同名称但大小写不同的常量(除了全小写)。

<?php
// "echo CONST" 打印 1,与 "echo const"、"echo CoNst" 等相同
define('CONST', 1, true);
echo CONST;
// 打印 1

define('CONST', 2);
echo CONST;
// 打印 2
echo CoNsT; // 打印 1
echo const; // 打印 1

// ** PHP NOTICE: Constant const already defined **
define('const', 3);
echo const;
// 打印 1
echo CONST; // 打印 2
?>

为什么要使用它?

第三方插件可能会尝试定义一个您已设置值的常量。如果他们可以设置新值,假设您无法编辑插件,您可以将您的常量定义为不区分大小写。如果需要,您仍然可以通过使用插件使用的以外的任何大小写来访问原始值。事实上,我想不出其他任何您想要不区分大小写的常量的情况……
-5
me at mariusgerum dot de
6 年前
您可以使用变量名定义常量(也适用于常量值或变量或数组值或类属性等等 - 只要它是有效的常量名称)。

<?php

# 定义一个常量,并设置一个有效的常量名称作为字符串值
define("SOME_CONSTANT", "NEW_CONSTANT");

# 使用动态名称(来自 SOME_CONSTANT 的值)定义第二个常量
define(SOME_CONSTANT, "Some value");

# 输出
echo SOME_CONSTANT; // 输出 "NEW_CONSTANT"
echo "<br>";
echo
NEW_CONSTANT; // 输出 "Some value"

?>

不用说,对于此类情况,您将完全失去 IDE 对重构和高亮显示的支持。
不知道为什么有人会/能够实际使用它,但我认为值得一提。
To Top