strpos возвращает int|false. Это создаёт одну конкретную проблему: проверку на false нужно делать строго:
// Классическая ошибка
if (strpos($url, 'admin')) {
// Не выполнится, если 'admin' в позиции 0
}
// Правильно
if (strpos($url, 'admin') !== false) {
// Окей
}
Этот паттерн !== false живёт в кодбазах как ритуал, смысл которого половина команды уже не помнит.
PHP 8.0 дал str_contains, str_starts_with, str_ends_with. Они возвращают bool. Просто bool.
if (str_contains($url, 'admin')) { ... }
if (str_starts_with($route, '/api')) { ... }
if (str_ends_with($file, '.blade.php')) { ... }Никакого !== false. Никакой магии с позицией 0.
Что осталось за strpos:
— Нужна позиция вхождения, а не факт наличия
— Нужен offset для поиска со смещением
— substr_count, substr_replace всё ещё работают с позициями
$pos = strpos($text, '{{');
$end = strpos($text, '}}', $pos);
// Здесь strpos оправдан — тебе нужны числаПро производительность: str_contains не медленнее strpos на коротких строках. На длинных — профилируй конкретный кейс, не гадай.
Короткий вывод: str_contains и компания — это не синтаксический сахар. Это правильный тип возврата для правильного вопроса.
🐸 Библиотека пхпшника
#элементарный_выбор