constant

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

constant返回常量的值

描述

constant(string $name): mixed

返回由 name 指示的常量的值。

如果您需要检索常量的值,但不知道它的名称,则 constant() 很有用。例如,它存储在一个变量中或由函数返回。

此函数也适用于 类常量枚举用例

参数

name

常量名。

返回值

返回常量的值。

错误/异常

如果未定义常量,则会抛出 Error 异常。在 PHP 8.0.0 之前,在这种情况下会生成 E_WARNING 级别的错误。

变更日志

版本 描述
8.0.0 如果未定义常量,constant() 现在会抛出 Error 异常;以前会生成 E_WARNING,并返回 null

示例

示例 #1 使用 constant() 以及常量

<?php

define
("MAXSIZE", 100);

echo
MAXSIZE;
echo
constant("MAXSIZE"); // 与上一行相同


interface bar {
const
test = 'foobar!';
}

class
foo {
const
test = 'foobar!';
}

$const = 'test';

var_dump(constant('bar::'. $const)); // string(7) "foobar!"
var_dump(constant('foo::'. $const)); // string(7) "foobar!"

?>

示例 #2 使用 constant() 以及枚举用例 (自 PHP 8.1.0 起)

<?php

enum Suit
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;
}

$case = 'Hearts';

var_dump(constant('Suit::'. $case)); // enum(Suit::Hearts)

?>

参见

添加说明

用户贡献的说明 17 个说明

82
Joachim Kruyswijk
19 年前
常量名可以为空字符串。

代码

define("", "foo");
echo constant("");

输出

foo
21
t dot kmieliauskas at gmail dot com
9 年前
如果您正在引用类常量(无论是否使用命名空间,因为总有一天您可能需要开始使用它们),那么按照以下方式进行引用将让您少操心。

<?php
class Foo {
const
BAR = 42;
}
?>
<?php
namespace Baz;
use
\Foo as F;

echo
constant(F::class.'::BAR');
?>

因为 F::class 将被解引用为任何您正在使用的命名空间快捷方式(并且这些快捷方式比带有硬编码命名空间的纯字符串文字更容易为 IDE 重构)
10
helvete at zhouba dot cz
7 年前
值得注意的是,关键字 'self' 可以用来从定义它的类中检索常量

<?php
class Foo {
const
PARAM_BAR = 'baz';

public function
getConst($name) {
return
constant("self::{$name}");
}
}

$foo = new Foo();
echo
$foo->getConst('PARAM_BAR'); // 输出 'baz'
?>
14
Richard J. Turner
11 年前
从 PHP 5.4.6 开始,constant() 不理会它所使用的文件中可能定义的任何命名空间别名。也就是说,constant() 始终表现得好像是从全局命名空间中调用一样。这意味着以下内容将不起作用

<?php
class Foo {
const
BAR = 42;
}
?>

<?php
namespace Baz;

use
\Foo as F;

echo
constant('F::BAR');
?>

但是,调用 constant('Foo::BAR') 将按预期工作。
10
Trevor Blackbird > yurab.com
18 年前
从技术上讲,您可以定义名称对于变量而言无效的常量

<?php

// $3some 不是一个有效的变量名
// 这将无法工作
$3some = 'invalid';

// 这可以工作
define('3some', 'valid');
echo
constant('3some');

?>

当然,这不是一个好习惯,但 PHP 已经为你准备好了。
6
Andre
21 年前
也许这很有用

$file_ext 是图像的文件扩展名

<?php
if ( imagetypes() & @constant('IMG_' . strtoupper($file_ext)) )
{
$file_ext = $file_ext == 'jpg' ? 'jpeg' : $file_ext;
$create_func = 'ImageCreateFrom' . $file_ext;
}
?>
4
XC
17 年前
当您经常编写如下代码

<?php

if(defined('FOO') && constant('FOO') === 'bar')
{
...
}

?>

以防止错误,您可以使用以下函数来获取常量的值。

<?php

function getconst($const)
{
return (
defined($const)) ? constant($const) : null;
}

?>

最后,您可以使用以下代码检查值

<?php

if(getconst('FOO') === 'bar')
{
...
}

?>

这更简洁。
1
hellekin
14 年前
检查常量是否为空是有问题的...

你不能

<?php
define
('A', '');
define('B', 'B');

if (empty(
B)) // 语法错误
if (empty(constant('B'))) // 致命错误

// 所以,感谢 IRC 上的 LawnGnome,您可以将常量转换为布尔值(空字符串为 false)
if (((boolean) A) && ((boolean) B))
// 执行操作
?>
0
nikolays93 at ya dot ru
3 年前
<?php

namespace Foo;

define(__NAMESPACE__ . '\Bar', 'its work'); // ..但 IDE 可能会发出警告

echo Bar; // its work
0
narada dot sage at googlemail dot com
18 年前
要访问类常量的值,请使用以下方法。

<?php

class a {
const
b = 'c';
}

echo
constant('a::b');

// 输出:c

?>
0
Anonymous
18 年前
回复 VGR_experts_exchange at edainworks dot com

要检查常量是否是布尔值,请使用以下代码

<?php
if (TRACE === true) {}
?>

这比使用 defined() 和 constant() 检查简单的布尔值更快、更简洁。

