Pull to refresh
58
0
Илья Гусев @iGusev

PHP Разработчик

Send message

Стрелочные функции в PHP 7.4

Reading time 2 min
Views 25K


Стрелочные функции, также называемые короткими замыканиями (short closures), станут хорошим способом писать чистый код в PHP. Такая форма записи будет полезной при передаче замыканий в такие функции как array_map или array_filter.


Пример:


// Коллекция объектов Post
$posts = [/* … */];

$ids = array_map(fn($post) => $post->id, $posts);

Раньше нужно было писать так:


$ids = array_map(function ($post) {
    return $post->id;
}, $posts);

Кратко:


  • Доступны с PHP 7.4
  • Начинаются с ключевого слова fn
  • Могут иметь только одно выражение, также являющееся возвращаемым значением
  • Не поддерживается return
  • Type-hintihg поддерживается в аргументах и возвращаемых значениях
Читать дальше →
Total votes 23: ↑22 and ↓1 +21
Comments 20

PHP 7.3. Что нового

Reading time 8 min
Views 57K


Синтаксис


  1. Смягчение требований к синтаксису Heredoc и Nowdoc
  2. Поддержка конечных запятых в вызовах функций и методов
  3. Ссылки в list()

Устаревшие возможности (deprecated)


  1. Функция image2wbmp() объявлена устаревшей
  2. Флаги FILTER_FLAG_SCHEME_REQUIRED и FILTER_FLAG_HOST_REQUIRED при использовании FILTER_VALIDATE_URL объявлены устаревшими
  3. Регистро-независимые константы объявлены устаревшими

Новые возможности


  1. Опциональный выброс исключений при ошибках в функциях json_encode и json_decode
  2. Добавление функции is_countable()
  3. Добавление функций array_key_first() и array_key_last()
Читать дальше →
Total votes 55: ↑53 and ↓2 +51
Comments 51

Точность через неточность: Улучшаем Time-объекты

Reading time 10 min
Views 5.1K
При создании value-объекта для хранения времени, я рекомендую выбирать вместе с экспертами в предметной области и вокруг нее с какой точностью он будет храниться.

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


К сожалению, так делают не часто, и, когда приходит момент, проблема дает о себе знать. Рассмотрим следующий код:


$estimatedDeliveryDate = new DateTimeImmutable('2017-06-21');

// представим, что сегодня ТАКЖЕ 2017-06-21
$now = new DateTimeImmutable('now');

if ($now > $estimatedDeliveryDate) {
    echo 'Package is late!';
} else {
    echo 'Package is on the way.';
}

Ожидаемо что, что 21 июня этот код выведет Package is on the way., ведь день еще не закончился и пакет, например, доставят ближе к вечеру.


Несмотря на это код так не делает. Так как не указана часть со временем, PHP заботливо подставляет нулевые значения и приводит $estimatedDeliveryDate к 2017-06-21 00:00:00.
С другой стороны $now вычисляется как… сейчас. Now включает в себя текущий момент времени, который, скорее всего, не полночь, так что получится 2017-06-21 15:33:34 или вроде того, что будет позднее, чем 2017-06-21 00:00:00.

Читать дальше →
Total votes 13: ↑13 and ↓0 +13
Comments 25

Марсоход, Координаты посадки

Reading time 4 min
Views 4.2K


В этой серии статей мы строим программное обеспечение марсохода в соответствии со следующими спецификациями. Это позволит применить нам на практике следующие подходы:


  • Monolithic Repositories — MonoRepo (Монолитные репозитории)
  • Command/Query Responsibility Segregation — CQRS (Сегрегация ответственности на чтение и запись)
  • Event Sourcing — ES (События как источник)
  • Test Driven Development — TDD (Разработка через тестирование)

Оглавление

В предыдущих частях мы создали пакет навигации, а в нем LandRover класс, который валидирует входные параметры для нашего первого способа использования:


