НейроАгент

Как реализовать функции startsWith() и endsWith() в PHP

Узнайте, как реализовать эффективные функции startsWith() и endsWith() в PHP. Изучите встроенные решения для PHP 8.0+ и пользовательские реализации для более старых версий с сравнением производительности и лучшими практиками.

Вопрос

Как реализовать функции startsWith() и endsWith() в PHP

Как создать две PHP функции, которые проверяют, начинается ли строка с указанного символа или подстроки, или заканчивается на него?

Например, мне нужны функции, которые бы:

  • Возвращали true, если строка начинается с указанного префикса
  • Возвращали true, если строка заканчивается указанным суффиксом

Пример использования:

php
$str = '|apples}';

echo startsWith($str, '|'); // Должно вернуть true
echo endsWith($str, '}');   // Должно вернуть true

Какой самый эффективный способ реализовать эти функции в PHP, и существуют ли встроенные альтернативы?

НейроАгент

PHP предоставляет несколько способов реализации функциональности startsWith() и endsWith(), при этом наиболее эффективным подходом являются встроенные функции str_starts_with() и str_ends_with(), доступные в PHP 8.0 и более поздних версиях. Для более старых версий PHP можно создавать собственные реализации с использованием различных методов манипуляции со строками.

Содержание

Встроенные функции PHP (PHP 8.0+)

Начиная с PHP 8.0, можно использовать встроенные функции, которые оптимизированы и безопасны с точки зрения типов:

php
$str = '|apples}';

// Использование встроенных функций
echo str_starts_with($str, '|'); // Возвращает true
echo str_ends_with($str, '}');   // Возвращает true

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

  • Безопасность типов: Они выполняют строгую проверку типов
  • Производительность: Они реализованы на C и быстрее PHP-альтернатив
  • Поддержка Unicode: Правильно обрабатывают многобайтовые символы
  • Безопасность при null: Возвращают false вместо генерации предупреждений при null-входных данных

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

Собственные реализации для старых версий PHP

Для версий PHP до 8.0 ниже приведены несколько подходов к реализации:

1. Использование сравнения подстрок

php
function startsWith($haystack, $needle) {
    return substr($haystack, 0, strlen($needle)) === $needle;
}

function endsWith($haystack, $needle) {
    return substr($haystack, -strlen($needle)) === $needle;
}

2. Использование strpos() для startsWith()

php
function startsWith($haystack, $needle) {
    return strpos($haystack, $needle) === 0;
}

function endsWith($haystack, $needle) {
    return strrpos($haystack, $needle) === strlen($haystack) - strlen($needle);
}

3. Использование регулярных выражений

php
function startsWith($haystack, $needle) {
    return preg_match('/^' . preg_quote($needle, '/') . '/', $haystack) === 1;
}

function endsWith($haystack, $needle) {
    return preg_match('/' . preg_quote($needle, '/') . '$/', $haystack) === 1;
}

4. Варианты без учета регистра

php
function startsWithIgnoreCase($haystack, $needle) {
    return stripos($haystack, $needle) === 0;
}

function endsWithIgnoreCase($haystack, $needle) {
    return stripos(strrev($haystack), strrev($needle)) === 0;
}

Сравнение производительности

Встроенные функции значительно превосходят по производительности собственные реализации:

Метод Производительность Версия PHP Примечания
str_starts_with()/str_ends_with() Самый быстрый PHP 8.0+ Реализация на основе C
Сравнение substr() Хорошая Все версии Надежно и читаемо
Метод strpos() Хорошая Все версии Немного быстрее substr
Регулярные выражения Самый медленный Все версии Наиболее гибкий, но самый медленный

Согласно документации TYPO3, встроенные функции PHP 8.0 быстрее их аналогов, реализованных вручную.


Лучшие практики и решения, специфичные для фреймворков

Реализации в фреймворках

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

php
// Вспомогательные функции Laravel
starts_with($str, '|');  // Возвращает true
ends_with($str, '}');    // Возвращает true

