• Ваш пакет Composer сломан: обновите идентификатор лицензии

      image


      Если вы, как и я:


      • являетесь мэйнтейнером какой-либо библиотеки или фреймворка;
      • ваша библиотека или фреймворк выпущены под какой-либо свободной лицензией
      • ваша библиотека или фреймворк доступны к установке через Composer и размещены на сервисе Packagist;

      то у вас, возможно, есть проблемы, о которых вы и не подозреваете.

      Загляните под кат, чтобы узнать, что нужно сделать уже сегодня!
    • Готовимся к собеседованию по PHP: Всё, что вы хотели узнать об интерфейсах, совместимости сигнатур и не побоялись узнать

      • Tutorial
      imageИнтерфейсы, впервые появившись в PHP 5, давно уже заняли прочное место в объектно-ориентированной (или всё-таки правильнее «класс-ориентированной»?) части языка.

      Казалось бы — что может быть проще интерфейса? "Как бы класс, но и не класс, нельзя создать экземпляр, скорее контракт для будущих классов, содержит в себе заголовки публичных методов" — не правда ли, именно такими словами вы чаще всего отвечаете на собеседовании на дежурный вопрос о том, что такое интерфейс?

      Однако не всё так просто, как может показаться начинающему программисту на PHP. Привычные аналогии не работают, руководство по языку вводит вас в заблуждение, в коде таятся неожиданные «подводные камни»…

      Три предыдущие части:

      Проверьте себя: всё ли вы знаете об интерфейсах в PHP?
    • «Runn Me!» — говорит нам очередной фреймворк* на PHP. А слышится «Throw Me!». Часть 2

        * вообще говоря это пока еще не фреймворк, а просто набор библиотек, фреймворком он станет чуть позже


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

        Сегодня мы продолжаем путешествие в бездонную глубину библиотеки runn/core будущего фреймворка «Runn Me!». Под катом нам встретятся следующие обитатели бездны:

        • Концепция «мультиисключения» и ее реализация в библиотеке
        • Понятие объекта с внутренней валидацией и эталонная реализация такого объекта
        • Немного заглянем в мир валидаторов и санитайзеров (подробный рассказ о них будет позже)
        • Рассмотрим реализацию объекта с обязательными полями

        Вперед!
      • Уточка говорит «кря-кря», коровка говорит «му-му», «Runn Me!» — говорит нам очередной фреймворк* на PHP. Часть 1

          «О нет!», воскликнет читатель, утомлённый разными мини-микро-слим-фреймворками и QueryBuilder-ами и будет прав.

          Нет ничего скучнее, чем очередной фреймворк на PHP. Разве что «принципиально новая» CMS или новый дейтинг.



          Так зачем же я с упорством, достойным лучшего применения, шагаю по неудобным подводным камням и выставляю на потеху публике суд товарищей своё творение? Заранее зная, что гнев критиков, как мощное цунами обрушится на этот пост и похоронит его на самом днище Хабра?

          Не знаю. Как не знал в своё время Колумб, зачем он отплывает от уютных берегов Испании. Надеялся ли он найти путь в Индию? Конечно да. Но не знал точно — доплывёт ли?

          Видимо и у программистов на PHP, к которым я вот уже 13 лет себя причисляю, есть такая же внутренняя потребность — выставлять свой код и зажмуривать глаза, ожидая реакции коллег.

          Что вас ждет под катом?

          • Открытый исходный код, лицензия LGPL
          • Код, полностью совместимый с PHP 7.0-7.2
          • 100% покрытие юнит-тестами
          • Библиотеки, проверенные временем в реальных проектах (и только проклятая прокрастинация мешала мне опубликовать их ранее!)

          Ну и, разумеется, история изобретения очередного велосипеда на костыльном приводе фреймворка*!

          * вообще говоря это пока еще не фреймворк, а просто набор библиотек, фреймворком он станет чуть позже

          Вперед!
        • Готовимся к собеседованию по PHP: Всё об итерации и немного про псевдотип «iterable»

          • Tutorial
          Не секрет, что на собеседованиях любят задавать каверзные вопросы. Не всегда адекватные, не всегда имеющие отношение к реальности, но факт остается фактом — задают. Конечно, вопрос вопросу рознь, и иногда вопрос, на первый взгляд кажущийся вам дурацким, на самом деле направлен на проверку того, насколько хорошо вы знаете язык, на котором пишете.

          И, разумеется, какими бы вам странными и некорректными ни казались вопросы на собеседовании, приходить нужно всё-таки подготовленным, зная тот язык, за программирование на котором вам собираются платить.

          image

          Третья часть серии статей посвящена одному из самых объемных понятий в современном PHP — итерации, итераторам и итерируемым сущностям. Я постарался свести в один текст некий минимум знаний об этом вопросе, пригодный для самоподготовки к собеседованию на позицию разработчика на PHP.

          Две предыдущие части:


          Добро пожаловать под кат!
        • О том, как мы на PHP запускали настоящий MS Excel и что из этого вышло

            Не секрет, что зачастую PHP-программистам приходится решать задачи, весьма далёкие от бытового представления о «веб-разработке». Развитие языка в последние годы привело к тому, что PHP всё чаще считают языком общего назначения, пригодным не только для сайтов, но и для других задач.

            Одну из таких «других» задач мне с коллективом пришлось решать совсем недавно. Мы решили поделиться «картой граблей» с теми, кто, возможно, пойдет по этому же пути.

            Дано


            • Многие наши партнёры (скажем прямо — это крупные банки) любят считать что-то в Excel. Причем «любят» — это очень нежно сказано. Сложнейшие скоринговые модели могут быть «запрограммированы» в Excel, в файле из сотни листов с десятками макросов
            • Перевести «программы», написанные в Excel на какой-либо язык программирования — практически нереально. Это займет уйму времени, а проблема постоянного обновления и проверки корректности делает такую задачу и вовсе нерешаемой


            Требуется


            • Основная информационная система нашей компании написана на PHP. Она содержит в себе как веб-интерфейсы, так и множество консольных сервисов и воркеров.
            • С этими «программами» в Excel нужно как-то взаимодействовать из консольных приложений на PHP — передавать в них данные, обсчитывать, получать результаты

            Некоторое время нам хватало возможностей популярной библиотеки PHPExcel. Но когда от бизнеса поступило очередное требование «нужно, чтобы работали макросы, и еще бы хорошо всё это сохранять в PDF», стало понятно, что выбранный путь — тупиковый. Нужно не парсить файлы xlsx, не имитировать просчёт, и даже не использовать Open Office, а научиться взаимодействовать с «настоящим» Microsoft Excel.


            Что из этого вышло - под катом
          • Обновление PHP до 7.0.6 может «сломать» ваш код

              Внимание! Будьте осторожны при обновлении PHP до версии 7.0.6! В этой версии был исправлено несколько важных багов, на которые мог неявно полагаться ваш код или код вашего фреймворка.

              PHP bugs

              Под катом тестовый пример кода, описание изменений и рекомендации, что же делать
            • Мультиисключение или Хочу поделиться одним интересным архитектурным приемом

                Мне никогда не нравилась в фреймворках на PHP работа с ошибками. И даже употребление этого слова не нравилось. Чтобы сразу уточнить — я не про фатальные ошибки, не про error_reporting, я про то, что называют ошибками валидации. То в моделях, то в формах — это уж от фреймворка зависит.

                Вы только гляньте. Вот например Yii и Yii2, получение ошибок валидации модели:
                $errors = $model->getErrors();
                

                Symfony, ошибки формы:
                $errors = $form->getErrors();
                

                Активно рекламирующийся Pixie (давненько про него ничего не было):
                $result = $validator->validate($data);
                $errors = $result->errors();
                


                Что тут не так?
                Да всё. Всё не так. Весь этот код очень дурно пахнет, он пахнет временами PHP4, спагетти-архитектурой и диким смешением понятий.

                Что же делать?

                Читать дальше →
              • Готовимся к собеседованию по PHP: псевдотип «callable»

                • Tutorial
                Не секрет, что на собеседованиях любят задавать каверзные вопросы. Не всегда адекватные, не всегда имеющие отношение к реальности, но факт остается фактом — задают. Конечно, вопрос вопросу рознь, и иногда вопрос, на первый взгляд кажущийся вам дурацким, на самом деле направлен на проверку того, насколько хорошо вы знаете язык, на котором пишете.
                image
                Вторая часть серии статей посвящена одному из самых сложных и объемных вопросов о современном PHP — что такое «callable»? Я постарался свести в один текст некий минимум знаний об этом вопросе.
                Подробный разбор неочевидных мест мануала - под катом
              • Готовимся к собеседованию по PHP: ключевое слово «static»

                • Tutorial
                Не секрет, что на собеседованиях любят задавать каверзные вопросы. Не всегда адекватные, не всегда имеющие отношение к реальности, но факт остается фактом — задают. Конечно, вопрос вопросу рознь, и иногда вопрос, на первый взгляд кажущийся вам дурацким, на самом деле направлен на проверку того, насколько хорошо вы знаете язык, на котором пишете.

                image

                Попробуем разобрать «по косточкам» один из таких вопросов — что значит слово «static» в PHP и зачем оно применяется?
                Подробности, цитаты из мануала, стандартов и личного опыта - под катом
              • Не мамонт ли Вы? (пятничный тест; который ложь, да в ней намек)

                  PHP развивается стремительно. И сам язык, и его реализация, и, особенно, сообщество. PHP перестаёт быть языком для быстрого клепания сайтиков и всё больше движется в сторону языка общего назначения, хотя путь этот будет долог — слишком много врожденных недостатков тянется с доисторических времён.

                  Как грибы растут стандарты, фреймворки, развивается и становится всё слаще синтаксис, растут разнообразные инструменты.

                  И это здорово!

                  Не совсем здорово то, что мы с вами, обычные разработчики, в массе своей всё больше отстаём от стремительного потока. История знает аналогичный пример — мамонты тоже отстали от стремительно меняющейся среды. И вымерли. Ну, или, по другой гипотезе — были съедены своими конкурентами за экологическую нишу — людьми. Неважно. Конец бедных гигантов в любом случае был печален.

                  image

                  Попробуйте пройти несложный тест и определить — не мамонт ли Вы в мире PHP? Не грозит ли Вам, как специалисту, вымирание в ближайшее время?

                  Тест, разумеется, пятничный и шуточный. Но в нём всё-таки есть доля истины.
                  Проверить степень своего оволосения и размер бивней
                • Простая публикация геоданных на собственной карте на базе 2ГИС

                    Недавно передо мной встала интересная задача — отображать на сайте карту, с различными объектами, причем этих объектов могут быть десятки и сотни, а управлять ими должен уметь любой менеджер ниже среднего звена.

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

                    Для реализации задумки была выбрана связка Google Docs и API картографического сервиса 2ГИС. Решение получилось действительно простым, в духе знаменитых «30 строк» :)
                    Читать дальше →
                    • +20
                    • 21,7k
                    • 5
                  • Заметки об архитектуре или Интерпретатор Forth на PHP 5.3

                      О чем пойдет речь?


                      Мне очень часто приходится проводить собеседования, нанимая на работу PHP-программистов. 2-3 человека в день — это вполне нормально, хотя и на грани выносливости.

                      Все кандидаты разные, кто-то просто великолепен, кто-то похуже. Но у тех, кто похуже, всегда одни и те же ошибки.

                      Во-первых они совершенно не интересуются развитием языка, на котором пишут, и вопрос «А что нового в PHP 5.3» ставит их в тупик, а уж предложение порассуждать на тему «Чтобы Вы добавили в будущие версии языка» — просто пугает.

                      Во-вторых они категорически не представляют, что PHP может быть хоть чем-то кроме «скриптов для сайтов». Особенно печально это в свете того, что на работе им придется заниматься далеко не сайтами и даже скорее всего не сайтами.

                      Ну и в третьих кандидаты, которые похуже, с трудом представляют себе процесс построения архитектуры программы. Паттерны — знают, и много, а вот как из паттернов сложить целостную систему, чтобы за нее не было мучительно стыдно — это уже с трудом.

                      Таким кандидатам и посвящается этот топик. С уважением к их нелегкой доле (а быть программистом на самом деле непросто) и с надеждой, что он подтолкнет их вперед по пути самосовершенствования.

                      Что мы будем делать?

                      Давайте попробуем сделать интерпретатор Форта на PHP!

                      Форт меня всегда манил, как далекая галактика из антиматерии. Стек, слова в словаре, обратная польская нотация… Это только кажется сложным, но на самом деле очень просто, зато здорово «просветляет» и расширяет кругозор.

                      Давайте сделаем наше приложение консольным, никаких браузеров и серверов. Давайте писать его на PHP 5.3, стараясь использовать язык на 100%. И, конечно же, попробуем изначально сделать так, чтобы пришедшие после нас не повесились от нашего кода в первый же день.
                      Читать дальше →
                    • Возможно, баг в PHP, возможно фича…

                        … а возможно — баг у меня в уставшей к вечеру голове -))

                        Пробуйте на PHP 5.3.1, версию 5.3.2 не успел проверить.

                        Простейший код:
                        abstract class First {

                        function init() {
                        echo static::DIR;
                        }

                        }

                        class Second extends First {

                        const DIR = 'test';

                        }

                        Second::init(); //ожидаем "test"


                        Запускаем, вполне ожидаемо получаем «test». Что и логично. Используем появившуюся недавно возможность LSB, все работает корректно.

                        ОК, добавим еще немного кода:
                        Читать дальше →
                      • «Беларусь», «Молдова» и прочие чудовища спящего разума

                          Поскольку нехорошо все-таки загаживать тематический топик филологическим срачем, есть предложение продолжить его в моем личном блоге.

                          Поводом к написанию этого топика послужил тот факт, что в пространстве русского языка внезапно (примерно 20 лет назад) появились национализированные географические слова (предлагаю сократить до НГС), такие как «Беларусь», «Молдова», «Кыргызстан», «Таллинн» и так далее.

                          В принципе ничего странного и страшного в этом нет, процесс появления НГС совпал с очередной итерацией обновления языка, в свою очередь вызванной радикальными политическими и общественными переменами. Но в генезисе НГС есть и особенности, отличающие их других пластов лексики, таких, например, как компьютерный сленг.
                          Читать дальше →
                        • Ярославские колдоёбины

                            Проект "Колдоёбина.РУ", о котором я писал в предыдущем посте, внезапно, что называется «пошел». И пошел неплохо.

                            — Добавили центр Ярославля
                            — Получили миллион ценных советов по развитию сервиса
                            — Скоро откроем еще пару городов

                            И даже получили пожертвование в размере $5 на развитие!

                            Следите за новостями, как говорится.

                            P.S. Я пока не готов писать это в «Я пиарюсь». Перфекционизм, знаете ли…
                          • Колдоёбина.РУ

                              Запустили небольшой, но интересный проект на Ronny CMSKoldoёbina.ru

                              Суть проста — сервис оценки проезжести дорог. Для регионов это очень ценно и актуально, зачастую в незнакомом городе невозможно ездить по карте, не зная заранее, есть ли асфальт на данной улице, или проехать по ней можно только на танке.

                              Технически все очень просто — Ronny CMS как основа, несколько текстовых страниц, модуль на основе Яндекс.Карт, на карты накладываются отрезки, к ним — голосование и комментарии.

                              Этот сайт — по сути зачетная работа одного моего «студента» (программиста-стажера), он ее успешно сдал.

                              Не хочу выкладывать в «Я пиарюсь», поскольку пока еще не уверен в том, что это всем интересно, но отметить в персональном блоге — можно.
                            • Провайдеры, абоненты и забавные случаи

                                Тут на днях дома почти сутки не было интернета от Корбины, она же нынче Билайн. Сразу оговорюсь — к Билайну никаких претензий, форс-мажор признали, компенсировали полностью.

                                Но в этой истории есть несколько забавных моментов:
                                Читать дальше →
                              • Скупые строчки новостей

                                  news.mail.ru/incident/3541131
                                  lenta.ru/news/2010/03/20/dead
                                  www.vesti.ru/doc.html?id=348419

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

                                  Начальник. Полковник. Суббота… Он не отсиделся дома, он честно и до конца исполнил свой долг. Я считаю, что он — герой. И не просто герой, а Герой России.

                                  Что можем сделать мы, простые сисадмины, программисты, девелоперы, SEOшники, ITшники?

                                  Написать:
                                  Президенту — letters.kremlin.ru
                                  в Государственную Думу — www.duma.gov.ru/letter_pr.html
                                  в Общественную Палату — ip.oprf.ru/treatments/send
                                  обращение с просьбой присвоить Евгению Чернышеву звание Героя России. Посмертно.

                                  P.S. Опыт общения с государственным органами и их представителями показывает, что таких людей — исчезающе малое количество. Поэтому новость лично меня глубоко потрясла. Я не верил, что такие еще есть.
                                • SGVsbG8gd29ybGQh или история base64

                                    Краткая предыстория


                                    Вообще, все началось давно. Настолько давно, что вряд ли остались свидетели holy wars тех дней, когда решалось — сколько же бит должно быть в байте.

                                    Это сейчас нам кажется само собой разумеющимся, что 1 байт = 8 бит, что в байте можно закодировать 256 различных значений. Но когда-то было совсем не так. История помнит и семибитные кодировки, и шестибитные, и даже более экзотические системы (например — ЭВМ «Сетунь», которая использовала троичную логику, то есть один троичный бит — трит мог иметь три, а не два значения, для нее было справедливо соотношение 1 трайт = 6 тритам). Но если оставить в стороне всякую экзотику, то мэйнстримом все-таки были кодировки, в которых 6, 7 или 8 бит в байте.

                                    Шестибитная кодировка (например — BCD) позволяла закодировать в одном байте 64 различных значения, что, как казалось, было вполне достаточно для кодирования алфавитно-цифровых символов, а «лишний» седьмой бит расширял кодировку уже до 128 символов.

                                    Однако скоро восьмибитный байт стал общепринятым.
                                    Читать дальше →