PHP долгое время не работал с многобайтовыми кодировками, такими как UTF-8.
<?php
// Выведет неверный результат
strlen('привет'); // 12
Даже если попробовать выполнить любую операцию над строкой, включающей не ASCII-символы, станет видно, что функции по-прежнему не умеют обрабатывать такие строки. Дело в том, что в целях соблюдения обратной совместимости, в PHP было создано отдельное подмножество функций, имеющих аналогичные названия, но с префиксом mb_
.
<?php
mb_strlen('привет'); // 6
Такая ситуация очень неприятна и из популярных языков присутствует в PHP, C++ и C. В большинстве остальных языков есть ровно один набор функций, работающий со всеми кодировками. Минимизировать проблему можно использованием только функций с префиксом mb_
, так как они прекрасно работают и для английского алфавита, и вообще для любых строк.
Вторая проблема, уже типичная — функций довольно много и некоторые из них низкоуровневые. Например, проверить то, что строка начинается с определённой подстроки можно с помощью функции strpos()
.
<?php
// Обязательно проверять строго на равенство нулю
strpos('start', 'st') === 0; // true
Такой код, мало того, что сложен (не очевидно, что он делает), так ещё и является постоянным источником ошибок из-за неявного приведения типов. Поэтому в PHP появилась функция str_starts_with()
:
str_starts_with('start', 'st') // true
Symfony String
Библиотека Symfony String предоставляет унифицированный объектно-ориентированный интерфейс для работы со строчками. Она работает как типичный Builder, например, Collect.
<?php
use function Symfony\Component\String\s;
s('fòôbàř')->upper(); // 'FÒÔBÀŘ'
s('start')->startsWith('st'); // true
Применение методов к обёрнутой строке всегда возвращает обёрнутую строку. Такое поведение добавляет возможность строить цепочки.
<?php
s('FÒÔ BÀŘ')->collapseWhitespace()->lower(); // fòô bàř
Кроме того, объект, возвращаемый функцией s()
, реализует магический метод __toString()
, а это значит, что не придётся заниматься преобразованием типов, как в случае с Collect
. Каждый раз, когда объект используется как строка, на его месте оказывается строка.
Библиотека Symfony String содержит инструменты, которые пришлось бы самостоятельно писать для решения типовых задач. Рассмотрим преобразование названия курса в латинский вариант, чтобы использовать его в урле. Слаг (Slug) - это строка, которая выводится в адресе страницы. Как правило это латинские символы, которые могут быть разделены через тире. Например, в адресе https://ru.hexlet.io/blog/posts/sovershennyy-kod-biblioteka-ili-svoe-reshenie
часть sovershennyy-kod-biblioteka-ili-svoe-reshenie будет слагом статьи.
В библиотеке Symfony String есть специальный класс, которые позволяет создавать слаги:
use Symfony\Component\String\Slugger\AsciiSlugger;
$title = 'Совершенный код: библиотека или своё решение';
$slugger = new AsciiSlugger();
$slug = $slugger->slug($title)->lower();
print($slug); // => soversennyj-kod-biblioteka-ili-svoe-resenie
Класс AsciiSlugger
возьмет на себя способ преобразования кириллицы в латиницу. Метод slug()
вернет экземпляр класса Symfony\Component\String\UnicodeString
, который содержит методы, необходимые для работы со строкой.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.