#php #constants #php4
#php #константы #php4
Вопрос:
В настоящее время я программирую веб-сайт (на PHP4). Я планирую сохранять значения, которые не меняются во время выполнения, в константах. Это, например, номер версии данных для входа в базу данных.
Вопрос 1: существуют ли какие-либо проблемы (связанные с безопасностью), которые могут возникнуть при сохранении данных в константах?
На данный момент я делаю следующее, чтобы определить и вызвать константу:
define("VERSION", "1.0");
echo "Current version: ".VERSION."."; // Result: "Current version: 1.0."
Есть одна вещь, которая меня раздражает: в случае, если константа не определена, вместо, например, NULL
, возвращается «неправильное» имя переменной.
define("VERSION", "1.0");
echo "Current version: ".VERSIONXXX."."; // Result: "Current version: VERSIONXXX."
Одно из решений, которое я нашел, чтобы получать сообщение об ошибке и возвращаемое значение «NULL», когда я случайно ввел неправильное имя константы, — это использование функции constant()
:
define("VERSION", "1.0");
echo "Current version: ".constant("VERSIONXXX")."."; // Result: "Current version: ."
Вопрос 2: Могу ли я предотвратить другим способом, что PHP возвращает имя несуществующей переменной?
Вопрос 3: Всегда ли значение константы в PHP должно возвращаться с помощью функции constant()
?
Комментарии:
1. Есть ли какая-либо причина, по которой вы остаетесь на PHP4, который больше не активен?
Ответ №1:
-
Если вы пытаетесь использовать константу, которая не существует, PHP автоматически предполагает, что это строка, поэтому вы видите
VERSIONXXX
. -
IIRC выдает предупреждение, если сообщение об ошибке находится на соответствующем уровне. Лучшее решение здесь — убедиться, что ваш код использует правильные имена констант.
-
Если вы знаете имя константы, проще всего использовать ее напрямую.
echo MY_CONSTANT
Если вы не знаете имя константы (например, ее имя находится в переменной), используйтеconstant()
:
$name = 'MY_CONSTANT'; константа echo ($name);
Ответ №2:
В обратном порядке:
Вопрос 3: Нет Вопрос 2: Не совсем, но вы можете внести коррективы.
из-за (вопрос 1:) сообщения об ошибке. Ваш веб-сервер PHP настроен скрывать некоторые ошибки. Если вы добавите
error_reporting(E_ALL);
в заголовке скриптов вы получите
Использование неопределенной константы MY_CONST — предполагается ‘MY_CONST’
Ошибка. К сожалению, это проблема, вытекающая из долгой истории PHP, что константы могут интерпретироваться как строки.
Если вы не уверены, что константа была установлена в первую очередь, вы можете использовать defined
if(defined('MY_CONSTANT') {
//do something
}
Но, по моему личному мнению, не должно быть много случаев, когда это необходимо, поскольку само слово constant подразумевает гарантированное присутствие. Единственное исключение, которое я могу придумать, — это типичный тест заголовка.
if(!defined('MY_APP_IS_PRESENT')) {
die('You can not call this file on its own, please use index.php.');
}
И последний совет: пойдите и создайте себе функцию обработки ошибок, может быть, даже с помощью firephp?
Ответ №3:
Ну, вы всегда можете использовать defined
функцию, чтобы убедиться, что константа существует. В сочетании с троичным оператором вы могли бы просто повторить пустую строку, что-то вроде:
echo defined( VERSION ) ? VERSION : "";
Не лучший ответ, но работоспособный?
Руководство по PHP для defined()
находится по адресу http://php.net/manual/en/function.defined.php