Свежая и последняя в этом году подборка со ссылками на новости и материалы. В выпуске: пара свежих предложений из PHP Internals, полезные инструменты, материалы по фреймворкам и асинхронному PHP и другое.
С наступающим Новым годом! Приятного чтения.
Новости и релизы
PHP Internals
- RFC: Scalar Pseudo-type — Предлагается добавить псевдотип
scalar
для тайпхинтинга любых скалярных значений:
function f(scalar $param) { echo "{$param}\n"; }
- RFC: Namespace-scoped declares — Предлагается сделать возможным установку директив интерпретатора для целых пространств имен, а не только для каждого файла. Такая возможность позволит добавлять и гибко использовать другие директивы, контролирующие поведение интерпретатора:
// bootstrap.php namespace_declare('Vendor\Lib', [ 'strict_types' => 1, ... ]);
Инструменты
- atk4/data — ORM, в которой реализована оригинальная модификация паттерна Data Mapper. Подробнее о том, что не так с другими ORM, и чем хороша эта в посте автора.
- myclabs/DeepCopy — Позволяет создавать глубокие копии объектов.
- mikeerickson/phpunit-pretty-result-printer — Расширение для PHPUnit выводит результаты в красивом сгруппированном виде:
Материалы для обучения
Symfony
- Как управлять переводами в Symfony?
- Symfony Flex Private Recipes: создание, настройка и использование
- Неделя Symfony #572 (11-17 декабря 2017)
- Неделя Symfony #573 (18-24 декабря 2017)
Yii
- Yii 2.1 и заморозка Yii 2.0
- Yii development notes #18
- LUYA 1.0 — Первый релиз мощной CMS.
- dmirogin/fakemodel — Инструмент для удобной генерации моделей с тестовыми данными. Прислал dmirogin.
Laravel
- Отложенные задачи и очереди на Laravel
- Vanilo — E-commerce фреймворк на базе Laravel.
- Расширение моделей в Eloquent ORM
Zend
Async PHP
- react/http v0.8.0 — Массивное обновление HTTP-сервера на ReactPHP. Поддержка PSR-7, и долгожданная полноценная поддержка загрузки файлов. Последнее позволит в полной мере использовать php-pm для запуска демонизированных приложений.
- О реализации Middleware для ReactPHP HTTP Server
- voryx/WebSocketMiddleware — WebSocket Middleware для react/http.
- amphp/parallel-functions — Набор функций для параллельного исполнения кода на базе компонента amphp/parallel без дополнительных расширений:
use function Amp\ParallelFunctions\parallelMap; use function Amp\Promise\wait; $responses = wait(parallelMap([ 'https://google.com/', 'https://github.com/', 'https://stackoverflow.com/', ], function ($url) { return file_get_contents($url); }));
- Пишем PSR-7 фреймворк: Структура и работа с HTTP, Контроллеры и маршрутизация
- Бенчмарки AMQP-клиентов для PHP
- VS Code в качестве редактора PHP
- Как анализировать тональность твитов с помощью машинного обучения на PHP
- Как прочитать большой файл средствами PHP (не грохнув при этом сервак)
- Управление зависимостями в PHP
- Руководство по написанию защищённых PHP-приложений в 2018-м
Занимательное
- Забавные головоломки на PHP
- symfony/thanks — Поблагодарите авторов библиотек и фреймворков, которыми вы пользуетесь, с помощью этого инструмента:
Спасибо за внимание!
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.
Прислать ссылку
Поиск ссылок по всем дайджестам
< Предыдущий выпуск: PHP-Дайджест № 121
Комментарии (38)
Corpsee
25.12.2017 06:07RFC: Scalar Pseudo-type, — по-моему, это уже лишнее, как и mixed.
daggert
25.12.2017 09:26Scalar да, а вот миксед наше все, для некоторых классов.
Corpsee
25.12.2017 09:52А чем хуже не добавлять никакую проверку типа в этот метод вместо mixed?
alexey-m-ukolov
25.12.2017 10:02Консистентность и наглядность — это не «забыли указать тип», а «указали любой тип».
Но составные типы (несколько типов через пайп) или монады будут лучше, конечно, если есть возможность их использовать.
А вот скалярные да, не могу придумать ненатужный пример их использования.alexey-m-ukolov
25.12.2017 10:10Если в функцию может прийти null, 0, 0.0, «0» или false и она всё это приведёт к булевому значению, то это, конечно, гибко, но с кодом выше явно что-то не то.
gro
25.12.2017 11:43Ну, например, нужна строка, которая куда-то выводится или записывается в файл, допустим. Числа спокойно в строку конвертнутся и выведутся, как надо. А вместо массива будет «Array».
alexey-m-ukolov
25.12.2017 11:50Числа в строку — ок. Буль в строку — не ок. Для этого кейса правильнее указать «int|float|string» (но я не помню приняли ли это RFC).
gro
25.12.2017 11:55Тогда нужно составные типы вводить, или какой-нибудь очередной псевдо-тип, или numeric тот же использовать. Видимо, чтобы не париться взяли существующие scalar, а на бул забили.
Хотя bool корректно конвертируется в строку и обратно, как и остальные скаляры, в отличии от массивов и остального.alexey-m-ukolov
25.12.2017 12:17Я о том и говорю — нужные составные типы, потому что они покрывают больше кейсов, чем scalar. И такой RFC уже был, но я не помню его судьбу.
Если примут scalar, но не примут составные типы — это будет очень странно.
В дополнение к составным типам ещё хорошо бы зашли алиасы для них — можно спокойно будет объявить свой scalar там, где он нужен и ещё много чего.gro
25.12.2017 12:21Сколько вы хотите от бедного PHP. Потом вам ещё подавай описание схемы ассоциативного массива :)
daggert
25.12.2017 10:15Я уже давно привожу в пример реестр, на данный ответ. В реестре может хранится как bool, так и string, так и array (при получении всей ветки). И что я должен выводить, кроме mixed?
Corpsee
25.12.2017 10:48Ничего, просто не делать проверку типов. Вы же таким образом никак не ограничиваете тип, который придет в метод.
Corpsee
25.12.2017 10:58Это уже похоже на какой-то «культ карго» и проверки ради проверок. Зачем указывать любой тип в сигнатуре функции в языке с динамической типизацией?
alexey-m-ukolov
25.12.2017 11:09+2Не для того, чтобы его язык проверил, а для того, чтобы код был читаемым. Я выше уже привёл пример. Это просто часть стайлгайда — если указываем типы, то указываем везде, хотя бы для того, чтобы не возникало вопросов.
Тип — это документация. Если указан mixed, то сразу понятно что ожидать. А если ничего не указано, то нужно открыть реализацию и всю её прочитать, чтобы убедиться что да, mixed, а не просто кто-то забыл тип проставить. Можно, конечно, завести правило «не указан тип читай mixed», но зачем эта когнитивная нагрузка?
daggert
25.12.2017 11:11+1Ну да, по сути культ карго. Ровно в той-же степени как и ООП. Мне стало удобней использовать строгую типизацию и «бить разрабов по рукам» за то что они не понимают что к ним приходит и что от них требуется. На данный момент mixed тип висит аккурат пустым, я согласен, это удобно, но если мы говорим про попытку внести строгую типизацию — таких лазеек оставлять нельзя.
arturpanteleev
25.12.2017 11:50+1Я бы в место mixed предпочел иметь возможность перечислять несколько возможных возвращаемых типов, было бы и «строже» и читабельнее.
daggert
25.12.2017 12:29Согласен с вами на все сто. Не знаю что останавливает разработчиков php просто взять и скопировать бест практис PHPDoc, где уже давно есть param string|bool. Вот самая ожидаемая фишка была-б.
Надо предложить сию идею товарищу Попову, мб заинтересует.VolCh
25.12.2017 17:19Да ладно PHPDoc, свою же документацию хотя бы можно было бы скопировать для сигнатур.
VolCh
25.12.2017 17:18С другой стороны, есть ситуации, когда прийти может реально любой тип и функция/метод готовы его обработать, например, dump() serialize() и т. п.
Fesor
25.12.2017 17:20+1лучше б uniont/interseption типы запилили...
Corpsee
25.12.2017 17:31Вот мне тоже кажется, что от этого было бы больше пользы, чем от mixed/scalar. Вроде и разумные способы применения выше в комментариях были описаны, но все равно это какой-то костыль. uniont/interseption те же проблемы решили бы красивее и строже.
Fesor
25.12.2017 17:55+1ну тут стоит заметить что для того что бы это было полноценной фичей следует сделать так же поддержку тайп элиасов/своих типов.
type Friends = iterable & Collection
Даже без union types и т.п. это уже позволяло бы повысить выразительность и не создавать так много контейнеров для данных, так же это бы горманично сочиталось бы с дженериками (которые хочет МорисонЛеви протолкнуть)
Gemorroj
25.12.2017 06:44По поводу
amphp/parallel
— оно реально раскидает по ядрам или будет на одном ядре делать?Nicodinus
26.12.2017 15:00На винде пример из статьи раскидал на 3 воркера (отдельные 3 процесса) и 1 мастер. Возможно, если запустить к примеру на дебиане с каким-нибудь pthreads под php раскидает на потоки, к сожалению сложно проверить.
bashkarev
26.12.2017 15:00+1Раскидает. Но это всего лишь обертка
proc_open
наyield
-ах.
На каждыйParallelTask
будет создаваться отдельный php процессFedot
26.12.2017 16:02У amphp/parallel есть несколько драйверов для работы. Есть реализация на процессах и тредах. Для тредов нужен pthreads. Для процессов ничего не нужно.
saggid
Большое спасибо, всё как всегда очень интересно и познавательно)
Кто что думает про atk4/data?
komjah
Мотивы автора вполне понятны. Другой вопрос в том насколько возможности этой ORM покрывают реальные кейсы и не проще ли писать SQL.
VolCh
SQL обычно всегда писать проще. СЛожнее поддерживать :)
Fesor
очередной велосипед который очень активно форсится его автором. Это не ORM, это не совсем DBAL (хотя ближе к этому)… очень мутная дока… слишком много фич для одного пакета… Что бы объективно понять что это и кому оно надо — надо слишком много времени разбираться. Может быть кто-то осилит. Лично мне это не нужно.
SamDark
Я попробовал разобраться. Похоже на data provider-ы из Yii + гриды / списки.
romaninsh
Спасибо за интерес. Я автор atk4/data. Пока весь материал на английском (русский знаю только разговорно), но если есть интерес, могу написать что то по русски.