Considerando que PHP surgió para procesar textos parece mentira que después de tantos años y versiones el manejo de cadenas sea tan deficiente e incongruente. Para tratar de unificar el manejo de cadenas en PHP y, además, de una manera orientada a objetos he creado la clase jfString.
Actualmente los nombres de las funciones de cadenas en PHP presentan ciertas incongruencias:
- Existen funciones que empiezan por str_: str_pad, str_repeat, etc.
- Existen funciones que terminan con _str: parse_str.
- Existen funciones sin separadores de palabras (strpos, strrev, etc.) mientras otras usan un _ como separador (str_pad, similar_text, etc.).
- Orden diferentes de parámetros. Por ejemplo, strpos usa el texto de entrada como primer parámetro mientras que str_replace lo usa de tercero.
Esta clase trata de corregir las deficiencias anteriores permitiendo tener un código más homogéneo. De cualquier función se elimina el parámetro que representa el texto donde se buscará (llamado haystack en la documentación de PHP) y se toma del valor de la clase. También cualquier texto str del nombre se elimina por ser redundante y se convierten a camelCase los nombres de las funciones PHP. Si la función a usar devuelve un string el valor de la clase será modificado, en caso contrario se devuelve el valor y el valor de la clase no se modifica.
Funcionalidades
UTF-8
A diferencia de las funciones de cadenas de PHP la clase permite trabajar con textos UTF-8 sin intervención del usuario. Algunas de Las funciones de PHP que no trabajan con UTF-8 han sido modificadas en la clase.
A diferencia de las funciones de cadenas de PHP la clase permite trabajar con textos UTF-8 sin intervención del usuario. Algunas de Las funciones de PHP que no trabajan con UTF-8 han sido modificadas en la clase.
Acceso a los caracteres
La clase implementa la intefaz ArrayAccess para permitir la notación de array para acceder al contenido de la clase como si fuera una cadena normal.
También implementa la interfaz Iterator por lo que se puede iterar sobre los caracteres sin tener que hacer un split del texto primero.
La clase implementa la intefaz ArrayAccess para permitir la notación de array para acceder al contenido de la clase como si fuera una cadena normal.
También implementa la interfaz Iterator por lo que se puede iterar sobre los caracteres sin tener que hacer un split del texto primero.
Alias
La clase permite modificar los alias de las funciones que se llamarán cuando se trata de acceder a un método. Esta funcionalidad permite modificar al vuelo el comportamiento de la clase.
La clase permite modificar los alias de las funciones que se llamarán cuando se trata de acceder a un método. Esta funcionalidad permite modificar al vuelo el comportamiento de la clase.
Mutabilidad
Se puede decidir cuándo se modifica el contenido de una instancia o se devuelve una nueva. Esto permite evitar las reasignaciones innecesarias que a veces es necesario hacer cuando se trabajan con cadenas en PHP.
Se puede decidir cuándo se modifica el contenido de una instancia o se devuelve una nueva. Esto permite evitar las reasignaciones innecesarias que a veces es necesario hacer cuando se trabajan con cadenas en PHP.
Ejemplos de uso
Reemplazo de texto
- use jf\text\String as jfString;
- $haystack = 'Hello World';
- $needle = 'World';
- $replace = 'jfString';
- // Usando las funciones de PHP
- echo strpos($haystack, $needle); // 6
- echo str_replace($needle, $replace, $haystack); // Hello jfString
- // Usando la clase jfString
- $str = new jfString($haystack);
- // Se elimina $haystack de la lista de parámetros pero se mantiene el orden del resto
- // Al devolver pos un valor numérico no se modifica el valor de la clase
- echo $str->pos($needle); // 6
- // Reemplazamos el valor y lo mostramos
- echo $str->replace($needle, $replace); // Hello jfString
- use jf\text\String as jfString;
- $haystack = 'Hello World';
- $needle = 'World';
- $replace = 'jfString';
- // Usando las funciones de PHP
- echo strpos($haystack, $needle); // 6
- echo str_replace($needle, $replace, $haystack); // Hello jfString
- // Usando la clase jfString
- $str = new jfString($haystack);
- // Se elimina $haystack de la lista de parámetros pero se mantiene el orden del resto
- // Al devolver pos un valor numérico no se modifica el valor de la clase
- echo $str->pos($needle); // 6
- // Reemplazamos el valor y lo mostramos
- echo $str->replace($needle, $replace); // Hello jfString
Uso de una función no mapeada
En realidad cualquier función podría ser usada siempre que acepte como primer parámetro la cadena a procesar (aunque los tests de la clase verifican solamente el uso de las funciones de texto de PHP):
- use jf\text\String as jfString;
- function wrap($text, $len = 1) {
- $_s = jfString::i('=')->repeat($len);
- return "$_s $text $_s";
- }
- echo jfString::i('Header')->wrap(5); // ===== Header =====
En realidad cualquier función podría ser usada siempre que acepte como primer parámetro la cadena a procesar (aunque los tests de la clase verifican solamente el uso de las funciones de texto de PHP):
- use jf\text\String as jfString;
- function wrap($text, $len = 1) {
- $_s = jfString::i('=')->repeat($len);
- return "$_s $text $_s";
- }
- echo jfString::i('Header')->wrap(5); // ===== Header =====
Iterando sobre los caracteres
Al implementar la interfaz Iterator se puede fácilmente iterar sobre los carácteres del texto con algo tan fácil como el siguiente código:
- use jf\text\String as jfString;
- foreach (jfString::i('hola mundo') as $_index => $_char)
- {
- echo "s[$_index] = $_char\n";
- }
Al ejecutarlo tendríamos como resultado:
- s[0] = h;
- s[1] = o;
- s[2] = l;
- s[3] = a;
- s[4] = ;
- s[5] = m;
- s[6] = u;
- s[7] = n;
- s[8] = d;
- s[9] = o;
Al implementar la interfaz Iterator se puede fácilmente iterar sobre los carácteres del texto con algo tan fácil como el siguiente código:
- use jf\text\String as jfString;
- foreach (jfString::i('hola mundo') as $_index => $_char)
- {
- echo "s[$_index] = $_char\n";
- }
Al ejecutarlo tendríamos como resultado:
- s[0] = h;
- s[1] = o;
- s[2] = l;
- s[3] = a;
- s[4] = ;
- s[5] = m;
- s[6] = u;
- s[7] = n;
- s[8] = d;
- s[9] = o;
Uso de alias
Supongamos que el usuario A hace uso de la clase en su código y genera un hash haciendo uso de la función md5. El usuario B hace uso de este código pero no quiere generar un hash md5 sino sha1. En este caso, tendríamos lo siguiente:
- use jf\text\String as jfString;
- // Código del usuario A.
- // ...
- $hash = jfString::i($text)->md5();
- // ...
- // Fin código de A.
- // ...
- // Ahora el usuario B ha importado el código de A y quiere modificarlo.
- // Con esto, cada vez que se trate de generar un MD5 se generará un SHA1.
- // ...
- jfString::alias['md5'] = 'sha1';
- // ...
Este ejemplo es para que se pueda ver lo fácil que es cambiar el comportamiento del código ya escrito. Obviamente sería incorrecto usar un método md5 que devuelva un sha1 ya que ofuscaría la legibilidad del código.
Supongamos que el usuario A hace uso de la clase en su código y genera un hash haciendo uso de la función md5. El usuario B hace uso de este código pero no quiere generar un hash md5 sino sha1. En este caso, tendríamos lo siguiente:
- use jf\text\String as jfString;
- // Código del usuario A.
- // ...
- $hash = jfString::i($text)->md5();
- // ...
- // Fin código de A.
- // ...
- // Ahora el usuario B ha importado el código de A y quiere modificarlo.
- // Con esto, cada vez que se trate de generar un MD5 se generará un SHA1.
- // ...
- jfString::alias['md5'] = 'sha1';
- // ...
Este ejemplo es para que se pueda ver lo fácil que es cambiar el comportamiento del código ya escrito. Obviamente sería incorrecto usar un método md5 que devuelva un sha1 ya que ofuscaría la legibilidad del código.