PHP Profi

Новости PHPКачество кода: 'взбиваемость' (churn) и сложность (complexity). Как отслеживать легаси.

Cложность кода (code complexity)

Сложность часто измеряется путем вычисления цикломатической сложности на единицу кода. Показатель можно рассчитать, принимая все ветви кода во внимание.

Сложность кода является показателем для нескольких вещей:

  • Насколько трудно понять кусок кода. Большое значение показателя говорит о многочисленном ветвлении в коде. При чтении кода, программист должен отслеживать все эти ветки, чтобы понять все различные пути, в которые может "зайти" приложение при исполнении.
  • Насколько трудно протестировать этот кусок кода. Большое значение показателя указывает на множество ветвей кода, и для того, чтобы полностью протестировать этот кусок кода, все эти ветви должны быть покрыты отдельно.
2018-01-22 alek13

ТестированиеНе пишите бесполезные unit-тесты

На днях я наткнулся на следующий код в проекте:

class Users
{
    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }
 
    public function getAllUsers()
    {
        $stmt = $this->pdo->prepare('SELECT * FROM users');
        return $stmt->fetchAll();
    }
}

 

И был вот такой тест для проверки этого кода:

class UserTest extends TestCase
{
    public function testGetAllUsers()
    {
        $pdo = m::mock(PDO::class);
        $stmt = m::mock(PDOStatement::class);
         
        $pdo->shouldReceive(‘prepare’)->andReturn($stmt);
        $pdoStmt->shouldReceive(‘fetchAll’)->andReturn($userArray);
 
        $users = new Users($pdo);
        $result = $users->getAllUsers();
         
        $this->assertEquals($userArray, $users);
    }
}

Обратите внимание, что я опустил остальную часть класса User, а также массив пользователей, который возвращается в тесте.

Этот тест на самом деле даёт нам 100%-ое покрытие кода в методе getAllUsers(). Но, к сожалению, для любой практической цели, этот тест полностью бесполезен.

2018-01-19 alek13

LaravelИспользование Laravel'овских строк перевода(локализации) во Vue.js

Одина из проблем, с которой вам придется столкнуться при создании мультиязычного сайта — это то, как держать в порядке ваши строки переводов для серверной стороны и для JavaScript компонентов. Я собираюсь продемонстрировать основные приёмы реализации этого, используя в моих примерах Laravel и Vue.js.

2018-01-18 alek13

ПакетыРеинкарнация популярного PHP-пакета для Slack

Всем привет!

Сегодня я хочу рассказать о небольшом, но популярном open source пакете и попросить у вас помощи и поддержки.

Slack

Все вы наверняка использовали Slack в своих командах для упрощения работы над проектом. В этом плане Slack - очень удобная штука.

2018-01-10 alek13

ИнструментыПодключение к Redis через Unix-сокеты в Docker

Подключение к Redis через Unix-сокеты, как правило, быстрее, чем подключение через TCP/IP.

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

Имея 10М+ скачиваний, redis является четвертым среди самых скачиваемых Docker-образов, и большинство систем настраивают подключение к Redis через Docker'овский встроеный сетевой TCP-мост.

Docker'овский собственный сетевой TCP-мост — это, конечно, хорошо и прекрасно, но не хотели бы вы выжать еще немного скорости?

2017-12-28 alek13

Новости PHPДобро пожаловать!

Всем привет!

Мы поздравляем всех, кто уже прошёл наш квест "Как хакнуть форму". Всем спасибо за ваши отзывы и комментарии по квесту.

Как мы уже говорили, всем, кто прошёл его, мы выслали инвайты. И всем, кто пройдёт квест до его завершения, инвайты будут высланы в 24:00 в день прохождения.

Большинство тех, кто получил инвайты, уже зарегистрировались и мы рады приветствовать новых пользователей.

Дамы и господа, you are welcome!

2017-12-26 alek13

ПакетыАсинхронный параллельный запуск кода в PHP на примере Laravel Collection

Фреймворк Laravel имеет отличный класс для работы с коллекциями, который имеет много полезных операций. Класс также является macroable. Это означает, что к нему можно добавлять функции во время выполнения путем вызова его метода macro и передачи названия и замыкания. В наших проектах мы, как правило, пишем один и тот же макрос снова и снова. Вот почему мы вынесли эти макросы в пакет laravel-collection-macros, так что вы можете их использовать, котоый основан на amphp/parallel.

В этом посте я хотел бы поговорить немного о новом макросе,  называемом parallelMap. parallelmap идентична map`у, но каждый элемент в коллекции будут обрабатываться параллельно.

Давайте взглянем на пример:

2017-12-25 irul

ИнструментыСкажите "Thanks!" библиотекам, которые используете

Если вы такие же, как и я, то при разработке приложения используете множество отличнейших библиотек PHP, поддерживаемых бесчисленным количеством талантливых разработчиков. И это восхитительно, что PHP-сообщество так далеко продвинулось!

И хотя я стараюсь изо всех сил внести и свой вклад, трудно выразить признательность за все эти усилия. И иногда мне просто хочется кричать "Спасибо!!!"

2017-12-22 irul

ПакетыПроизводительность AMQP-клиентов на PHP. Benchmark`и всех!

Рост популярности AMQP interop вызвал волну вопросов относительно того, какой адаптер является самым быстрым. В этом посте я хочу поделиться своими выводами о производительности постановки сообщений в очередь. Позже будет подобный пост о "разгребании" очереди.

Рассмотрим:

а также их адаптеры с имплементацией AMQP interop:

