Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 7.2.0, Symfony 4 и другие релизы, предложение из PHP Internals, материалы по фреймворкам, асинхронный PHP, порция полезных инструментов, и многое другое. Приятного чтения!
Новости и релизы
- PHP 7.2.0 — Долгожданный мажорный релиз PHP доставлен строго по расписанию. 236 коммитеров и 4456 коммитов. Спасибо всем контрибьюторам и релиз-менеджерам за проделанную работу! В свежей версии интерпретатора улучшена производительность, а также ряд других улучшений:
- Новый тип object
- Криптографическая библиотека Sodium в ядре
- Хеширование пароля с помощью Argon2
- Эмуляции подготовленных выражений
- Расширение типа параметра
- Множество функций объявлены устаревшими
> Полный список изменений
Подробнее о том, как установить PHP 7.2 на различных ОС. - Symfony 4 — Не просто обновление, а переосмысленный фреймворк.
- Автоматическая установка пакетов с помощью Symfony Flex
- Авторегистрируемы и автоподключаемые сервисы
- Микрофреймворк из коробки: Symfony 4 приложение на 70% меньше, чем Symfony 3
- Webpack Encore для работы с фронтендом
- И множество других улучшений
- Доступен PhpStorm 2017.3
- PSR-15 Server Request Handlers — Стандарт обработчиков запросов и middleware перешел в стадию ревью.
- PHP 7.0.26
- PHP 7.1.12
- Symfony Moscow Meetup #14 — Пройдет 14 декабря в гостях у компании Rambler&Co
PHP Internals
- RFC: Explicit call-site pass-by-reference — Отличное предложение от Никиты Попова. На данный момент тот факт, что функция принимает аргумент по ссылке обозначается только в определении самой функции:
function inc(&$num) { $num++; } $i = 0; inc($i); var_dump($i); // int(1)
Предлагается сделать возможным явное указание передачи по ссылке. Тем самым предупреждая разработчика о том, что переданная переменная изменится:
function inc(&$num) { $num++; } $i = 0; inc(&$i); var_dump($i); // int(1)
Инструменты
- yiisoft/di — Экспериментальный независимый от фреймворка и совместимый с PSR-11 DI-контейнер и инжектор от команды Yii.
- PHPStan 0.9 — Отличный статический анализатор для PHP. Подробнее о релизе 0.9 в посте автора. Онлайн-песочница для проверки кода.
- Indatus/trucker — Пакет для использования удаленных ресурсов API (обычно RESTful) как моделей в стиле ActiveResource.
- coraxster/flysystem-owncloud, coraxster/flysystem-aws-s3-v3-minio — Пара провайдеров для Flysystem: Owncloud и Minio соответственно. Прислал corax.
- acelot/automapper — Автомаппер данных для PHP 7. Прислал eee.
- javibravo/simpleue — Простая очередь и воркеры с поддержкой AWS SQS, Redis, Beanstalkd в качестве бэкенда.
- rectorphp/rector — Инструмент для обновления ваших приложений на основе AST.
- apioo/fusio — Открытая платформа управления API на PHP.
- TinyLara/TinyLara — Простой микрофреймворк.
- arvenil/ninja-mutex — Реализация мьютекса для PHP с поддержкой различных адаптеров (flock, memcache, mysql, redis, ...).
Материалы
Symfony
- Symfony 3.4.0 — Список новых возможностей.
- Будущий релиз Symfony 4.0 и проект с использованием Symfony Flex
- Обзор Symfony 4
- Добавляем GraphQL API в приложение Symfony Flex
- Неймспейсы и организация сервисов бизнес-логики в Symfony
- krlove/async-service-call-bundle — Бандл позволяет вызывать методы сервисов приложения асинхронно в фоновом php-процессе. Прислал Андрей Мищенко
- wouterj/WouterJEloquentBundle — Интегрирует Eloquent ORM из Laravel в Symfony
- Неделя Symfony #569 (20-26 ноября 2017)
- Неделя Symfony #570 (27 ноября — 3 декабря 2017)
- Неделя Symfony #571 (4-10 декабря 2017)
Yii
- Yii PHP Framework принял AMQP Interop — В официальный компонент Yii для работы с очередями yiisoft/yii2-queue добавлена поддержка queue-interop/amqp-interop, что означает автоматическую поддержку многих AMPQ-пакетов. Первый шаг на пути к стандартизации работы с очередями между фреймворками.
- Павел Климов: «Ф’Yii’лософия»
- Павел Климов: «Yii: миграции и инсталляции»
Laravel
- Конвертер SQL-запроса в синтаксис Laravel Query Builder
- jarektkaczyk/eloquence — Полезные расширения для Eloquent ORM.
- Создание собственных PHP функций в Laravel проекте
Zend
Async PHP
- Роман Пронский: «Асинхронный PHP» — Обзорный доклад от меня.
- ReactPHP PromiseStream: О конвертации промиса в стрим и наоборот
- Создание клиента для Memcached на ReactPHP: юнит-тестирование промисов
- Расширение дочерних процессов для ReactPHP
- Введение в промисы ReactPHP
CMS
- Месяц WordPress: ноябрь 2017
- Magento Tech Digest #7 — News, Tutorials and Tools (November 14 — December 4, 2017)
- Найди уязвимость в PHP-коде — Каждый день декабря публикуется небольшой кусок кода с уязвимостью и подробным объяснением.
- Как читать большие файлы на PHP
- Тюнинг PHP-FPM с использованием 'pm static'
- Оптимизация markdown-парсера с помощью Blackfire.io
- Opensource нам строить и жить помогает: интервью разработчика Yii Framework Александра Макарова
- Selenium Manager: история одного интерфейса
- Архитектура сервиса сбора и классификации объявлений жилья из Вконтакте
- Конструктор XML-строки из PHP-массива
- Ещё один Telegram-бот для видеонаблюдения
- Регулярные выражения для самых маленьких
Занимательное
- Переход с PHP на GO... и обратно
- Хорошая иллюстрация принципа KISS
Спасибо за внимание!
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.
Прислать ссылку
Поиск ссылок по всем дайджестам
< Предыдущий выпуск: PHP-Дайджест № 120
Комментарии (25)
arturpanteleev
11.12.2017 11:23Не могу понять зачем ввели тип
object
. Все равно когда нам нужно, гарантировать определенное поведение объекта мы делаем тайпхинт через интерфейс. А что по сути начит object — хоть что лишь бы не скаляр, массив, null и ресурс. Какое может быть у этого практическое применение?iit
11.12.2017 12:14могу предположить все что is_object($var) — а где пригодиться?
пока думаю только прокси объекты — которым важно что через них был передан какой-либо объект, лишь бы только объект
Что касается массива — думаю объекты описывающие интерфейсы массива все-таки пройдут
symbix
11.12.2017 12:19Навскидку:
$request = json_decode($requestBody); process($request); // function process(object $request)
ilyaplot
11.12.2017 12:32Получается, еще один stdClass?
symbix
11.12.2017 13:04\stdClass — это исторически такая затычка для вопроса "что делать, если массив прикастили к object". Object же — это любой объект.
Согласен, что пример с json_decode не очень. Приведу пример получше — универсальные ORM, которые способны работать с Plain PHP Objects через Reflection, типа Doctrine 2.
ilyaplot
11.12.2017 15:30Почему то я думал, что все объекты в PHP наследуют stdClass. Как же сильно я заблуждался. В таком случае Object — это то, что действительно давно пора было добавить в язык.
Fesor
11.12.2017 13:09Какое может быть у этого практическое применение?
$container->get(SomeObject::class); // object $entityManager->find($id); // object | null
по сути это нужно там, где вы делаете проверку на
is_object
и вас не интересует все остальное. Далее статический анализатор уже может убедиться в том что там на самом деле будет какой-то объект, а не строка. Это просто чуть сужает количество вариантов того что вы можете получить. Еще выгодно для чего-то что на рефлексии завязано например, где конкретный тип вам не интересен, а важно что это именно объект.symbix
11.12.2017 13:10Вот, кстати, на подобных примерах хочется еще раз пустить слезу по поводу отсутствия в PHP Generics. :-)
Aptop
11.12.2017 13:15+1Любой контейнер зависимостей. Сервис локатор. Гидратор. В ОРМ найдется применение
VolCh
11.12.2017 15:36Технически тип object заменяет в некоторых случаях сообщения типа
Call to a member function <method>() on <non-object-type>)
наArgument 1 passed to <method>() must be an object, <non-object-type> given.
или выброс исключений при проверках типаif (!is_object($param)) throw new Exception('$param must be object')
. Если таких ошибок у вас не встречается, то он вам особо и не нужен, да. Но на моей практике, это один из самых (если не самый) распростаненных типов рантайм ошибок в синтаксически правильном коде. Есть надежда, что синтаксические анализаторы теперь будут лучше ошибки такого плана выявлять.
Eugeny1987
ведь раньше так и писали
Fesor
семантика отличалась. До php 5.4 вы таким образом передавали явно ссылку. Причем даже если функция собиралась по значению работать, так же можно было ссылку передать. Сейчас вы получите ошибку "call-time pass-by-reference". Предлагаю чуть поменять семантику — что бы указание на стороне вызывающего явной ссылки никак не влияло на рантайм и только на читабельность.
symbix
Да, формально семантика отличалась, но фактически вменяемые разработчики использовали именно так, как предлагается в нынешнем RFC. Когда вышел 5.4, я сильно недоумевал такому решению и, матерясь, вычищал амперсанды в вызовах по всему коду (благо, такого было немного).
Sayonji
Т. е. предлагают грубо говоря добавить еще один вид комментириев? Обоснование в RFC есть такое:
По мне это лучше, чем deceptively different
Fesor
скорее опциональную возможность визуально отмечать как была передана переменная. По ссылке или по значению. То есть на рантайм это никак не повлияет, и если функция не принимала ссылки волшебным образом, как это было до 5.4 то добавление этой метки выкинет ошибку.
Sayonji
Я в таких случаях представляю, как кто-то, кого я учу php, спросит у меня: а что делает амперсанд перед аргументом функции? А мне придётся сказать: ничего не делает.
Gemorroj
если функция принимает аргумент не по ссылке, то на такой код должно ругнуться.
доп. защита от описок.
VolCh
Показывает, что переменная передаётся по ссылке. Явное лучше неявного и всё такое.
Sayonji
Я был бы за, если бы альтернативный синтаксис запретили. Хотя бы notice. Я видел, что в rfc говорится о том, что потом планируют и это предложить, вот в этом случае будет явное вместо неявного. Но сама по себе эта фича, на мой взгляд, просто внесёт путаницу.
VolCh
Думаю, можно надеяться, что в статанализаторах и даже линтерах такой нотайс быстро появится.
Sayonji
Хм, вы правы. По моей логике получается, что наличие override в джаве плохо. Если ide будут подсвечивать пропущенный амперсанд, то полезная фича. Благословляю, можно принимать RFC :)
artspb
Будут, куда денутся ;)