PHP-константа не существует - PullRequest
3 голосов
/ 31 января 2009

Я бы хотел использовать константы в качестве переменных конфигурации в моих PHP-приложениях, только когда константа не существует (по какой-либо причине), она выдаёт мне уведомление, но я бы хотел, чтобы это было ошибкой (или исключением) так же, как когда я пытаюсь отобразить несуществующую переменную.

Возможно ли это без использования отдельной функции для получения постоянных значений, как-то так:

echo $non_existing_variable; // Error
echo NON_EXISTING_CONSTANT; // Now also an error

Немного искал, но ничего не смог найти.

Мне кажется это логичным, когда я пытаюсь использовать переменную, которая не существует, выполнение кода немедленно завершается и выдает ошибку, почему не с константами?

Ответы [ 6 ]

11 голосов
/ 31 января 2009

Я бы предложил использовать определено с ним, вы должны быть в состоянии сделать что-то вроде

if (defined('CONSTANT')) {
    echo CONSTANT;
} else {
    throw new Exception('Undefined Constant.');
}

Edit:

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

2 голосов
/ 01 февраля 2009

Вы можете написать свой собственный обработчик ошибок. Больше информации здесь:

http://php.net/manual/en/errorfunc.examples.php

http://www.w3schools.com/php/php_error.asp

2 голосов
/ 01 февраля 2009

Вы можете создать пользовательский обработчик ошибок , который будет

  1. Проверьте, не была ли ошибка Уведомлением
  2. Проверьте, содержит ли строка ошибки «Неопределенная константа класса»
  3. Если так по обоим пунктам, бросьте свое исключение

Это даст вам то, что вы хотите. Проблема с этим подходом заключается в том, что теперь вы отвечаете за обработку ВСЕХ ошибок. Обработка ошибок PHP будет полностью обойдена.

Другой подход заключается в определении класса конфигурации и использовании его констант

class Config{
    const CONFIG_ONE = 42;
}
//will produce a fatal error 
if(Config::CONFIG_TWO){
   //...
}

Вместо уведомления вы получите фатальную ошибку, которая кажется более правильной. К сожалению, вы не можете поймать фатальные ошибки без подобных шуток (см. Комментарии в set_error_handler записи руководства).

Последний вариант, который находится далеко от проторенного пути, с которого мы начали, - это создание синглтона конфигурации с переменными частного класса, хранящими ваши значения. Это дает вам полный программный контроль над тем, что происходит, когда кто-то пытается получить доступ к неопределенному значению конфигурации, но вы теряете преимущества констант.

1 голос
/ 01 февраля 2009

Я бы посоветовал вам установить обработчик ошибок, который превращает все ошибки (независимо от уровня) в исключения. В вашем коде не должно быть ошибок, будь то предупреждения или уведомления.

См .: обработка ошибок-как-исключений-лучших-методов

0 голосов
/ 31 января 2009

Да, я знаю об определенной функции, но каждый раз проверять, существует ли константа, это большая работа, поэтому я ищу какую-то настройку php или трюк без использования дополнительной функции для автоматического генерирования ошибки или исключения вместо уведомления, когда константа не существует.

Мне кажется, что это логично, когда я пытаюсь использовать переменную, которая не существует, выполнение кода немедленно завершается и выдает ошибку, почему не с константами?

Спасибо, пока (-:

0 голосов
/ 31 января 2009

Используйте функцию defined , чтобы проверить, существует ли константа с данным именем.

...