Марсоход должен будет сначала приземлиться в заданном положении. Положение состоит из координат (X и Y, являющихся целыми числами) и ориентации (строковое значение north, east, west или south).

Сегодня мы будем рефакторить LandRover:

Читать дальше →
Total votes 13: ↑10 and ↓3 +7
Comments 1

Марсоход, Посадка

Reading time 5 min
Views 5.9K


В этой серии статей мы строим программное обеспечение марсохода в соответствии со следующими спецификациями. Это позволит применить нам на практике следующие подходы:


  • Monolithic Repositories — MonoRepo (Монолитные репозитории)
  • Command/Query Responsibility Segregation — CQRS (Сегрегация ответственности на чтение и запись)
  • Event Sourcing — ES (События как источник)
  • Test Driven Development — TDD (Разработка через тестирование)


Ранее мы создали пакет навигации, теперь можно приступать к разработке первого варианта использования:


Марсоход должен будет сначала приземлиться в заданном положении. Положение состоит из координат (X и Y, являющихся целыми числами) и ориентации (строковое значение north, east, west или south).
Читать дальше →
Total votes 14: ↑12 and ↓2 +10
Comments 0

Марсоход, Инициализация

Reading time 4 min
Views 5.5K


В этой серии статей мы строим программное обеспечение марсохода в соответствии со следующими спецификациями. Это позволит применить нам на практике следующие подходы:

  • Monolithic Repositories — MonoRepo (Монолитные репозитории)
  • Command/Query Responsibility Segregation — CQRS (Сегрегация ответственности на чтение и запись)
  • Event Sourcing — ES (События как источник)
  • Test Driven Development — TDD (Разработка через тестирование)


Cначала нам нужно инициализировать наш проект.
Читать дальше →
Total votes 12: ↑9 and ↓3 +6
Comments 2

Марсоход, Введение

Reading time 4 min
Views 13K


Добро пожаловать в серию статьей «Марсоход», где мы будем использовать следующие практики:

  • Monolithic Repositories — MonoRepo (Монолитные репозитории)
  • Command/Query Responsibility Segregation — CQRS (Сегрегация ответственности на чтение и запись)
  • Event Sourcing — ES (События как источник)
  • Test Driven Development — TDD (Разработка через тестирование)

В этой вводной статье мы просто обозначим спецификации нашего марсохода.

Примечание. Этот пример является адаптированной для нужд серии статей версией упражнения, представленного на Dallas Hack Club, который сейчас, к сожалению, лежит.


Но сначала, давайте кратко пройдемся по упомянутым выше терминам.
Читать дальше →
Total votes 20: ↑19 and ↓1 +18
Comments 11

PHP 7.1: Грядущие изменения

Reading time 5 min
Views 38K


Ниже приведены основные изменения, привнесенные PHP 7.1. Для получения полного списка утвержденных и обсуждаемых на текущий момент изменений проверьте официальный PHP RFC.

  • Перехват нескольких типов исключений за раз
  • Поддержка Curl HTTP/2 server push
  • Области видимости для констант классов
  • Возвращаемый тип void
  • Единое поведение строковых функций
  • Поддержка строковых параметров в функции list() и новый синтаксис c []
  • Выброс предупреждения при невалидных строках в арифметике
  • Объявление устаревшим mcrypt() и его последующее удаление

Перехват нескольких типов исключений за раз


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

try {
    // to do something
} catch (MyException $e) {
    // Handle this exception
} catch (AnotherException $e) {
    // Handle this in the same way as MyException
} catch (Exception $e) {
    // Handle this in a different way
}

В PHP 7.1, оба исключения, обрабатываемые в примере одинаково, можно поймать одновременно:
Читать дальше →
Total votes 41: ↑38 and ↓3 +35
Comments 66

Опьяняющая сила Composer Plugins

Reading time 6 min
Views 12K
Composer — это самый важный инструмент в наборе современного PHP-разработчика. Времена ручного управления зависимостями остались в далеком прошлом, и их место заняли такие замечательные вещи как Semver. Вещи, которые помогают нам спать по ночам, ведь мы можем обновлять наши зависимости не обрушивая все вокруг.
neanderthal smashing rocks

