БлогNot. PHP: доброе время суток :)

PHP: доброе время суток :)

Приём пошленький, но популярный - программно пожелать юзеру "Доброго утра" или "Доброй ночи" в зависимости от того, что сейчас на сервере. Вообще-то, логичней получать клиентское время яваскриптом, но ведь часы юзера тоже могут быть сбиты... так что для уменьшения пошлости будем выводить приветствие вместе с текущим временем, как-то вот так:

У нас 05:41, доброе утро

К сожалению, даже для столь простой задачи кусочки кода, приводимые в инете, в основном кошмарны - вроде создания 4 переменных, хранения текстов приветствий отдельно от времени, в которое они действуют и т.п.

Не создавая отдельного класса, я бы написал простейший код для приветствия, зависящего от времени суток, примерно так (код приведён без "обрамления" HTML):

<?php
 @date_default_timezone_set(date_default_timezone_get());
  //Или поставьте свою временную зону во внешних скобках, например, 'Asia/Novosibirsk'
 list ($hours,$minutes) = explode(':',date("H:i"));
 $times=array('доброй ночи'=>3,'доброе утро'=>10,'добрый день'=>16,'добрый вечер'=>22);
  //Тексты и границы часа, до которого включительно действует приветствие
 $message=array_shift(array_keys($times)); //По умолчанию всегда ночь :)
 foreach ($times as $msg=>$hour) if ($hours<=$hour) { $message=$msg; break; }
 echo "У нас $hours:$minutes, $message";
?>

 Скрипт в работе

P.S. С версии PHP 5.4.0 ряд настроек PHP снова "устрожился" даже по отношению к 5.3.0. В частности, E_STRICT стало частью E_ALL. Соответственно, при настройке

error_reporting(E_STRICT);

скрипт может выдать предупреждение

Strict Standards: Only variables should be passed by reference in ***/goodtimes.php on line **

на строку

$message=array_shift(array_keys($times));

Пути решения этой и любой подобной проблемы:

1. Поставить директиву

error_reporting(E_ERROR);

первым оператором кода.

2. Не делать этого, но засобачить конкретно "опасные" операторы, то есть, в нашем случае, изменить строку на

$message=array_shift(@array_keys($times));

3. Просит "by reference" - дать ему "by reference", то есть, разбить действие на два:

$keys = array_keys($times); $message=array_shift($keys);

Что делать, раз любой нормальный, в том числе и код, теперь подозрителен :) Почему так? А вот из стандарта:

По ссылке можно передавать:

Переменные, например foo($a)

Оператор new, например foo(new foobar())

Ссылки, возвращаемые функцией, например:

<?php
function foo(&$var)
{
    $var++;
}
function &bar()
{
    $a = 5;
    return $a;
}
foo(bar());
?>

Любое другое выражение не должно передаваться по ссылке, так как результат не определён.

P.P.S и ответ на вопрос читателя: если нужно выводить приветствие в зависимости не от серверного, а от некоего местного времени, которое от серверного отличается, проще всего сделать так:

  • завести в скрипте настройку, показывающую на сколько минут со знаком "+" или "-" местное время отличается от серверного (минут - потому что существуют территории, где разница во времени с Гринвичем не составляет целого количества часов), например, так:
    define ('SERVER_TIME','240');
  • функции date вторым параметром передать значение time()+SERVER_TIME*60, которое и сформирует нужную нам отметку времени.

Например, если мой сервер "живёт" по московскому времени, а я хочу приветствовать посетителей по-новосибирскому (+4 часа от Москвы с 24.07.2016), получится такой код:

<?php
 define ('SERVER_TIME','240');
 error_reporting(E_ERROR);
 @date_default_timezone_set(date_default_timezone_get());
 list ($hours,$minutes) = explode(':',date("H:i",time()+SERVER_TIME*60));
 $times=array('доброй ночи'=>3,'доброе утро'=>10,'добрый день'=>16,'добрый вечер'=>22);
 $message=array_shift(array_keys($times));
 foreach ($times as $msg=>$hour) if ($hours<=$hour) { $message=$msg; break; }
 echo "В Новосибирске $hours:$minutes, $message";
?>

 Скрипт в работе

28.05.2013, 12:38 [11900 просмотров]


теги: программирование ошибка php время

показать комментарии (1)