Pull to refresh

Comments 24

>>Проблема заключалась в следующем. Необходимо реализовать функцию
>>Решение проблемы состоит в том, чтобы реализовать абстрактный класс

Лично мне кажется, что тут какая-то надуманная проблема и излишне усложненное ее решение, которое может сломать мозг многим.
Чуть не сломал пока пытался понять что могло натолкнуть на описанное в статье решение
Наталкивает все одно и то же — статический анализ, строгая типизация, все это позволяет существенно уменьшить число ошибок.

Но приведенная реализация какая-то странная. Если уж так хочется типизировать перечисления, явно нагляднее писать:
test( new Data(Data::ID) );

И собственно, это уже реализовано SplEnum.
>>Наталкивает все одно и то же — статический анализ, строгая типизация, все это позволяет существенно уменьшить число ошибок.
Наврятли автора натолкнуло это. Обратите внимание — он определенную проблему решает «Необходимо реализовать функцию», т.е. не проблему где нужно придумать определенную структуру данных и абстракции для описания определенных бизнес процессов, а именно «реализовать функцию». Скорее всего он в php пришел недавно, у него есть в голове определенные патерны решения проблем — тут он ищет что-то похожее, если не находит дописывает сам. И как раз этим он тут делится. Но его подход как раз количество вероятных ошибок в данном случае совсем не уменьшает, а наоборот.
Может вы конечно говорите про другую статью, но в этой статье автор определенно решает проблему типизации о чем и пишет неоднократно.
Иногда в коде приходится использовать строго типизированные параметры, однако сам язык PHP не является строго типизированным (как, например, C#, в котором присутствует такой тип данных, как перечисления – Enum).

Необходимо реализовать функцию, которая бы на вход принимала строго типизированный объект (класс),


Вполне логично, для примера использования типизированного перечисления использовать функцию (собственно, это и будет основным способом использования).
SplEnum версия всего лишь 0.1.0, а так же ставится оно из PECL.
Нет никакой уверености в поддержке этого дополнения.
Так что использовать в продакшене я бы не стал.
Вообще-то такие вещи лучше наследованием реализовывать. Data_ID extends Data и Data_String extends Data. И в каждом определить метод get_type().
Либо я туго вечером соображаю, либо… Чем вам не угодили стандартные is_int и is_string?
Вы изобрели php.net/SplEnum, я правильно понимаю?

И, да,
> Лично мне кажется, что тут какая-то надуманная проблема
Вот что бывает, когда «программисты» не читают документацию по языку, который используют.
Ждем решения для реализации стека, очереди и строк-объектов.

P.S. Ну и конечно же, как в любом уважающем себя фреймворке, свой stdClass
Это не часть языка, а его расширение. Для кого-нибудь это может быть проблемой.
Не расширение а стандартная библиотека. Она есть всегда.
И документация по ней объединена с документацией по языку. Как можно было пропустить — для меня загадка.
Боюсь что у людей, настройка окружения у которых вызывает проблемы, нету такой уж большой необходимости в enum.
Это расширение.

PHP Manual > Function Reference > Other Basic Extensions > SPL Types
http://ru2.php.net/manual/en/class.splenum.php

Не всегда есть возможность устанавливать расширения — например на shared хостинге. Хотя согласен — реализация странная.
Только сейчас заметил, кстати.
А зачем в этом классе реализован синглтон? Да еще и криво реализован, через self?
Это действительно странно и значение хранится не в объекте, а статической переменной.
Ошибка не в этом, а в том что self::$instance, а не static::$instance
Хотя всё равно криво, конечно.
Мне вот только не понятно, почему тот пост в плюсах, а этот в минусе?
Мне кажется лучше уже было бы вместо

switch ((string)$data) {


Вызывать явно

switch ($data->toString()) {


Так интуитивно понятнее.
Sign up to leave a comment.

Articles