Хоть мы и используем Composer довольно часто, не все знают о том, как расширить его возможности. Такая мысль даже не возникает, ведь он и так делает свою работу хорошо по-умолчанию, и кажется, что это не стоит времени или усилий, чтобы попытаться или хотя бы изучить. Даже в официальной документации обходят стороной этот вопрос. Наверное, потому что никто не спрашивает…

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

Итак, сегодня я подумал, что мне бы хотелось исследовать возможности composer-плагинов, и по ходу дела создать немного свежей документации.

Вы можете найти код этого плагина на Github.
Читать дальше →
Total votes 12: ↑10 and ↓2 +8
Comments 10

Эффективные структуры данных для PHP 7

Reading time 11 min
Views 51K
PHP имеет всего одну структуру данных для управления всем. array — сложный, гибкий, гибридный, сочетает в себе поведение list и linked map. Но мы используем его для всего, потому что PHP придерживается прагматичного подхода: иметь предельно правильный, здравый и реалистичный способ решения проблемы, исходящий из практических, а не теоретических рассуждений. array позволяет делать работу, хотя о нем и так много рассказывают на лекциях по информатике. Но, к сожалению, с гибкостью приходит и сложность.

Последний релиз PHP вызвал большое оживление в сообществе. Мы не могли дождаться того, чтобы начать использовать новые возможности и почувствовать вкус ~2х прироста производительности. Одна из причин, почему это случилось — структура array была переработана. Но массивы все также придерживаются принципа «оптимизировано для всего; оптимизировано для ничего», еще не все идеально, есть возможности для совершенствования.

А что насчет структур данных SPL?
К сожалению… они ужасны. Раньше, до PHP7, они предлагали _некоторые_ преимущества, но сейчас мы дошли до точки, когда использование SPL не имеет практического смысла.

Почему мы не можем просто поправить и улучшить их?
Да, мы могли бы, но я считаю, что их дизайн и реализация настолько бедны, что лучше бы найти более современную замену.
«SPL data structures are horribly designed.»
Anthony Ferrara


Введение: php-ds — расширение для PHP7, добавляющее структуры данных. Этот пост кратко охватывает поведение, производительность и преимущества каждой из них. Также в конце вы найдете список ответов на ожидаемые вопросы.

Github: https://github.com/php-ds
Пространство имен: Ds\
Интерфейсы: Collection, Sequence, Hashable
Классы: Vector, Deque, Stack, Queue, PriorityQueue, Map, Set
Читать дальше →
Total votes 43: ↑38 and ↓5 +33
Comments 27

Случайность в PHP7 – Повезет ли мне?

Reading time 4 min
Views 19K
Криптографическая рандомизация в PHP

В этой статье мы проанализируем проблемы, относящиеся к генерации случайных чисел, используемых в криптографии. PHP5 не обеспечивает простой механизм генерации криптостойких случайных чисел, в то время как PHP7 решает эту проблему путем введения CSPRNG-функций.

Что такое CSPRNG?


Цитируя википедию, криптографически стойкий генератор псевдослучайных чисел (англ. Cryptographically secure pseudorandom number generator, CSPRNG) — это генератор псевдослучайных чисел с определёнными свойствами, позволяющими использовать его в криптографии.

CSPRNG в основном используется для следующих целей:
  • Генерация ключей (в том числе, генерация public/private ключей)
  • Создание случайных паролей для аккаунтов пользователей
  • Системы шифрования

Главным аспектом сохранения высокого уровня безопасности является высокое качество случайности.

CSPRNG в PHP7


PHP7 вводит две новых функции, которые могут быть использованы для CSPRNG: random_bytes и random_int.
Читать дальше →
Total votes 27: ↑20 and ↓7 +13
Comments 5

Новый PHP, часть 2: Scalar types

Reading time 8 min
Views 44K

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

