• 27450
  • 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
746

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

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

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

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

Многие клиенты, вздыхая о харамном ссудном проценте местных банков, сокрушались по поводу отсутствия у нас халяльного кредитования. Поддержка исламского банкинга на уровне МФЦА есть...
DanaJarlygapova
24 марта 2017 / 18:28
  • 21902
  • 63
Рианна за $2 млн. Очередные понты от «ЭКСПО-2017»

Рианна за $2 млн. Очередные понты от «ЭКСПО-2017»

Концерт Рианны всё-таки состоится летом в рамках культурно-зрелищных и спортивных мероприятий ЭКСПО-2017. Рианна крута, с этим никто не спорит. Но соберёт ли «Астана Арена» 30 тысяч зрителей при...
openqazaqstan
29 марта 2017 / 14:29
  • 18719
  • 15
КТЖ подарило iPhone мошеннику за краденную фотографию

КТЖ подарило iPhone мошеннику за краденную фотографию

Украл в супермаркете — отправился в полицию. Украл фотографию — выиграл новенький iPhone 7 от КТЖ. Вот такая нехитрая получается история. Огромное спасибо Тамерлану Жумабекову, который обратил моё...
andche
вчера / 0:06
  • 12027
  • 22
Компания LG Electronics открыла предзаказ на новый флагман LG G6

Компания LG Electronics открыла предзаказ на новый флагман LG G6

LG Electronics объявляет о начале предварительного заказа онлайн на новый смартфон LG G6. Оформить предзаказ можно на сайтах магазинов электроники до 16 апреля 2017 года.
LG Electronics
24 марта 2017 / 14:20
  • 5263
  • 0
Страну, где так строят дороги, победить невозможно!

Страну, где так строят дороги, победить невозможно!

Шестиминутный ролик про строительство автомобильной дороги в США - это как острый нож в пузо нашим чиновникам. Они же подавятся бешбармаком, увидев его! Похлеще любого пропагандистского фильма...
Timur_Tregulov
24 марта 2017 / 11:26
  • 5129
  • 41
Димаш, Головкин, Есентаева... О героях нашего времени – истинных и «картонных»

Димаш, Головкин, Есентаева... О героях нашего времени – истинных и «картонных»

В прессе, в соцсетях, на ТВ, во всём информационном пространстве Казахстана –заразная эпидемия. Что сказал Головкин, что съела Есентаева, что китайцы подарили Димашу...
openqazaqstan
вчера / 15:54
  • 3864
  • 21
Почему наши парни выглядят как агашки? Хочется им сообщить, что мода на пафос прошла

Почему наши парни выглядят как агашки? Хочется им сообщить, что мода на пафос прошла

Когда уже люди смогут самоутверждаться за счет своего интеллекта, энергии, познаний и настоящей красоты, а не за счет авторитетного вида и не менее авторитетного дяди?
Bookenova_smartass
28 марта 2017 / 18:28
  • 4250
  • 91
Это вам не Дисней. Реальный прототип «Красавицы и Чудовища»

Это вам не Дисней. Реальный прототип «Красавицы и Чудовища»

Многие уверенны на 100%, что сказка «Красавица и Чудовище» - это интересная выдумка ее создателей. Однако, действия, происходящие в мультфильме и фильме, имели место в истории, и у главных героев...
Naomi_K
24 марта 2017 / 18:42
  • 5088
  • 36
Семь причин почему вам надо перестать откладывать переезд за границу

Семь причин почему вам надо перестать откладывать переезд за границу

Вы думаете о переезде за границу, но постоянно откладываете дату, потому что вас беспокоит тысяча мелочей, которые могут пойти не так? У меня есть семь причин, почему пора перестать мотать нервы...
Lesch
24 марта 2017 / 17:50
  • 4058
  • 14