Современные методы PHP

Для современной разработки на PHP:

  1. Всегда используйте встроенные функции, когда это возможно (PHP 8.0+)
  2. Добавляйте подсказки типов для улучшения качества кода
  3. Учитывайте граничные случаи, такие как пустые иглы (needles)
  4. Учитывайте производительность для операций с высокой частотой

Полная реализация с безопасностью типов

php
function startsWith(string $haystack, string $needle): bool {
    if ($needle === '') {
        return true;
    }
    return str_starts_with($haystack, $needle);
}

function endsWith(string $haystack, string $needle): bool {
    if ($needle === '') {
        return true;
    }
    return str_ends_with($haystack, $needle);
}

Для совместимости с PHP < 8.0:

php
function startsWith(string $haystack, string $needle): bool {
    if ($needle === '') {
        return true;
    }
    return substr($haystack, 0, strlen($needle)) === $needle;
}

function endsWith(string $haystack, string $needle): bool {
    if ($needle === '') {
        return true;
    }
    return substr($haystack, -strlen($needle)) === $needle;
}

Полные примеры реализации

Вот комплексное решение, которое работает в разных версиях PHP:

php
<?php

/**
 * Проверяет, начинается ли строка с заданного префикса
 * 
 * @param string $haystack Строка для поиска
 * @param string $needle Префикс для поиска
 * @return bool True, если строка начинается с префикса
 */
function startsWith(string $haystack, string $needle): bool {
    if ($needle === '') {
        return true;
    }
    
    if (function_exists('str_starts_with')) {
        return str_starts_with($haystack, $needle);
    }
    
    return substr($haystack, 0, strlen($needle)) === $needle;
}

/**
 * Проверяет, заканчивается ли строка заданным суффиксом
 * 
 * @param string $haystack Строка для поиска
 * @param string $needle Суффикс для поиска
 * @return bool True, если строка заканчивается суффиксом
 */
function endsWith(string $haystack, string $needle): bool {
    if ($needle === '') {
        return true;
    }
    
    if (function_exists('str_ends_with')) {
        return str_ends_with($haystack, $needle);
    }
    
    return substr($haystack, -strlen($needle)) === $needle;
}

// Примеры использования
$str = '|apples}';

echo startsWith($str, '|') ? 'true' : 'false'; // true
echo endsWith($str, '}') ? 'true' : 'false';   // true

// Граничные случаи
echo startsWith('hello', '') ? 'true' : 'false'; // true (пустой префикс)
echo endsWith('hello', '') ? 'true' : 'false';   // true (пустой суффикс)
?>

Эта реализация:

  • Автоматически определяет версию PHP и использует оптимальные функции
  • Правильно обрабатывает пустые иглы (возвращает true)
  • Предоставляет подсказки типов для лучшей поддержки IDE
  • Работает во всех версиях PHP с последовательным поведением
  • Обратная совместима с шаблоном использования из примера

Источники

  1. Журнал изменений TYPO3 Core - Устаревание StringUtility::beginsWith() и StringUtility::endsWith()
  2. Перестаньте гадать! Окончательный код PHP String Starts With (PHP 5-8+)
  3. PHP - Википедия
  4. Обратная строка в PHP – Простые примеры кода

Заключение

При реализации функциональности startsWith() и endsWith() в PHP учтите следующие ключевые моменты:

  • Для PHP 8.0+: Всегда используйте встроенные функции str_starts_with() и str_ends_with() для оптимальной производительности и безопасности типов
  • Для старых версий PHP: Реализуйте собственные функции с использованием сравнения substr() для лучшей производительности и читаемости
  • Интеграция с фреймворками: Используйте вспомогательные функции фреймворков, такие как starts_with() и ends_with() в Laravel, когда они доступны
  • Обработка граничных случаев: Всегда учитывайте пустые иглы и согласованность типов
  • Производительность имеет значение: Выбирайте правильную реализацию на основе вашей версии PHP и требований к производительности

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