Предлагаем вашему вниманию очередную подборку со ссылками на новости и материалы.

Приятного чтения!


Новости и релизы




PHP


  • RFC: Typed Properties — Предлагается реализовать типизированные свойства:
    class Foo {
      public int $int = 1;
      public float $flt = 2.2;
      public array $arr = [];
      public bool $bool = false;
      public string $string;
      public callable $callable;
      public stdClass $std;
      public OtherThing $other;
      public $mixed;
    }
    
  • Трекер PHP RFC — Ресурс агрегирует информацию по всем RFC, а также доступна статистика контрибьюторов.
  • php.internals: Add spaceship assignment operator — Ироничное сообщение от Никиты Попова по поводу предложений добавить операторы ??= и ?:=. Для консистентности Никита предлагает добавить еще следующие сокращенные операторы:
    $a <=>= $b;
    // эквивалентно
    $a = ($a <=> $b);
    
    $a ==== $b;
    // эквивалентно
    $a = ($a === $b);
    


Инструменты


  • Ocramius/PSR7Csrf — Генератор/валидатор CSRF-токенов на PSR-7 без хранилища данных.
  • ratchetphp/Pawl — Асинхронный WebSocket клиент.
  • spatie/menu — Генератор HTML меню. Пост в поддержку.
  • producerphp/producer.producer — CLI-инструмент для автоматизации процесса релиза PHP-пакетов. Пост от автора в поддержку.
  • Swader/nofw — Скелет приложения без фреймворков.
  • kelunik/acme-client — Сервис Let's Encrypt позволяет бесплатно генерировать подтвержденные SSL-сертификаты. По ссылке PHP-клиент для Let's Encrypt для тех кому не подходит оригинальный на Python. Пост об использовании.
  • sitepoint/Rauth — ACL для классов и методов на основе аннотаций. Туториал по использованию.
  • lcobucci/jwt — Простая библиотека для работы с JSON Web Token.
  • ptlis/conneg — Content Negotiation для PHP.
  • niklongstone/regex-reverse — Генерирует строку на основе регулярного выражения.
  • Fakerino/Fakerino — Генератор тестовых данных, альтернатива Faker.
  • jobbyphp/jobby — Продвинутый менеджер cron-задач.
  • Codeception/AspectMock 1.0 — Библиотека для создания тестовых двойников, позволяющая делать моки буквально для всего.
  • php-composter/php-composter — Управление Git-хуками с помощью Composer.


Материалы для обучения




Аудио и видеоматериалы




Занимательное




Спасибо за внимание!

Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.

Присылайте ссылки на интересные статьи или полезные инструменты, которых не было в PHP-Дайджестах, и ваше имя будет рядом с присланной ссылкой в выпуске.

Прислать ссылку
Быстрый поиск по всем дайджестам
< Предыдущий выпуск: PHP-Дайджест № 81

