常量名可以为空字符串。
代码
define("", "foo");
echo constant("");
输出
foo
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
constant — 返回常量的值
返回由 name
指示的常量的值。
如果您需要检索常量的值,但不知道它的名称,则 constant() 很有用。例如,它存储在一个变量中或由函数返回。
name
常量名。
返回常量的值。
示例 #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)
?>
如果您正在引用类常量(无论是否使用命名空间,因为总有一天您可能需要开始使用它们),那么按照以下方式进行引用将让您少操心。
<?php
class Foo {
const BAR = 42;
}
?>
<?php
namespace Baz;
use \Foo as F;
echo constant(F::class.'::BAR');
?>
因为 F::class 将被解引用为任何您正在使用的命名空间快捷方式(并且这些快捷方式比带有硬编码命名空间的纯字符串文字更容易为 IDE 重构)
值得注意的是,关键字 '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'
?>
从 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') 将按预期工作。
从技术上讲,您可以定义名称对于变量而言无效的常量
<?php
// $3some 不是一个有效的变量名
// 这将无法工作
$3some = 'invalid';
// 这可以工作
define('3some', 'valid');
echo constant('3some');
?>
当然,这不是一个好习惯,但 PHP 已经为你准备好了。
也许这很有用
$file_ext 是图像的文件扩展名
<?php
if ( imagetypes() & @constant('IMG_' . strtoupper($file_ext)) )
{
$file_ext = $file_ext == 'jpg' ? 'jpeg' : $file_ext;
$create_func = 'ImageCreateFrom' . $file_ext;
}
?>
当您经常编写如下代码
<?php
if(defined('FOO') && constant('FOO') === 'bar')
{
...
}
?>
以防止错误,您可以使用以下函数来获取常量的值。
<?php
function getconst($const)
{
return (defined($const)) ? constant($const) : null;
}
?>
最后,您可以使用以下代码检查值
<?php
if(getconst('FOO') === 'bar')
{
...
}
?>
这更简洁。
检查常量是否为空是有问题的...
你不能
<?php
define('A', '');
define('B', 'B');
if (empty(B)) // 语法错误
if (empty(constant('B'))) // 致命错误
// 所以,感谢 IRC 上的 LawnGnome,您可以将常量转换为布尔值(空字符串为 false)
if (((boolean) A) && ((boolean) B))
// 执行操作
?>
<?php
namespace Foo;
define(__NAMESPACE__ . '\Bar', 'its work'); // ..但 IDE 可能会发出警告
echo Bar; // its work
要访问类常量的值,请使用以下方法。
<?php
class a {
const b = 'c';
}
echo constant('a::b');
// 输出:c
?>
回复 VGR_experts_exchange at edainworks dot com
要检查常量是否是布尔值,请使用以下代码
<?php
if (TRACE === true) {}
?>
这比使用 defined() 和 constant() 检查简单的布尔值更快、更简洁。
IMO,使用 ($var === true) 或 ($var === false) 而不是 ($var) 或 (!$var) 是检查布尔值的最佳方式,无论是什么。不会有任何歧义。
从对象中返回常量。您可以通过正则表达式过滤或通过值匹配来从值中找到常量名称。
有时非常有用。
<?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!';
}
?>
使用 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 问题中提交了答案)
您可以使用定义的常量名称在配置文件中定义值,例如
在您的 php 代码中
define("MY_CONST",999);
在您的配置文件中
my = MY_CONST
读取文件时,请执行以下操作
$my = constant($value); // 其中 $value 是字符串 "MY_CONST"
现在 $my 包含 999 的值
当调用类常量时,此函数对命名空间敏感。
使用
<?php namespace sub;
class foo {
const BAR = 'Hello World';
}
constant('foo::BAR'); // 错误
constant('sub\foo::BAR'); // 工作
?>
这似乎不影响用 'define' 函数定义的常量。除非常量名称字符串中隐式定义了其他命名空间,否则它们最终都会在根命名空间中定义。
// 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$
使用 constant() 和 define() 很容易翻译数据库保存中的某些词。
例如
您有一个名为 userprofil 的表,其中一列是 "gender"。
性别可以是男性或女性,但您将显示 "maennlich" 或 "weiblich"(德语单词 - 无论如何...)。
第一步:获取到 $Gender
第二步
define("male", "maennlich");
define("female", "weiblich");
第三步
echo constant($Gender);
现在,变量 $Gender 的索引将被视为常量!
(为了更好地理解,它就像 "echo male;" 一样工作。)
结果,它显示 maennlich btw. weiblich!
问候