До сих пор мы говорили о типах только в отношении классов и интерфейсов. В течение многих лет мы только их (и массивы) и могли использовать. Однако же, PHP 7 добавляет возможность использовать и скалярные величины тоже, такие как int, string и float.

Но постойте. В PHP большинство примитивов являются взаимозаменяемыми. Мы можем передать "123" в функцию, которая хочет int, и довериться PHP, который все сделает «правильно». Так для чего же тогда нужны скалярные типы?
Читать дальше →
Total votes 27: ↑23 and ↓4 +19
Comments 94

Новый PHP, часть 1: Return types

Reading time 5 min
Views 43K
Каждый мажорный релиз PHP добавляет ряд новых возможностей, некоторые из которых действительно имеют значение. Для PHP 5.3 — это были пространства имен и анонимные функции. Для PHP 5.4 — трейты. Для PHP 5.5 — генераторы. Для 5.6 — списки аргументов переменной длины.

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

Почему поддержка строгой типизации так важна? Она предоставляет программе — компилятору или рантайму и другим разработчикам ценную информацию о том, что вы пытались сделать, без необходимости исполнять код. Это дает три типа преимуществ:
Читать дальше →
Total votes 41: ↑36 and ↓5 +31
Comments 38

Релиз Phalcon 2.1.0 beta 1

Reading time 6 min
Views 7.9K
Мы рады представить вам первый бета-релиз Phalcon 2.1!

Релизы 2.1.x будут поддерживаться в течении более длительного периода, 2.1 будет нашей первой версией с долгострочной поддержкой (LTS).

В 2.0.x мы ввели несколько новых фич и поправили множество багов. Однако, наше внимание всегда было обращено на сохранение обратной совместимости с Phalcon 1.3.x, в то же время мы стимулировали разработчиков обновляться до 2.0.x. Это дало достаточно времени разработчикам на внесение изменений в свои приложения для работы с новой веткой.

Phalcon 2.1 предоставляет новые возможности, некоторые из которых несовместимы с предыдущими версиями, поэтому убедитесь, что вы проверили свои приложения перед обновлением production-систем.

Мы уверены, что изменения в этом релизе оправдают обновление :)
Читать дальше →
Total votes 16: ↑14 and ↓2 +12
Comments 0

Релиз Phalcon 2.0.3

Reading time 3 min
Views 4.6K
В рамках нашего расписания регулярных релизов, мы рады сообщить, что Phalcon 2.0.3 был выпущен!

Эта версия содержит множество исправлений, а также новые возможности, основанные на фидбеке сообщества.

Изменения


  • Реализованы псевдонимы для namespace в PHQL
  • Возможность определять должен ли виртуальный внешний ключ игнорировать `null`-значения или нет
  • Добавлена поддержка `Phalcon\Mvc\Collection` в поведениях (Behaviours)
  • Добавлены поведения `SoftDelete` и `Timestampable` в коллекциях
  • Исправлена ошибка, добавляющая двойной `?` в `Mvc\Url::get` при использовании параметров #10421
  • Строковые атрибуты в моделях теперь имеют опциональную поддержку пустых значений строки #440
  • Добавлена возможность возвращать SQL, генерируемый в экземплярах `Mvc\Model\Query` #1908
  • Исправление некорректно генерируемого запроса в `Phalcon\Db\Dialect::select()` #10439
  • Добавлена поддержка типа Double в MySQL
  • `Phalcon\Tag\Select` теперь обрабатывает массив значений строк, избегая принятия нуля за пустую строку #2921
  • PHQL теперь поддерживает выражения CASE/WHEN/ELSE #651
  • Исправлена ошибка, возникающая при добавлении нестроковых значений в `Phalcon\Crypt::encrypt` из `Phalcon\Http\Cookies`
  • Исправлена ошибка непередачи имени схемы (PostgreSQL)
  • Атрибут `persistent` был удален из DNS-атрибутов для PDO соединений, в целях избежания ошибок в PostgreSQL #10484