и один из мира Golang:

2017-12-22 alek13

ПакетыMockery: разные возвращаемые значения при разных аргументах

Иногда при работе с mock объектами библиотеки Mockery, мы хотим сообщить фейковому методу, чтобы он возвращал разные значения для разных аргументов. Это редкий случай, когда мне нужна эта функциональность, но каждый раз, когда мне это нужно, я счастлив, что она есть.

2017-12-21 alek13

ComposerУправление зависимостями и решение конфликтов в PHP через Composer

Когда вы создаете PHP-приложение или библиотеку, вы, как правило, имеете 3 вида зависимостей:

  • Жесткие зависимости: то, что требуется вашему приложению/библиотеке, чтобы работать
  • Необязательные зависимости: например, ваша PHP-библиотека может предоставлять адаптеры/бриджи для различных фреймворков
  • Зависимости для разработки: инструменты отладки, тестирования...

Как управлять этими зависимостями?

2017-12-20 alek13

Новости PHPУстановка новой версии PHP 7.2

PHP 7.2

Недавно был релиз PHP 7.2, который привнёс несколько отличных новых фич и улучшений безопасности в язык. Например, таких, как указание типа object, разумное поведение count() и многое другое.

Здесь мы собрали краткие руководства о том, как установить PHP 7.2 на нескольких разных операционных системах:

2017-12-08 alek13

SymfonyНеймспейсы и организация сервисов бизнес-логики в Symfony

Я хочу поговорить о пространствах имен для сервисов в Symfony, специфичное для Symfony3.

Это захватывающие времена, Symfony 4 уже на подходе — выходит 30-го ноября — так что этот пост может стать неактуальным в ближайшее время! Тем не менее концепт всё тот же, так что давайте взглянем на него!

2017-11-29 alek13

Тонкости языкаЧего всё ещё не хватает в PHP: generics

РНР 7.2 не за горами, и эта версия принесёт нам такие изменения в типах, как возможность указать тип object в сигнатуре методов, или как расширение типа параметра.
Они подтверждают желание сообщества PHP укрепить систему типов в PHP и улучшить безопасность типов.

В Libcast (видеохостинг), мы ценим эти изменения, которые позволяют полагаться на IDE, которая отображает ошибки типов при вводе кода и проверяет типы во время компиляции, тем самым уменьшая время, необходимое для поиска и исправления ошибки.
Дженерики (Generics) - это фича, которая, как мы надеемся, скоро появятся в PHP и позволит создавать универсальные контейнеры указанного типа.

2017-11-28 irul

ПроектированиеЧто обеспечивает interface и для чего он нужен

Создание и внедрение интерфейсов в наш код — это важно. Это помогает с подменой компонентов, облегчает тестирование, отделяет "что" от "как".

Но просто влепить интерфейс к классу и забыть — этого недостаточно.

Мы также должны подумать о том, на что мы "натянем" этот интерфейс.

 

2017-11-27 alek13

ТестированиеЗапуск встроенного PHP веб-сервера из PHPUnit

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

2017-11-24 alek13

ПакетыPHP GraphQL пакеты и интеграции с Symfony

GraphQL продолжает набирать обороты в 2017 году. Хотя он и не является заменой для REST, он обеспечивает пользователей контентных API и т. п. лучшей эргономикой, чем RESTful-интерфейсы общего назначения. Для PHP существуют две популярные библиотеки, и обе имеют бандлы для интеграции с Symfony.

Реализация GraphQL-совместимого сервера — не тривиальная задача, да и создавать с нуля свой собственный не рекомендуется (на любом языке). Для PHP на данный момент есть две библиотеки, которые предлагают прочную основу для построения реализаций GraphQL:

2017-11-23 alek13

ТестированиеЮнит тесты для трейтов в PHP7

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

Т.к. PHP трейты не могут быть инстанциированы сами по себе, то их юнит-тестирование кажется невозможным. Однако, создав обычный класс, который использует трейт, вы можете легко написать код теста для этого трейта. Примерно так:

2017-11-22 alek13

ПакетыWhoops! Наглядное отображение ошибок в PHP

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

В довершение к тому, что эти сообщения не читабельны и плохо воспринимаются, добивает то, что на поиск места в коде в вашем любимом IDE уходит достаточно много времени (ну больше, чем хотелось бы). Ну и напоследок, в тот момент, когда вы открыли нужное место в коде, вы тут же поняли, что ошибка явно произошла не здесь, а где-то выше или ниже по стеку. И нужно вновь открывать станицу с ошибкой, изучать сек вызова и вновь искать нужный фрагмент кода. Неприятное и муторное занятие.

И вот тут решить все эти проблемы нам поможет Whoops!

Что такое Whoops

2017-11-15 alek13

Базы данныхОптимизация MySQL: индексы, медленные запросы, конфигурация

MySQL по-прежнему является самой популярной в мире реляционной базой данных, но в то же время и наиболее не оптимизированной. Многие люди остаются с настройками по умолчанию, не "копая" глубже. В этой статье мы рассмотрим некоторые советы по оптимизации MySQL в сочетании с некоторыми новинками, которые вышли относительно недавно.

Оптимизация конфигурации

Первое, что каждый пользователь MySQL должен сделать для повышения производительности - это настроить конфигурацию. Однако, большинство этот шаг пропускают. В 5.7 (текущая версия) настройки по умолчанию стали намного лучше, чем у её предшественников, но улучшить их по-прежнему можно и несложно.

2017-11-13 alek13