Curiosidades sobre el código fuente de Symfony2

Hace cuatro años publicamos un artículo en el que mencionábamos las 20 funciones PHP más utilizadas en el código de Symfony 1. Después de todo este tiempo y con la nueva versión Symfony 2.1 recién publicada, hemos decidido volver a curiosear sobre las funciones PHP utilizadas en el código fuente de Symfony2.

Nuestro análisis se basa en todos los archivos PHP que se encuentran en el directorio vendor/ de una instalación estándar de Symfony 2.1. Esto significa que, además del núcleo de Symfony, se incluye el código de todos los componentes y librerías que forman el framework Symfony2: Twig, Monolog, Doctrine, SwiftMailer, etc.

Número total de funciones utilizadas

En la versión PHP 5.3 de nuestro servidor de pruebas, el lenguaje PHP tiene 1.575 funciones definidas, tal y como se puede comprobar con una llamada a la función get_defined_functions(). De ellas, el código de Symfony2 utiliza 467 funciones diferentes. Así que Symfony 2.1 no utiliza el 70% de las funciones de PHP.

Las funciones más utilizadas

  1. count(), 1.806 veces
  2. sprintf(), 1.610 veces
  3. substr(), 536 veces
  4. dirname(), 500 veces
  5. is_array(), 500 veces
  6. implode(), 483 veces
  7. strpos(), 442 veces
  8. strtolower(), 426 veces
  9. get_class(), 407 veces
  10. class_exists(), 386 veces

Para comparar, en el año 2008 la lista de funciones más utilizadas del viejo Symfony 1 era:

  1. isset(), 1.083 veces
  2. sprintf(), 729 veces
  3. count(), 515 veces
  4. substr(), 372 veces
  5. strlen(), 256 veces
  6. is_null(), 230 veces
  7. is_array(), 229 veces
  8. dirname(), 218 veces
  9. empty(), 213 veces
  10. strpos(), 204 veces

Las funciones menos utilizadas

Existen decenas de funciones que sólo se llaman una vez en todo el código de Symfony 2.1. Como muchas de ellas están relacionadas, la siguiente lista agrupa algunas de ellas y muestra otras funciones que nos han parecido curiosas:

  1. xml_xxx() (xml_set_element_handler, xml_set_object, xml_set_character_data_handler, xml_parser_create, ...) Relacionadas con el procesamiento de archivos XML. Se utilizan sobre todo en el componente SwiftMailer.
  2. getmypid(), devuelve el PID del proceso que está ejecutando PHP. Sólo se utiliza en un test de SwiftMailer.
  3. readline_xxx(), que integran la librería readline de GNU y se utilizan para proporcionar un historial de comandos en la shell de Symfony2 (accede a ella con el comando php app/console --shell).
  4. lchown(), que cambia el usuario de un enlace simbólico y se utiliza en el componente Filesystem.
  5. php_uname(), que proporciona información sobre el sistema operativo en el que está corriendo PHP y se utiliza en el componente Console para detectar si estás ejecutando Symfony2 en un OS400.
  6. openlog(), syslog() y closelog(), que sirven para abrir, escribir y cerrar el archivo de log del servidor. Como era de esperar, se utilizan en el componente Monolog.
  7. crc32(), calcula el código de redundancia cíclica de un valor (algo parecido a un primitivo md5()) y se utiliza en Doctrine.
  8. array_product(), que multiplica el valor de todos los elementos de un array. Se utiliza en Assetic.
  9. chunk_split(), divide una cadena de texto en trozos más pequeños de la longitud deseada (a este tipo de funciones se les suele llamar word wrappers). Se utiliza por ejemplo para hacer que el contenido de los emails cumpla los estándares. No es de extrañar por tanto que se utilice en el componente SwiftMailer.
  10. compact(), que es difícil de explicar con palabras, así que observa este ejemplo: $a = 3; $vars = compact('a'); // $vars ahora es array('a' => 3). A pesar de lo útil que es, sólo se utiliza una vez en el componente Translation.
  11. hash_algos(), devuelve la lista de algoritmos de codificación disponibles en tu sistema (md5, sha1, etc.) Se utiliza en el componente de seguridad.
  12. str_getcsv(), parsea una línea en formato CSV y devuelve un array con un elemento por cada campo CSV. Se utiliza cuando el profiler guarda sus datos en un archivo (en formato CSV) en vez de en una base de datos.
  13. array_pad(), aumenta el tamaño del array que le pasas hasta el tamaño que le indicas y lo rellena con el valor que le pasas. Sólo se utiliza en un test de Twig.
  14. strpbrk(), devuelve el trozo de cadena que empieza en el carácter que le indicas o false si no lo encuentra. Se utiliza en uno de los mensajes de error más populares de Symfony2: el del componente YAML que te dice que no puedes añadir tabuladores en un archivo YAML. Con esta función muestran el trozo de línea donde has escrito el tabulador.
  15. ngettext(), la versión para plurales de la función gettext(), que muestra la traducción de un texto al idioma actualmente seleccionado. Esta función es necesaria porque algunos idiomas tienen diferentes plurales en función de cuántos elementos sean. Por ejemplo en checo "2 ventanas" se dice "2 okna", pero "5 ventanas" se dice "5 oken". Esta función es imprescindible para el componente de traducción de Twig.

Cuando utilizas un framework como Symfony 2.1 que abstrae todas las partes del desarrollo de una aplicación, es fácil olvidar que todo el código corre sobre PHP. Tienes más de 1.500 funciones a tu disposición, así que no caigas en el error de programar algo que puede resolver una simple función PHP.

Comentarios

  1. que buena info Javier ...

    Roberto German Puentes Diaz el 13 de septiembre de 2012, 0:53:53

Este artículo ya no permite añadir más comentarios.
¿Por qué? Los artículos cierran sus comentarios automáticamente unos meses después de su publicación para asegurar que estos sigan siendo relevantes.

Publicada el

11 de septiembre de 2012

Etiquetas

Proyectos Symfony destacados

La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.