Читать дальше →
Total votes 5: ↑2 and ↓3 -1
Comments 4

Сравнение систем типов PHP7 и Hack

Reading time 5 min
Views 22K

Одной из интересных вещей в PHP7, кроме невероятной производительности, является введение скалярного type-hinting'а в сочетании с опциональным «strict» режимом. При чтении RFC я заметил, что PHP код в примерах выглядит очень похожим на Hack. Что если выполнить один и тот же код и в PHP7 и в Hack? Какая разница между ними? Вот что я узнал.
Читать дальше →
Total votes 16: ↑15 and ↓1 +14
Comments 17

Релиз Phalcon 2.0.2

Reading time 2 min
Views 7K
Процесс разработки Phalcon с момента выхода 2.0.0 значительно ускорился. Все больше и больше контрибьюторов находит Zephir легким и понятным для работы. Результатом этого стал релиз Phalcon 2.0.2. Эта версия включает в себя множество новой функциональности, исправлений ошибок и улучшения производительности:

  • Добавлен метод stats() в Beanstalk
  • Устранено падение при doc-блоке без аннотаций #10301
  • Исправлено неверное количество передаваемых параметров при срабатывании события в Mvc\Collection
  • Теперь Mvc\Model проверяет есть ли у атрибута значение по умолчанию, указанное в схеме БД и игнорирует его при генерации SQL для вставки/обновления
  • Исправлен критический баг при вызове Http\Request::hasPut() #10283
  • Phalcon\Text: добавлен метод reduceSlashes() — убирает множественные слешы, заменяя их одиночными
  • Phalcon\Text: добавлен метод concat() — объединяет строки с использованием разделителя без дублирования в местах конкатенации.
  • Добавлено условие в адаптере start() сессии для проверки наличия уже начатой сессии
  • Добавлен метод status() в адаптере сессии для проверки факта начала сессии
  • Внедрение подзапросов в PHQL
  • Повышение производительности, ориентированное на PHP5.6
Читать дальше →
Total votes 22: ↑19 and ↓3 +16
Comments 3

Как я использую трейты

Reading time 6 min
Views 38K
Недавно несколько человек просили меня рассказать об использовании трейтов в новом проекте, который я пишу. Примерно в тоже время Рафаэль Домс показал мне его новую речь о сложных когнитивных процессах, которые мы не замечаем. Так как наш мозг — это большой мешок, перемешивающий все, в результате получился пост, который пытается охватить и то как я использую трейты, и то как я решаю где они нужны.

Воздействие vs Абстракция


Первое, что вы должны сделать — пойти почитать пост “Abstraction or Leverage” от Майкла Найгарда. Это отличная статья.

Если же у вас мало времени, основная суть поста состоит в том, что части кода (функции, классы, методы и т.д.) могут предназначаться либо для абстракции, либо для воздействия. Разница в:

  • Абстракция содержит высокоуровневый концептуальный код, позволяющий лаконичнее работать с ним другому коду.
  • Воздействие содержит код, изменения в котором влияют лишь на определенную часть.
Читать дальше →
Total votes 20: ↑19 and ↓1 +18
Comments 31

PSR-7 принят

Reading time 5 min
Views 21K

Рад сообщить, что по состоянию на 06:00 18 мая 2015 года PSR-7 (HTTP Message Interfaces) был принят!

UPD. Хороший перевод «PSR-7 в примерах».

Дорога к PSR-7


Путь к PSR-7 был долгим и извилистым. Все началось летом 2012 года с проекта предложения по работе с HTTP клиентами за авторством Бенджамина Эберлея (Benjamin Eberlei), в течение обсуждения которого другие участники предложили, что, возможно, небольшой стандарт на http-сообщения — вот что позволило бы решить все проблемы.
Читать дальше →
Total votes 18: ↑18 and ↓0 +18
Comments 13
1

Information

Rating
Does not participate
Location
Казань, Татарстан, Россия
Date of birth
Registered
Activity