Случается, когда вы пытаетесь получить доступ к массиву с помощью ключа, который не существует в массиве.
Типичным примером для уведомления Undefined Index
будет ( demo )
$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];
Оба spinach
и 1
не существуют в массив, вызывающий запуск E_NOTICE
.
Решение состоит в том, чтобы убедиться, что индекс или смещение существуют до доступа к этому индексу. Это может означать, что вам необходимо исправить ошибку в вашей программе, чтобы убедиться, что эти индексы существуют, когда вы ожидаете их. Или это может означать, что вам нужно проверить, существуют ли индексы с помощью array_key_exists
или isset
:
$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
echo $data['spinach'];
}
else {
echo 'No key spinach in array';
}
Если у вас есть код например:
, тогда $_POST['message']
не будет установлена, когда эта страница будет загружена первой, и вы получите указанную выше ошибку. Только когда форма будет отправлена и этот код будет запущен во второй раз, будет существовать индекс массива. Вы обычно проверяете это с помощью:
if ($_POST) .. // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') .. // page was requested with POST
Вопросы, относящиеся:
System.currentTimeMillis()
, очевидно, большинство эффективный , так как это даже не создает объект, но new Date()
действительно просто тонкая обертка о длинном, таким образом, это не далеко позади. Calendar
, с другой стороны, является относительно медленным и очень сложным, так как это должно иметь дело со значительно сложность и все причуды, которые свойственны к датам и времени (високосные годы, переход на летнее время, часовые пояса, и т.д.).
Это - обычно хорошая идея иметь дело только с долгими метками времени или Date
объекты в рамках Вашего приложения, и только использовать Calendar
, когда на самом деле необходимо выполнить вычисления даты/времени, или отформатировать даты отображения их пользователю. Если необходимо сделать многое из этого, с помощью , Время Joda является, вероятно, хорошей идеей для более чистой интерфейсной и лучшей производительности.
Рассмотрение JDK, у самого внутреннего конструктора для Calendar.getInstance()
есть это:
public GregorianCalendar(TimeZone zone, Locale aLocale) {
super(zone, aLocale);
gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
setTimeInMillis(System.currentTimeMillis());
}
, таким образом, это уже автоматически делает то, что Вы предлагаете. Конструктор по умолчанию даты содержит это:
public Date() {
this(System.currentTimeMillis());
}
, Таким образом, действительно нет потребности получить системное время конкретно, если Вы не хотите сделать некоторую математику с ним прежде, чем создать Ваш объект Календаря/Даты с ним. Также я действительно должен рекомендовать joda-разовый использовать в качестве замены для собственных классов календаря/даты Java, если Ваша цель состоит в том, чтобы работать с вычислениями даты много.
Если Вы ИСПОЛЬЗУЕТЕ дату тогда, я настоятельно рекомендую использовать jodatime, http://joda-time.sourceforge.net/ . Используя System.currentTimeMillis()
для полей, которые являются , даты походят на очень плохую идею, потому что Вы закончите с большим количеством бесполезного кода.
И дата и календарь серьезно borked, и Календарь является определенно худшим исполнителем их всех.
я советовал бы Вам использовать System.currentTimeMillis()
, когда Вы на самом деле действуете с миллисекундами, например, как это
long start = System.currentTimeMillis();
.... do something ...
long elapsed = System.currentTimeMillis() -start;
Я предпочитаю использовать значение, возвращенное System.currentTimeMillis()
для всех видов вычислений, и только использую Calendar
или Date
, если я должен действительно отобразить значение, которое читается людьми. Это также предотвратит 99% Ваших ошибок летнего времени.:)
В зависимости от Вашего приложения можно хотеть рассмотреть использование System.nanoTime()
вместо этого.