Utilizar las funciones PHP
Preámbulo
El objetivo de este capítulo es presentar las funciones más útiles para el desarrollo de un sitio web.
PHP ofrece numerosas funciones; la descripción de cada función puede encontrarse en www.php.net.
Desde la versión 8, es posible pasar parámetros a una función utilizando el nombre del parámetro en lugar de su posición. Esta característica se presenta en el capítulo Escribir funciones y clases PHP, pero puede utilizarse en las funciones nativas del lenguaje PHP y, por lo tanto, en las funciones que se presentan en este capítulo. Sin embargo, en este capítulo, los nombres reales de los parámetros de las funciones no se presentan (están traducidos); para conocerlos, consulte la documentación en línea de las funciones.
Desde la versión 8.1, ha quedado obsoleto pasar el valor NULL a un parámetro que es explícitamente opcional y produce una alerta de nivel E_DEPRECATED.
Ejemplo
<?php
$x = null;
$n = strlen($x);
?>
Resultado
Deprecated: strlen(): Passing null to parameter #1 ($string) of type
string is deprecated in /app/scripts/index.php on line 3
Manipular las constantes, las variables y los tipos de datos
1. Constantes
PHP ofrece un cierto número de funciones útiles para el trabajo con constantes:
Nombre |
Rol |
defined |
Indica si una constante está definida o no. |
constant |
Devuelve el valor de una constante. |
defined
La función defined permite saber si una constante está definida o no.
Sintaxis
booleano defined(cadena nombre)
nombre |
Nombre de la constante. |
La función defined devuelve TRUE si la constante está definida y FALSE en caso contrario.
Ejemplo
<?php
// Evaluar si la constante CONSTANTE está definida.
$ok = defined('CONSTANTE');
if ($ok) {
echo 'CONSTANTE está definida.<br />';
} else {
echo 'CONSTANTE no está definida.<br />';
};
// Definir la constante CONSTANTE
define('CONSTANTE','valor de CONSTANTE');
// Evaluar si la constante CONSTANTE está definida.
$ok = defined('CONSTANTE');
if ($ok) {
echo 'CONSTANTE está definida.<br />';
} else {
echo 'CONSTANTE no está definida.<br />';
};
?>
Resultado
CONSTANTE no está definida.
CONSTANTE está definida.
constant
La función constant devuelve el valor de una constante cuyo nombre se ha pasado como parámetro.
Sintaxis
mixto constant(cadena nombre)
nombre |
Nombre de la constante. |
Esta función es útil para recuperar el valor de una constante cuyo nombre no se conoce en principio.
Ejemplo
<?php
// Definir el nombre de la constante en una variable.
$nombreConstante = 'OTRA CONSTANTE';
// Definir el valor de la constante.
define($nombreConstante,'valor de OTRA CONSTANTE');
// Mostrar el valor de la constante.
echo $nombreConstante,' = ',constant($nombreConstante)
?>
Resultado
OTRA CONSTANTE = valor de OTRA CONSTANTE
Otras funciones permiten conocer el tipo de una constante (véase en este capítulo Manipular las constantes, las variables y los tipos de datos - Tipos de datos).
2. Variables
PHP ofrece un cierto número de funciones útiles para el trabajo con variables:
Nombre |
Rol |
empty |
Indica si una variable está vacía o no. |
isset |
Indica... |
Manipular las tablas
PHP ofrece un gran número de funciones para trabajar con tablas.
Las funciones más utilizadas son las siguientes:
Nombre |
Rol |
count |
Cuenta el número de elementos en una tabla. |
in_arrays |
Evalúa si existe un valor en una tabla. |
array_search |
Busca un valor en una tabla. |
array_replace |
Reemplaza los valores de una tabla. |
[a|k][r]sort |
Ordena una tabla (varias posibilidades). |
str_split |
Recorta una cadena en fragmentos de longitud fija y almacena los elementos en una tabla. |
explode |
Recorta una cadena según un separador y almacena los elementos en una tabla. |
implode |
Agrupa los elementos de una tabla en una cadena mediante un separador. |
array_column |
Devuelve todos los valores de una columna de una tabla multidimensional. |
max |
Devuelve el valor más grande almacenado en una tabla. |
min |
Devuelve el valor más pequeño almacenado en una tabla. |
No olvide la función is_array, que permite saber si una variable es de tipo tabla (véase en este capítulo Manipular las constantes, las variables y los tipos de datos - Tipos de datos).
Algunas funciones modifican el contenido de la tabla que se considera argumento y por lo tanto, no se pueden aplicar a una tabla constante si no se quiere obtener un error fatal:
Fatal error: Only variables can be passed by reference in ...
Existen muchas otras funciones. La descripción de cada función está disponible en www.php.net. Principalmente encontrará funciones para:
-
realizar cálculos;
-
extraer una subtabla de una tabla;
-
fusionar tablas;
-
devolver la primera o la última clave de una tabla;
-
desduplicar una tabla, etc.
count
La función count permite conocer el número de elementos en una tabla.
Sintaxis
entero count (tabla variable)
variable |
Variable en cuestión |
Si la variable es una tabla, count devuelve el número de elementos presentes en la tabla (0 si la tabla está vacía).
Desde la versión 8, si la función se aplica a una variable que no es una tabla, se produce una excepción TypeError (simple error de nivel E_WARNING en la versión 7); este error interrumpe el script si no se gestiona.
Ejemplo
<?php
$x = array();
echo '$x tabla vacía => ',count($x),'<br />';
$x = array(1,2);
echo '$x tabla de 2 elementos => ',count($x),'<br />';
?>
Resultado...
Manipular los números
Las funciones más útiles para manipular números son las siguientes:
Nombre |
Papel |
abs |
Valor absoluto de un número. |
ceil |
Redondea un número al entero superior. |
floor |
Redondea un número al entero inferior. |
intdiv |
Cociente de la división entera de dos enteros. |
max |
Mayor valor de una lista de números. |
min |
Menor valor de una lista de números. |
rand |
Generación de números aleatorios |
round |
Redondea un número a coma flotante. |
abs
La función abs devuelve el valor absoluto de un número.
Sintaxis
numero abs(numero valor)
valor |
Número que se va a tratar. |
La función abs devuelve un número del mismo tipo que el que se pasa como argumento (entero o número en coma flotante).
Ejemplo
<?php
echo 'abs(123) =',abs(123),'<br />';
echo 'abs(-321) =',abs(-321);
?>
Resultado
abs(123) = 123
abs(-321) = 321
ceil
La función ceil («límite superior») redondea un número al entero superior.
Sintaxis
numero ceil(numero valor)
valor |
Número que se va a tratar. |
La función ceil devuelve un número en coma flotante (float).
Ejemplo
<?php
echo 'ceil(123.45) =',ceil(123.45),'<br />';
echo 'ceil(-123.45) =',ceil (-123.45);
?>
Resultado
ceil(123.45) = 124
ceil(-123.45) = -123
floor
La función floor («límite inferior») redondea un número al entero inferior.
Sintaxis
numero floor(numero valor)
valor |
Número que se va a tratar. |
La función floor devuelve un número en coma flotante (float).
Ejemplo
<?php
echo 'floor(1234.56) =',floor(1234.56),'<br />';
echo 'floor(-1234.56) =',floor (-1234.56);
?>
Resultado
floor(1234.56) = 1234
floor(-1234.56) = -1235
intdiv
La función intdiv devuelve el cociente de la división entera de dos enteros.
Sintaxis
entero intdiv(entero dividendo, entero divisor)
Dividendo |
Dividendo. |
divisor |
Divisor. |
Si los dos argumentos no son de tipo entero, se convierten a enteros antes del cálculo, usando las reglas presentadas en el capítulo Introducción a PHP - Las bases del lenguaje PHP - Tipos de datos. Fundamentalmente, recuerde que en este caso un número en coma flotante siempre...
Manipular las cadenas de caracteres
Las funciones más útiles para manipular las cadenas de caracteres son las siguientes:
Nombre |
Rol |
strlen |
Devuelve el número de caracteres de una cadena. |
strtolower strtoupper ucfirst lcfirst ucwords |
Conversiones mayúsculas/minúsculas |
strcmp strcasecmp |
Comparación de cadenas (distingue o no mayúsculas/minúsculas). |
[s]printf v[s]printf |
Formato de una cadena (idéntica a las funciones C equivalentes). |
number_format |
Formato de un número. |
[l|r]trim |
Eliminación de caracteres «vacíos». |
substr |
Extracción de una parte de cadena. |
str_repeat |
Construcción de una cadena por repetición de caracteres. |
str[r][i]pos |
Busca la posición de una coincidencia (carácter o cadena) dentro de una cadena. |
str[i]str strrchr |
Extracción de la subcadena que comienza a partir de una cierta coincidencia de un carácter o de una cadena. |
str_[i]replace |
Sustitución de las coincidencias de una cadena por otra. |
strtr |
Sustitución de las coincidencias de un carácter por otro carácter o de una cadena por otra cadena. |
str contains |
Determina si una cadena contiene otra cadena (novedad de la versión 8). |
str starts with |
Determina si una cadena comienza por otra cadena (novedad de la versión 8). |
str ends with |
Determina si una cadena termina por otra cadena (novedad de la versión 8). |
No olvide las funciones explode e implode presentadas anteriormente (véase en este capítulo Manipular las tablas). En el capítulo Gestionar los formularios y los vínculos con PHP, se estudian otras funciones más específicamente relacionadas con la gestión de los formularios.
En la siguiente sección, también veremos cómo realizar búsquedas y sustituciones con ayuda de expresiones racionales.
strlen
La función strlen devuelve el número de caracteres de una cadena.
Sintaxis
entero strlen(cadena cadena)
cadena |
Cadena en cuestión. |
Ejemplo
<?php
$x = 'Olivier Heurtel';
echo "strlen('$x') = ",strlen($x);
?>
Resultado
strlen('Olivier Heurtel') = 15
strtolower - strtoupper - ucfirst - lcfirst - ucwords
Estas funciones permiten hacer conversiones de mayúsculas/minúsculas.
Sintaxis
cadena strtolower(cadena...
Utilizar expresiones regulares
1. Introducción
Una expresión regular es una cadena de caracteres que describe el modelo (o patrón) buscado en otra cadena de caracteres. Las expresiones regulares son muy útiles y muy eficaces para realizar comprobaciones u operaciones a veces complejas en cadenas de caracteres.
PHP solo ofrece una única extensión para utilizar expresiones regulares: PCRE (Perl Compatible Regular Expression). Esta extensión (funciones preg_*) utiliza prácticamente la misma sintaxis que el lenguaje Perl para escribir la expresión regular.
2. Estructura de una expresión regular
Una expresión regular Perl debe enmarcarse por un carácter delimitador. Este delimitador puede ser cualquier carácter a excepción de la barra invertida (\); muy a menudo se utiliza el carácter barra (/). También se puede utilizar los delimitadores (), {}, [] y <>.
Ejemplos (delimitador en negrita)
/http:\/\/(.*)/
{http://(.*)}
Tal y como muestra el primer ejemplo, si el carácter delimitador está presente en el patrón de búsqueda, debe escaparse con una barra invertida (\). En este caso, se puede utilizar otro delimitador distinto a / (#, por ejemplo) para obtener una expresión más legible.
Después del delimitador de cierre, se pueden detallar opciones que modificarán el comportamiento de la búsqueda.
Ejemplo (opción en negrita y utilización del carácter # como delimitador)
#http://(.*)#is
A continuación se presentan las opciones principales.
En una expresión regular, la mayoría de los caracteres se representan a sí mismos. De este modo, la expresión /http/ permite buscar la cadena http.
Pero la potencia de las expresiones regulares reside en la existencia de caracteres especiales (metacaracteres) que se interpretan para describir el patrón buscado.
Contrabarra
El carácter barra invertida tiene varios usos.
En primer lugar, permite escapar los caracteres especiales (^.[$()|*+?{\) o el delimitador de búsqueda cuando este está siendo buscado como tal. Por ejemplo, el patrón #a\*{2,4}b# permite buscar las secuencias comenzando con una a seguida de 2 a 4 asteriscos seguidos a su vez de una b (nótese el \*).
Para buscar una barra invertida, hay que duplicarla...
Manipular las fechas
PHP no gestiona las fechas con un tipo de datos específico. No obstante, pueden manipularse las fechas, bien en forma de una cadena de caracteres, bien en forma de un timestamp de Unix (correspondiente al número de segundos transcurridos desde el 1 de enero de 1970 a las 01:00:00). Hay varias clases que ofrecen funcionalidades avanzadas para la manipulación de las fechas (clase DateTime) e intervalos (clase DateInterval) orientados a objetos (ver la documentación).
Varias funciones permiten manipular las fechas bajo una de estas formas:
Nombre |
Rol |
checkdate |
Comprueba que los tres enteros correspondientes al día, el mes y el año se ajustan a una fecha válida. |
date |
Convierte en cadena una fecha dada en forma de timestamp de Unix. |
strftime |
Convierte en cadena una fecha dada en forma de timestamp de Unix, utilizando las características locales. |
getdate |
Almacena en una tabla los diferentes componentes de una fecha dada en forma de timestamp de Unix. |
date_parse_from_ format |
Almacena en una tabla los diferentes componentes de una fecha facilitada en forma de cadena de caracteres. |
time |
Da el timestamp de Unix actual. |
mktime |
Crea un timestamp de Unix a partir de los diferentes componentes de una fecha. |
microtime |
Da el timestamp de Unix actual acompañado del número de microsegundos transcurridos desde el último segundo. |
idate |
Da los componentes de una fecha facilitada en forma de timestamp de Unix. |
La llamada a algunas funciones puede generar una alerta de nivel E_NOTICE si el huso horario no se define correctamente (ver la directiva de configuración date.timezone del archivo de configuración de PHP). En este libro, suponemos que esta directiva vale Europe/Madrid.
checkdate
La función checkdate comprueba que los tres enteros correspondientes al día, el mes y el año se ajustan a una fecha válida.
Sintaxis
booleano checkdate(entero mes, entero día, entero año)
mes |
Número del mes (de 1 a 12). |
día |
Número del día (de 1 a 31). |
año |
Año (de 1 a 32767). |
La función checkdate devuelve TRUE si la fecha constituida con los tres componentes es válida y FALSE en caso contrario. Esta función tiene en cuenta los bisiestos.
Ejemplo
<?php
$día = 26; $mes = 8; $año = 1966;
echo "$día/$mes/$año => ", ...
Generar un identificador único
En ciertas situaciones, puede ser necesario generar identificadores únicos.
PHP ofrece la función uniqid para generar identificadores únicos.
Sintaxis
cadena uniqid()([cadena prefijo [, booleano más_único]])
prefijo |
Prefijo del identificador. Ponga una cadena vacía o no ponga nada si no desea prefijo. |
más_único |
Si este parámetro se establece en TRUE, se añaden datos suplementarios al final del valor devuelto para obtener un identificador más largo y más difícilmente identificable. |
La función uniqid devuelve una cadena de trece caracteres o veintitrés si el parámetro más_único se establece en TRUE (sin contar el prefijo), calculado a partir de la hora actual en microsegundos.
Ejemplo
<?php
echo uniqid(),'<br />';
echo uniqid(),'<br />';
echo uniqid('abc'),'<br />';
echo uniqid('',TRUE) ,'<br />';
?>
Resultado
62583b776e886
62583b776e887
abc62583b776e888
62583b776e8894.21626890
Este ejemplo muestra que el identificador generado es realmente único, aunque no haya gran diferencia entre dos llamadas sucesivas. Así, el identificador generado puede considerarse insuficientemente aleatorio y, en cierto sentido, determinista.
Una técnica clásica consiste en utilizar...
Trabajar con archivos en el servidor
1. Funciones útiles
PHP ofrece un gran número de funciones para trabajar con archivos en el servidor.
Las funciones más útiles son las siguientes:
Nombre |
Rol |
fopen |
Abrir un archivo |
fclose |
Cerrar un archivo |
fread |
Leer el contenido de un archivo (en una cadena) |
file |
Leer el contenido de un archivo (en una tabla) |
fwrite |
Escribir en un archivo |
file_get_contents |
Abrir, leer y cerrar un archivo |
file_put_contents |
Abrir, escribir y cerrar un archivo |
readfile |
Muestra el contenido de un archivo directamente en la salida |
copy |
Copiar un archivo |
unlink |
Eliminar un archivo |
rename |
Cambiar el nombre de un archivo |
file_exists |
Comprobar la existencia de un archivo |
filesize |
Leer el tamaño de un archivo |
También existen funciones que permiten leer el contenido de un directorio (opendir, readdir, closedir, scandir, etc.). Para más información, consulte la documentación PHP.
Algunas de estas funciones tomarán como parámetro un nombre de archivo o de directorio. En Windows, para especificar una ruta de acceso en una cadena de caracteres delimitada por comillas, debe escapar la barra invertida (con una barra invertida = \\) o puede utilizar una notación de tipo «Unix», con barras (/). Por ejemplo, la ruta c:\temp\info.txt puede escribirse «c:\\temp\\info.txt» o «c:/temp/info.txt». Si no se indica ninguna ruta, se utiliza el directorio actual. Pueden especificarse rutas relativas utilizando el carácter . (punto) para designar el directorio actual y .. (dos puntos) para designar el directorio superior.
La constante predefinida DIRECTORY_SEPARATOR da el carácter de separación utilizado en los nombres de directorio para la plataforma en la que está instalado PHP. La constante predefinida PHP_EOL da la secuencia de caracteres utilizada por la plataforma para representar una nueva línea.
Por otro lado, varias funciones poseen un parámetro (llamado utilizar_inclusión en las sintaxis de este libro) que permite buscar el archivo en los directorios especificados por la directiva de configuración include_path.
La mayor parte de las funciones de manipulación de archivos permiten acceder de manera más general a los flujos de datos (HTTP, FTP, etc.). En este marco, las funciones aceptan un argumento adicional de contexto que permite especificar los argumentos específicos...
Enviar un correo electrónico
1. Visión de conjunto
Un sitio web interactivo a menudo necesita enviar mensajes electrónicos a los usuarios, por ejemplo para confirmar una compra, una inscripción o enviar un boletín informativo.
La función mail que ofrece PHP permite responder simplemente a este tipo de necesidad. Esta función se detalla en este capítulo, en primer lugar, para enviar mensajes de texto (sin adjuntos), y luego, para enviar mensajes en formato MIME (Multipurpose Internet Mail Extensions).
Además, PHP ofrece una potente biblioteca, pero más compleja de utilización, para gestionar mensajes según el protocolo IMAP (Internet Message Access Protocol). No trataremos esta biblioteca en este libro, ya que no es indispensable para responder a la necesidad mencionada anteriormente.
2. Enviar un mensaje de texto sin adjunto
La función mail permite enviar un mensaje electrónico.
Sintaxis
booleano mail(cadena destinatario, cadena asunto,
cadena mensaje[, cadena encabezado])
destinatario |
Dirección electrónica del destinatario. Pueden indicarse varios destinatarios separándolos mediante comas. |
asunto |
Asunto del mensaje. |
mensaje |
Texto del mensaje. |
encabezado |
Encabezados suplementarios, en forma de cadena de caracteres o de tabla. |
La función mail envía el mensaje indicado por los diferentes parámetros a un servidor de correo electrónico definido por las directivas de configuración siguientes:
Win32 |
SMTP |
Dirección del servidor SMTP al que enviar el mensaje. Ejemplo: smtp.gmail.com |
sendmail_from |
Dirección electrónica del emisor. Ejemplo:webmaster@misitio.com Esta directiva debe estar presente, aunque esté vacía. |
|
Unix |
sendmail_path |
Ruta de acceso hacia el ejecutable del servidor de correo electrónico (puede incluir parámetros). Ejemplo: sendmail -t -i |
La función mail devuelve TRUE si el mensaje ha podido enviarse al servidor (lo que no garantiza que este haya podido enviarlo con éxito) y FALSE en caso contrario. No hay ninguna manera de saber si el mensaje ha sido enviado correctamente; esta comprobación debe realizarse fuera de PHP.
El cuarto parámetro permite especificar información adicional que será enviada en el encabezado del mensaje (From, Reply-To, etc.). En caso de uso de una cadena de caracteres...
Manipular los encabezados HTTP
La función header permite enviar encabezados HTTP con la página HTML.
Sintaxis simplificada
header(cadena encabezado [, booleano sustituir [,
entero código_respuesta]])
encabezado |
Cadena para enviar como encabezado HTTP con la página HTML. |
sustituir |
Indica si la función debe sustituir un encabezado previamente emitido (valor TRUE, de manera predeterminada) o bien añadir un nuevo encabezado (valor FALSE). |
codigo_respuesta |
Código de respuesta HTTP. |
Los diferentes encabezados HTTP se describen en la RFC 2616.
Por ejemplo, la función header puede utilizarse para enviar un encabezado que prohíbe el almacenamiento en caché de la página por el cliente o por un proxy. Esta necesidad es bastante frecuente en los scripts de PHP que generan HTML dinámico cuyo contenido cambia en función del usuario.
Ejemplo
// HTTP 1.0
header("Pragma: no-cache");
// HTTP 1,1
header("Cache-Control: no-cache, must-revalidate");
En la continuación de este libro, tendremos la ocasión de utilizar la función header en varias situaciones:
-
redirección HTTP (véase el capítulo Gestionar los formularios y los vínculos con PHP - Ir a otra página);
-
identificación HTTP (véase el capítulo Gestionar las sesiones - Autenticación);
-
descarga (download) de un documento (véase...