define

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

define定义一个命名常量

描述

define(string $constant_name, mixed $value, bool $case_insensitive = false): bool

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

参数

constant_name

常量的名称。

注意:

可以使用 define() 定义具有保留名称甚至无效名称的常量,其值只能通过 constant() 获取。但是,不建议这样做。

value

常量的值。在 PHP 5 中,value 必须是 标量 值(intfloatstringboolnull)。在 PHP 7 中,也接受 array 值。

警告

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

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 允许 array 值。

范例

范例 #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)

参见

添加注释

用户贡献的注释 17 个注释

97
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 年前
我不确定为什么文档省略了这一点,但是当尝试定义() 一个已经定义的常量时,它会失败,触发 E_NOTICE,并且常量的值将保留为最初定义的值(新值将被忽略)。

(我想这就是为什么它们被称为“常量”。)
28
danbettles at yahoo dot co dot uk
15 年前
define() 将完全按照指定定义常量。因此,如果您想在命名空间中定义一个常量,则需要在调用 define() 时指定命名空间,即使您是从命名空间内部调用 define()。以下示例将使它变得清晰。

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

<?php
namespace test;
define('MESSAGE', 'Hello world!');
?>

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

<?php
namespace test;
define('test\HELLO', 'Hello world!');
define(__NAMESPACE__ . '\GOODBYE', 'Goodbye cruel world!');
?>
4
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;
}

我喜欢这个 实现!

?>
1
eparkerii at carolina dot rr dot com
15 年前
我发现了一些有趣的东西。以下 define

<?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”。

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

[EDIT BY danbrown AT php DOT net: 原帖作者指的是连字符和下划线。连字符在 define 或变量中不起作用,这是预期的行为。]
0
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; // 遗留

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

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

// "another file":
echo VEG; // cabbage
echo FRUIT; // FRUIT
?>
-3
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"
-4
axew3 at axew3 dot com
7 年前
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);
-6
me at mariusgerum dot de
5 年前
您可以使用变量名定义常量(也适用于常量值或变量或数组值或类属性等等 - 只要它是有效的常量名称)。

<?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 对此类情况的重构和突出显示的支持。
不知道为什么有人会/真的会使用它,但我认为值得一提。
-5
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
?>

为什么要使用它?

第三方插件可能会尝试定义一个您已经设置了值的常量。如果他们可以设置新值,假设您无法编辑插件,您可以将您的常量定义为不区分大小写。如果需要,您仍然可以访问原始值,方法是使用除了插件使用的任何大小写以外的任何大小写。事实上,我想不出您需要不区分大小写常量的其他情况...
-8
phen at adnerdum dot org
13 年前
澄清一些事情
以 0 开头的整数可以使用。但由于 PHP(以及许多其他语言)将它们处理为八进制值,因此它们只允许 0-7 的范围

<?php
define
('GOOD_OCTAL', 0700);
define('BAD_OCTAL', 0800);

print
GOOD_OCTAL;
print
'<br>';
print
BAD_OCTAL;
?>

结果
448
0

---------------------------------------

此外,

在注释中提到的,在没有引号的情况下写常量名会导致E_NOTICE警告,应避免此操作!

<?php
define
(TEST, 'Throws an E_NOTICE');
?>

结果
注意:使用未定义的常量 TEST - 假设为 'TEST'
-10
jan at webfontein dot nl
16 年前
对于使用变量和 define 进行翻译,还可以参考 constant() 函数。

示例

<?php
define
('PAYMENT_IDEAL',"iDEAL Payment ( NL only )");
define('PAYMENT_MASTERCARD',"Mastercard Payment ( international )");

$payparam='MASTERCARD';

echo
constant("PAYMENT_$payparam");

// 输出:
// Mastercard Payment ( international )
?>
-8
David Spector
5 年前
值得注意的是,define 函数必须在引用其全局常量之前执行。

示例

Abc();
define("TEST", 23);
function Abc()
{
echo TEST;
} // Abc

这段代码会失败,并产生一个 Notice 级别的消息。在这里 TEST 被视为字符串 "TEST"。
-9
ohcc at 163 dot com
4 年前
可以使用 define 函数定义命名空间常量,这种方式定义的常量不是全局的。

<?php
namespace WuXiancheng;
\define('China\Sichuan\Guangan\Yuechi\ZIP', 638300);
echo
ZIP; // 使用未定义的常量 ZIP
echo \China\Sichuan\Guangan\Yuechi\ZIP; // 638300
?>
-8
agneady at gmail dot nospam dot please dot com
2 年前
如果你碰巧将你的常量命名为与函数名相同(无论是内置函数还是用户定义函数),PHP 可以根据上下文正确处理这种情况。例如

<?php
function myfunc() {
return
'function output';
}

define('MYFUNC', 'constant value');

// 注意,函数名不区分大小写
// 所以调用 MYFUNC() 等同于调用 myfunc()

echo 'MYFUNC(): ' . MYFUNC() . ', MYFUNC: ' . MYFUNC;
?>

输出
MYFUNC(): function output, MYFUNC: constant value
-4
tux dot lector at gmail dot com
1 年前
从 8 或 8.1 版本开始,如果我记得没错的话,任何类型的类
都可以被定义为常量值。

是否应该使用它,我不知道。
很可能,引用此类实例会导致严重错误。
但它可能对公共和只读类有用。

<?php

define
('ClassInstance',
new class extends
\My\OtherClass {

private
bool $toggle = false;
private
float $real = 1.2345;
private ?
string $obj = null;

public function
__construct() {
$this-> privatemethod();
}

private function
privatemethod() {
$this-> obj = var_export ($this, true);
}

});

?>
To Top