// Из доков:
echo new Month(Month::June); // выведет: 6
// Тот же самый результат:
echo Month::June;
Получается, смысл только в валидации входных значений:
// Но мне проще написать:
if ( ! array_key_exists(13, My_Date::$months)) {
echo 'Error!';
}
// чем писать это:
try {
new Month(13);
} catch (UnexpectedValueException $uve) {
echo $uve->getMessage();
}
Чем же SplEnum лучше? Мне кажется, чем проще, тем лучше. Простые нативные массивы лучше чем класс, который никак не упрощает работу.
Если строго следовать этой логике, то вообще все переменные должны быть закрытыми + куча геттеров.
И это правильно.
Но иногда, встречаются исключения из правил. Я показал такое исключение, которое ко всему прочему, оказалось статическим членом.
вы бы легко впилили туда перевод
Этого не надо делать ни в коем случае! В справочнике могут быть ключевые слова. Например, они могут фигурировать в БД в ENUM полях. Да и перепиливать базовые классы под проект — это не хорошо.
Если вдруг моё приложение станет мультиязычным, то переводом я буду заниматься на совсем другом уровне. Там где происходит вывод:
Это немного сложнее, но правильнее. Это MVC-принципы. Перевод относится именно к «V».
Например, потом вам понадобится сделать API к вашему сайту. А у вас все справочники локализованы и API будет постоянно выдавать месяца на разных языках. Как клиентское ПО будет с этим работать?
Я только хотел сказать, что в статье показана одна сторона медали и практически не освещена другая. Я привёл конкретные примеры противоречащие утверждениям автора:
это не дает никаких преимуществ
даёт.
Вам придется жестко привязаться к
Я хочу, чтобы в моей системе был один справочник в одном месте => мне приходится привязываться к этому месту. Вы можете изобретать сложные механизмы, например, хранить справочник в отдельном файле или в БД или просто в атрибуте объекта, но зачем?
Но Вы же и философию из этого не делаете, верно?
Делаю. В некоторых случаях нельзя делать статические члены класса; в некоторых случаях это необходимо. Автор статьи плохо описал случаи в которых это необходимо. Я попытался дополнить.
P.S.> В качестве примера можете посмотреть в Zend Framework. Они не брезгуют использовать статические члены класса. Просто они грамотно их используют и это не создаёт лишних зависимостей и не мешает тестированию.
Отличная статья и отличный перевод. Заплюсовал.
Однако, некоторые утверждения кажутся мне странными.
это не дает никаких преимуществ по сравнению с процедурным программированием
Если несколько функций можно как-то сгруппировать по тематике, то я их группирую в один статический класс:
<?php
class My_Math {
public static function fibonachi($n) {
return ...;
}
public static function getK($m, $n) {
return ceil(($m / $n) * log(2));
}
}
Преимущества от этого следующие:
Вместо одного огромного файла functions.php, функции раскиданы по нескольким файлам и их легко найти
Работает autoload. Класс Math загрузится только тогда когда мне понадобится
Статические свойства никогда не должны быть доступны снаружи
Почему бы и нет?
<?php
class My_Date {
// Пусть в моей системе будет только один справочник со списком месяцев
public static $months = array('Январь', 'Февраль', ...);
// Сделал бы его константой класса, но константы не могут быть массивами :(
}
Статические свойства существуют, по большей части, как техника оптимизации, они не должны рассматриваться как философия программирования.
Как насчёт этого?
<?php
class My_Pager {
// Каждый экземпляр должен знать свой порядковый номер, что бы генерить уникальные ссылки
protected $_num = 0;
// Но как же его посчитать автоматически?
// А вот как:
protected static $_cntPagers = 0;
public function __construct()
{
$this->_num = self::$_cntPagers++;
}
}
Итог: статические члены классов, это неотъемлемый инструмент, которым надо уметь правильно пользоваться, не создавая лишних зависимостей.
Никто не заявлял, что Биг-Бази это выгодно. Это подавали под соусом, что им проще вложить деньги в саморекламу, чем отдать рекламные бюджеты телевизионщикам/радионщикам и прочим СМИ… Вполне правдоподобно. Кстати, я ещё клал себе на телефон 200 рублей оплачивая только 100. Это тоже не вписывалось в законы экономики, но это работало.
Год назад я отлично сходил в выходной вечер поиграл в боулинг за 130 рублей (цена обычной аренды в это же время 1300р). Сделал химчистку авто за 1500р. (обычная цена 6000р.).
Меня ни разу не обманули. Что я сделал не правильно? Кстати, покупал у БигБаззи.
Есть там приложене «Б», которое определяет «шрифт букв, разрешённых для использования на регистрационных знаках». Перевёрнутый номер не будет соответствовать этому требованию.
Раньше опыты были интереснее. А теперь повторение школьной программы естествознания пятого класса.
Спирали вращаются от тёплого воздуха — зашибись!
Металл растягивается от температуры — круто!!!
Воздух расширяется при нагревании — уау!!!
Получается, смысл только в валидации входных значений:
Чем же SplEnum лучше? Мне кажется, чем проще, тем лучше. Простые нативные массивы лучше чем класс, который никак не упрощает работу.
И это правильно.
Но иногда, встречаются исключения из правил. Я показал такое исключение, которое ко всему прочему, оказалось статическим членом.
Этого не надо делать ни в коем случае! В справочнике могут быть ключевые слова. Например, они могут фигурировать в БД в ENUM полях. Да и перепиливать базовые классы под проект — это не хорошо.
Если вдруг моё приложение станет мультиязычным, то переводом я буду заниматься на совсем другом уровне. Там где происходит вывод:
Это немного сложнее, но правильнее. Это MVC-принципы. Перевод относится именно к «V».
Например, потом вам понадобится сделать API к вашему сайту. А у вас все справочники локализованы и API будет постоянно выдавать месяца на разных языках. Как клиентское ПО будет с этим работать?
даёт.
Я хочу, чтобы в моей системе был один справочник в одном месте => мне приходится привязываться к этому месту. Вы можете изобретать сложные механизмы, например, хранить справочник в отдельном файле или в БД или просто в атрибуте объекта, но зачем?
Делаю. В некоторых случаях нельзя делать статические члены класса; в некоторых случаях это необходимо. Автор статьи плохо описал случаи в которых это необходимо. Я попытался дополнить.
P.S.> В качестве примера можете посмотреть в Zend Framework. Они не брезгуют использовать статические члены класса. Просто они грамотно их используют и это не создаёт лишних зависимостей и не мешает тестированию.
Однако, некоторые утверждения кажутся мне странными.
Если несколько функций можно как-то сгруппировать по тематике, то я их группирую в один статический класс:
Преимущества от этого следующие:
Почему бы и нет?
Как насчёт этого?
Итог: статические члены классов, это неотъемлемый инструмент, которым надо уметь правильно пользоваться, не создавая лишних зависимостей.
Меня ни разу не обманули. Что я сделал не правильно? Кстати, покупал у БигБаззи.
Смысл Highload iblocks как раз в том, что бы обойти тормозное iblock-api. А вы просто сделали (не доделали) новое АПИ. В чём смысл?
Спирали вращаются от тёплого воздуха — зашибись!
Металл растягивается от температуры — круто!!!
Воздух расширяется при нагревании — уау!!!
Так не подойдёт?