Я хочу оптимально проверить определенные константы в PHP - PullRequest
1 голос
/ 01 декабря 2008

В PHP, в зависимости от уровня сообщения об ошибках, если вы не определили константу, а затем назвали ее так:

<?= MESSAGE ?>

Может выводить имя константы вместо значения!

Итак, я написал следующую функцию, чтобы обойти эту проблему, но я хотел знать, знаете ли вы способ сделать это в более быстром коде? Я имею в виду, что когда я проводил тест скорости без этой функции, я могу определить и вывести 500 констант за 0,0073 секунды. Но используйте эту функцию ниже, и она переключается от 0,0159 до 0,0388 секунд. Таким образом, было бы здорово уменьшить микросекунды до минимума. И почему? Потому что я хочу использовать это для шаблонов. Я думаю, что просто должен быть лучший способ, чем переключать отчеты об ошибках с каждой переменной, которую я хочу отобразить.

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) ?>

Ответы [ 2 ]

5 голосов
/ 01 декабря 2008

Пока вы не возражаете против использования кавычек для своих констант, вы можете сделать это:

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

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

define('MESSAGE', 'test');

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

Выход:

Не определено

тест

В противном случае, нет способа обойти это без перехвата уведомления, выданного с помощью неопределенной константы.

0 голосов
/ 01 декабря 2008

попробуй

if (isset(constant($constant)) ...

Это не должно вызывать никаких сообщений E_NOTICE, поэтому вам не нужно устанавливать и сбрасывать error_reporting.

...