我想以最佳方式检查PHP中定义的常量

我想以最佳方式检查PHP中定义的常量,php,constants,Php,Constants,在PHP中,根据您的错误报告级别,如果您没有定义一个常量,然后像这样调用它: <?= MESSAGE ?> 它可能打印常量的名称而不是值 所以,我编写了下面的函数来解决这个问题,但是我想知道您是否知道一种用更快的代码实现它的方法?我的意思是,当我在没有这个函数的情况下进行速度测试时,我可以在.0073秒内定义并转储500个常量。但是使用下面的这个函数,它会切换到0.0159到0.0238秒之间的任何位置。因此,最好将微秒降到尽可能小的程度。为什么?因为我想用这个做模板。我认为应

在PHP中,根据您的错误报告级别,如果您没有定义一个常量,然后像这样调用它:

<?= MESSAGE ?>

它可能打印常量的名称而不是值

所以,我编写了下面的函数来解决这个问题,但是我想知道您是否知道一种用更快的代码实现它的方法?我的意思是,当我在没有这个函数的情况下进行速度测试时,我可以在.0073秒内定义并转储500个常量。但是使用下面的这个函数,它会切换到0.0159到0.0238秒之间的任何位置。因此,最好将微秒降到尽可能小的程度。为什么?因为我想用这个做模板。我认为应该有更好的方法,而不是用我想显示的每个变量来切换错误报告

function C($constant) {
    $nPrev1 = error_reporting(E_ALL);
    $sPrev2 = ini_set('display_errors', '0');
    $sTest = defined($constant) ? 'defined' : 'not defined';
    $oTest = (object) error_get_last();
    error_reporting($nPrev1);
    ini_set('display_errors', $sPrev2);
    if (strpos($oTest->message, 'undefined constant')>0) {
        return '';
    } else {
        return $constant;
    }
}

<?= C(MESSAGE) ?>
函数C($constant){
$nPrev1=错误报告(E_全部);
$sPrev2=ini_集('display_errors','0');
$sTest=已定义($constant)?“已定义”:“未定义”;
$oTest=(对象)错误_get_last();
错误报告($nPrev1);
ini_集('display_errors',$sPrev2);
如果(strpos($oTest->message,'undefined constant')>0){
返回“”;
}否则{
返回$constant;
}
}
试试看

如果(isset(常量($constant))。。。
这不会触发任何E_通知消息,因此您不必设置和重置错误报告。

只要您不介意在常量上使用引号,您可以执行以下操作:

function C($constant) {
    return defined($constant) ? constant($constant) : 'Undefined';
}

echo C('MESSAGE') . '<br />';

define('MESSAGE', 'test');

echo C('MESSAGE') . '<br />';
函数C($constant){
返回定义($constant)?constant($constant):“未定义”;
}
回音C('MESSAGE')。
; 定义(‘消息’、‘测试’); 回音C('MESSAGE')。
输出:

未定义

试验


否则,如果不抓住使用未定义常量引发的注意,就没有办法解决此问题。

如果运行该代码(哦,并在末尾添加另一个参数),则会出现错误“无法在写入上下文中使用函数返回值”,并抱怨常量($constant)函数直接传递给isset()。您可以更简单地使用“@”运算符关闭错误报告,但在内部它也会执行相同的操作,因此速度仍然非常慢。如果未定义消息,则肯定无法执行此操作,那么在您到达函数C()和C()之前,将生成通知我想真正的问题是为什么使用常量而不定义它们?根本的想法是:修复代码,使其不会抛出任何错误或通知。使用错误抑制仅作为最后手段。
function C($constant) {
    return defined($constant) ? constant($constant) : 'Undefined';
}

echo C('MESSAGE') . '<br />';

define('MESSAGE', 'test');

echo C('MESSAGE') . '<br />';