Комментарии (29)


  1. Borro
    28.03.2016 00:28

    1. pronskiy
      28.03.2016 09:54
      +11

      Сознательно не включил :-) RestAPI — явно из категории "вредные советы", а в посте про Битрикс типичный флейм.


  1. AleksDesker
    28.03.2016 06:33

    PhpStorm научился держать живым коннект, чтоб без пауз изменения на сервак заливать. Лет 5 сидел в Zend Studio 5.5 дожидаясь этой фичи.


    1. quantum
      28.03.2016 10:52
      +2

      А он же и раньше умел, нужно было открыть соединение в окошке "remote host", после этого file transfer использовал это соединение


      1. happyproff
        28.03.2016 19:36

        Этот воркэраунд работал только до десятой версии.


      1. AleksDesker
        28.03.2016 20:39

        Нет, раньше он этого не умел, ссылку ниже правильную дали: http://blog.jetbrains.com/phpstorm/2016/03/changes-to-remote-connection-keep-alive-in-phpstorm-2016-1/ Там правда были варианты со всякими костылями, типа создания туннеля с локали, но это уже не про PhpStorm.


    1. psFitz
      28.03.2016 18:26

      Вы про remote host? С 9 версии есть.


      1. happyproff
        28.03.2016 19:25

        А пишут, что это новая фича в 2016.1.


      1. happyproff
        28.03.2016 19:33

        Вот скрин из 9 версии:
        image

        А вот из 2016.1:
        image


  1. Yeah
    28.03.2016 14:13

    Честно говоря, так и не понял use case для использования генераторов случайных тестовых данных. А все примеры в Сети: просто констатация факта — вы можете использовать тестовые данные. Кто использовал Faker и иже с ними в реальных проектах? Поделитесь примером, когда это реально работает.


    1. ykushnir
      28.03.2016 18:27

      Клиенту гораздо приятнее и понятнее смотреть демо проекта, где будут более-менее осмысленные слова и выражения вместо lorem ipsum-ов и фраз вида «fwhufgw gregheur».


    1. alexkunin
      28.03.2016 18:54

      Допустим, вы делаете некую систему с клиентами, заказами, счетами. Пока у вас 3 тестовых клиента по одному заказу и счету — все хорошо. Как проверить нагрузку при 10К клиентов, у каждого по 30-40 счетов (примерно 3 года ежемесячных платежей), и т.д.? Или ваш проект принимает на вход JSON или CSV с дампом всех счетов и клиентов из такой системы — как сгенерировать тестовые данные?

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


      1. Yeah
        28.03.2016 23:44

        Ваш пример имеет право на жизнь, но честно говоря я ожидал немного иного примера. Обычно Faker приводится в контексте юнит-тестирования. Вот как это прикрутить к юнит-тестам, я понять не могу. Во всех примерах (тот же Laravel) обычно пишут, вот смотрите: вы можете создать модель User и заполнить ее реальными данными. Ну ок, и чё??? Получается, что никакие assertEquals не подходят, ибо данные сгенерированы случайно. То есть максимум, что я могу проверить — какую-нибудь логику валидации, что например я передал в setEmail корректный email или нет, что имя пользователя длиннее 5 символов или нет. Но только для такого применять здоровенную библиотеку… Не знаю, мутно как-то...


        1. alexkunin
          29.03.2016 00:09

          Эээ, может Mocker приводится в контексте юнит-тестов? Я тоже не могу придумать, где Faker и рандомные данные могут пригодится в тестировании, которое должно быть процессом детерминированным, т.е. вам нужно самому придумать такие входные данные, которые поведут проверяемый код по тому или другому пути, и таким образом образуется 100% code coverage. Ну, рандомом тоже можно покрыть 100% кода, просто это слишком затратно и никаких гарантий, что на слеюущий ран тестов опять 100% покроет, и ваше изменение не будет полностью проверено.


          1. Yeah
            29.03.2016 02:04

            Вот например Там есть код теста. Реально они тупо проверяют assertInstanceOf


            1. alexkunin
              29.03.2016 02:29
              +1

              Википедия (https://en.wikipedia.org/wiki/Mock_object#Mocks.2C_fakes_and_stubs) пишет, что в литературе эти три понятия — моки, фейки и стабы — постоянно перемешиваются, но смысл в том, что это три уровня «примерной реализации» реального объекта, который нужен как параметр в целях тестирования другого объекта. Кто-то из этих троих просто набор фиксированных свойств со значениями, кто-то даже какую-то логику может предоставлять, ну и кто-то посередине.

              Т.е. в приведенном вами примере просто смешаны Fake как элемент тестирования ("$fm->define('Message')->setDefinitions(...)" и «static::$fm = new FactoryMuffin();») и Faker как генератор случайных данных по шаблону («Faker::firstNameMale()» и т.д.). И именно Faker тут никак не нужен, на сколько я понимаю, т.к. данные не должны быть случайными.

              Т.е. я полностью разделяю ваше смущение. Но похоже, просто смешаны термины Fake (в смысле Mock/Stub) и Faker (в смысле генератор случайных данных по образцу).


            1. Big_Shark
              29.03.2016 07:00

              Там при вызове функции create и seed есть параметр $attr, который позволяет переопределить нужные нам данные, таким образом у нас объект валидный за счет того что все поля заполнены, и заполнены верно, а нужные нам поля мы можем без проблем изменить взяв их значение допустим из dataProvider.


        1. CyberSoft
          29.03.2016 22:21

          Нам, к примеру, потребовалось в Elasticsearch посмотреть сколько места будут занимать данные и как будут выполняться запросы. Конечно, реальных данных нам никто не даст, NDA, всё такое. Первый велосипед был быстро набросан в скрипте на php, примерно генерируя то, что нам нужно. После уже обнаружили esBench, который собирает инфу на реальных данных, а потом мы можем по готовым шаблонам залить данные и сделать оценку. Но какой-то он заброшенный… У php ещё есть шанс :) можно будет посмотреть предложенные в этой статье инструменты.


    1. Fesor
      29.03.2016 12:44

      Представьте что вы пишите тест (внезапно да), и у вам надо проверить как система обрабатывает какие-то данные. Данных много, а вам важны только 2-3 значения, все остальное — можно просто сгенерировать.
      У меня такие ситуации появляются чуть ли не каждый день.


      1. Yeah
        29.03.2016 15:54

        Извините, представить получается с трудом. Если система не работает с какими-то данными, то это мертвые данные — зачем они нужны? Если ваш тест не покрывает какую-то функциональность, а работа с такими данными ведется, то это неполный тест — толку от такого нет.


        1. Fesor
          29.03.2016 16:44

          толку от такого нет.

          Другую часть этих данных покрывает другой тест кейс, третью — третий. В рамках тест кейса обычно тестируются важные вещи, а такие вещи как "имя пользователя" или его день рождения можно сгенерить для правдоподобности.
          Если вам интересно реальное применение — вот:
          https://github.com/nelmio/alice


          1. Yeah
            29.03.2016 16:53

            Про эту либу слышал, сама по себе ссылка не приоткрывает завесу тайны, но пошел там по ссылкам и нашел-таки реальный пример!!! Так что спасибо за наводку


  1. alexkunin
    28.03.2016 18:27

    «Подсчет слов на различных языках программирования» (http://juditacs.github.io/2016/03/19/wordcount2.html?hello) — реализация на nodejs в 10 раз медленнее, чем на php 7 (и примерно в 5 раз медленнее, php 5.6). Неужели там все так плохо?? В код не вчитывался, просто пробежался — ничего особо страшного… Мне казалось, нода позиционируется как супер быстрая штука.


  1. adombrovsky
    29.03.2016 09:17
    +1

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


    1. alexkunin
      29.03.2016 17:00

      Упомянутые в статье assignment shapceship — это дичь какая-то, мы стремительно приближаемся к брейнфаку. Я решительно не могу придумать юз кейз для этих вот штук (привожу вариант «было», а не «хотелось бы».):

      $a = ($a <=> $b);
      $a = ($a ==== $b);

      Зачем так повторно использовать переменные? С большой вероятностью $a в результате меняет свой тип, поэтому и считаю дичью.

      А вот сам оператор <=> очень хорош, потому что заменяет целый кусок опостылевшего кода (а если на входе пара вызовов функций, то еще и промежуточные переменные вводить нужно):

      if ($a < $b) $c = -1;
      elseif ($b > $a) $c = 1;
      else $c = 0;


      1. Fesor
        29.03.2016 17:08
        +1

        Упомянутые в статье assignment shapceship — это дичь какая-то

        Собственно в этом и суть, и именно по этой причине Никита иронично отписался в php-internals.
        Зачем так повторно использовать переменные?

        Картинка про сарказм.


  1. Lebnik
    29.03.2016 13:55
    +1

    спасибо


  1. chilic
    29.03.2016 22:22
    +1

    Спасибо, как всегда есть что-то интересное.


  1. Alcogolic
    06.04.2016 00:19

    Ещё одна хорошая новость — 10 апреля выйдет драйвер PDO MSSQL для PHP7 https://github.com/Azure/msphpsql/issues/58