No más parches: conociendo str_starts_with y str_ends_with en PHP 8
\n\n¿Alguna vez ha escrito código como if (strpos($str, 'prefix') === 0) y ha sentido que se veía un poco torpe? ¿O quizás ha perdido tiempo descifrando substr($str, -3) === 'end' para verificar el final de una cadena? Si es así, tengo una excelente noticia para usted. A partir de PHP 8.0, el lenguaje incluye dos funciones elegantes e intuitivas: str_starts_with() y str_ends_with().
En este artículo las analizaremos en detalle. Aprenderá cómo funcionan, en qué se diferencian de los enfoques antiguos y por qué debería usarlas en cada proyecto PHP moderno. También veremos ejemplos reales de la vida del desarrollador, desde la verificación de URL hasta la validación de correos electrónicos y el trabajo con rutas de archivos.
\n\n¿Qué son str_starts_with() y str_ends_with()?
\n\nSon funciones integradas de PHP 8 que permiten verificar si una cadena comienza con una subcadena determinada, o si termina con ella. Devuelven un valor booleano (true o false), lo que las hace ideales para usar en condiciones.
Aquí está su sintaxis básica:
\n\nstr_starts_with(string $haystack, string $needle): bool\nstr_ends_with(string $haystack, string $needle): bool\n\nDonde $haystack es la cadena que está verificando, y $needle es la subcadena que busca al inicio o al final.
Ejemplo simple
\n\n<?php\n$string = "¡Hola, mundo!";\n\n// Verificamos si la cadena comienza con "Hola"\nif (str_starts_with($string, "Hola")) {\n echo "La cadena comienza con 'Hola'"; // Este código se ejecutará\n}\n\n// Verificamos si la cadena termina con "mundo!"\nif (str_ends_with($string, "mundo!")) {\n echo "La cadena termina con 'mundo!'"; // Y este también\n}\n?>\n\nSencillo, ¿verdad? Sin cálculos adicionales, sin === 0 ni strlen(). Solo una verificación y el resultado.
¿Por qué es importante? Problemas de los enfoques antiguos
\n\nAntes de PHP 8, los desarrolladores tenían que ingeniárselas. La forma más popular de verificar el inicio de una cadena era así:
\n\nif (strpos($string, 'prefix') === 0) { ... }\n\n¿Cuál es el problema? strpos() busca la subcadena en cualquier lugar de la cadena, no solo al inicio. Sí, la verificación === 0 descarta resultados incorrectos, pero el código en sí no expresa la intención del desarrollador. Al mirarlo, piensa: "Ajá, está verificando si comienza... o solo está buscando?" — esto reduce la legibilidad.
Y la verificación del final de la cadena era aún menos intuitiva:
\n\nif (substr($string, -3) === 'end') { ... }\n\nAquí necesita saber exactamente la longitud de la subcadena (-3), lo que lleva a errores si indica un número incorrecto. Además, si la subcadena es más larga que la cadena misma, substr() simplemente devolverá una cadena vacía y la condición nunca se cumplirá.
Las nuevas funciones str_starts_with() y str_ends_with() resuelven todos estos problemas:
- \n
- Legibilidad: El código habla por sí mismo. \n
- Fiabilidad: No necesita pensar en la longitud de la subcadena ni en cadenas vacías. \n
- Rendimiento: Las funciones están optimizadas a nivel del núcleo de PHP. \n
Ejemplos reales de uso en desarrollo web
\n\nVeamos dónde estas funciones pueden ser útiles en la práctica. He seleccionado varios escenarios que seguramente ha encontrado en su trabajo.
\n\n1. Verificación de prefijos de URL (enrutamiento, redirecciones)
\n\nSupongamos que está escribiendo un enrutador simple y quiere manejar las URL que comienzan con /admin:
<?php\n$uri = $_SERVER['REQUEST_URI'];\n\nif (str_starts_with($uri, '/admin')) {\n echo "Está en el panel de administración";\n // Cargamos el panel de admin\n}\n?>