• 27829
  • 342
  • 28
Нравится блог?
Подписывайтесь!

Пробный пост про "магические" свойства объектов в PHP

Недавно был проект с "русскими" и ISO датами. Все время делали функциями, а тут я решила написать объект и использовать "магические" свойства (properties).

Дело, оказалось, не хитрое: есть 2 "магических" метода __get() и __set(). Вот пример (извините за кривое форматирование, редактор yvision мена победил :)):

 

 

class MyDate {       protected $date;        // UNIX timestamp
function __get($name) {
switch($name) {
case 'ru':
return gmdate('d/m/Y',$this->date);
case 'iso':
return gmdate('Y-m-d',$this->date);
}
}
function __set($name,$value) {
switch($name) {
/* DD/MM/YYYY или DD.MM.YYYY */
case 'ru':
if (preg_match('@^([0-9]+)(\.|/)([0-9]+)(\.|/)([0-9]+)$@', $value, $matches)) {
list($all,$day,$sep,$month,$sep,$year) = $matches;
$this->date = gmmktime(0, 0, 0, $month, $day, $year);
return $this->date;
}
return FALSE;
/* YYYY-MM-DD */
case 'iso':
$this->date = strtotime($value);
return $this->date;
}
return FALSE;
}
}
date_default_timezone_set('GMT');
$date = new MyDate;

/* 3 строки с одинаковым результатом: */
$date->ru = '14.02.2010';
$date->ru = '14/02/2010';
$date->iso = '2010-02-14';

$date->ru; // 14/02/2010
$date->iso; // 2010-02-14
?>

Комментов в коде не особено много, так-что дайте знать если нужны разъяснения.

Еще дайте знать если пост показался интересным, продолжу!

Мария Marion_Silver
14 февраля 2010, 17:34
759

Загрузка...
Loading...

Комментарии

ulan
0
0
продолжай. чем ты занимаешься?
IT в целом, программированием в частности :)
ulan
0
0
это основное место работы или хобби?
Это хобби, переросшее в профессиональное :)
это просто отличная ситуация
t-sh
0
0
неплохо-таки :), но от русских дат вообще лучше отказываться начинать :)
tulgha
0
0
Точна... И от американских тоже. Я, как правило, пишу в формате 2010-02-14. И да, кстати, настоящий ISO должен выглядеть как 2010-02-14T03:41:12
Софт он-же для людей, как им удобнее, так и надо время показывать. По поводу ISO, по-моему 2010-02-14T03:41:12 - это время, а - это дата.
Тем не менее, 2010-02-14 формат ГОСТ Р 6.30-2003
можно поинтересоваться, что это дает в общем?)
Rex
0
0
Пример выбран не самый удачный. Даты удобно хранить в штампе времени, в int. И приводить их к нужному формату при непосредственном выводе. Это даст большую универсальность и меньше граблей.
По поводу геттеров и сеттеров - удобно их использовать в реализации конфигурационного файла, когда конфигурация загружается из массива/файла/или еще откуда-то и все это потом как бы собирается в объект. У Zend-а так было с ней, кстати.
Согласна в PHP удобнее int–ом. Так, собственно, и сделано (в самом начале: protected $date; // UNIX timestamp). С другой стороны, например в MySQL, тип DATE в формате YYYY-MM-DD а TIMESTAMP, YYYY-MM-DD HH:MM:SS - соответственно надо переводить.

Помимо конфигурации, "магия" часто используется в Object-to-Relational библиотеках - но из них пример короткий сложно замутить.
Rex
0
0
мм ну почему же :) Тот же пример из конфига зенда, где магический геттер берет по ключу из ассоциативного массива значение :) Не сложно :) вот :

function __get($name){
return isset($data[$name]) ? $data[$name] : null;
}

где $data это наш массив с ключами. А в купе с тем же синглтоном вообще все вкусно получается :) ну и потом при обращении $inst->try_this будет искаться ключ try_this в массиве $data и возвращаться его значение. А если же мы еще и добавим немного воображения и рекурсии то можно получить возможность таких обращений - $inst->try_this->try_in_try и т.д. :) Живой пример - Config::getInstance()->db->host, который возвращает хост базы данных. Как то так :)
Рекурсия интересно выглядит :)
ну когда как, вообще лучше с ней бороться и не использовать ее :)
Rex
0
0
кстати, в mysql я не пользуюсь TIMESTAMP и DATE, храню тоже в int. Как то так пошло..:) Хотя timestamp было бы удобнее - установив зону можно получать сразу свое время.
7kun
0
0
>решила написать объект
Написать класс. Объект в терминологии ООП — это экземпляр класса.
А в остальном — молодец.
Спасибо за коррекцию :)

