Forwarded from Пых (Валентин Удальцов)
Пару недель назад мы с Кириллом обсуждали PHP. Выяснилось, что он накануне имел дело с Laravel и, цитирую, "увидел очень много косяков". Фартан Алексей не мог пройти мимо такого инфоповода и предложил крутой состав для стрима:
▸ Кирилл Мокевнин подсветит проблемы Laravel,
▸ Данил Щуцкий встанет на защиту Тейлора,
▸ Алексей Гагарин расскажет, что в Spiral всё сделано в 100 раз лучше.
Встречаемся в этот четверг в
19:00 по Москве! Жмите в колокол, чтобы не пропустить.https://youtu.be/KpSfWe7XS3A
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14😁5🤡2
Forwarded from Пых (Валентин Удальцов)
Буквально через несколько минут начнётся первый в истории Пыхап! Залетайте в трансляцию на канале PHP Point!
https://youtu.be/Pa4pti6r-rc
В программе у нас 3 доклада:
Андрей Клименко поломает вам голову основами ФП и примерами на Scala, из которых станет понятно, что из функционального мира уже доступно в PHP, а что ещё предстоит законтрибьютить.
Вадим Занфир расскажет, почему все современные фреймворки теряют сообщения и как на самом деле надо работать с "кроликом".
В аду есть специальный котёл для тех, кто использует float для хранения денег. Сергей Жук подскажет, как в него не угодить.
Спонсор первого Пыхапа — Happy Job 💚! Обращайтесь в Happy Job за исследованиями вовлечённости и оценкой 360, ребята делают лучшую платформу для развития сотрудников.
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Пыхап / 8 ноября 2024
Пыхап — митап про PHP для PHP-разработчиков, их техлидов, тимлидов, архитекторов, техдиректоров и всех, кому небезразличен наш бесконечно умирающий язык.
0:00 Вступление
6:07 Приветствуем Андрея Клименко
8:32 (Не) используйте функциональное программирование…
0:00 Вступление
6:07 Приветствуем Андрея Клименко
8:32 (Не) используйте функциональное программирование…
🔥7❤3👍1👎1
PHP 8.4.1 Released!
Ключевые изменения в PHP 8.4:
Предложена новая реализация JIT-компилятора, построенная на базе IR Framework. Ключевое отличие в том, что старый JIT напрямую генерировал машинные инструкции на основе байткода и с использованием разных бэкендов для архитектур x86_64 и AArch64, а новый JIT использует единый для всех архитектур бэкенд и генерирует промежуточное представление (IR), которое затем дополнительно оптимизируется и преобразуется в машинные инструкции для нужной целевой платформы.
Добавлена поддержка прикрепления обработчиков свойств (property hook), позволяющих добавить дополнительную логику, выполняемую при изменении или доступе к свойствам объекта, реализуемую без перехвата операций чтения и записи при помощи общих функций __get и __set, и без создания дополнительных методов-обвязок. Применение обработчиков свойств даёт возможность существенно сократить объём кода и упростить переопределение поведения работы со свойствами, благодаря привязке собственного обработчика к каждому свойству.
Разрешено указание ссылок на методы в конструкции "new" без отделяющих скобок, т.е. вместо "$name = (new MyClass())->method()" теперь можно указывать "$name = new MyClass()->method()".
Добавлена возможность асимметричного управления видимостью свойств объектов (public, private, protected), отдельно для операций записи (set) и чтения (get). Например:
Предоставлена штатная поддержка "ленивых" объектов (lazy), инициализация которых производится в момент первого использования.
Вместо общего параметра "opcache.jit_buffer_size" для управления JIT-компилятором и настройки размера буфера JIT предложены параметры "opcache.jit" и "opcache.jit_buffer_size". Для отключения JIT теперь можно указывать "opcache.jit=disable" вместо "opcache.jit_buffer_size=0". Внесены изменения, снижающие потребление памяти и повышающие производительность JIT в некоторых ситуациях.
Добавлен атрибут "#[\Deprecated]", предназначенный для пометки устаревших функций, классов и методов.
Реализован класс \Dom\HTMLDocument, поддерживающий корректный разбор разметки HTML5.
Добавлена функция request_parse_body() для разбора HTTP-запросов с типом контента multipart/form-data (RFC1867).
Добавлены функции array_find(), array_find_key(), array_any() и array_all(). Функции array_find() и array_find_key() возвращают первый элемент или ключ в массиве, для которых сработала проверка, заданная через указанную пользователем callback-функцию. В свою очередь функции array_any() и array_all() возвращают любой совпавший элемент и все совпавшие элементы. Например, для вывода первого элемента, размер поля title в котором больше 5 символов, можно указать:
Добавлены методы DateTime::getMicrosecond() и DateTimeImmutable::setMicrosecond($microsecond) для получения и установки времени с микросекундной точностью, а также метод DateTime::createFromTimestamp().
В PDO (PHP Data Objects), абстрактный интерфейс для работы с базами данных, добавлена возможность создания парсеров SQL и субклассов, специфичных для определённых драйверов СУБД. Добавлены новые субклассы Pdo\Dblib, Pdo\Firebird, Pdo\MySql, Pdo\Odbc и Pdo\Sqlite.
Ключевые изменения в PHP 8.4:
Предложена новая реализация JIT-компилятора, построенная на базе IR Framework. Ключевое отличие в том, что старый JIT напрямую генерировал машинные инструкции на основе байткода и с использованием разных бэкендов для архитектур x86_64 и AArch64, а новый JIT использует единый для всех архитектур бэкенд и генерирует промежуточное представление (IR), которое затем дополнительно оптимизируется и преобразуется в машинные инструкции для нужной целевой платформы.
Добавлена поддержка прикрепления обработчиков свойств (property hook), позволяющих добавить дополнительную логику, выполняемую при изменении или доступе к свойствам объекта, реализуемую без перехвата операций чтения и записи при помощи общих функций __get и __set, и без создания дополнительных методов-обвязок. Применение обработчиков свойств даёт возможность существенно сократить объём кода и упростить переопределение поведения работы со свойствами, благодаря привязке собственного обработчика к каждому свойству.
class User
{
public string $name {
set {
if (strlen($value) === 0) {
throw new ValueError("Name must be non-empty");
}
$this->name = $value;
}
}
public function __construct(string $name) {
$this->name = $name;
}
}Разрешено указание ссылок на методы в конструкции "new" без отделяющих скобок, т.е. вместо "$name = (new MyClass())->method()" теперь можно указывать "$name = new MyClass()->method()".
Добавлена возможность асимметричного управления видимостью свойств объектов (public, private, protected), отдельно для операций записи (set) и чтения (get). Например:
class PhpVersion
{
public private(set) string $version = '8.4';
}
$phpVersion = new PhpVersion();
var_dump($phpVersion->version); // string(3) "8.4"
$phpVersion->version = 'PHP 8.3'; // errorПредоставлена штатная поддержка "ленивых" объектов (lazy), инициализация которых производится в момент первого использования.
Вместо общего параметра "opcache.jit_buffer_size" для управления JIT-компилятором и настройки размера буфера JIT предложены параметры "opcache.jit" и "opcache.jit_buffer_size". Для отключения JIT теперь можно указывать "opcache.jit=disable" вместо "opcache.jit_buffer_size=0". Внесены изменения, снижающие потребление памяти и повышающие производительность JIT в некоторых ситуациях.
Добавлен атрибут "#[\Deprecated]", предназначенный для пометки устаревших функций, классов и методов.
#[\Deprecated("use newFunction() instead", since: "1.1")]
function oldFunction() {
// …
}Реализован класс \Dom\HTMLDocument, поддерживающий корректный разбор разметки HTML5.
Добавлена функция request_parse_body() для разбора HTTP-запросов с типом контента multipart/form-data (RFC1867).
Добавлены функции array_find(), array_find_key(), array_any() и array_all(). Функции array_find() и array_find_key() возвращают первый элемент или ключ в массиве, для которых сработала проверка, заданная через указанную пользователем callback-функцию. В свою очередь функции array_any() и array_all() возвращают любой совпавший элемент и все совпавшие элементы. Например, для вывода первого элемента, размер поля title в котором больше 5 символов, можно указать:
$firstMatch = array_find(
$posts,
function (Post $post) {
return strlen($post->title) > 5;
}
);Добавлены методы DateTime::getMicrosecond() и DateTimeImmutable::setMicrosecond($microsecond) для получения и установки времени с микросекундной точностью, а также метод DateTime::createFromTimestamp().
В PDO (PHP Data Objects), абстрактный интерфейс для работы с базами данных, добавлена возможность создания парсеров SQL и субклассов, специфичных для определённых драйверов СУБД. Добавлены новые субклассы Pdo\Dblib, Pdo\Firebird, Pdo\MySql, Pdo\Odbc и Pdo\Sqlite.
🔥13👍11
Добавлены новые функции mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst(), mb_lcfirst(), bcceil(), bcdivmod(), bcfloor() и bcround(), pcntl_getcpu(), pcntl_getcpuaffinity(), pcntl_getqos_class(), pcntl_setns(), pcntl_waitid(), http_get_last_response_headers(), http_clear_last_response_headers(), fpow()
Операции exit и die теперь можно вызывать в форме полноценных функций, которые допускается передавать в качестве аргумента в другие функции. Ранее возможности функций exit() и die() были сильно ограничены, так как они представляли собой обвязки над ключевыми словами exit и die.
Добавлены изменения, усложняющие эксплуатацию уязвимостей, вызванных выходом за границы буфера, а также усиливающие рандомизацию имён файлов, создаваемых через функцию tempnam().
Объявлено устаревшим поведение, при котором для параметров функций с присвоенным по умолчанию значением null автоматически разрешалось присвоение значений null. Для того, чтобы подобные параметры могли принимать значения null теперь требуется явное указание префикса "?". Например, вместо "function save(Book $book = null) {}" следует указывать "function save(?Book $book = null) {}".
Объявлены устаревшими константы E_STRICT, MYSQLI_REFRESH_*, функции mysqli_ping(), mysqli_kill(), mysqli_refresh(), методы mysqli::ping(), mysqli::kill(), mysqli::refresh(), возможность использования "_" в качестве имени класса, некоторые свойства DOMDocument и DOMEntity. Запрещено переопределение констант класса GMP, для которого теперь выставлено ключевое слово "final".
Источник: https://www.opennet.ru/opennews/art.shtml?num=62269
Операции exit и die теперь можно вызывать в форме полноценных функций, которые допускается передавать в качестве аргумента в другие функции. Ранее возможности функций exit() и die() были сильно ограничены, так как они представляли собой обвязки над ключевыми словами exit и die.
Добавлены изменения, усложняющие эксплуатацию уязвимостей, вызванных выходом за границы буфера, а также усиливающие рандомизацию имён файлов, создаваемых через функцию tempnam().
Объявлено устаревшим поведение, при котором для параметров функций с присвоенным по умолчанию значением null автоматически разрешалось присвоение значений null. Для того, чтобы подобные параметры могли принимать значения null теперь требуется явное указание префикса "?". Например, вместо "function save(Book $book = null) {}" следует указывать "function save(?Book $book = null) {}".
Объявлены устаревшими константы E_STRICT, MYSQLI_REFRESH_*, функции mysqli_ping(), mysqli_kill(), mysqli_refresh(), методы mysqli::ping(), mysqli::kill(), mysqli::refresh(), возможность использования "_" в качестве имени класса, некоторые свойства DOMDocument и DOMEntity. Запрещено переопределение констант класса GMP, для которого теперь выставлено ключевое слово "final".
Источник: https://www.opennet.ru/opennews/art.shtml?num=62269
🔥21👍12
Windsurf — это новый клон VSCode с AI фичами.
Казалось бы, ничего нового, тысячи их. Впрочем, другие аналогичные клоны VSCode (Cursor и т.п.) я толком не пробовал, поэтому сравнивать с ними не буду.
На YouTube много обзоров, как Windsurf создаёт проект с нуля за считанные минуты. Но эти демо всегда казались мне синтетическими. Я не часто начинаю новые проекты, и, когда это происходит, обычно используется некий корпоративный шаблон со своими заморочками.
Итак, сегодня засел за Windsurf на реальной задаче из рабочего проекта: некий калькулятор корпоративных расходов в PHP приложении с фронтендом на Alpine.js. Я был приятно удивлён, насколько хорошо Windsurf подхватил текущие файлы проекта и вошел в контекст!
😍Главные впечатления:
- Очень удобный интерфейс для просмотра и применения изменений. Я пользуюсь GitHub Copilot плагином в PhpStorm и могу сказать, что Copilot inline chat (функция появилась относительно недавно) просто отвратителен. С точки зрения UX Windsurf на два шага впереди.
- Исходную задачу хорошо разбивает на шаги, которые потом последовательно скармливаются LLM, процесс визуализирован. Под капотом, возможно, заготовлена куча продуманных prompts. Если бы я делал аналогичную декомпозицию вручную через ChatGPT, то я бы запарился.
Основной недостаток для меня в том, что это клон VSCode, а я в основном использую PhpStorm. Естественно, всё кажется неудобным: другие цвета, другие горячие клавиши, отсутствие инспектора БД и автоформатирования. Я знаю, что всё можно настроить и расширить плагинами. Однако, я поступил иначе: использовал Windsurf для генерации существенных блоков кода через запросы к AI, а затем переключался обратно на PhpStorm для ручного редактирования.
Вывод: Windsurf для меня не IDE. Это скорее продвинутое окно ChatGPT с прямым доступом к чтению и записи файлов проекта — очень удобное и полезное окно, оказалось!
https://codeium.com/windsurf
Казалось бы, ничего нового, тысячи их. Впрочем, другие аналогичные клоны VSCode (Cursor и т.п.) я толком не пробовал, поэтому сравнивать с ними не буду.
На YouTube много обзоров, как Windsurf создаёт проект с нуля за считанные минуты. Но эти демо всегда казались мне синтетическими. Я не часто начинаю новые проекты, и, когда это происходит, обычно используется некий корпоративный шаблон со своими заморочками.
Итак, сегодня засел за Windsurf на реальной задаче из рабочего проекта: некий калькулятор корпоративных расходов в PHP приложении с фронтендом на Alpine.js. Я был приятно удивлён, насколько хорошо Windsurf подхватил текущие файлы проекта и вошел в контекст!
😍Главные впечатления:
- Очень удобный интерфейс для просмотра и применения изменений. Я пользуюсь GitHub Copilot плагином в PhpStorm и могу сказать, что Copilot inline chat (функция появилась относительно недавно) просто отвратителен. С точки зрения UX Windsurf на два шага впереди.
- Исходную задачу хорошо разбивает на шаги, которые потом последовательно скармливаются LLM, процесс визуализирован. Под капотом, возможно, заготовлена куча продуманных prompts. Если бы я делал аналогичную декомпозицию вручную через ChatGPT, то я бы запарился.
Основной недостаток для меня в том, что это клон VSCode, а я в основном использую PhpStorm. Естественно, всё кажется неудобным: другие цвета, другие горячие клавиши, отсутствие инспектора БД и автоформатирования. Я знаю, что всё можно настроить и расширить плагинами. Однако, я поступил иначе: использовал Windsurf для генерации существенных блоков кода через запросы к AI, а затем переключался обратно на PhpStorm для ручного редактирования.
Вывод: Windsurf для меня не IDE. Это скорее продвинутое окно ChatGPT с прямым доступом к чтению и записи файлов проекта — очень удобное и полезное окно, оказалось!
https://codeium.com/windsurf
Windsurf
Windsurf Editor | Windsurf
Tomorrow's editor, today. Windsurf Editor is the first AI agent-powered IDE that keeps developers in the flow. Available today on Mac, Windows, and Linux.
👍24🔥8🤷♂4
Посмотрел Laravel Lynch 2 - критика фреймворка, сравнение с Symfony (по некоторым пунктам), общее обсуждение вариантов развития программиста в PHP-экосистеме.
В целом осталось впечатление, что всё тлен: и Laravel, и Symfony, и Spiral + Temporal (который нужен 0,01% проектов).
Что делать? Обдумав все услышанное, отметил для себя, что не хейтили только Yii3! 😉
https://www.youtube.com/live/uwih1jLMkyg?si=FPLabeKHO1t-Q3Zh
В целом осталось впечатление, что всё тлен: и Laravel, и Symfony, и Spiral + Temporal (который нужен 0,01% проектов).
Что делать? Обдумав все услышанное, отметил для себя, что не хейтили только Yii3! 😉
https://www.youtube.com/live/uwih1jLMkyg?si=FPLabeKHO1t-Q3Zh
YouTube
Laravel Lynch 2
Линчуем Laravel. Опять.
Ссылки из стрима:
Книга «Архитектура сложных веб-приложений. С примерами на Laravel» от Аделя:
https://github.com/adelf/acwa_book_ru
Buggregator:
https://buggregator.dev/
Ссылки из стрима:
Книга «Архитектура сложных веб-приложений. С примерами на Laravel» от Аделя:
https://github.com/adelf/acwa_book_ru
Buggregator:
https://buggregator.dev/
👍24😁21🥴4❤3🔥3🤮1
Инсайды с PHP Russia: автор админ-панели MoonShine прокомментировал возможность использования инструмента статической типизации Typhoon в коде своей админ-панели:
не фанат
😁59👍6🤪4🤡2
Top 3 англоязычных YouTube канала, которые я регулярно смотрю.
Опубликую отдельными постами, чтобы можно было отдельно лайкать, репостить и чтобы к каждому каналу был свой preview 👇
Опубликую отдельными постами, чтобы можно было отдельно лайкать, репостить и чтобы к каждому каналу был свой preview 👇
👍8
3 Место:
Theo - t3․gg - бывший инженер Twitch, сам пишет на full-stack TypeScript, поэтому основной контент про экосистему JavaScript/TypeScript, Node.js, Next и вот это всё. Видео пишется по заготовленному сценарию, поэтому всё чётко, понятно, качественно.
350К подписчиков.
https://youtu.be/yaodD79Q4iE?si=cc3AjWExswksc1IM
Theo - t3․gg - бывший инженер Twitch, сам пишет на full-stack TypeScript, поэтому основной контент про экосистему JavaScript/TypeScript, Node.js, Next и вот это всё. Видео пишется по заготовленному сценарию, поэтому всё чётко, понятно, качественно.
350К подписчиков.
https://youtu.be/yaodD79Q4iE?si=cc3AjWExswksc1IM
👍18👎1
2 Место:
ThePrimeTime – бывший инженер Netflix, много стримит на Twitch и нарезки наиболее интересных фрагментов публикует на YouTube. Тяготеет к Rust, использует Vim и клавиатуру Kinesis Advantage360.
Темы на канале разнообразные, про разные языки программирования и стеки. Зачастую просто читает некую статью или смотрит видео и комментирует, делится своими мыслями и опытом по заданной теме.
The Prime - это полная противоположность предыдущему каналу (Theo). Тут сплошная импровизация, много юмора, много экспрессии и эмоций.
650К подписчиков.
Одно из моих любимых видео (не про PHP):
https://youtu.be/QwUPs5N9I6I?si=ByFxlSrpIjawgL20
Обзор PHP 8.4:
https://youtu.be/f5nGmE92zNA?si=i64DgiTiT8cTziz-
ThePrimeTime – бывший инженер Netflix, много стримит на Twitch и нарезки наиболее интересных фрагментов публикует на YouTube. Тяготеет к Rust, использует Vim и клавиатуру Kinesis Advantage360.
Темы на канале разнообразные, про разные языки программирования и стеки. Зачастую просто читает некую статью или смотрит видео и комментирует, делится своими мыслями и опытом по заданной теме.
The Prime - это полная противоположность предыдущему каналу (Theo). Тут сплошная импровизация, много юмора, много экспрессии и эмоций.
650К подписчиков.
Одно из моих любимых видео (не про PHP):
https://youtu.be/QwUPs5N9I6I?si=ByFxlSrpIjawgL20
Обзор PHP 8.4:
https://youtu.be/f5nGmE92zNA?si=i64DgiTiT8cTziz-
👍13🔥8👎2
1 Место:
Fireship – «пятиминутка здорового человека»! Короткие видео длительностью примерно 5 минут. Это либо пересказ новостей за последнее время, либо краткий обзор какой-то технологии (языка программирования, СУБД, ОС…). Особый почерк канала – великоллепное сочетание мемов и технической информации. Автор виртуозно вплетает отсылки к событиям из мира IT и поп-культуры. Единственный YouTube канал, на котором я нажал кнопку «колокльчик».
3.5М подписчиков.
https://www.youtube.com/watch?v=Iq_r7IcNmUk
Fireship – «пятиминутка здорового человека»! Короткие видео длительностью примерно 5 минут. Это либо пересказ новостей за последнее время, либо краткий обзор какой-то технологии (языка программирования, СУБД, ОС…). Особый почерк канала – великоллепное сочетание мемов и технической информации. Автор виртуозно вплетает отсылки к событиям из мира IT и поп-культуры. Единственный YouTube канал, на котором я нажал кнопку «колокльчик».
3.5М подписчиков.
https://www.youtube.com/watch?v=Iq_r7IcNmUk
YouTube
25 crazy software bugs explained
Find all the best dev content at https://daily.dev/fireship
Let’s explore 25 crazy software bugs that changed the world. Including funny bugs like the Facetime Eavesdropping, mostly harmless bugs like the Morris Worm, and deadly bugs like Therac-25.
0:00…
Let’s explore 25 crazy software bugs that changed the world. Including funny bugs like the Facetime Eavesdropping, mostly harmless bugs like the Morris Worm, and deadly bugs like Therac-25.
0:00…
🔥17👍9
Смотрю видео с LivePHP про множественное наследование.
В процессе доклада Дмитрий Елисеев придумал запутывающую задачу для собеседования :)
https://www.youtube.com/live/0fgbrmxwJOM?si=yhkkEO1aai9jIkeB&t=5800
(это же видео на рутуб: https://rutube.ru/video/5c6226dca53d39f63a3a5a430b188889/)
upd: продолжаю смотреть, великолепная ирония на тему множественного наследования:
😂
В процессе доклада Дмитрий Елисеев придумал запутывающую задачу для собеседования :)
https://www.youtube.com/live/0fgbrmxwJOM?si=yhkkEO1aai9jIkeB&t=5800
(это же видео на рутуб: https://rutube.ru/video/5c6226dca53d39f63a3a5a430b188889/)
upd: продолжаю смотреть, великолепная ирония на тему множественного наследования:
наследуем собаку от животного и от батареи, потому что тёплая
😂
😁25🥴14👍6🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Пятничное настроение - что-нибудь отрефакторить к понедельнику!
😁72👍4💩3
Серьёзный Breaking Change в минорной версии Laravel. Если всё как описано в статье (я сам ещё не проверял), то эффект может быть как от sql-injection атаки.
Раньше query builder метод
Раньше query builder метод
->orWhere() генерировал sql-запрос с логикой AND, например debt_amount > 0 AND org_id = :current_user_org_id, а теперь получим OR логику debt_amount > 0 OR org_id = :current_user_org_id - в multitenant приложениях пользователи увидят чужие данные 😨🤯15🤬4👍1