IMO,使用 ($var === true) 或 ($var === false) 而不是 ($var) 或 (!$var) 是检查布尔值的最佳方式,无论是什么。不会有任何歧义。
-2
bohwaz
14 年前
从对象中返回常量。您可以通过正则表达式过滤或通过值匹配来从值中找到常量名称。

有时非常有用。

<?php

function findConstantsFromObject($object, $filter = null, $find_value = null)
{
$reflect = new ReflectionClass($object);
$constants = $reflect->getConstants();

foreach (
$constants as $name => $value)
{
if (!
is_null($filter) && !preg_match($filter, $name))
{
unset(
$constants[$name]);
continue;
}

if (!
is_null($find_value) && $value != $find_value)
{
unset(
$constants[$name]);
continue;
}
}

return
$constants;
}

?>

示例

<?php

class Example
{
const
GENDER_UNKNOW = 0;
const
GENDER_FEMALE = 1;
const
GENDER_MALE = 2;

const
USER_OFFLINE = false;
const
USER_ONLINE = true;
}

$all = findConstantsFromObject('Example');

$genders = findConstantsFromObject('Example', '/^GENDER_/');

$my_gender = 1;
$gender_name = findConstantsFromObject('Example', '/^GENDER_/', $my_gender);

if (isset(
$gender_name[0]))
{
$gender_name = str_replace('GENDER_', '', key($gender_name));
}
else
{
$gender_name = 'WTF!';
}

?>
-2
Anonymous
5 年前
使用 constant()(或其他方法)来确保 your_constant 被定义,这在定义为 `true` 或 `false` 时尤其重要。

例如,来自 Stackoverflow 问题的代码
https://stackoverflow.com/questions/5427886/php-undefined-constant-testing/56604602#56604602)

如果 `BOO` 未被定义为常量,由于某种原因,

<?php if(BOO) do_something(); ?>

将被评估为 `TRUE` 并运行。这是一个相当意外的结果。

原因是 PHP 假设您在未在定义的常量列表中看到 `BOO` 时“忘记”了 `BOO` 周围的引号。
因此,它被评估为:`if ('BOO')`...
由于除空字符串之外的每个字符串都是“真值”,因此该表达式被评估为 `true`,并且 do_something() 意外运行。

如果改为使用
<?php if (constant(BOO)) do_something() ?>

那么如果 `BOO` 未定义,`constant(BOO)` 将被评估为 `null`,
这是假值,而 `if (null)`... 变成 `false`,因此 do_something() 被跳过,正如预期的那样。

PHP 关于未定义常量的行为在定义特定常量是例外情况、假值是默认值,而具有真值则暴露安全问题时,尤其令人震惊。例如,
<?php if (IS_SPECIAL_CASE) show_php_info() ?> .

还有其他方法可以解决这种 PHP 行为,例如
<?php if (BOO === true) do_something(); ?>

<?php if (defined('BOO') && BOO) do_something() ?>.

请注意,只有使用 `defined()` 的版本在不抛出 PHP 警告“错误消息”的情况下也能正常工作。

这是一个 php repl.it 演示
https://repl.it/@sherylhohman/php-undefined-constants-beware-of-truthy-conversion?language=php_cli&folderId=

(披露:我还在上面链接的 SO 问题中提交了答案)
-2
dachnik
14 年前
您可以使用定义的常量名称在配置文件中定义值,例如

在您的 php 代码中
define("MY_CONST",999);

在您的配置文件中
my = MY_CONST

读取文件时,请执行以下操作

$my = constant($value); // 其中 $value 是字符串 "MY_CONST"

现在 $my 包含 999 的值
-4
adam at adamhahn dot com
12 年前
当调用类常量时,此函数对命名空间敏感。

使用
<?php namespace sub;

class
foo {
const
BAR = 'Hello World';
}

constant('foo::BAR'); // 错误

constant('sub\foo::BAR'); // 工作

?>

这似乎不影响用 'define' 函数定义的常量。除非常量名称字符串中隐式定义了其他命名空间,否则它们最终都会在根命名空间中定义。
-3
mohammad alzoqaily
6 年前
// 1) 可以在默认变量中存储常量的名称
// 然后使用它而无需识别它的名称 :)

$str= "constName";

define("constName","this is constant");

echo constant($str);


输出
this is constant

// 2) 适用于动态生成常量


function generateConst( $const , $value , $sensitivity=TRUE )
{

define( "$const" , "$value ",$sensitivity);
}

$CONST="cost";
$VALUE="100$";

generateConst( $CONST , $VALUE);

echo constant($const);

输出
100$
-6
service at dual-creators dot de
18 年前
使用 constant() 和 define() 很容易翻译数据库保存中的某些词。

例如
您有一个名为 userprofil 的表,其中一列是 "gender"。
性别可以是男性或女性,但您将显示 "maennlich" 或 "weiblich"(德语单词 - 无论如何...)。

第一步:获取到 $Gender

第二步
define("male", "maennlich");
define("female", "weiblich");

第三步
echo constant($Gender);

现在,变量 $Gender 的索引将被视为常量!

(为了更好地理解,它就像 "echo male;" 一样工作。)

结果,它显示 maennlich btw. weiblich!

问候
To Top