Оставьте свой комментарий

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

Нет ничего более вдохновляющего, чем видеть стада сайгаков. Не зря их называют «киелі»

Нет ничего более вдохновляющего, чем видеть стада сайгаков. Не зря их называют «киелі»

В начале 2000-х годов в уральской популяции оставалось только 2500 сайгаков. Сейчас благодаря охране от браконьеров их численность выросла до 100 тысяч.
theYakov
17 июля 2017 / 17:55
  • 8611
  • 3
Ресторанный консенсус в Казахстане: мужчина платит всегда

Ресторанный консенсус в Казахстане: мужчина платит всегда

Ресторанный консенсус в этой стране таков, что если речь идет именно о свидании, то оплачивает его на 100% из 100 именно мужчина. Пытаться его расшатать - это достаточно дорогое удовольствие.
convoluted
17 июля 2017 / 15:32
Решили рискнуть и обратиться к риэлторам. И этим людям мы доверяем свой ночлег?

Решили рискнуть и обратиться к риэлторам. И этим людям мы доверяем свой ночлег?

Звоним риэлтору, говорим, верните наши 15 000 тг, так как ваша клиентка нас кинула. По его словам, он вернуть деньги больше не может. Не имеет право.
decorus
17 июля 2017 / 14:48
  • 3033
  • 15
Польша – страна простых решений. Почему они смогли, а мы еще нет?

Польша – страна простых решений. Почему они смогли, а мы еще нет?

В Польше вообще очень много понятного и простого – инфраструктура, коммуникации и дороги прежде всего, льготы в образовании, поляки вообще получают его бесплатно. А урожай побольше нашего.
Shimanskaya
17 июля 2017 / 16:08
  • 3178
  • 37
Один из способов выиграть суд против коллекторов

Один из способов выиграть суд против коллекторов

Сегодня в своем посте я постараюсь рассказать, как выиграть суд против некоторых коллекторских компании в нашей стране. Чем отличается коллекторское агенство от обычного банка?
Advokot
18 июля 2017 / 15:31
  • 2595
  • 9
«Язык мой – враг мой», или 7 причин никогда не разговаривать с полицией

«Язык мой – враг мой», или 7 причин никогда не разговаривать с полицией

На этот раз пост очень важный и необходим к прочтению каждым! Не поленитесь и уделите время прочтению. Ни в коем случае, не разговаривайте с полицейскими до прихода вашего адвоката!
asselsabekova
18 июля 2017 / 14:19
  • 2681
  • 31
«Алматы – город, летящий под откос», или Кто заказал утку у российского блогера

«Алматы – город, летящий под откос», или Кто заказал утку у российского блогера

Некий блогер Сергей Никитский неустанно пишет о Казахстане, Астане, Экспо и посвящает два материала Алматы, причём подчёркнуто называет город Алма-Ата.
Langdon
19 июля 2017 / 15:44
  • 2480
  • 50
Госорганы, ответственные за жизни детей, хранят молчание. У них в отчетах все хорошо

Госорганы, ответственные за жизни детей, хранят молчание. У них в отчетах все хорошо

Вчера все информационные агентства страны передали сообщение, которое заставило забиться в ужасе сердца всех матерей страны. В мусорном контейнере города Сатпаев было обнаружено тело новорожденной девочки.
AliyaSadyrbaeva
19 июля 2017 / 11:06
  • 2059
  • 17
Книга, которая сэкономит вам 150 тысяч долларов и два года жизни

Книга, которая сэкономит вам 150 тысяч долларов и два года жизни

Автор утверждает, что программы МБА не дают никакого позитивного выхлопа, если ты уже не являешься владельцем или наследником прибыльного бизнеса. Знания МБА можно получить бесплатно, уверяет он.
Aks_Ras
19 июля 2017 / 16:28
  • 2113
  • 2