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 [12038 просмотров]