Está en la página 1de 322
> , Ls Rebursos Tnformatitos PHP 5.5 Desarrollar un sitio Web dinamico e interactivo Olivier HEURTEL INFORMATICA TECNICA Tico Anterior Buscar indice rodisén Informacion genera sobre PAP ‘arable, constanes psy matrices ceruauras de conta Gestion de formudarios Lmiaruncereoelacrénico Aamistrarlos eres en un serge PH PHP 5.5 Desarrollar un stio Web dinémico e interactivo Este vo sobre PHP 5.5 esth disalo a diseRadores y desarraiadores que Sesean sttzar PHP para desarrolor un alto web dingmice e Interactive. Desputs de_presentar os prncpion baton del lnguaje autor se Imeractvos, properconando. respuestas completes "y_predsas a. BS lestiones nae habtuales (gestion de formulgios, acceso 2) bases de ‘dates gestion de sesiones, vio de mensajes de correo electrics). ‘humeroroe ejemplo de caigo. Este libro de referenca, a ver completo Y nbn: Los ejemplos que aparecen en elitra se pueden descargaren esta pina Los capitulos det libro: Inerogcaon = Informaccn general sobre PHP - Varables,constantes tinos Yyimatnees = Operagares'< Estructras: ge control's Funcones y chses = Gestion de formulanos = Aeeder a ins bases de datos = Adminitar ls ‘Senones * Envmrn coreo eiscrdnice~ Gestén de arcwos = AdmNNStar los errres en un senpt PHP Anexo, er HEURTEL Después de mis de ocho afos en una empress de servicios, donde Sueschamente desempens labores de. desarolader, administrador de proyedtas y decor de proyectos, Olivier HEURTEL iniie "uno actividad foro consuorfermadar independiente espedalzado en bases de datos {(Groas)deserrolo Web (PHE) y to sistemas de apoyo'2 las decsiones, ‘También es poseedor del cerutcad Oracle Certed Professional Publezci febrero 2014 fet NS SPH PHP 5.5 a" Constantes 1. Definicion La funcién define o la palabra clave const (desde la versién 5.3) permiten definir una constante. Una constante es un drea de memoria identificada por un nombre que contiene un valor legible, pero no modificable en el programa. Sintaxis booleano define (cadena nombre, mixto valor[, booleano sensible_mayisculas) const nombre = valor nombre Nombre de la constante (ver seccion Estructura basica de una pagina PHP - Normas de denominacién en el capitulo Informacién general sobre PHP). valor Valor de la constante. sensible_maytsculas Indica si el nombre de la constante es sensible a maydsculas y mindsculas (TRUE - valor predeterminado) no (FALSE). La funcién define devuelve TRUE en caso de éxito y FALSE en caso de error. Cualquier tipo de dato escalar (véase la seccién Tipos de datos en este capitulo) se puede utilizar como tipo de datos de una constante. El nombre de una constante no puede comenzar con un $ ya que este prefijo estd reservado al nombre de las variables (véase la seccién Variables en este capitulo). Definir una constante cuyo nombre comienza por $ no genera un error (define devuelve TRUE). Sin embargo, cuando se utiliza, la constante se vera como una variable no inicializada. Una vez creada, una constante no se puede cambiar, ni por una nueva llamada a define(devuelve FALSE y deja el valor de la constante inalterado), ni por asignacién directa (genera un error de analisis de la secuencia de comandos). Eiemplo OK). echo ‘CONSFANTE = ',CONSTANTE, "
'; // Mostrar el valor de 1a constante echo ‘constante = ",constante; echo ' => interpretada literalmentecbr />'; // vtilizacion de 1a palabra clave const (desde la versién 5.3) const OTRA_CONSTANTE = ’PHP 5.5"; echo ‘OTRA_CONSTANTE = ’, OTRA_CONSTANTE; vacie) Resultado CONSTANTE = valor de CoNSTANTE constante = constante => interpretada literalmente OTRA_CONSTANTE = PHP 5.5 Tradicionalmente, los nombres de las constantes se definen en maydisculas. Utilizar una constante no definida (0 una variable no inicializada) o intentar redefinir una constante ya definida genera un error de nivel E_NOTICE. El nivel de error reportado por PHP depende de las directivas de configuracién en el archivo php.ini (véase el capitulo Administrar los errores en un script PHP). El resultado anterior corresponde a una configuracién en la que los errores de nivel&_NOTICE no se muestran. 2. Alcance El alcance de una constante es la secuencia de comandos en la que se define. Por lo tanto, una constante se puede definir en una primera seccién de cédigo PHP y utilizarse en otra seccion de codigo PHP del mismo script. Eiemplo <2php // Definir una constante: define (/NOMBRE’ , ‘Olivier’) ;

Hola !

Resultado jHlola Olivier! 3. Funciones Utiles La funcién def ined permite saber si una constante esta definida 0 no. ‘Sintaxis booleano defined (cadena nombre) nombre Nombre de la constante. def ined devuelve TRUE sila constante esté definida y FALSE en caso contrario. Ejemy "; } else ( echo ‘CONSTANTE no esta definida.
"; he // Definir la constante CONSTANT define (’ CONSTANTE’ , ‘valor de 1a CONSTANTE’); // Probar si 1a constante CONSTANTE esta definida Sok = defined (”CONSTANTE" ) ; Lf (Sok) ( echo 'CONSTANTE esta definida.
"; } else { echo "CONSTANTE no esté definida.
"; he Resultado CONSTANTE no eaté definida. CONSTANTE estd definida. © En este ejemplo se utiliza la estructura de control if, que permite probar una condicién y actuar en consecuencia (véase el capitulo Estructuras de control). La funcién constant devuelve el valor de una constante cuyo nombre se pasa como parémetro. Sintaxis mixto constant (cadena nombre) con nombre Nombre de la constante Esta funcién es itil para recuperar el valor de una constante cuyo nombre no se conoce a priori. Eiemy Resultado CONSTANTE = valor de 1a CONSTANTE Otras funciones permiten conocer el tipo de una constante (véase la seccién Tipos de datos - Funciones utiles). Variables Una variable es un rea de memoria identificada por un nombre que contiene un valor legible o modificable en el programa. 1. Inicializacién y asignacion En PHP, las variables se identifican por el prefijo $ seguido de un nombre que cumple con las reglas de denominacién presentadas en el capitulo Informacion general de PHP. El nombre de las variables. es sensible a maydsculas y minusculas: PHP considera $nombre y$Nombre como variables diferentes. Este comportamiento es peligroso ya que, en caso de utilizar una sintaxis incorrecta, se crea una nueva variable vacia con un simple error de nivel E_NOTICEque no se puede mostrar (véase el capitulo Administrar los errores en un script PHP). Por tanto, es esencial adoptar una convencién de denominacién y respetarla. Algunas sugerencias: + todo en mindsculas (nombre), + primera letra en mayiiscula y el resto en minusculas ($Nombre). + primera letra de cada palabra en maydiscula y el resto en minisculas ($NombreDePi la). Las variables de PHP se definen autométicamente la primera vez que se utilizan. No hay instrucciones especificas para crear una variable Las variables de PHP se escriben de forma automstica; cada vez que se asigne un valor 2 una variable, el tipo de variable se define o se redefine automaticamente (véase la seccién Tipos de datos). Un valor se puede asignar a una variable mediante el operador de asignacién "=" (véase el capitulo Operadores para obtener una lista de todos los operadores). Eiemplo Nombre = ’, $Nombre; echo ’ => vacio (es otra variable)
"; // Moditicar el valor (y el tipo) de 1a variable Snombre. Snombre = 123; H Mostrar la variable $nombre. echo ‘Snonbre = ‘,Gnombre, ‘
; Resultado (los errores de nivel E NOTICE no se muestran| Snombre = 01 sNombre Snombre = 123 vacio (es otra variable) ©4 Wo largo de este libro, tendremos la oportunidad de conocer las variables definidas automdticamente por PHP y que contienen valores relativos al entorno, a PHP, a formularios, cookies. 2. Alcance y duracién El alcance de una variable es la secuencia de comandos en la que se define. Por lo tanto, una variable se puede definir en una primera seccién de cédigo PHP y utilizarse en otra seccién de cédigo PHP del mismo script. La duracién de una variable es el tiempo de ejecucién del script. Cuando el script termina, las variables se eliminan. Si més adelante se llama al mismo script, se definen nuevas variables. Ejem| '; // inicializar 1a variable snombre. Snombre = ‘0 // Mostrar de nuevo el contenido de 1a variable Snombre. echo ‘Snombre = ',$nombre,/
"; > Resultado de la primera llamada del script Snombre Snombre = Olivier Resultado de la segunda llamada del script Snombre = Snombre = olivier Entre las dos llamadas, se ha eliminado la variable. Al comienzo de la segunda llamada, no contiene el valor que tenia al final de la primera llamada (no es la misma variable). © En en el capitulo Gestién de sesiones, veremos cémo conservar el valor de una variable més allé de la ejecucién del script o cémo transmitir el valor de una variable de un script a otro. 3. Funciones utiles PHP ofrece una serie de funciones utiles en las variables: Nombre Funcién empty Indica si una variable esta vacia o no. isset Indica si una variable esta definida 0 no. unset Elimina una variable. var_dump Muestra la informacién sobre una variable (tipo y valor). empty La funcién empty permite probar si una variable esté vacia o no Sintaxis, booleano empty (mixto variable) variable Variable que se va a probar. empty devuelve TRUE si la variable esté definida y FALSE en caso contrario. Una variable se considera vacia sino ha sido asignada o si contiene una cadena vacia (""), una cadena igual a 0 ("0"), 0, NULL 0 FALSE. Desde la versién 5.5, la funcién empty se puede utilizar para probar si una expresién esta vacia o no. Eiemplo * if (Sesté_vacia) ( echo ‘=> Svariable esta vacia-
"; } else ( echo '=> Svariable no esté vacia.
"; } // prueba de una variable que contiene una cadena vacia Svariable = '/; Sesta_vacia = empty ($variable) ; W\rebe /> echo "Svariable if (Sesté_vacia) ( echo ‘=> Svariable esta vacia-
"; } else ( echo ‘=> Svariable no esta vacia.
"; } // Prueba de una variable que contiene una cadena igual a 0. Svariable = '0"; Sesta_vacia = empty ($variable) ; echo “Svariable = \'",Svariable,’\"
"; if (Sesta_vacia) | echo ‘=> Svariable esta vacia-
"; } else ( echo ‘=> Svariable no esta vacia.
"; } // prueba de una variable que contiene 0. Svariable = 0; Sesta_vacia = empty ($variable) ; echo “Svariable = ',$variable,’
"; if (Sesta_vacia) echo '=> Svariable esta vacia.
"; } else ( echo ‘=> Svariable no esta vacia.
"; ) // Prueba de una variable que contiene una cadena no vacia. Svariable = 'x'; Sesté_vacia = empty ($variable) ; echo "variable = \'",Svariable,/\"
"; if (Sesta_vacia) | echo ‘=> Svariable esta vacia.cbr />"; } else ( echo ‘=> Svariable no esta vacia.
"; } Resultado Svariable no inicializada => svariable esta vacia. Svariable = '' => Svariable esta vacia. Svariable = '0° => Svariable esta vacia. Svariable = 0 => Svariable esta vacia. Svariable ~ "x! => $variable no esta vacia. set La funcién isset permite probar si una variable esté definida o no. Sintaxis booleano isset (mixto variable[,...1) variable Variable que se va a probar; pueden ser varias, separadas por una coma. Asset devuelve TRUE sila variable esta definida y FALSE en caso contrario. Si se faciitan varios parémetros, la funcién devuelve TRuz Unicamente si se definen todas las variables. Una variable se considera como no definida si no se ha visto asignado o si contiene NULL. A diferencia de la funcién empty, una variable que contiene una cadena vacia (""), una cadena igual a 0 ("0"), un 0 0 FALSE, no se considera como no definida. Ejemplo, "; if (Sesté_definida) { echo ‘=> Svariable esta definida.
"; } else { echo ‘=> Svariable no esta definida.
"; } // Prueba de una variable que contiene una cadena vacia. Svariable = '/; Sesta_definida= isset (Svariable); echo *Svariable = \V\'
"; if (Sesté_definida) { echo ‘=> Svariable esta definida.
"; } else ( echo ‘=> Svariable no esta definida.
"; } // Prueba de una variable que contiene una cadena igual a 0. Svariable = '0"; Sesta_definida = isset ($variable) ; echo *Svariable = \'',$variable,‘\"
"; Lf (Sest4_definida) { echo ‘=> Svariable esté definida.
"; } else { echo ‘=> Svariable no esta definida.
!; } // Prueba de una variable que contiene 0. Svariable = 0; Sest4_definida = isset (variable) ; echo ‘$variable = ',Svariable,'
'; if (Sesta_definida) | echo ‘=> Svariable esta definida.
"; } else ( echo ‘=> Svariable no esta definida.
"; } // Prueba de una variable que contiene una cadena no vacia Svariable = ‘x’ Sest4_definida = isset ($variable) ; echo ‘Svariable = \'",Svariable,/\'
"; if (Sesta_definida) { echo ‘=> Svariable esta definida.
"; } else echo ‘=> Svariable no esta definida.
"; } > Resultado Svariable no inicializada => svariable no esta definida. Svariable = '' => Svariable esté definiaa. Svariable = '0° => Svariable esta definida. Svariable = 0 => Svariable esta definida. Svariable = ‘x’ => Svariable esta definida. unset La funcién unset permite eliminar una variable. Sintaxis unset (mixto variablet, ...1) variable Variable que se va a eliminar (para eliminar varias, deben estar separadas por una coma). unset acepta una lista de variables. Después de la eliminacién, la variable se encuentra en el mismo estado que si no hubiera sido asignada. El uso de la funcién isset en una variable eliminada devuelve FALSE. Eiemplo "; Af (Sesta_definida) { echo ‘=> Svariable esta definida.
"; } else { echo ‘=> Svariable no esté definida.
"; ) // Eliminar 1a variable. unset (Svariable) ; // Mostrar 1a variable y probar si esté definida. Sesté_definida = isset (Svariable) ; echo *Svariable = ',$variable,’"; if (Sesta_definida) { echo ‘=> Svariable esté definida.
"; } else ( echo ‘=> Svariable no esta definida.
!; ) 2S Resultado Svariable = 1 => Svariable esta definida. Svariable => Svariable no esté definida oO Alasignar un 0 0 una cadena vacia a una variable, no se borra. var_dump La funcién var_dump muestra informacién sobre una variable (tipo y contenido). Sintaxis var_dump(mixto variable) variable Variable que se va a mostrar (pueden ser varias, separadas por una coma). La funcién var_dump es especialmente interesante en las fases de desarrollo. Ejemy '; var_dump ($variable} + // moditicar el valor (y el tipo) de la variable Svariable = 3.14; // nimero decimal “7 mostrar ia informacién sobre una variable echo "
"7 var_dunp ($variable} ; // modificar el valor (y el tipo) de la variable Svariable = ‘abe’; // cadena de caracteres // mostrar 1a informacién sobre 1a variable echo ‘
'; var_dunp (Svariable) ; > Resultado NULL int (10) Eloat (3.14) string (3) "abo" Para una variable no inicializada, var_dump devuelve NULL. Para un nimero, var_dump indica el tipo (int = entero, float = mimero decimal) seguido por el valor entre paréntesis. Para una cadena, var_dump indica el tipo (string), seguido de la longitud entre paréntesis, seguido por el valor entre comillas, PHP también ofrece las funciones print_r y var_export, que son similares a la funciénvar_dump. la funcién print_r muestra o dewuelve el contenido de la variable en una forma mas legible, sin mencionar el tipo de datos. La funcién var_export muestra o devuelve una cadena que ofrece un cédigo PHP de definicion de la variable; esta funcién aparecié en la versién 5. © En la seccién Tipos de datos de este capitulo, estudiaremos otras funciones que permiten determinar el tipo de una variable y realizar conversiones de tipos (de nimero a cadena, de cadena a nimero...). 4, Variable dinamica (0 variable variable) PHP ofrece una funcién de variable dinémica (también llamada variable variable) util en determinadas situaciones El principio consiste en utilizar una variable que almacena el nombre de otra variable y, a continuacién se hace referencia a ella con una notacién, del tipo $Svariable o ${$variable}. Con esta notacién, la variable "interior" se sustituye por el valor de la variable Svariable(valor por ejemplo) que se utiliza como un nombre de variable por la $ “exterior” (es decir,$valor en nuestro ejemplo). Eiemplo "; echo ’Snonbre_variable = ',$nonbre variable,’
" ;$$nombre_variable,'
! echo ’$Snombre_variable Resultado Suna_variable = 10 Snombre_variable = una_variable S$nombre_variable = 10 m Tipos de datos 1. Tipos disponibles PHP dispone de cuatro tipos de datos escalares (sélo pueden contener un valor), dos tipos compuestos (pueden contener varios valores) y dos tipos especiale: + Tipos escalares: = ntimero entero = ndimero de punto flotante = cadena de caracteres = booleano + Tipos compuestos: = matriz (véase la seccién Matrices de este capitulo) = objeto (véase el capitulo Funciones y clases) * Tipos especiales = NULL = Recurso Entero El tipo entero (integer) permite almacenar un nimero entero de 32 bits, cuyos valores estén comprendidos entre -2 147 483 648 (-25+) y +2 147 483 647 (+272-1). En caso de desbordamiento de capacidad en un cdlculo, el resultado se convierte automdticamente a un némero de punto flotante. Namero de punto flotante El tipo ntimero de punto flotante (float) permite almacenar un ntimero decimal en un rango de valores dependiente de la plataforma (normalmente del orden de 10°08 a 10*398), Este ntimero se puede expresar en notacién decimal x,y (por ejemplo, 123.456) 0 en notacién cientifica xyEz 0 x.yez (por ejemplo 1.23456E2). En caso de conversién de un ntimero de punto flotante en entero, el nimero se trunca (no se redondea) al entero més préximo (1.9 da 1, por ejemplo). En caso de desbordamiento de capacidad, no aparece ningun mensaje, pero el valor a la llegada esta definido (normalmente 0). PHP ofrece bibliotecas especiales (también llamadas Librerias) para manejar los numeros de gran tamaiio (bibliotecas BC 0 GMP). Cadena de caracteres El tipo cadena de caracteres (string) permite almacenar cualquier secuencia de caracteres de un byte wa (cédigo ASCII entre 0 y 255), sin limitacién de tamafio. Una expresién literal de tipo cadena de caracteres se puede especificar entre comillas ("esto es una cadena") o entre apéstrofos (‘esto también es una cadena’) con importantes diferencias en el comportamiento, que se describen a continuacién. Las comillas presentes en una cadena delimitada por comillas 0 los apéstrofos presentes en una cadena delimitada por apéstrofos deben "escaparse", es decir, deben ir precedidos por una barra invertida (\). Ademds, una barra invertida al final de esta cadena, justo antes de la comilla o el apéstrofo final, también debe escaparse mediante una barra invertida. Eiemplo "; echo "Yo digo \"hola\".
"; Resultado It's raining, Yo digo “hola” Una cadena se puede introducir en varias lineas, pero se muestra en una sola linea en el navegador. Para mostrar una cadena en varias lineas en el navegador, debe insertar una etiqueta. ¥o me llamo Olivier y vivo en Francia.

'; echo Scadena; Scadena = ‘

¥o me Llano Oliviersbe /> y vivo en Francia.

!; echo Scadena; Resultado Yo me llamo Olivier y vivo en Francia. Yo me llamo Olivier y vivo en Francia. Cuando una cadena esta delimitada por comillas, cualquier secuencia de caracteres que comience con el signo $ se interpreta como una variable y se sustituye por el valor de la variable: es el mecanismo de sustituciin de variables por su valor. Esta caracteristica, muy préctica, no funciona con las cadenas delimitadas por apéstrofos (primera diferencia entre los dos tipos de cadenas). Efemplo "; echo ‘Yo me Llamo §nombre.
'; // no funciona Resultado Yo me Llano Olivier. ana Yo me llamo §nonbre En algunos casos, es posible que este comportamiento no sea el deseado. Basta con escapar el signo $ con la barra invertida (\) para que se comporte como un $. jem Resultado Snombre = Olivier En otros casos, el comportamiento puede ser deseado si existe la necesidad de adjuntar un texto adicional después del nombre de la variable. Ejemplo "; echo “Dos Sfrutas cuestan el doble.
"; Resultado Una manzana no es caza. Dos cuestan el doble En este ejemplo, PHP interpreta la “s” plural como perteneciente a la secuencia de caracteres situada detras del $ y, por lo tanto, a la variable $frutas que se reconoce y se sustituye por su valor (vacio, ya que la variable no se ha inicializado). La solucién consiste en delimitar el nombre de la variable por llaves en forma de ($variable} 0${variable)}. Antes de la versién 5.1.1, el cardcter de escape barra diagonal inversa se podia utilizar antes de la primera llave para cancelar esta interpretacién de las llaves. Desde la versién 5.1.1, este cardcter de escape ya no funciona para la lave, por lo tanto, a partir de esta versién utiizamos la notacién ( ($fruta}) en lugar de \($fruta] (véase el ejemplo mas adelante). De todos modos, una llave que no va precedida o seguida por un $ no escapado se deja sin cambios. Efemplo "; echo Dos ($fruta}e cuestan el doble.
"; echo "tres $(fruta}s cuestan el triple.
"; echo "{\Sfruta) = {{$fruta}).
"; Resultado Una manzana no es cara bos manzanas cuestan el doble qzes manzanas cuestan el triple. ana (¢fruta) = No hay mecanismo de sustitucién equivalente para las constantes; esta es una raz6n valida manzana) para utilizar variables en lugar de constantes reales. Ademés, se pueden utilizar otras secuencias de escape en las cadenas delimitadas por comillas, pero no en las delimitadas por apéstrofos (segunda diferencia entre los dos tipos de cadenas). Secuencia Valor \n Salto de linea (= LF = cédigo ASCII 10) \r Retorno de carro (= CR = cédigo ASCII 13) \t Tabulacién (= HT = codigo ASCII 9) Ww Tabulacién vertical (= VT = cédigo ASCII 11) \e Escape (= ESC = cédigo ASCII 27) \f Pagina siguiente (= FF = cédigo ASCII 12) \\ \ (ya explicado) \s $ (ya explicado) \nnn El cardcter designado por el cédigo ASCII nnn expresado en octal \xnn El cardcter designado por el cédigo ASCII nn expresado en hexadecimal Eiemplo \n"; echo "Yo me Ilamo \117\154\151\166\151\145\162."; Resultado Yo me llano Yo me llano Recordatori ejemplo. Aqui, la etiqueta
provoca el salto de linea en la pagina actual. un salto de linea en la fuente de la pagina enviada al navegador no causa ningun salto de linea en la pagina. Este es el caso de la secuencia "\n", utilizada en nuestro Es posible acceder al enésimo caracter en una cadena usando la notacién $x [i], $x, designando la variable de tipo cadena e i el némero del carécter (el primer cardcter lleva el ntimero 0). También se pueden utilizar las llaves. Eiemplo ana Resultado or PHP es capaz de convertir una cadena en un nimero (entero 0 decimal) con las siguientes reglas: + Siel primer carécter no "blanco" (que no sea el espacio, Ia tabulacién, LF, CR) no es una cifra, ni un punto ni el signo menos, la cadena se evaliia a 0 (entero). + De lo contrario, PHP extraeré todos los caracteres no “blancos" del principio de la cadena hasta que encuentre un caracter no numérico (es decir, que no esté entre 1 y 9, que no sea un punto, el signo "menos" y el simbolo cientifico "e" 0 "E"); la secuencia obtenida se convierte en un entero (sin punto ni simbolo cientifico) 0 decimal (en caso de presencia de un punto 0 un simbolo cientifico). Eiempla "5 echo 11 4 "1.5" = ",var_dump(1 + "1.5"),"
"; echo '1 + "1.582" ="',var dump(1 + "1.522"),"
"; echo 11 4 "1e3" = ",var_dump(1 + "1e3"),/
"; echo ‘1 + labe = ',var_dump(1 + "labe") ,"
"; echo ‘1 + "1.Sabcd” = 7,var_dump(1 + "1.Sabed"),/
"; echo 11 + "1.5 abed™ = ’,var_dump(1 + "1.5 abed"),"
"; echo 114 ".5" = ',var_dump(1 + ".5"),"
1; echo *1 + "5" = ',var_dump(1 + "-5"), "
"; echo ‘1 +" \t\n\r 5" = ‘,var_dump(1 +" \t\n\r 5"),!
"; echo ’1 + "abel" = *,var_dump(1 + abel"), "
"; Resultado 1+ "Im = int(2y L + "LS" = eloat (2.5) 1 + "1.582" = float (151) 1 + "1e3" = float (1001) 1 + labe = int(2) 1 + "1.Sabea" = float (2.5) 1 + "1.5 abed" = float (2.5) 1+ ".5" = float (1.5) 1+ "5" = int (=a) 1+” \e\n\r 5" = int (6) 1+ "abel" = int (1) El ditimo ejemplo muestra que una cadena que no comienza con un caracter numérico se convierte a un niimero entero igual a 0. Estos mecanismos de conversién son muy précticos en algunos casos, pero también pueden conducir a problemas dificiles de detectar porque PHP rechaza cantidades tan pequefias PHP se niegue a compilar la secuencia de comandos. Booleano El tipo booleano (boolean) puede tomar dos valores: TRUE (0 true) y FALSE (0 false). Este tipo de datos se utiliza principalmente en las estructuras de control para probar una condicién (ver capitulo Estructuras de control). sr pence ENI Training - Ubroertine PHP es capaz de convertir cualquier tipo de datos en booleano segiin las siguientes reglas: valor Resultado de la conversién niimero entero 0 FALSE nimero decimal 0.000... cadena vacia ("") cadena igual a 0 ("0") matriz vacia objeto vacio constante NULL (véase el "tipo” Null) todo lo demds TRUE © Un valor igual a -1 se convierte en TRUE con PHP. Por el contrario, PHP es capaz de hacer las conversiones siguientes: TRUE FALSE Booleano -> Numero 1 0 Booleano -> Cadena “ae oe (cadena vacia) Teniendo en cuenta la légica de conversién que se ha indicado anteriormente, es posible probar cualquier variable como un valor légico (PHP se encarga de la conversién). Este funcionamiento suele ser practico, pero puede dar lugar a errores dificiles de detectar. EI "tipo" NULL Este tipo, introducido en PHP 4, es algo especial y corresponde al tipo de una variable utilizada sin haber sido inicializada. Tiene un valor Gnico, el valor uuu1, definido por la constante NULL (onu11). Si se convierte en booleano, NULL toma el valor FALSE. Eiemplo "; echo "Smimero . Scadena = var_dump (Snimero . Scadena) ; ecnd ‘cpr />" echo *Snimero var_dunp (Smimero) ; echo ‘
'; echo ‘Scadena = '; var_dunp (Scadena) ; > Resultado Smimero + Scadena = int (579) Smimero . Scadena = string(3) "12345éabe" Snumero = int (123) Scadena = string(6) "456abc" En el primer ejemplo, la variable $cadena se evalia en nimero por ser del tipo esperado por el operador "+", mientras que en el segundo ejemplo, es Sntimero el que se evaliia en cadena por ser del tipo esperado por el operador "." (concatenacién). Por contra, las dltimas dos visualizaciones muestran que las variables en cuestién no se han convertide durante las operaciones: conservan su tipo respectivo original. Ademés, PHP ofrece una notacién y una funcién para realizar una conversién manual explicita Notacién La notacién consiste en indicar el nombre del tipo deseado entre paréntesis antes de la expresion que se desea convertir. Los valores permitidos son los siguientes: Notacion Conversién en (int) 0 (integer) entero (bool) © (boolean) booleano (zeal), (double) 0 (float) | mimero de punto flotante ma (string) cadena (array) matriz (object) objeto Ejemplo "; echo * (float) "1.Sabe" =", var_dump((float) "1.5abe")
"; echo ' (float) "abel” = ',var_dunp( (float) "abel") ,"
"s echo‘ (int) 1.7 = ",var_dump((int)1.7),"
"; echo / (int) TRUE =", vaF_dump ((int) TRUE), ‘
"; echo ’ (int) FALSE = *,var_dump( (int) FALSE) , "
"; echo * (bool)=1 = *,var_dump((bool)-1) ,"
"; echo * (bool)0 = *,var_dump{((bool) 0) , "
"5 echo * (bool)1 = *,vax_dunp (bool) 1) , "
"5 echo * (bool)"" = ',vaz_dump( (bool) ""), "
"; echo ‘ (bool) "0" =", var_dump( (bool) "0") , "
"; echo * (bool) "1" = ",var_dump( (bool) "1") , "
77 echo ' (bool) "a" = ',var_dump( (bool) "a"), "
"; float (1) Float (1.5) (float) "abel" = float (0) (int)1.7 = int) (int) TRE = int (1) (int) FALSE = int (0) (bo01)=1 = bool (rue) (bo01)0 = bool (False) (b001)1 = bool (true) (bool) "" = bool (false) (bool) "0" = bool (false) (bool) "1" = bool (true) (bo01) "a" = bool (true) Estos ejemplos permiten encontrar las reglas de conversion mencionadas anteriormente. Funcién de conversién La funcién set type permite convertir una variable de un tipo a otro. Sintaxis booleano settype (mixto variable, cadena tipo) variable Variable que se va a convertir. tipo Tipo deseado usando uno de los siguientes valores: boolean 0 bool (conversién en booleano) integer o int (conversién en entero) double 0 float (conversién en ntmero de punto flotante) string (conversién en cadena de caracteres) ara zane EN Training - Ubeooiine array (conversién en matriz) object (conversién en objeto) null (conversién en xuxL) settype dewuelve TRUE en caso de éxito y FALSE en caso de error. Eiemplo "; Ds Sx = TRUE: settype (Sx, /string’) : echo ’TRUE convertido en cadena = ‘,var_dump($x),/
'; gx = 10"; settype (9x, "boolean’ ); echo "\’0\! convertido en booleano = ',var_dump($x),"
"; Sx -1y settype (Sx, ‘boolean’ ); echo *=1 convertido en booleano = ‘,var_dump($x) ,"
"; Resultado "Yabe’ convertido en entero = int (1) 1.7 convertido en entero = int(1) ‘TRUE convertido en cadena = string(1) "1" "0" convertido en booleano = bool (false) “1 convertido en booleano = bool (true) © £ general, es recomendable elegir la conversion explicita: el cédigo es més legible, més fécil de mantener y desarroliar. 3. Funciones utiles Ademés, PHP tiene varias funciones utiles para el tipo de variables: Nombre Funcion is_* Indica si la variable es del tipo dado por *: array = matriz; bool = booleano; double, float, real = numero de punto flotante; int, integer, long =entero; null = tipo NULL; numeric = entero o numero de punto fiotante o una cadena que contiene un niimero (entero o decimal); object = objeto; string = cadena; on resource = recurso; scalar = tipo escalar. strval Convierte una variable en cadena. floatval Convierte una variable en numero de punto flotante doubleval Intval Convierte una variable en entero. Boolval Convierte una variable en booleano * La funcién is_* permite probar si una variable es de un tipo particular. Sintaxis booleano is * (mixto variable) variable Variable que se va a probar. Las declinaciones son las siguientes: Funcién Tipo probado is_array matriz ‘is_bool booleano is_double numero de punto flotante is_float is_real is_int entero is_integer is_long is_null tipo NULL is_numeric entero 0 ntimero de punto fiotante o una cadena que contiene un néimero (entero 0 decimal). is_object objeto is_string cadena is_resource | recurso is_scalar tipo escalar La funcién devuelve TRUE si la variable est definida y FALSE en caso contrario. Eiemplo "; d Sx= (1 <2) i£ (is bool ($x)) echo Sx = (1 < 2) es del tipo booleano.
"; sora 2awanne ENT Training - Ubrocrine } Sx = "123ab0" if (is_string($x)) { echo 'Sx = "i23abc" es del tipo cadena...
"; } if (1 is_numeric($e)) { echo '7.. pexo no del «tipo» .
!; ) Sx = 11.23645"; if (is_mumeric($x)) echo ‘Por el contrario, $x = "1.23645" es del «tipo» .
' } >> Resultado De momento, $x es del tipo NULL. Sx = (1 < 2) es del tipo booleano. Sx = "123abe" es del tipo cadena... <+ pero no del «tipo» numeric. Por el contrario, $x = "1.23645" es del «tipo» numeric. En este ejemplo, la funcién is_numeric no aplica las mismas reglas para determinar si una cadena contiene un numero que a las utilizadas para la conversién. Con la funcién is_numeric, la cadena no debe contener caracteres no numéricos. strv: La funcién strval devuelve el valor de una variable después de la conversién en cadena. Sintaxis cadena strval (mixto variable) variable Variable que se va a procesar. Esta funcién sélo se aplica a las variables de tipo escalar (no es valida para las matrices u objetos). El tipo de la variable permanece sin cambios. Ejemy "; + jvar_dump(steval ($x)),/
"; Resultado bool (true) => string(1) "1" Float (1.2345) => string(6) "1.2345" floatval (0 doubleval) La funcién floatval devuelve el valor de una variable después de la conversién en nimero de punto sua flotante. La funcién doubleval es un alias de la funcién floatval. Sintaxis niimero Floatval (mixto variable) variable Variable que se va a procesar. Esta funcién s6lo se aplica a las variables de tipo escalar (no es valida para las matrices u objetos). El tipo de la variable permanece sin cambios. Eiemplo <2php Sx = TRUB; echo var_dump($x),‘ => ‘,var_dump(floatval ($x) ,"
"5 Sx = 123; echo var_dump ($x) ,’ Sx = "1.23045"; echo var_dump($x),‘ => ',var_dump(floatval ($x)),"
"3 Sx = "123abc"; echo var_dump (Sx) ,"_ => ‘,var_dump (floatval ($x)),/
"; * ,var_dump (floatval ($x)),"
" Sx =" \B\t\e 123.45ab0"7 echo var_dump(Sx)," => ,var_dump(Eloatval ($x)),/
"; Resultado bool (true) => float (1) int (123) => float (123) string(7) "1.23e45" => float (1.238+45) string (6) "123abc" => float (123) string (14) " 123.45abe" => float (123.45) Se han respetado las reglas de conversién evocadas. intval La funcién intval devuelve el valor de una variable después de la conversién en entero. Sintaxis, niimero intval (mixto variable) variable Variable que se va a procesar. Esta funcién s6lo se aplica a las variables de tipo escalar (no es valida para las matrices u objetos). El tipo de la variable permanece sin cambios. Eiemplo ',var_dump(intval($x)),"
"7 Sx = 123.9; echo var_dump (Sx), Sx = "1.23045"; echo var_dump (Sx) ," => ‘,var_dump (intval($x)),/
"; + yvar_dump (intval (Sx) ),"
"; sana Sx = "123abe") echo var_dump ($x)," => ',var_dump(intval($x)),"
"7 Sx =" \B\t\e 123.45ab0" echo var_dump ($c) ,/ => ‘;var_dump(intval(Sx)),"
"7 > Resultado bool (true) => int (1) float (123.9) => int (123) string (7) "1.23e45" => int (1) string (6) "123abc" => int (123) string (14) " 123.45abe" => int (123) Se han respetado las reglas de conversién evocadas anteriormente. Una vez més, debemos recordar que un nimero de punto flotante convertido a un entero se trunca y no se redondea: en nuestro ejemplo, 123.9 da 123 y no 124. Para convertir un némero de punto flotante en entero, con redondeo, es necesario utilizar la funcisn round () Eiemplo ",var_dump (round ($x) ),"
"s echo “intval (round($x) ) vara ‘a3 Matrices 1. Definicién En PHP, una matriz es una coleccién (lista de elementos) ordenada por la pareja clave/valor. La dave puede ser de tipo numero entero 0 de tipo cadena. En el primer caso, se dice que la matriz es numérica y la clave se designa por el término indice. En el segundo caso, se dice que la matriz es asociativa: las claves no son necesariamente consecutivas, ni ordenadas y esta matriz puede tener claves enteras y claves de tipo cadena. El valor asociado a la clave puede ser de cualquier tipo, incluyendo el tipo matriz, en cuyo caso se dice que la matriz es multidimensional. Eiemalo + Matriz numérica (indices ordenados consecutivos) Clave/indice valor 0 cero 1 uno 2 dos 3 tres Matriz numérica (indices no ordenados, no consecutivos) . Clave/indice valor 20 veinte 30 treinta 10 diez Matriz mixta : Clave/indice valor 0 cero cero 0 uno 1 1 uno dos 2 2 dos tres 3 3 tres Matriz multidimensional (lista de ciudades por pais) Clave/indice valor 110 ESPANA, Clave/indice Valor 0 Madrid 1 Leén 2 Barcelona ITALIA Clave/indice valor 0 Roma 1 Venecia 2. Creacion Una variable de tipo matriz se puede definir explicitamente a través de la funciin array o implicitamente mediante una notacién entre corchetes ([ ]). Desde la version 5.4, es posible utilizar una sintaxis abreviada para definir explictamente una matriz sin utilizar la funcién array. Notacién entre corchetes ([]) Una variable utilizada por primera vez con una notacién de la forma $variable[...], se crea automsticamente con el tipo matriz Si se efectiia la misma operacién en una variable ya definida, con un tipo escalar, produce un mensaje de error. El contenido de una matriz puede estar bien definido por varias asignaciones de tipoSmatriz[. valor. Con una asignacién del tipo $matriz[] = valor, PHP busca el indice entero mayor utilizado y asocia el valor al indice inmediatamente superior. Si la tabla esta vacia, el elemento se colocard en el indice 0. Con una asignacién del tipo Smatriz[clave] - valor, PHP asocia el valor a la clave especificada (que puede ser de tipo entero o de tipo cadena). Ambas notaciones se pueden mezclar en una secuencia de asignacion. Eiemplo indice 0 Snimeros{] = ‘uno’; // => indice max (0) +1 = Snimeros[] = ‘dos’: // => indice max (1) + 1 Snimeros[] = tres’; // => indice max (2) + 1 = 3 Snimeros [5] = ‘cinco’; // => indice 5 Snimeros[] = ‘seis’; // => indice max (5) +1 = 6 Snimeres [’uno'] = 12 // indice "un" Snimeros[] = ‘siete’; // => indice max (6) +1=7 Snimeros [-1] = "menos uno’; // Resultado Clave/indice Valor 0 cero ano 1 uno 2 dos 3 tres 5 cinco 6 seis uno 1 7 siete 1 menos uno Estas notaciones se pueden utilizar para construir una matriz multidimensional en forma desmatriz(...] §matriz_interior 0 $matriz(...]{...] = valor. La primera notacién permite almacenar una matriz en una ubicacién de otra matriz, y la segunda notacién, almacenar un valor directamente en una ubicacion dentro de otra matriz. Eiemplo + Primer método: mixto valor(, valor Elemento de la matriz. clave Valorde la clave. En la primera sintaxis, las claves/indices no se han especificado y se crea una matriz numérica con indices consecutivos empezando en 0: el primer argumento de la funcién se almacena en el indice 0, el segundo en el indice 1, etc. En la segunda sintaxis, el indice o la clave se especifican ya sea mediante un numero entero o una cadena, y se le asocia un valor mediante el operador =>. Ambas sintaxis se pueden mezclar. En este caso, cuando no se ha especificado el indice o la clave, PHP busca el indice entero mayor utilizado y asocia el valor al indice inmediatamente superior; si no hay indices enteros, el elemento se coloca en el indice 0. La funcién array, llamada sin argumentos, crea una matriz vacia. Eiemplo ‘cinco’, /seis’,“uno’ => 1,/siete’,-1 => ‘menos uno!) ; > Resultado Clave/indice Valor 0 cero m uno. 2 dos 3 tres 5 cinco 6 seis uno 1 ano 7 siete menos uno La funcién array acepta como argumentos los datos de tipo matriz (ya sea una variable o una llamada anidada en array), lo que permite crear una matriz multidimensional. Eiemplo + Primer métod: $ciudades espafia, ‘XTALTA’ => Sciudades italia); + Segundo método: array ("Roma’ ,’Venecia’)); > > array ("Madrid’ ,’Leén’ , "Barcelona’), Resultado (en ambos casos, Clave/indice Valor ESPANA. Clave/indice Valor 0 Madrid 1 Leén 3 Barcelona ITALIA Clave/indice Valor 0 Roma 1 Venecia Sintaxis corto Desde la versin 5.4, es posible definir una matriz explicitamente utilizando una notacién entre corchetes (13) en lugar de la funcién arzay() Eiemplo ‘cinco!,‘seis’,/uno’ => 1, ‘siete’ > ‘menos uno! ]; Al igual que al utilizar la funcién assay), otra matriz puede definirse como elemento, ya sea con la funcién array), 0 bien con la sintaxis corta como en el siguiente ejemplo. 10 [Paris’, ‘Lyon’, /Nantes’], ‘YTALTA’ => [‘Roma’,,/Venecia’]]; Esta sintaxis corta permite aligerar la escritura en un cierto numero de situaciones (pasar de una matriz en parametro a una funci6n, definicion de matrices multidimensionales)... 3. Manipulacién En el manejo de matrices existen dos necesidades comunes: » Acceder a un elemento individual de la matriz. * Examinar la matriz. nto individual de la matriz Acc La notacién entre paréntesis se utiliza para acceder, leer 0 escribir, un elemento individual de la matriz: Smatriz[{cadena | entero} clave] Smatriz Matriz correspondiente. clave Valor de la dave/indice. Para las matrices multidimensionales, se deben utilizar varias series de corchetes. Efemplo ‘cinco’, ’seis’, “uno! echo Smimeros [i], "
"; echo §numeros (‘un’], "
"; Sciudades = array("ESPARA’ => array(‘Madrid’ ,’Le6n’ ,/Barcelona’), ‘XTALTA’ => array ("Roma’ ,/Venecia’)) echo Sciudades[’ ESPANA’ ] [0], "
"; echo Sciudades ["ITALIA’]{11,/
/: array ("cezo’ ,/ uno’, "dos, ‘tres’, => 1,/siete’,-1 => ‘menos uno!) ; Resultado 1 Madrid Venecia PHP acepta que omita el delimitador de cadena (comillas 0 apéstrofo) cuando especifica una clave de tipo cadena en una matriz asociativa. Eiemplo 1,‘dos’ ero // wrilizacién de §nimeros[uno] y no $nimeros[” uno! ] echo Snimeros (uno) ; > Resultado (si los errores de tipo E_NOTICE no se muestran, 1 Resultado (si los errores de tipo E NOTICE se muestran) Notice: Use of undefined constant uno - assumed ‘uno’ in /app/seripts/index.php on line 4 1 Esta sintaxis se acepta (y funciona), pero genera un error de tipo E_NOTICE. PHP considera que la constante uno no existe y la sustituye por la cadena ‘uno’ ..., lo que permite obtener el resultado correcto... hasta el dia en que defina una constante uno con valor 1, por ejemplo. En consecuencia, no se recomienda utilizar esta sintaxis "simplificada”. El principio de sustitucién de variables en las cadenas delimitadas por comillas funciona con las matrices. Es necesario utilizar llaves para delimitar la expresién en dos casos * Para especificar una clave de tipo cadena expresada en forma de un literal: iSmatriz[’.../]} + Para una matriz multidimensional:{§matriz[...][..-]} Eiemplo ‘cinco’, ‘seis’, "uno! => 1,/aiete’,-1 => ‘menos unc!) ? echo "\§mimeros[1] = §nimeros[1]
"; echo "\Smimeros[‘un’] = {Snimeros |" uno! ]}
"; Sciudades = array("SSPANA’ => array("Madrid’ ,"Leén’, Barcelona’), ‘ITALIA’ => array ("Roma’ ,"Venecia’)); echo “\$ciudades {’ESPANA’} 0] = (Sciudades[’ESPANA’ ] [0] )
";2> Resultado Snumeros [1] = uno Snimeros [’un’] = 1 Sciudades |’ ESPANA’ ] [0] = Madrid Examinar la matriz Se pueden utilizar multitud de métodos para examinar una matriz con las siguientes construcciones * a estructura de control iterativa for + la estructura de control iterativa while + la estructura de examen de matriz foreach En este capitulo, s6lo estudiaremos el uso de la estructura foreach, que es sin duda la forma més facil de examinar una matriz. Este método no requiere ningun conocimiento especial sobre la naturaleza de la matriz (numérica, asociativa, rango de indices/claves...). Sintaxis, m0 foreach (matriz as variable valor) { instrucciones } foreach (matriz as variable clave { instrucciones } variable valor) La primera sintaxis permite examinar la matriz de principio a fin; en cada iteracién, el valor actual de la matriz se almacena en la variable variable_valor y las instrucciones entre llaves se ejecutan. Esta sintaxis es suficiente si el procesamiento no necesita hacer referencia a los valores de la clave. La segunda sintaxis funciona en base al mismo principio, pero en cada iteracién, la clave actual se almacena en la variable variable_clave y el valor en la variable variable_valor. Esta sintaxis es util si el procesamiento necesita hacer referencia a los valores de la clave. Eiemplo 0,/uno’ => 1,!dox’ => 2); // examen de 1a matriz con la primera sintaxis ‘echo "Primera sintaxis:
"; foreach (Snimeros as $nimero) ( an // examen de 1a matriz con la segunda sintaxis echo ‘Segunda sintaxis:
/; foreach (Snimeros as $clave => $nimero) ( echo "Sclave => §numero
"; } Resultado Primera sintaxis: dos ° 1 2 Segunda sintaxis: 0 => cezo aaa 2 => dos cero => 0 uno => 1 dos => 2 Estos dos ejemplos demuestran que no es necesario ningiin conocimiento previo de la matriz para examinarla: ni su tamafo, ni su estructura de claves. Desde la versién 5.5, la estructura foreach permite examinar una matriz de matrices y recuperar los elementos de la matriz anidada en variables con la ayuda de la funcién list. Sintaxis, aro foreach (matriz as list (variablel, » En cada iteracién, los elementos de la matriz anidada actual se almacenan en las variables enumeradas en la funcién etc). Eiemplo "; ist (primer elemento en la primera variable, segundo elemento en la segunda variable, En la funcién list, si hay menos variables que elementos en la tabla anidada, los elementos sobrantes de esta tiltima se ignorardn. Por el contrario, si hay muchas variables en la funciénlist, se generard una alerta de nivel NOTICE y las variables sobrantes no se inicializarén. 4, Alcance Las variables de tipo matriz siguen las mismas reglas de alcance y de duracién que las variables de tipo escalar (véase seccién Variables - Alcance y duracién). 5. Funciones Utiles PHP ofrece un gran numero de funciones que permiten manipular las matrices. Las funciones utilizadas con mayor frecuencia son: Nombre Funcién count Cuenta el ntimero de elementos de una matriz. in_array Comprueba si un valor est presente en una matriz. array_search Busca un valor en una matriz. array replace Reemplaza valores de una matriz alk] [r]sort Ordena una matriz (varias variantes posibles). explode Divide una cadena segun un separador y almacena los elementos en una matriz. implode Reagrupa los elementos de una matriz en una cadena mediante un separador. str_split Divide una cadena en fragmentos de longitud fija y almacena los elementos en una matriz. Array column Devuelve los valores de una columna de una matriz oro |__muttidimensional, La funcién is_array (véase la seccién Tipos de datos - Funciones utiles) permite conocer si una variable es de tipo matriz. Recuerde. Existen muchas otras funciones y puede consultar la descripcion de cada funcién en linea enwww.ohp.net. Ahi encontraré, especialmente, funciones para: + realizar célculos (suma. + extraer una submatriz de una matriz * fusionar matrices + desduplicar una matriz. count La funcién count permite conocer el ntimero de elementos en una variable en general, una matriz en particular. ‘Sintaxis entero count (mixto variable) variable Variable en cuestién. son0 Algunas funciones utiles sobre las cadenas de caracteres, las fechas y los ndmeros 1. Preambulo El objetivo de esta seccién es presentar las funciones mas utiles, relacionadas con la manipulacién de cadenas de caracteres y de fechas, tipos de datos que se utilizan con mucha frecuencia en las aplicaciones PHP ofrece muchas funciones y puede consultar la descripcién de cada funcién en linea enwww.php.net. 2, Manipulacién de cadenas de caracteres Las funciones més utiles para la manipulacién de cadenas de caracteres son las siguientes: v[s]printé Nombre Funcion strlen Devuelve el nmero de caracteres de una cadena. strtolower Las conversiones de miniisculas/mayisculas pueden limitarse a strtoupper la(s) primera(s) palabra(s). ucfirst ucwords lefirst stromp Comparacién de cadenas (sensible a mayusculas y minusculas o streasecmp no). [s]printé Formato a una cadena (idéntica a las funciones de C ‘equivalentes). number format Formato de un nimero. (Lir]trim Eliminacién de caracteres "blancos" substr Extraccién de una subcadena de una cadena. str_repeat Construccién de una cadena por repeticién de caracteres str[r] [i]pos Biisqueda de la posicién de una ocurrencia (cardcter 0 cadena) dentro de una cadena. str[i]str strrchr Extraccién de la subcadena dentro de una cadena a partir de una ocurrencia determinada de un cardcter 0 una cadena, str_[i]replace Sustitucién de las ocurrencias de una cadena por otra cadena strtr Sustitucién de las ocurrencias de un cardcter por otro cardcter 0 de una cadena por otra cadena. Recuerde las funciones explode, implode y str_split anteriormente presentadas (véanse seccién Matrices - Funciones tiles). Otras funciones, més especfficamente relacionadas con la gestién de formularios se estudian en el capitulo Gestionar los formularios. wn strlen La funcién strlen devuelve el ntimero de caracteres de una cadena. Sintaxis, entero strlen(cadena cadena) cadena Cadena en cuestion. strtolower - strtoupper - ucfirst - ucwords - Icfirst Estas funciones permiten realizar conversiones de mintisculas/maydsculas, posiblemente limitadas a la(s) primera(s) palabra(s) de la cadena Sintaxis cadena strtolower (cadena cadena) cadena strtoupper (cadena cadena) cadena ucfirst (cadena cadena) cadena ucwords (cadena cadena) cadena 1cfirst (cadena cadena) cadena Cadena que se va a procesar. La funcién strtolower convierte todos los caracteres de una cadena en minisculas. La funcién strtoupper convierte todos los caracteres de una cadena en mayiisculas. La funcion ucf ist convierte el primer cardcter de una cadena en mayisculas. La funcién ucwords convierte el primer cardcter de cada palabra de una cadena en mayusculas. La funcién 1cfirst convierte el primer carécter de una cadena en mindscula (a partir de la versién 5.3). Eiemolo "; echo “strtoupper ("$y") = ",strtoupper ($y), "
"5 echo "ucfirst (’$y’) = *,ucfirst ($y), "
"; echo “lefirst ("$x") = ",1cfirst (Sx) ,/
'; echo “ucwords ("$y’) = *,ucwords (Sy) ,"
75 > Resultado strtolower (OLIVIER HEURTEL') = olivier heurtel strtoupper (/olivier heurtel’) = OLIVIER HEURTEL ucfirst (‘olivier heurtel’) = Olivier heurtel Lefirst (‘OLIVIER HEURTEL') = OLIVIER HEURTEL ucwords ("olivier heurtel’) = Olivier Heurtel strcmp - strcasecmp ant Estas funciones permiten comparar dos cadenas teniendo en cuenta 0 no las maydisculas y mindsculas. Sintaxis entero strcmp (cadena cadenal, cadena cadena?) entero strcasecmp (cadena cadenal, cadena cadena?) cadenal y cadena? Cadenas que se van a comparar. ‘Ambas funciones devuelven un numero negativo si cadena es menor que cadena2, un ntimero igual a Osison iguales y un nimero positivo si cadena es mayor que cadena2. stremp es sensible a mayiisculas y minusculas, mientras que strcasecmp no lo es. Ejemj <2php Sx = /Olivier’; Sy = ‘olivier’; echo "stremp('$x!,/Sy') = ",stremp ($x, $y) ,"
"s echo "strcasecmp(’$x',/$y") = ",strcasecmp (Sx, Sy), "
"5 Resultado stromp (‘01d strcasecmp(’ Olivier’ ,’olivier’) = 0 | folivier’) = -2 [s]printt Las funciones printf y sprintf permiten dar formato a una cadena (idénticas a las funciones de C equivalentes), Sintaxis cadena sprintf (cadena formato[, mixto valor[y -.-11) entero printf (cadena formato[, mixto valor[, -.-1]) formato Cadena de formato que presenta varias directivas segiin las especificaciones que figuran a continuacién. valor Valor que se integraré en la cadena. sprint dewebe el resultado en forma (0 FALSE en caso de error), mientras que print fmuestra directamente el resultado (como la instruccién echo) y devuelve la longitud de la cadena con formato en caso de éxito 0 FALSE en caso de error. la cadena format debe contener una directiva de formato para cada argumento valor; esta directiva de formato especifica la ubicacién y el formato del valor correspondiente. La correspondencia entre una directiva de formato y un valor es de posicionamiento (primera directiva para el primer valor.. Las instrucciones de formato comienzan con el carécter % seguido de una a cinco informaciones, siendo la Ultima la Unica obligatoria: 8 [reLleno] [alineacién] [longitud) [precisién] tipo Las informaciones son las siguiente: ant xelleno alineacién longitud precisién tipo Especifica el cardcter utilizado para el relleno. El cardcter por defecto es el espacio. Se puede utilizar cualquier otro caracter si se menciona precedido de un apéstrofo (Gnicamente el carécter cero se puede indicar directamente): ‘x indica que el carécter de relleno es la "x" Especifica la alineacién. De forma predeterminada, la alineacién es 2 la derecha. EI cardcter menos ("-") permite obtener una alineacién a la izquierda. Especifica el nimero minimo de caracteres del elemento formateado. Indica el niimero de digitos usados para el formato de un numero de punto flotante (valid s6lo si el elemento asociado es un nimero).. Da el tipo del valor que se va a insertar: c: entero que se sustituye por el cardcter cuyo cédigo ASCII tiene este valor; d: entero que se representaré como tal; f: nimero de punto flotante que se representaré como tal (teniendo en cuenta la configuracién regional); F: nmero de punto flotante que se representaré como tal (sin tener en cuenta la configuracién regional); aparecié con la version 5.0.3; si ninguno, se representaré como una cadena. Para obtener un caracter "%e" en el resultado final, debe duplicarlo en el formato Algunos ejemplos: Directiva valor Resultado Explicacién %d 1 NGmero entero sin un formato especial. %02d o1 (02 = completar con el cardcter cero, en una longitud minima de dos. MF 0.333333 | Numero de punto flotante sin un formato especial. %.2F 0.33 -2 = dos digitos después del separador decimal. %02.3F 00.333 <3 = tres digitos después del separador decimal. 02 = completar con el cardcter cero, con el separador decimal, en una longitud minima de dos. %s Olivier! Olivier! Cadena sin un formato especial. %’.10s Olivier "10 = completar con un punto para llegar a una longitud minima de diez caracteres (alineacién predeterminada). Olivier, *,=10 = completar con un punto para llegar a una longitud minima de diez caracteres (signo - = alineacién a la izquierda). 9.9 -2 = dos digitos después del separador decimal. * .5 = completar con un punto para llegar a una longitud minima de cinco caracteres antes del punto decimal (alineacién predeterminada). Eiemplo "; echo ‘Formato de nimeros: ', sprint£(/%01.2£ - $01.2£",1/3,12345678.9),/
"; echo ‘Bordentaje: ', sprinté ("801.2 887,12.3),"ebr fo"; echo "Utilizacién de las opciones de relleno:
"; echo ’; // fuente no proporcional printf ("8 .-10s8" .5.2f
",/Libros’ ,9.35); // printf direct Printe ("8 .-1058".5.2F
","Discos’, 99.9); // printf direct echo *
"; Resultado Formato de una fecha: 01/01/2001 Formato de nimeros: 0.33 - 12345679.90 Porcentaje: 12.30 § Utilizacién de las opciones de relleno: Libros.....9.35 Discos. ..99.90 wisIprintt Las funciones vprint£ y vsprint£ son idénticas a las funciones print£ y sprint, pero aceptan como segundo parémetro una matriz que contiene los distintos valores que se van a utilizar (en lugar de varios parémetros). Sintaxis cadena vsprintf (cadena formato[, matriz valores]) entero vprintf (cadena formato[, matriz valores]) con formato Cadena de formato que presenta varias directivas segin las especificaciones dadas anteriormente. valores Matriz que da los valores que se van a integrar en la cadena. Eiemplo ; // fuente no proporcional ant foreach (Sdatos as §linea) { printf ("8" .-10s8".5.2f
",$1inea); // printf direct } echo "' > Resultado Libros 9.35 Discos 99.90 number_format La funcién number_format permite dar formato a un ntimero. Sintaxis cadena nunber_format (nlimero valor{, entero decimalest, cadena separador_decimal, cadena separador_millares}]) valor Namero que se va a formatear. decimales Nimero de decimales (ninguna parte decimal por defecto). separador_decimal Separador decimal (punto por defecto). separador_millares Separador de millares (coma por defecto). Se puede llamar a la funcién con uno, dos 0 cuatro argumentos, pero no tres: si se da un tercero, el cuarto es obligatorio. Si el nimero tiene una precisién superior a la solicitada (parémetro decimales), el ntimero se redondea a la precision solicitada. jem, <2php Sx = 1234.5677 echo “number_format ($x) = ";nunber_format ($x) ,"
"; echo “number_format ($x,1) = ",number_format (Sx, 1),"
"; echo “number format ($4,2,141,! ') =", number_format ($%,2)747,/ '),/45 > Resultado punber_format (1234.567) = 1,235 number format (1234.567,1) = 1,234.6 number format (1234.567,2,",/,/ ‘) = 1 234,57 Observe, en estos ejemplos, los redondeos automaticos cuando la precisién solicitada es inferior a la precision de! numero. Itrim - rtrim - trim Estas funciones permiten eliminar los caracteres “blancos" u otros caracteres al principio de la cadena, al final de la cadena o en ambos lados. ent Sintaxis, cadena Ltrim(cadena cadena[, cadena caracteres]) cadena rtrim(cadena cadena[, cadena caracteres}) cadena trim(cadena cadena(, cadena caracteres}) con cadena Cadena que se va a procesar. caracteres Cadena que indica la lista de caracteres que se va a eliminar. Si este pardmetro esté ausente, los caracteres "blancos" se eliminan. Las tres funciones devuelven una cadena igual a la cadena inicial en la que los caracteres "blancos" o los caracteres especificados se han eliminado al principio (1trim con 1 = left =a la izquierda) al final (ctrim con x = right =a la derecha) 0 en ambos lados (trim). Los caracteres "blancos” son el salto de linea (\n = cédigo ASCII 10), el retorno de carro (\r = codigo ASCII 13), la tabulacién (\t = cédigo ASCII 9), el carécter NULL (\O = cédigo ASCII 0) y el espacio. Eiemplo /; echo ’strlen(Itrim($x)) = ’,strlen(1trim($x)),’
"s echo ‘strien(rtrim($x)) = ‘,strien(rteim($x)),"
"; echo ‘strlen (trim(3x)) = ‘,strlen(trim($x)),"
"; Sx = ee-Olivier-ttt echo "trim('$x',/*#=") = ",trim(Sx,/*#="), "
"7 Resultado strien(Sx) = 8 strien (Ltrim(Sx)) strlen (rtrim(Sx)) strlen (trim($x)) teim(**+-Olivier-t##+", 744-7) = Olivier ubstr La funcién subst permite extraer una subcadena de una cadena. Sintaxis cadena substr (cadena cadena, entero inicio[, entero longitud]) cadena Cadena que se va a procesar. inicio Posicién del primer cardcter de la subcadena que se va a extraer (atencién 0 = 1er cardcter). longitud NGmero de caracteres que se van a extraer (por defecto, hasta el final de la cadena). Si el argumento inicio es positivo, la subcadena extraida comienza en eb am + Si el argumento inicio es negative, la subcadena extraida comienza cardcterinicio partiendo desde el final (-1 = iltimo cardcter). + Sino se especifica el argumento Longitud, la subcadena extraida termina al final de la cadena. + Si el argumento longitud se especifica y es positive, substr extrae el numero de caracteres indicado por el argumento longitud. + Sielargumento longitu se especifica y es negativo, la subcadena extraida termina al final de la cadena, menos el nimero de caracteres indicado por el valor absoluto del argumento longitud. Eiemy para el control $x = ‘Olivier’; echo "substr(/$x!,3) = ",substr($x,3),"
sche: ¥oubsts (18x! 64/3] ~ Sequontelieraiel vices (oly echo “subst (/$x",-4) = ",substr($x,~4),"
"; echo "substr(/$x!,<4,3) = ",substr($x,=4,3),"
"7 Resultado substr(/Olivier’ ,3) = vier subst (/Olivier’ ,3,2) = vi substr (/Olivier’,=4) = vier substr (/Olivier’ ,=4,3) = vie str_repeat La funcién str_repeat permite construir una cadena por repeticién de caracteres. Sintaxis, cadena str_repeat (cadena secuencia, entero repeticiones) secuencia Secuencia de caracteres a repetir. repeticiones Numero de repeticiones deseadas. Efemplo Resultado abcabcabe st strrpos - strij str Estas funciones permiten buscar la posicién de una ocurrencia (carécter 0 cadena) dentro de una ant cadena. Sintaxis entero strpos (cadena a_procesar, cadena buscar[, entero inicio]) entero strrpes (cadena a procesar, cadena buscar[, entero inicio) entero stripos (cadena a procesar, cadena buscar[, entero inicio) entero strripos (cadena a_procesar, cadena buscar[, entero inicio]) Con a_procesar Cadena que se va a procesar. buscar Elemento buscado. inicio NGmero del cardcter (0 = primer cardcter) a partir del cual se debe llevar a cabo la busqueda (por defecto, el inicio de la cadena). strpos busca, en la cadena a_procesar, la primera ocurrencia de la cadena de buscar, comenzando a apartir del cardcter nlimero inicio (0 = primer caracter). strrpos busca, en la cadena a_procesar, la ultima ocurrencia de la cadena de buscar, comenzando a apartir del cardcter numero inicio (0 = primer cardcter). Si el inicio es negativo (- n), los n Uitimos caracteres de la cadena a_procesar se ignoran. El parmetroinicio se afiadié en la version 5. En la versién 4, slo se tenia en cuenta el primer cardcter de la cadena buscar. Las dos funciones son sensibles a mayisculas y mindsculas (en maylisculas no es igual que en mindsculas). Las funciones stripos y strripos son idénticas respectivamente a las funcionesst rpos y strpos, pero no son sensibles a maydsculas y minusculas; esto se introdujo en la version 5. Estas cuatro funciones devuelven la posicién de la ocurrencia encontrada (0 = primer cardcter) OFALSE siel elemento de bisqueda no se encuentra. FALSE es equivalente a 0, por lo tanto es fécil confundir el caso en el que el elemento no se ha encontrado y en el que se encontré al principio de la cadena. La técnica consiste en utilizar el operador de comparacién {tres signos igual), que permite comparar el valor y el tipo de dos expresiones (para mas detalles, véase el capitulo Operadores).. Eiemplo para el control Scorreo = ‘contacto@olivier-heurtel. fr’ W strepos Sposicion = strrpos($mail, 0"); echo "@ eaté en la posicién Sposicién en Scorreocbr />"; V1 strpos Sposicién = strpos ($correo, ‘olivier’ echo "’olivier’ esta en la posicién $posicién en Scorreosbr />"; // Ocurrencia al principio de la cadena Sposicién = strpos($correo, ‘contacto'); AE (1 Sposicién) ( // prueba no superada echo contacto’ no se puede encontrar en Scorreocbr />"; } else ( echo "’contacto’ esté en la posicién Sposicién fen Scorreosbr />' } Af (Sposicion === FALSE) { // prueba superada: —= echo contacto’ no se puede encontrar en Scorreosbr / ont } else ( echo "/contacto’ esta en la posicién Sposicién en Scorreocbr />' } 1 Ocurrencia no encontrada Sposicién = strpos($correo,’ informacién’); Af (Sposicién === FALS=) { // prueba superada: <= echo "’informacién’ no se encuentra en Scorreocbr />"; } else echo "/informacién’ esta en la posicién S$posicién fen Scorreosbr />"; } Resultado @ esta en 1a posicion 7 en contactotolivier-heurtel. fr ‘olivier’ esta en 1a posicién 8 en contacto@olivier-heurtel. fr ‘contacto’ no se puede encontrar en contacto@olivier-neurtel. fr ‘contacto’ esté en la posicién 0 en contacto@olivier-neurtel.fr "informacién’ no se puede encontrar en contacto@olivier-heurtel.fr strstr - stristr - strrchr Estas funciones permiten extraer la subcadena comenzando a partir de una ocurrencia determinada de un carécter 0 de una cadena. Sintaxis, cadena strstr (cadena a procesar, cadena buscar, booleano antes) cadena stristr (cadena a procesar, cadena buscar, booleano antes) cadena strrchr (cadena a_procesar, carécter buscar) a_procesar Cadena que se va a procesar. buscar Elemento buscado. antes Indica si la funcién devuelve la cadena situada antes (valor TRUE) 0 después (valor FALSE, por defecto) de la cadena buscada. las funciones strstr y stristr buscan, en la cadena a_procesar, la primera ocurrencia de lacadena buscar y devuelven la porcién final o inicial dé la cadena comenzando desde esta ocurrencia (incluida). La funcién strstr es sensible a mayisculas y mindsculas (una maydscula es diferente de una mindscula), mientras que stristr no lo es. strrchr busca, en la cadena a_procesar, la .iltima ocurrencia del caracter_ buscar y devuelve la Porcién final o inicial de la cadena comenzando desde esta ocurrencia (incluida). Sibuscar es una cadena de varios caracteres, s6lo el primero se tiene en cuenta, strrchr es sensible a maysculas y minisculas. Estas tres funciones devuelven FALSE sino se encuentra el elemento buscado. Ejemplo "; VW sterchr sont echo "= 1a ltima ocurrencia de '-"
Vo strstr Sresto = strstr (Scorreo, ‘olivier’ ); echo "- la primera ocurrencia de ‘olivier’ (sensible a mayasculas y minusculas)
-- V stristr Sresto = stristr(Scorreo, ‘olivier’); echo "- la primera ocurrencia de ‘olivier’ (no sensible a mayasculas y minisculas)
-- echo “Inicio de Scorreo terminando por:
": // svrstranbs > Sresto
"; > Sresto
"; > sresto
Con esta sintaxis, la asignacién se efectia por valor, es decir, que el valor de la expresién situada a la derecha del signo igual se copia en la variable mencionada a la izquierda. Al realizar una asignacién de una variable en otra, la modificacién posterior de la primera variable no tiene efecto en la segunda. Eiemplo Resultado gee sy La operacién de asignacién es una expresién que tiene un valor igual al valor asignado y que se puede utilizar directamente en otra expresién. Por ejemplo, el valor de la expresién $x = les ly se puede escribir una instruccién de tipo $y= ($x=1) +2 que asigna al valor 3 a Sy. Eiemplo "; echo "\Sy = Sy
"; Resultado seed sy -3 Esta técnica es muy practica, pero puede afectar a la legibilidad del cédigo. Para todos los operadores que se estudian en este capitulo, pueden existir espacios en todo el operador. Ino Anterior indice rtormacion genera sore PHP saueexPvPr ‘arabes, consnes poy matrices Ans uno te races operadores \oscperdaes compan Lesopercore teat ceruauces de contra Gestion de formudarios Acces las bases oe datos mviaruncereselecrinico Aamistrarloseroresenunscrge PH ‘anco_Se@utock-om Ubros gas El operador de asignaci6n por referencia ‘A parr de PHP 4, es poste reizar una asignacisa por referencia utizando el operador ‘Siataais Con esta sintai, el valor de a variable Svariablel no ze copia en la variable Svariable2. La ‘arable Svariable? hace referencia a a vafable Svariabled; as dos variables apuntan 2 eemale Soho "égatconinsce = Spatroainicocee (> Trias szacion el asulease ene "\eapettido = sapelsisoche >"? ° (Scho “\rutcontnuco * spaceonunicocte (2%; Spsczontnice = olivier Deepa Go La moaifioweiin a Sapa ‘uuir CConsaanes genome ae so erent x a" indice rvormacion genera sore PHP Gestion de eho Acris eroes en un serge PHP Los operadores aritméticos os operadores artindticns son ls siguientes: ‘Operacién ‘Operader emo (sx=13 y5y=8) Some ¥ echo $4 8; > Resta z echo Sx > Sy) Munpicnoen ° echo Sx” oy Soa Owain 7 echo Sx 7 Syr Twosulo (esto de i dvedn enters ceil Oo one pamer eperando por el segundo) Contare : echo Pringamento (narementa a varabe| stents | echo oles de devoherel valor de a varabie) | de! operands Portneremento (mermenta f varable| ++ después | echo ‘sends de haber dewieko el valor de ts | de! echo wembe) operando Predecremente (Gecrementa la varable| —antes del | echo ‘bles de devohers! valor de la variable) | perando, Postdecemento (Gecerenta la varable| —después | echo sdesgués de haber ceweno el vabr deb] del bene varable) eperand susie x a" Ino Anterior ‘mance Se@outock.com Libros gratis X Buscar indice Inloemacin genet abe PHP El operador de cadena aaa 1 no operator de cadena es el operador de concatenaién, qual que e punto (). cong de it Sita aroles,enstanes, pos matrzes ata sintans devuele una cadena igual la primera cadena inmediatamente seguda de i segunda; consumes ‘ete cabe ningun sepeadorenre ua dos gers. an oom ‘enim intemtrcimcninm ‘fellate deepest te concatenate ‘gr ce it tr 1h Seishan'y specans teaaien’ coe geno sv mee tae 2 operadores > Somer cn rte Lotopenaspee Fares yes cst eran Araya sees nar sncrea cern oe est ec -Admitsarles ereres en unsergt PHP a sree cones une eo cena a" indice rvormacion genera sore PHP Gestion de eho Acris eroes en un serge PHP Los operadores de comparacién Los operadores de comparacién son los siguentes: ‘terente tpos diferentes Operacién ‘Operador Tgualioa = Tualsnd ytpos Wanicos = Deerente = Tnieror sxe ty FASE Sy <%= TRUE Sy 282 > FALSE Thferoro ual Sx == fy => FALSE Superor > gx by => TRUE Sy > x= FALSE ‘Superore wual = x35 $y => TRUE Sy S= $x => Fase Sy >= $2 => TRUE © 1 se debe contundirel operador de asgnacén susie con el operador de comparactn x a" indice Ioormaciin Ineroduccion Informacion genera sobre PAP ‘arable, constanes psy matrices ceruauras de conta Gestion de formudarios tmiaruncereoelecrénico Amira los errores en un eript PHP mando. S5@ousesk.com Lros gras Objetivo del libro objetivo de este tbo es aprender a desarralar un skis Web dindmicn e interactno usando PHP 5. Para camp con este objetivo, este toro presente de manera ripide las funcones bésicas del lengua Fe ames de eto en detabe scares ecearis pte desarola not Web + Gestibn de formarios + Acceso a bases de datos, como MySQL, Oradey SQLite + Gestion de sesiones (autenticacin, gostiin de un context, el uso de “cookies”. + Envi de correos eletrSnizos en formato HTML y con datos aajuntos. + Gestion de archivos (nduyendo Is transerenca de archivos dede la estacin de trabajo de! ‘Ssuane al serdr fle upload" Este bro esta digo @ gestores de proyedo, dienadores y desarolladores con un canociniento basico de programacén Web en HTML (iyperText Markup Language) y algunes conocmentos de SQL (Gerucrured Query Language - enguaje estandar de acceso a bs bases de datos relaconakes) para el Capituo sobre as bases de datos, Este bro aborda ia versién 5 de PHP; las nuevas caractristicas, especfcas par esta versién, estin ‘daramente ingiadae y se bass ene versin 5.5.0 publeads en jnio 20%. sutir x a" indice rvormacion genera sore PHP evened msc de una pga PHP Vite costae, nosy matrices Funciones chases este de formulates Gestion de eho Acris eroes en un serge PHP Los operadores légicos Los operadores tics san es siguientes: mando. S5@ousesk.com Lros gras Operacién ‘Operador(es) Ejempo Years and TRUE and TRUE => TRUE Wai or TRUE oF TRUE => TRUE " “TRUE of FALSE => TRUE FALSE or FALSE —> FALSE 0 take exciusivo FALSE si vor TRUE wor TRUE => FALSE ‘ambos operandos son TRUE) “TRUE sor FALSE => TRUE FALSE wor FALSE => FALSE ogi 7 TRUE => FALSE FALSE => TRUE os operedores andy & &, esicomo oF y || son éntkos, pero no Henen le mie precedenci (yéase la seczin Precedencia de os operadores). susie x a" Ino Anterior Buscar indice rvormacion genera sore PHP soutesruer msc de una pga PHP ‘arabes, constants py mates oe ite ie en operadores opera de denon por valor ntvadeite npn Larepercores eae £1 operadorrernaro Funcions ylases este de formulates emir assesiones Gestion de eho Admiisvar los emores enun sense PHP ‘anco_Se@utock-om Ubros gas El operador ternario Cote operedorcandional, el aperador temaro 2, funciona coma en elienguase C Stas ata nstruccidn dewehe el valor de expresién? si expreaigal se evalia como TRUE y el valor de exprseisnd, si expeeaisnl se evalle como FALSE, S| expeesiéni no es de tipo booleane, Se realza una conversn de acuerdo alas regs desertas en el capitulo Variables, constantes, pes veatrces, Desde a versién 5.3, e5 posbie omit expresiidn?:expresiént?: expresién3. En este caso, le instrcein dewelve el valor de expreaiénl si exprealén] se evalia como TRUE y el valor de fexprea on’ en caso contrara. Fs el equvalente de expreeidal 2eupregiant sexpres ions. emala Wi sosatczncson ds vars. U1 iesentzscite de up mensaje que depende del velor Se érembee ‘tone 1 jnola *_ (Gnoubre?:"desconscide').!"//vereién 8.3 ene "hole + (Geummeats"senconsesan') "tebe fo" /eeeaton 8.3 slide susie x a" indice rvormacion genera sore PHP evened msc de una pga PHP Vite costae, nosy matrices Funciones chases este de formulates Gestion de eho Acris eroes en un serge PHP Los operadores combinados Los operadores sume (+), dferenct (-), mutipicadi (*),dhissn (/), mbdulo (2) y coneatenacisn () se pueden combinar con el operador de asignacen (=) siguiendo la siguiente sintaxs, mando. S5@ousesk.com Lros gras Sintaxis Eauivatonte a ‘Svariable t= expresign | gvariable = Svarlable + exproslén ‘Svariable -= expresion | $variable = Svariable - expresién ‘Gvariable += expresion | $variable - svariable » expresign ‘Svarieble /> expresion | gvariable = Gvaricble / expresién Grariable t= sxpresin | Svariable = Svariable § eupresi@n ‘Suariable > expresion | gvariable = Svarisble . expreslén susie x a" Ino Anterior Buscar indice rvormacion genera sore PHP evened msc de una pga PHP ‘arabes, constants py mates ntvadeite npn Laropencores eae Funcions ylases este de formulates emir assesiones Gestion de eho Admiisvar los emores enun sense PHP Precedencia de los operadores ‘anco_Se@utock-om Ubros gas 1a precedence de les operadores designa el onlen en que se procesan los operadores en una expresion compet. ‘A ual que en todos los lenguajes, se pueden utizar los paréntests para modifear el orden ene procesamicnto de lus operacones. En la priciea, no dude en ullmar os paréntesis para evitar Droblemas y mejraria legbikad de ls expresiones, a precedencia de los operadores es la siguiente, desde el menos prontaro (se proces el uit) a iis pritario (se process el primero): Operator wpewhafiieere “1% 1 ++ — (a (double) (string) (ray) Object) susie x a" Los controles condicionales 1. If La estructura de control if permite una ejecucién condicional de instrucciones. Esta estructura tiene dos sintaxis: Primera sintaxis if (condicion 1) instrucciones_1; [] elseit (condicién_2) | instrucciones_2; ] [om] [) else ( instrucciones_n; | } El principio de funcionamiento de la estructura de control if es el siguiente: + Sila condicién_1 es verdadera, las instrucciones instrucciones_1 se ejecutan y, a continuacién, el control se pasa a las instrucciones que siguen la estructura de control. Por ejemplo, la ejecucién del programa sigue a la instruccién que sigue directamente al final de la estructura de control. + Si la condicién_1 no es verdadera, el proceso se repite para las posibles parejascondicion_i/instrucciones_i siguientes, introducidas por la palabra dave elseif * Sininguna condicién es verdadera, las instrucciones instrucciones_n, introducidas por la palabra clave €1se se ejecutan y luego se pasa el control a las instrucciones que siguen la estructura de control. Puede haber varias cléusulas elseif, Si las expresiones que definen las condiciones no son de tipo booleano, se realiza una conversién de acuerdo a las reglas descritas en el capitulo Variables, constantes, tipos y matrices. Eiemplo "; } elseif (Sedad == NULL) { echo "jHola Snombre! No sé tu edad.
"; } else ( echo ";Hola Snombre! Tienes Sedad aflos.
"; Resultado jHola Olivier! No sé tu edad. 1s La segunda sintaxis se utiliza principalmente para escribir una estructura de control en varios bloques PHP entre los que se inserta codigo HTML. ‘Sequnda sintaxis (con cédiao HTML incrustado) cédigo_HTWE_1 [ <2php elseif (condicion_2): 2> codigo HTML 2 ] Lee [ cédigo_Hrut_n ] <2php endif; 2 El principio de andlisis de la estructura if - elseif - else es eo mismo que con Ia primera estructura, pero en lugar de la ejecucién de instrucciones PHP, el motor incorpora en el resultado el cédigo HTML asociado con la condicién. Ejemplo Ejemplo de pagina PiP
jHola desconocide!
Conozco tu nonbre pero no tu edad.
Conozco tu nombre y tu edad, pero no se lo diré a nadie.
Resultado (depende de la asignacién aleatoria de las variables) Conezco tu nombre pero no tu edad. Esta sintaxis es realmente muy practica para realizar una construccién condicional de una pagina HTML, 28 aawzone ENI Training - Ubroertine evitando el uso pesado de un solo bloque PHP que genera todo el cédigo HTML con la instruccién echo. 2. Switch La estructura de control switch, equivalente a miltiples if - elseif se utiliza para comparar el resultado de una expresidn con varios resultados. Esta estructura tiene dos sintaxis Primera sintaxis switch (expresion) ( case expresicn_i: instrucciones_1; (break?) [ case expresién 2: Anstrucciones 2, [break:] 1 Live 3 [ defaui [breaks] 1) El principio de funcionamiento de la estructura de control switch es el siguiente + Si la expresién es igual a expresién_i las instrucciones asociadas ainstrucciones_i se ejecutan y se realizan las comparaciones si no hay una instruccionbreak. + Si no se encuentra ninguna igualdad, + se_—ejecutantodas_—las instrucciones inst rucciones_n introducidas por la palabra clave default. Puede haber varias cldusulas case. Cuando se verifica una igualdad y se ejecutan las instrucciones correspondientes, la instrucciénswitch no se interrumpe y se evallian las expresiones casos siguientes. Para interrumpir la ejecucién de la instruccién switch y la evaluacién de las cléusulas case, es necesario utilizar la instruccion break (fuerza la salida de la estructura de control). Eiemplo <2php Snombre = rand(0,1)?/ Olivier’ :wULL: switch (Snombre) { case NULL : echo ‘jHola desconocido! ', "Voy a Llamarte Olivier-
"; Snonbre = ‘Olivier’: breal case ‘Olivier’ echo "jllola Maestro Snomb: break; default echo "jHola alumno Snombre!
"; lebr />"; tpemenrring coment ptieabok spi= 86137 as ” www.FreeLibros.me 2awanne EN Training - ibrontine Resultado (depende de la asignacién aleatoria de las variables, jHola desconocido! Voy a llamarte Oliver. ‘Sequnda sintaxis (con cédiao HTML incrustado} ‘cOdigo_BTML_1 [ cédigo_HTwn_2 1 Dove] [ <2php deraute : 2> cédige_BTME_n <2php endswitch; 2> El primer case debe estar escrito en el bloque PHP switch. Eiemolo Ejemplo de pagina PHP</titie> <style type="text/css" media="all"> sen (font-weight: bold; color: green;} ses (font-weight: bold; color: orange; } ifx (font-weight: bold; colez: blues) Idesconocide (font-weight: bold; color: red;} </etyle> </head> <body> <div> <2php switch (Sidioma) : // switch case ‘en’ // primer case <I- Cédigo BTML --> Hello <span class="en">ay friend</span>!<br /> <?php break: // break primer case 2> <?php case ‘fr’ : /J segundo case ?> <!-= Cédigo BTML ==> Bonjour <span class="sp">mon pote</span> !<br /> <ophp break; // break segundo case 2> <ophp case ‘es? : 11 tercer case ?> <I> Cédige BTML --> jHola <span class="es">amigo</span>!<br /> <2php breaks // break tercer case ?> <?php default : // por defecto ?> <Ia= Cédigo ATMEL ==> <span class="desconocido">??2??</span> <2php endswitch; // fin del switch 2> </aiv> </eody> </atm1> Resultado tpenenrring comer ptiedabok spi= 86137 ” www.FreeLibros.me 4s 2awanne jHola amigo! hipununwenictraning comilient netined abock spueR= 85137 ENI Train - Ubrocrtine www.FreeLibros.me 95 2avaaone Ino Anterior indice pune floes le sobre cacenat Operadores Lesopencors see Funciones clases Acceder alas bases de datos Envaruncoreoelecrinico est de serves cristal eres en un scrips PHP EN Training - Libro tine ‘mance Se@outock.com Libros gratis X Los controles iterativos 1. While lina conden es verdadera, Como para las estructura de contol candidonales, hay dos sintaxis diaponibles mee otis El principle de foncionamiento de fy estrucure de control nile es el siguente: mentas que I condicn condicion sea verdadera, las nstruciones inst rucciones se ejecutan Sila expresion que define & condisén no es de tipo booleano, se realize una conversion de acuerdo a las relas desertas en el capitulo Varables,constantes, tines v matrices, ‘Smale Pe UT alentzas ot Ledice on interior «in longitud de ta endane 11 aan punto, ino sonore sindice) "+ estado ‘Tradicionalmente, esta estructura adopta las siguientes conductas 4 Sila condicion es fasa en la primera terackn, las instrucones situadas dentro del bucle ‘nunca se ejecutan Ipuhuwenitraining coment netimadabook aspx 5138 a" ‘www.FreeLibros.me 2awanne ENI Train - Ubrocrtine Incluir un archivo 1. Funcionamiento Las funciones include, include_once, require y require_once permiten induir un archivo en un script PHP. ‘Sintaxis entero include (archivo) entero include_once (archivo) require (archivo) require_once (archivo) archivo Nombre del archivo que se va a incluir (se puede especificar con una ruta absoluta o relativa). Las funciones include e include_once dewuelven 1 en caso de éxito y FALSE en caso de error. Las funciones require y require_once no tienen cédigo de retorno. En caso de error, las funciones include e include_once generan un simple error de nivel&_WARNING que no interrumpe la ejecucién del Script. Este no es el caso de las funcionesrequire y require_once que causan un error fatal interrumpiendo la ejecucién del script. El archivo incluido puede contener cédigo HTML, cidigo PHP o ambos. Si contiene cédigo PHP, este cédigo debe estar escrito entre las etiquetas PHP habituales. El cédigo HTML, presente en el archivo incluido, se integra tal cual en la pagina enviada al navegador, como si se encontrase en el script que realiza la llamada. EI cédigo PHP, presente en el archivo incluido, se ejecuta también, como si se encontrase en el script que realiza la llamada. Cuando se incluye cédigo PHP, variables y constantes, definidas en el archivo induido se pueden usar en el script de llamada y viceversa. Todo sucede como si hubiera un sélo script tras la inclusién y, por lo tanto, un rango igual a este script para las variables y constantes. Es posible incluir varios archivos en un script, o integrar las inclusiones (incluir un archivo que, a su vez, incluye un archivo en otro). Con las funciones include y require, el proceso de inclusién se repite varias veces, si el mismo archivo se incluye en varias ocasiones. En algunos casos este puede ser un comportameinto no deseado, especialmente cuando un archivo se incluye por primera vez directamente en un script y una segunda vez indirectamente a través de la inclusién de otro archivo. Este comportamiento se puede evitar usando las funciones include_once y require_once, que garantizan que un archivo se incluye una sola vez, aunque se le llame varias veces. La extensién del archivo que se va a incluir es totalmente libre. Por ejemplo, no es obligatorio el uso de la extensién .php para incluir cédigo PHP: el archivo incluido no se ejecuta directamente por el motor PHP (es el script de llamada el que se ejecuta). Para los archivos incluidos que no pueden o no deben ejecutarse directamente, es posible utilizar una extensién diferente (.inc., por ejemplo). Ejemplo: script principal hipunumwenitrating comilient netined abock spueR= 85138 18 www.FreeLibros.me 2awanne ENI Train - Ubrocrtine <?php // Inclusién de un archive include’ comin. inc’); // deciaracién de una variable $x en el script principal sxe // Visualizacion de 1a variable $x. echo "Valor de \$x en el script principal: Sx<br / // Visualizacién de 1a variable Sy (definida en el archivo // incluido) « echo "Valor de \sy en el script principal: Sybr />"1 >> Archivo inciuido comin.inc <Ic+ Inicio del archivo de inclusién en modo HTML (apertura de una etiquetacb> que se cierra al final del archivo ==> <b>inicio del archivo comin. inc<br /> <?php // algo de cédigo 2H? // veciaracién de una variable $y en el script inciuido sy = 25 // Visualizacién de 1a variable $y. echo "Valor de \sy en el archivo incluido: $y<br />"; > Fin del archivo comin.inc</b><br /> Resultado Inicie del archive comin.ine Valor de $y en el archivo incluido: 2 Fin del archivo comin. ine valor de $x en el script principal: Valor de $y en el script principal: En el archivo php. ini, la directiva include_path permite definir rutas de busqueda para la inclusi6n de archivos. 2. Utilizacion La técnica de inclusion es practica para dos tipos principales de uso: + Incluir definiciones estéticas: constantes, definiciones de funciones. En este caso, es necesario sobre todo utilizar las funciones include_once y require_once para evitar una posible doble inclusién (lo que provocaria un error én la definicién de las funciones). + Incluir cédigo PHP 0 HTML dinémico que se ejecuta efectivamente en el momento de la inclusién: seccisn HTML comin a varias paginas (encabezado, pie de pagina) 0 cédigo comin a varias paginas (aunque en este caso, es mas adecuado definir una funcién). En este caso, es necesario sobre todo utilizar las funciones include o require para garantizar que la inclusién se produce en cada llamada. © 12 creacién de funciones personalizadas se estudia en el capitulo Funciones y clases. Ejemplo tpamenrring comer ptiedabok asp 85128 ” www.FreeLibros.me 2awanne ENI Training - Libro ntine + Archivo de definicién de constantes (constantes. inc) <?php // Definicién de constantes W/ por ejemplo, el nombre del sitio. DEFINE (NOMBRE_STTIO, 'miSitio.com’); * Archivo que contiene el principio de cada pagina (principio. inc) <?php // Inclusién del archivo de constantes. include_once |’ constantes. inc’) ; >> <IDOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict //EN" sbttp: //www.w3 .org/PR/xhtm11/D7D/xhtml1-strict .dta"> <html walns="nttp: //www.W3.0rg/1999/xhtml"> <head><title><?php echo NOMBRE SITIO; 2> + Archivo que contiene el final de cada pagina (final. inc) * Script de una pagina <2php. // Inclusién del principio de la pagina. include (’ principio. inc’) ;

contenido de 1a pagina ssultado fuente de la pagina en el nav chead>ctitlesmisitio.comc/title> -

tpamenrring comer ptiedabok asp 85128 ” www.FreeLibros.me 2awanne ENT Training - Ubrocrine Interrumpir el script Las instrucciones exit y die permiten interrumpir la ejecucién del script (die es un alias de exit). Sintaxts exit (cadena mensaje) 1 exit[(entero estado) 1; die (cadena mensaje) 17 die[ entero estado} 17 mensaje Mensaje que se va a mostrar antes de detener el script. estado Estado de retorno (entero entre 1 y 254), El script se detiene de repente y la visualizacién se queda “como esta". Por lo tanto, la pagina HTML que se envia al navegador puede ser incoherente o estar vacia. Si se llama a la instruccién o a la funcién dentro de un archivo incluido, el script principal se interrumpe. Ejemplo (sin mensaje! Usuaric desconocido. No se puede continuar."); } // Continuar la generacion de la pagina. echo Snonbre; tpanenrning comer etiedabok asp 85140 tn ” www.FreeLibros.me 2awanne ENI Train - Ubrocrtine Funciones 1. Introduccién Al igual que en otros lenguajes de programacién, PHP ofrece la posibilidad de definir sus propias funciones (llamadas funciones del "usuario") con todas las ventajas asociadas (modularidad, uso de maydsculas...). Una funcién es un conjunto de instrucciones identificadas por un nombre, cuya ejecucién devuelve un valor y culla llamada se puede utilizar como operando en una expresién. Un procedimiento es un conjunto de instrucciones identificadas por un nombre que puede ser llamado como una instruccién. 2. Declaracién y llamada La palabra clave funcién permite introducir la definicién de una funcién. ‘Sintaxis funcién nombre _funcién({parémetro]) [ nombre_funcién Nombre de la funcién (debe respetar las reglas de denominacién presentes en el capitulo Informacion general sobre PHP). parametro Pardmetros posibles de la funcién expresados como una lista de variables = (véase_ = la_—secci6n Parémetros):$parametrol, $parametro2, instrucciones Conjunto de instrucciones que componen la funcién. Sila funcién devuelve un valor, es posible utilizar la instruccién return para definir el valor de retorno de la funcién (véase la seccién Funciones - Valor de retorno). El nombre de la funcién no debe ser una palabra reservada de PHP (nombre de funcién nativa, de instruccién) o ser igual al nombre de otra funcién definida de antemano. Una funcién de usuario se puede llamar como una funcién nativa de PHP: en una asignacién, en una comparacién... Eiemplo ! } // Buncién con 2 parémetros que devuelve el producto // de 10s dos parametros. funcién producto ($valort, $valor2) ( return Svalorl * Svalor2; } // Vamada de 1a funcién mostrar_hola mostrar_hola(); tpamenrring coer ptiedabok sph 5142 ” www.FreeLibros.me 15 2awanne ENT Training - Ubrocrine // Uses de la funcién producto: V7 = en una asignacién Sresultado = producto(2, 4); echo "2 x 4 = Sresultadocbr />"; // = en una comparacion Af (producto (10,12) > 100) { echo 10 x 12 es superior a 100.cbr />"; } Resultado Hola! 2e4-8 10 x 12 es superior a 100. En el lenguaje PHP, no existe un procedimiento real. Para definir algo equivalente a un procedimiento, basta con definir una funcidn que no devuelva ningiin valor y llamar a la funcién como si se tratara de una instruccién (como la funcién mostrar_hola, por ejemplo). Desde la versién 5.4, cuando una funcién devuelve una matriz, es posible acceder directamente @ un elemento de la matriz liamando a la funcién con una sintaxis de tipo funcién(...) [clave]. Efem| "; Resultado quien() (0) = olivier Esta técnica funciona también cuando la funcién devuelve una matriz multidimensional con una sintaxis de tipo funcién(...) [clave1] [clave2] Es posible utilizar una funcién antes de definiria. Eiemplo <2php // Urilizacién de 1a funcién producto. echo producto (5, 5); // Definiciéa de la funcién producto. Funcién producto ($valorl, Svalor2) { return Svalorl * §valor?; ) > Resultado Iipihunwanctraiing coment netinedabock epxeR= 5142 21s ‘www.FreeLibros.me 2awanne ENI Train - Ubrocrtine 25 Por lo tanto, no hay ningiin problema para definir funciones que llamen entre ellas. Una funcién se puede utilizar s6lo en el script donde se define. Para utilizarla en varios scripts, es necesario, bien copiar su definicién en los diferentes scripts (se pierde el interés por definir una funcién), 0 bien definirla en un archivo incluido donde la funcién sea necesaria. Eiemplo + Archivo funciones . inc que contiene la definicién de funciones: llamada $operacién(). return Soperacién ($valorl, $valor2) ; ? // Utilizacion de 1a funcién calcular, echo *3 + 5 = *,calcular(”suma’,3,5)."
"; echo '3 x 5 = ',calcular(*producto’ ,3,5)."
"s tpanenrring comer ptiedabok asp 85142 ans ” www.FreeLibros.me 2awanne ENI Train - Ubrocrtine Resultado 3. Parametros Los parémetros (también llamados argumentos) posibles de la funcién se definen en forma de una lista de variables. En este tercer punto, vamos a estudiar las siguientes posibilidades: + definir un valor predeterminado para un pardmetro; + pasar un parémetro por referencia; + utilizar una lista variable de parametros. lor predeterminado Es posible indicar que un parémetro tenga un valor predeterminado con la siguiente sintaxis: Sparanetzo = expresion Literal El valor predeterminado de un parémetro debe ser una expresién literal y puede ser ni una variable, ni una funcién, ni una expresién compuesta El valor predeterminado se utiliza como valor de un parametro cuando se llama a la funcién, sin mencionar el valor para el parémetro en cuestién. Ejemplo <2php // Definicion de una constante define (/ UNO , 1); // Definicién de 1a funcién producto con valores // predeterminados para los parémetros (incluyendo una constante // para el primer parénetro). funcién producto ($valor1=0NO, $valor2=2) { return Svalorl* $valor2; } // Vamadas // ~ sin parametro echo ‘producto() = ',producto(), "
"; // = con un anico parametro = obligatoriamente el primero echo 'producto(3) = ',producto(3),"
"; Resultado producto() = 2 producto(3) = 6 No dar ningdin valor a un pardmetro que tenga un valor predeterminado sélo es posible desde la derecha. Pase un valor "vacio" ("" 0 NULL) no resuelve el problema porque PHP convierte el valor en cuestién en el tipo apropiado (en este caso, entero igual a 0). tpamenrring coer ptiedabok sph 5142 ans ” www.FreeLibros.me 2awanne ENT Training - Ubrocrine Pasar un nimero insuficiente de parémetros y no tener ningun valor predeterminado genera un error. Pasar demasiados pardmetros no genera ningun error; los parémetros en exceso se pasan por alto. e por referens Por defecto, el pase de parametros se realiza por valor: se trata de una copia del valor que se pasa a la funcién. Por lo tanto, la modificacién de los parémetros dentro de la funcién no tiene efecto sobre los valores en el script de llamada. Efemplo, "; } // Imicializacién de una variable. sxe // Visualizacion de 1a variable antes de la llamada a ia funcién. echo “\$x antes de la llamada = $x
"; // Lanada de 1a fonction utilizando la variable como valor // del parametro. por_valor (Sx) // Visualizacion de 1a variable después de 1a llamada a la funcion. ‘echo "\$x después de 1a Liamada = §x
"; Resultado Sx antes de la llamada = 1 Sparanetzo = 2 Sx después de la llamada = 1 Si es necesario, es posible tener un pase de referencia utilizando el operador de referencia & (véase el capitulo Operadores - seccién El operador de asignacién por referencia) delante del nombre del pardmetro en la definicién de la funcién. Con esta definicidn, a la funcién se le pasa una referencia a la variable (no una copia); esta itima trabaja directamente en la variable del script de llamada. Eiemplo "; } // Inicializacién de una variable. seed // Visualizacion de 1a variable antes de la llamada a la funcion. echo "\Sx antes de la llamada = $x
"; // Vanada de 1a fonction utilizando la variable como valor Iipihunwanctraiing coment netinedabock epxeR= 5142 sts ‘www.FreeLibros.me 2awanne ENI Train - Ubrocrtine 11 dei parametzo por_referencia ($x); // Visualizacion de 1a variable después de la llamada a la funcion. echo "\$x después de 1a llamada = $xcbr />"; > Resultado $x antes de la llamada = 1 Sparametro = 2 Sx después de la lat 2 Con esta definicién, no es posible pasar constante 0 una expresién como valor del parémetro. Eiemplos prohibidos por_referencia (2); por_referencia (1+1) ; por_referencia (UNO) ; // UNO = constante definida ai riormente Lista variables de parametros Dentro de una funcién, es posible utilizar las siguientes tres funciones de PHP: Funcién Funcién func_num_args Indica el nimero de parémetros pasados a la funcién. func_get_args Devueive la lista de parametros pasados a la funcién (en una matriz) func_get_arg Devueive el valor de un parémetro cuyo nimero se especifica ‘Sintaxis entero func_num a! matriz func_get_args(} mixto func_get_arg(entero numero) mimero Numero del parémetro solicitado (0 = primer parémetro), Gracias a estas funciones nativas, es muy fécil escribir una funcién que acepta un némero variable de pardmetros. Los principios son los siguientes: + declarar la funcién sin parémetros; + recuperar, en el cuerpo de la funcidn, los. pardmetros. con las funciones func_get_args ofunc_get_arg y utilizarlos (normaimente en un bucle). En la practica, nada impide que los parémetros sean de diferentes tipos. Por otra parte, es posible declarar explicitamente los parametros y luego aceptar una lista de variables de pardmetros adicionales. En este caso, los pardmetros explicitamente declarados se retoman en el recuento y en la lista de parémetros. Por tanto, es necesario eliminarlos del procesamiento. Eiemplo break; 1 } // Vamadas producto ($resultado) ; echo ‘producto ($resultado) => ’,$resultado,’
"; producto ($resultado,1,2/3); echo ‘producto ($resultado, 1,2,3) => ',Sresultado,’
"; Resultado producto ($resultado) => 0 producto ($resultado,1,2,3) => 6 4, Valor de retorno El uso de la instruccién return en el interior de una funcién, permite definir el valor de retorno de la funcién y detener su ejecucion. Sintaxis return expresién; expresion Expresién cuyo resultado constituye el valor de retorno de la funcién. El resultado de una funcién puede ser de cualquier tipo (cadena, numero, matriz...) Si hay varias instrucciones return presentes en la funcién, es la primera encontrada en el curso de las instrucciones la que define el valor de retorno y provoca la interrupcién de la funcion: Efemplo " echo ‘valor_retorno(0) = ’.valor_retorno(0)."
"; > Resultado valoy_retorno(1) = Primer return valoz_retozno(0) = Segundo return Si la funcién no tiene ninguna instruccién return (0 si no se ejecuta ninguna instruccién return), el valor de retorno de la funcién es NULL. 5. Consideraciones sobre las variables utilizadas en las funciones bale Las variables utilizadas dentro de una funcién son locales: no se definen fuera de la funcién y se inicializan en cada llamada a la funcién. Lo mismo ocurre con los parémetros de la funcién Por el contrario, una variable definida fuera de la funcién (en el script de llamada) no esta definida dentro de la funcién. PHP ofrece un concepto de variable global para acceder, en una funcidn, a las variables definidas dentro del contexto del script de llamada. Para ello, dentro de la funcidn, es necesario dedlarar las variables globales que la funcién se utiliza con la instruccién global o utilizar la matriz asociativa predefinida $GLOBALS. Sintaxis global Svaziable[, . $variable Variable del script de llamada que la funcién quiere usar. Se pueden especificar varias variables, separadas por una coma, La matriz predeterminada SGLOBALS es una matriz asociativa. En esta matriz asociativa, la clave es igual al nombre de la variable globale (sin el $) y el valor asociado es igual al valor de la variable globale. La matriz asociativa $GLOBALS es una matriz “superglobal". Una matriz supergiobal esté automaticamente disponible en todos los entornos de ejecucién, sin tener que haberia declarado como global. En este libro, utilizaremos otras matrices superglobales. Eiemplo Caso *globales
"; funcién productol () { J/ Sx y Sy estan vacias en el interior de la funcién. echo "\Sx = Sxcbr />"; echo "\Sy = Sy
"; S220 + Sx * Sy ? productol () // $2 esta vacia en el script principal echo "\$z = Sz
"; // Resolucién del problema utilizando variables globales: // ~ con la palabra clave global para Sz y Sy // ~ con 1a matriz SGLOBALS para $2 echo ‘Caso 2: utilizacién de variables globales


"; funcién producto2 () { global 3x, Sy? echo "\Sx = Sxcbr />"; Sy = Sysbr >"; SGLOBALS[’z'] = 0 + $x * Syz ? producto2() echo "\$z = $2ebr />' 2 sin utilizacién de variables ’, Resultado Caso 1: sin utilizacién de variables globales Sx sy Se Caso 2: utilizacién de variables globales sxe sy=5 10 82 Un parémetro de una funcién se comporta como una variable local a la funcién, a menos que se pase por referencia, en cuyo caso es equivalente a una variable global. Variabl tatica De forma predeterminada, las variables locales de una funcién se restablecen en cada llamada a la funcién. La instruccién static permite definir variables locales estaticas que tienen la propiedad de conservar el valor de una llamada a otra funcién, durante la duracién del script. ‘Sintaxis static Svariable = expresién_literal[, .. $variable Variable en cuestion. expresién_literal Valor inicial asignado a la variable durante la primera hpitanvenstraring cement native sbock asp 85142 ons ‘www.FreeLibros.me 2awanne Eiemplo "; Sotra_variable = Sotra_variable
" J/ Increnentacién de las dos variables. Svariable_estaticatt: Sotva_vazlable++; } // Primera lamada de 1a funcién. echo "Primera llamada de variable _estatica (); Wve la funcién:cbr />"; 1 Segunda lamada de 1a funcién. ‘echo "Segunda llamada de variable_estatica (); Pisses la funcién:
'; // Tercera llamada de 1a funcién. echo ‘Tercera llamada de variable_estatica (); Resultado da funcién:
"; Primera llamada de 1a funcién: Svariable estatica = 0 Sotra_variable = 0 Segunda llamada de 1a funci6i Svariable_estatica = 1 Sotra_variable = 0 Tercera llamada de 1a funcié Svariable_estatica = 2 Sotra_variable = 0 Este ejemplo muestra que el valor de Svariable_estatica se conserva de una llamada a otra, la primera llamada permite inicializario. Por contra, la variable $otra_variable se pone a 0 en cada llamada de la funcién. El valor s6lo se conserva por la duracién del script: cuando éste termina, el valor se pierde y, en la siguiente llamada del script, la variable estatica se restablece. 6. Las constantes y las funciones En el capitulo Variables, constantes, tipos y matrices, se observé que el alcance de las constantes es el hpihuweniraiing comet netimedabock spk Rasta ‘www.FreeLibros.me sons 2awanns ENT Training - Ubrocrine script en el que se definen. A diferencia de las variables, el Ambito de aplicacién se extiende a las funciones llamadas en el script: una constante se puede utilizar dentro de la funcién sin ser declarada global. Por el contrario, una constante definida en una funcidn se puede utilizar en un script, después de llamar a la funcién. Eiemplo <2php // Definicién de una constante en el script. define (CONSTANTE_SCRIPT, ‘constante script"); // Definicién de una funcién. funcién constante() { // Que define una constante define (CONSTANTE_FUNCION, "constante funcién'}; // ¥ que mueatea una constante del script de llamada. echo “En la funcién, CONSTANTE SCRIPT = ', CONSTANTE_SCRIET,’
"; ) // Vamada de la funcién. constante() ; // Visualizacién de 1a constante definida en 1a funcién. echo ’En el script, CONSTANTE FUNCION CONSTANTE_FUNCION, "
"7 Resultado En la funcién, CONSTANTE_SCRIPT = constante script En el script, CONSTANTS FUNCION = constante funcién 7. Recursividad Al igual que muchos lenguajes, PHP permite la recursividad, es decir, la posibilidad de que una funcién se llame a si misma Para ilustrar este concepto, vamos a escribir una funcién genérica que muestra que permite mostrar el contenido de una matriz, posiblemente multidimensional. Fuente <2php funcién mostrar_matriz (§matriz, $titulo="" ,$nive U1 parametros J/ = Smateiz = matriz cuyo contenido se debe mostrar J/ = Stitulo = titulo que se debe mostrar sobre el contenido Jf = Snivel = nivel de visualizacién J/ Si bay un titulo, mostrarlo. if (Stitulo != '") { echo "cbr />cbr />"; 1 Uf Probar si hay datos. if (isset (Smatriz)) { // hay datos // Examinar la matriz pasada en pardmetro. reset (Smatriz); foreach (Smatriz as $clave re svaloz) { Iipihunwanctraiing coment netinedabock epxeR= 5142 sms ‘www.FreeLibros.me aawzone EN Trang - trons // wostzar 1a clave (con sangzia en funcién del nivel) echo str_pad("',12*snivel, ‘anbsp:'), hemientities ($clave),” 1 Mostrar el valor if (is_array(Svalor)) { // es una matriz WM etsquetar
echo "
4; //¥ wtamar de manera recursiva mostrar_matriz para // mostrar 1a matriz en cuestién (sin titulo y // al nivel siguiente de sangria) nostrar_matriz($valor,’" ,§nivel+1) ; } else ( 7/ es un valor escalar 1 wostzar el valor echo htmlentities (Svalor) ,"
"; ) H } ese { // sin datos // Poner una etiqueta simple
echo "
1; ) ) // Mostrar una matriz de colores Scolores = arzay("Azul" ,/Blanco” ;’Ro}0"): nostrar_natriz (§colores, ‘Colores"); // Mostar una matziz de dos dimensiones (pais/ciudad) . Spais = arzay("Espafa’ => array (’Madrid "Tealia’ => array(’Roma’ ,"Venecia’)) nostrar_natriz (Spais,’Pais/Ciudades’ ) "Leén’ , "Barcelona’), Resultado colores 0 = azul 1 = Blanco 2 = Rojo Pais/Ciudades Espana = 0 = Madria 1 = Leon 2 = Barcelona Italia = 0 = Roma 1 = Venecia Para ser rigurosos, debemos comprobar que la variable pasada inicialmente en el primer pardmetro es una matriz. Vamos a utilizar esta funcién varias veces en este libro, asumiendo que es parte de un conjunto de funciones genéricas definidas en un archivo incluido en el script sies necesario. 8, Funcién anénima Una funcién anénima, también llamada de cierre 0 closure en inglés, es una funcién a la que no se le ha asignado ningtin nombre en su creacién. Este concepto aparecié en la versién 5.3. Una funcién anénima se puede utilizar como el valor de una variable (funcién variable) 0 como una Iipihunwanctraiing coment netinedabock epxeR= 5142 sans ‘www.FreeLibros.me 2awanne ENT Training - Ubrocrine funcién de devolucién de llamada a otra funcién. Ejemy "; he // Vlamada a la funcién anénima. Sfuncién_anénima(’todo el mundo"); // vtilizacion de 1a Funcién anénima como funcién de devolucién de Mamada Snombres = array(/Olivier’ , ‘David’ , “Tomas! ); array walk (Snombres, $funcién_anénima) ; > Resultado iHola tod e1 mundo! jHola Olivier! Hola David! jola Tomas! La funcién array walk es una funcién que permite ejecutar una funcién (llamada funcién de devolucién de llamada) en los elementos de una matriz. La funcién anénima se puede definir directamente en la llamada. Eiemplo <2php. Snombres = array(/Olivier’ , ‘David’ , Toms’); array_walk i Snonbres, funcién (Snombre) (echo "jHola $nombre!
" Me > Una funcién anénima puede importar variables del contexto padre. Para ello, tras la firma de la funcién, basta con utilizar la palabra clave use seguida de la lista de variables que deben importarse entre paréntesis. Ejemplo "; he // Vlamada de la funcién anénina. Sfuncién_anénima () 7 > Resultado Iipihunwanctraiing coment netinedabock epxeR= 5142 sans ‘www.FreeLibros.me 2awanne ENI Train - Ubrocrtine jHola oLivi Si la variable importada debe modificarse por la funcién anénima, es necesario importarla con el operador & (use (&$nombre) ). 9. Funcién generadora Un generador (generator en inglés) 0 funcién generadora es una funcién que genera una lista de valores que podrén explorarse en el programa mediante una llamada con la ayuda de la estructuraforeach (como para una matriz), Esta técnica, aparecida en la version 5.5, es interesante ya que permite generar una lista de valores sin pasar por un almacenamiento en una matriz que podria consumir mucha memoria. Antes de la versién 5.5, era posible obtener el mismo resultado, pero a cambio de una mayor complejidad a la hora de definir una clase que implementase la interfaziterator Una funcién generadora no devuelve ningin valor y, por tanto, no comporta instruccién return. En su lugar, para proporcionar un valor a la persona que realiza la llamada, la funcién utiliza la palabra dave yield. Sintaxis yield [clave =>] valor: valor Expresién cuyo resultado constituye el valor proporcionado por la funcién. Clave Expresién cuyo resultado constituye la dave asociada al valor proporcionado por la funcién, Si no se especifica esta cléusula, los valores proporcionados se indexan por defecto a partir de 0. Cuando se llama a una funcién generadora, en realidad devuelve un objeto de la clase internaGenerator que implementa la interfaz Iterator. Cuando este objeto se explora por un bucleforeach, PHP llama a la funcién para recuperar un valor, hasta que no haya mas valores (como para una matriz). En cada iteracién, la funcién proporciona el valor con la ayuda de la palabra dave yield y su ejecucién se suspende hasta la siguiente iteracién Primer ejemplo: generacién de una lista de valores Dump de 1a variable:

"; var_dunp (3valores) ; echo ‘ // es un objeto

cbr />"; 11 exploracién de los valores echo *Exp foreach echo ) echo "
"; yracién de los valores:

'; res as §valor) ( va valor Iipuhunwanctraiing coment netinedabock epxeR= 5142 sans www.FreeLibros.me 2awanne ENT Training - Ubrocrine // nueva liamada (con 5 valores) y exploracién directamente // en 1a estructura foreach echo ‘Nueva generacion (5 valores) :
"; foreach (lanzador_de_dados(5) as Svalor) { Dump de 1a variable: object (Generator) #1 (0) ( } // es un objeto Exploracién de los valore: 563 Nueva generacién (5 valores): 44143 ‘Sequndo ejemplo: generacién de una lista de parejas clave/valor Stexto(Sil; ) ) foreach (letras (/OLIVIER’) as $code => Sletra) { echo "Sietra (Scode) "s } Resultado © (79) & (76) Z (73) Vv (BE) TF (73) B (69) B (82) Iipihunwanctraiing coment netinedabock epxeR= 5142 sss ‘www.FreeLibros.me 2awanne ENI Train - Ubrocrtine Clases 1. Concepto En la versién 5, la gestién de objetos en PHP se ha reescrito completamente para proporcionar un mejor rendimiento y mas caracteristicas. PHP ofrece ahora caracteristicas clés s de programacién orientada a objetos * definicién de clase. * uso de métodos constructor y destructor. * conceptos de atributo o de método publico, privado, protegido. * legado. + conceptos de clase 0 método abstracto, de clase 0 método final, de interfaz, de atributo o método estatico (de clase). * excepciones. Una clase es un tipo compuesto que reagrupa variables (lamadas atributos de la clase) y funciones (llamadas métodos de la clase). Por si misma, una clase no contiene ningin dato; es sdlo un modelo, una definicién. A partir de la clase, es posible definir ("instanciar") objetos que tienen la estructura de la clase y que contienen datos. En esta seccién, vamos a presentar las caracteristicas basicas mas utilizadas: es una introduccion prdctica a las caracteristicas orientadas a objetos de PHP. Para obtener mas informacién, consulte la documentacién de PHP. 2. Definir una clase La palabra clave class permite introducir la definicién de una clase. Sintaxis clase nombre_clase { // definicién de los atributos C public | private | protected Satributo [= expresion_1 1 // definicion de los métodes C [public | private | protected] function métedo() ( ) 1 ? nombre_classe Nombre de la clase (debe respetar las reglas de denominacién presentes en el capitulo Informacion general sobre PHP). tpamerrning coer ptiedabok p= 85143 ta ” www.FreeLibros.me 2avaanne ENI Train - Ubrocrtine $atributo Nombre de una variable que corresponde a un atributo de la clase. expresién_literal Valor inicial del atributo. Sélo se aceptan las expresiones literales y las constantes; las expresiones compuestas 0 las funciones no estan permitidas. método Definicién de una funcién que corresponde a uno de los métodos de la clase. La visibilidad de los atributos y los métodos se define por una de las siguientes palabras dav public El atributo 0 método es ptiblico y se puede acceder a él desde el exterior de la clase. private El atributo 0 método es privado y sélo se puede acceder a él desde el interior de la clase. protected El atributo o el método esta protegido y sdlo se puede acceder a él desde el interior de la clase o de las clases derivadas de la clase (ver el concepto de legado). De forma predeterminada, un método es publico. Por contra, la visibilidad del atributo debe especificarse. Los métodos se definen como las funciones de usuario clasicas (con pardmetros, instrucciénreturn...), pero dentro de la clase. Un método de una clase puede tener el mismo nombre que una funcién de usuario 0 que otro método de otra clase. Uno de los métodos puede tener el mismo nombre que la clase en Ia que se define. A este método particular, llamado método constructor, se le llama automaticamente al crear (“instanciar") un nuevo objeto. En general, este método se utiliza para inicializar los atributos que no puede serlo por una simple expresién literal. El método constructor de una clase puede ser llamado de manera unificada __ construct. Este método de denominacién es recomendable porque facilta la llamada del método constructor de una clase padre en una clase derivada (ver el concepto de legado). En primer lugar, PHP siempre busca un método llamado __construct; sino lo encuentra, busca un método con el mismo nombre que la clase. Ademas, es posible especificar un método destructor llamado _destruct (sin parémetros). A este método destructor se le llama automaticamente cuando se elimina la ditima referencia a un objeto. Este método se puede utilizar para liberar los recursos utilizados por el objeto (del tipo archivo, informacién en una base de datos, etc.). Por ultimo, es posible especificar un método llamado __toString (sin parémetros), que permite convertir un objeto en cadena. A este método se le llama automaticamente cada vez que se utiliza el objeto en un contexto en el que PHP espera una cadena (por ejemplo, en un echo). Este método debe devolver una cadena en la que se puede integrar Ia informacién que desee sobre el objeto. Dentro de los métodos, el objeto actual (o instancia actual) se puede referenciar por la variableSthis; para acceder a los atributos 0 a los métodos, basta con utilizar el operador -> seguido de! nombre del atributo o del nombre de! método, detrés del nombre de la variable Sthis. ‘Sintaxis Sthis->atributo Sthis->método([valor[, ...11) El signo $ va en el nombre de la variable this, pero no en el nombre del atributo. hipununwenitrating comilient netined abock spueR= 85143 an www.FreeLibros.me 2awanne EN Training - Libro ntine Eiem nombre = $nombre; Sthis->apellido = Sapellido; // Inicializar la marca de tiempo con la funcién time(). Sthis->timestamp = time(); } Jf = método destructor public function destruct () { // Basta con mostrar un mensaje. echo "

Eliminacién de Sthis->apellido

"; ) // ~ métode de conversién del objeto en cadena public function _toString() { // Devuelve e1 apellido y el nombre. return "_toString = $this->apellido - $this~>nombre"; ) J/ ~ mévodo que modifica el idioma del usuario. Public function idioma (Sidioma) { Sthis->idioma = Sidioma; } Jf ~ metodo (privado) que da formato a la fecha/hora J de creacion del usuario. private function FormatoDeLaNarcaDeTiempo() ( setlocale(LC_TIME, $this=>idioma) ; return strftime(’tc’, $this=>timestamp) ; ) Jf ~ metodo que da informacién sobre el usuario public function informacion() ( Screacion = Sthis->FormatoDeLaMarcaDeTiempo () return "Sthis->nonbre $this->apellido - Screacién"; 1 } >> Una case se puede utlizar s6lo en el script donde se define. Para poder utiizaria en varios scripts, es necesario, bien copiar su definicién en los diferentes scripts (se pierde el interés por definir una case), 0 bien definirla en un archivo incluido donde la clase sea necesaria. 3. Instanciar una clase Iipihunwanctraining comet netinadabock epxeR= 5149 au ‘www.FreeLibros.me 2awzone ENI Training - ubroertine Una instancia significa crear un objeto basado en la definicién de la clase. Hasta cierto punto, esto equivale a la definicién de una variable que tiene como “tipo” la clase. La creacién de instancias se realiza mediante el operador new. Sintaxis Snombre_objeto = new nonbre_clase{(valort, ...1)] §$nombre_objeto Variable para almacenar el objeto. nombre_clase Nombre de la clase que sirve como "modelo" para el objeto valor Posible parémetro que se pasa al método constructor de la clase llamada durante la creacién del objeto. Después de la creacién del objeto, los atributos y métodos publicos del objeto se pueden obtener con el operador ->, en la variable S$nombre_objeto, como con la variable $this. © No hay proteccién de los atributos publicos de los objetos; se pueden manipular directamente. Ejemplo . // Urilizacion de Los métodes dei opjeto. echo "{Syo->informacién()}
"; Syo->idiona (’en_US’); // modificacién del idioma echo "{Syo->informacién())
"; // Modificacién y lectura directa de un atribute public Syo->apellide = strtoupper (S$yo->apellido) ; echo "Syo->apellido
"; // Visualizacién directa del objeto => utilizacién de __tostring echo "Syo
"; Resultado Olivier Heurtel ~ mar 25 jun 2013 16:23:13 CET Olivier Heurtel - Tue 25 Jun 2013 04:23:13 pM CET BEURTEL __toString = HEURTEL - Olivier Eliminacién de HEURTEL Como muestra este ejemplo, las variables objeto pueden sustituirse igual que el resto (ver capitulo Variables, constantes, tipos y matrices - seccién Tipos de datos) en las cadenas de caracteres delimitadas con comilias dobles. Si es necesario, se pueden utilizar llaves para delimitar la variable dentro de la cadena. Desde Ia versién 5.4, es posible acceder a un miembro de una clase (atributo 0 método) durante la instanciacién, con una sintaxis de tipo (new clase(...))->miembro. tpenenrring comer rtiedabok p= 85143 ane ” www.FreeLibros.me 2awanne ENI Train - Ubrocrtine Eiem informacién () + echo "Sinformacién
"; Resultado Supresién de Hugo Victor Hugo - mar 25 jun 2013 17:15:03 cer Con este tipo de llamada, el nuevo objeto se suprime inmediatamente después de su creacién, lo que explica por qué el mensaje de supresién se muestra antes de la informacion. © 12s mismas reglas de alcance y duracién de las variables se aplican a los objetos (ver capitulo Variables, constantes, tipos y matrices - seccién Variables). 4, Legado Es posible definir una nueva clase que hereda de una clase existente con la palabra clave extends. ‘Sintaxis class nombre clase extends nombre clase de base{ // Definicién de atributes adicionales c public | private | protected Satributo [= expresién. 1 // Definicién de métodos adicionales. i public | private | protected function método() { ) 1 } El significado de los diferentes elementos es el mismo que para la definicién de una clase. La nueva dase creada se llama subclase y Ia clase base (que sirve como un "molde” en esta creacion) se denomina superciase. La nueva clase tiene implicitamente los atributos y los métodos de la clase base y puede definir otras nuevas, incluyendo una clase constructora de llamada __construct. Si la subclase no tiene un método constructor se llama al método del constructor de la superclase cuando se instancia un objeto de la subclase. tpemenrring comer ptiedabok p= 85163 ane ” www.FreeLibros.me ows ENT Training - iene Cuando el método constructor existe en la subclase, no hay ninguna llamada automitica al método constructor de la superciase: si es mnecesario, se le debe llamar explicitamente utizandoparent: :__construct (). Ejemplo nonbre = Snombre; Sthis->apellido = Sapellido; ) J/ = método que da 1a informacién sobre e1 usuario public function informacién() ( return "Sthis->nombre $this~>apellide"; 1 } // Definicién de una clase que hereda de la primera. class usuario_color extends usuario( J/ Definicién de atributos complenentarios public Scolores; // colores preferidos de usuarios J/ Definicién de métodos complenentarios. Jf ~ metodo constructor public function construct (Snombre, $colores) { // wiamada al Constructor de la superclase // para 1a primera parte de 1a inicializacién. parent::__construct (Snombre, ’x’) ; // Inicializacién especifica complementaria. Sthis->colores = explode(",", $colores) ; 1 Jf ~ lista de los colores preferides del usuario public function colores() ( return implode(",", §this->colores) ; } ? // Instanciacién de un objeto en 1a subclase. Syo = new usuario_color(’ Olivier’ ,‘azul,blanco, rojo’) // Utilizacion de métodos: 1 ~ de 1a superciase echo "{Syo->informacién() }
"; // existe por legado V1 ~ de 1a subclase echo "{$yo~>colores()}
"; // existe en 1a clase > Resultado olivier azul blanco, rojo 6 En una subclase, es posible volver a declarar un método o un atributo existe en la superclase. En este caso, el operador parent : : se puede utilizar para hacer referencia explictamente a Iipihunwanctraining comet netinadabock epxeR= 5149 eu ‘www.FreeLibros.me pawzone EN Training - Ubeoonsine los atributos (parent: :atributo) 0 métodos (parent: :método()) de la superciase y eliminar la ambigledad de los nombres (este operador se puede utilizar incluso si no hay ambigiledad), 5. Otras caracteristicas de las clases a. Clase o método abstracto Una clase abstracta es una clase que no se puede instanciar (no se crea ninguin objeto en la clase). Por contra, esta clase puede servir de base para definir una subclase que se puede instanciar (excepto si es a su vez abstracta). Un método abstracto es un método que se define en una clase (que a su vez es necesariamente abstracta), pero no se ha implementado (el cédigo del método no esté presente). Este método se puede implementa en una subclase. Un método abstracto no puede ser privado. En cuanto a la sintaxis, basta con poner la palabra clave abstract antes de la definicisn de la clase 0 del método Una subclase que no implementa todos los métodos abstractos de la superciase es implicitamente abstracte (aunque la palabra clave abstract no esté presente). Ejemplo, <2php // Definicion de una clase abstracta. abstract class superclase { V1 atributo protegido protected $x; 71 dos métodos para acceder al atributo protegide 1 = para leer Public function get() { return "GET = §this->x"; ) (1 = para escribir // > metodo abstracto abstract public function put ($valez); ? // Definicion de una subclase que hereda de la superclase. class subclase extends superclase ( // Twpienentacién del método de escritura. yn put (Svalor) { Svalor: Public funct Sthis->x ) } // Ueilizacién de 1a subclase. Sobjeto = new subclase(); Sobjeto->put (123) 7 echo Sobjeto->get (),/
4; 2D ultado cer - 123 Iipihunwanctraining comet netinadabock epxeR= 5149 mma ‘www.FreeLibros.me 2awanne ENI Train - Ubrocrtine b. Clase o método final No se puede heredar de una clase final. Un método final no puede ser redefinido en una subclase. En cuanto a la sintaxis, basta con poner la palabra clave final antes de la definicién de la clase 0 del método. Eiemplo 1 x; plementacién del método de lectura. ) // Impiementacién del método de escritura public function put (Svalor) { Sthis->x = $valor: ) d. Atributo o método estatico - Constante de clase Un atributo 0 un método estitico se puede utilizar directamente sin necesidad de instanciar antes un tpemenrring comer ptiedabok p= 85163 on ” www.FreeLibros.me pane EN Training - Ubeooniine objeto. También conocido como atributo o método de clase. Para definir un atributo 0 un método estatico, basta con colocar la palabra clave static antes de la definicién del atributo o de! método. Para hacer referencia a un atributo o un método estético, debe utilizar la sintaxisnombre_clase::$nombre_atributo 0 nombre_clase: :nombre_método(). Una constante de clase es una constante definida en una clase que se puede utilizar directamente sin necesidad de instanciar antes un objeto (como un atributo de clase, pero constante). ‘Sintaxis para definir una constante de clase const nombre_constante = valor; nombre_constante Nombre de la constante. valor Valor de la constante. Una constante de clase es implicitamente piblica. Para hacer referencia a una constante de clase, debe —_utilizar__— la sintaxisnombre_clase::nombre_constante. Ejemplo x = Svalor: unaClase: :Snimerot+; echo "Creacién del objeto: Sthis->x
"; ) // Método destructor // ~ zeduciz el nimero de objetos public function destruct () { ‘unaClase: :Sniimaro==; echo "Bliminacién del objeto: Sthis->xcbr />"; ) } U1 Crear dos objetos: Se: new unaClase()7 Sabe = new unaClase ("ABC'); // Mostrar el ninero de objetos echo unaClase: :mimeroopjetos(),” objeto(s)
"; Iipihunwenctraiing comet netinadabook epxeR= 5143 soa ‘www.FreeLibros.me ynocido 2awanne ENI Train - Ubrocrtine // "ELiminar" un objeto unset (Sdesconocido) ; // Mostzar el ninero de objetos echo unaClase: > rniimereObjetos ()," objeto(s)
"; Resultado creacién del objeto: x Creacién del objeto: ABC 2 objeto(s) Eliminacién del objeto: x 1 objeto(s) Eliminacién del objeto: ABC Trazos Un trazo es un tipo de clase que reagrupa un conjunto de métodos o de atributos que pueden a continuacién utilizarse en otras clases sin legado. Es un medio facil de utilizar del cédigo en un lenguaje como PHP que no autoriza el legado multiple. Esta caracteristica se introdujo en la version 5.4. Sintaxis de definicién de un trazo trazo nombre_trazo { // Definicién de atributes y/o de métodos nombre_trazo Nombre del trazo (debe respetar las regias de nomenclatura presentadas en el capitulo Informacion general sobre PHP). En la definicién del trazo, los atributos y métodos se definen como en una clase normal. Entonces, es posible definir una nueva clase que utilice uno o varios trazos con la palabra claveuse. Sintaxis class nombre_clase [extiende el nombre de la clase de base] { 7/ Utilizacién de uno 0 varios trazos use nombre_trazo [,...14 // Seguido de 1a definicién de la clase. } Eiemplo nombre)) { echo "Hola (Sthis-nombre} !"; e echo ' jHola!
"; > ) ) ) // Definicién de una clase que utiliza los dos trazos class usuario| use YoséCalcular, YosoyListo; // avributes y métodos de la clase. private Snombre; // nombre del usuario public function _construct (Snombre) { // Inicializar el nombre con el valor pasado como parametro. Sthis->nonbre = Snonbre; // Decir hola (1lamada de un método de uno de los trazos) « Sthis->decirHola(); ’ ) // Instanciar un nuevo objeto. Syo = new usuario(’ Olivier’); // Bacer un calculo (1lamada de un método de uno de los trazos) echo ‘Yo sé calcular: "; echo '10821 x 11409 = ', $yo=»producto(10821, 11409) 5 Resultado jHola Olivier! Yo sé calcular: 10821 x 11409 = 123456789 Un método heredado de una clase base se reemplaza por un método con el mismo nombre surgido de un trazo, que a su vez se reemplaza por un método del mismo nombre de la clase actual. Por el contrario, si dos trazos insertan un método con el mismo nombre en una clase, se produce un error fatal, salvo si el conflicto. se resuelve _explicitamente —_utilizando_—_los operadores insteadof 0 as (véase la documentacién a este respecto). Un trazo puede utilizar otros trazos. 6. Excepciones Los lenguajes de programacién basados en objetos como C++ y Java utilizan el concepto de excepcion para administrar los errores. Esta caracteristica se introdujo en la gestién de objetos en la versién PHP 5. El principio consiste en incluir el codigo susceptible de provocar errores en un bloque try y asociarlo a un bloque catch destinado a detectar errores y procesarlo: Estructura general try ( // cédigo susceptible de generar errores Iipihunwanctraining comet netinadabock epxeR= 5149 sna ‘www.FreeLibros.me 2awanne ENI Train - Ubrocrtine } catch (Exception Se) { J/ codigo destinado a procesar los errores c } finally ( // codigo ejecutado en todos los casos 1 ? Desde la versién 5.5, es posible incluir un bloque finally después del bloque catch. EI cédigo presente en el bloque finally siempre se ejecuta después de los bloques try y catch, independientemente de si se produce una excepcién o no. La dase Exception es una clase que contiene los siguientes métodos: __construct Método constructor que acepta dos parametros: un mensaje de error y un cédigo de error (opcional). getMessage Método que permite recuperar el mensaje de error. getCode Método que permite recuperar el cbdigo de error. Dentro del bloque try, se puede producir una excepcién por una instruccién de tipo throw new Exception (mensaje, [cédigo]) En el bloque catch, los métodos getMessage y getCodepermiten recuperar informacién sobre el error y procesarla. En caso de excepcién en un bloquetry, el procesamiento se ramifica directamente en el bloque catch: el resto del bloque try no se ejecuta. Eiemplo x = $valors } J/ Método que Lleva a cabo cualquier aceién. public function accién() | 7/ Por alguna razén, se prohibe 1a accién // si el atribato es negativo: se produce una excepcién. LE (Sthis—>x <0) { ‘throw new Exception(*Accién prohibida’ , 123); , ) ) // Czeax dos objetos. Sobjeto = new unaClase(1) ; try ¢ echo ‘objeto 1: Sobjeto->accién(); // no va a provocar ninguna excepcién echo 'OK
'; } catch (Exception $e) { echo ‘ERROR ',$e->getCode(),’ ~ ', $e=>getMessage()/"
"; ) tpenenrring comer ptiedabok sph 85143 sae ” www.FreeLibros.me pawzone ENT Training - tears Sobjeto = new unaciase (-1); try { echo ‘Objeto fobjeto->acién(); // va a provocar una excepeién echo ‘OK
1; } catch (Exception Se) { echo ‘ERROR ',Se->getCode(),/ ~ ',Se->getessage(),"
"; } echo ‘ance />" // to mismo con un bloque finally. Sobjeto = new unaClase (1) ; try « echo ‘Objeto 1: Jobjeto->action () echo ‘OKcbr />'; } eaten (Exception $e) { echo ‘ERROR ', $e->getCode(),” ~ ', Se->getilessage(), "
! } finatty ( echo 'FINALLY
"; > Sobjeto = new unaclase (+1) + ty t echo ‘Objeto 2: * fobjeto->action (); // produciré una excepeién echo ‘OK
"; } catch (Exception $e) { echo 'ERROR ', Se~>getCode(),” ~ ', Sen>getilessage(),"
"; } finery ( echo 'FINALLY
"; // no se produciré una excepcién > Resultado objeto 1: OK Objeto 2: ERROR 123 - Accién prohibida objeto 1: ox FINALLY Objeto 2: ERROR 123 - Accién prohibida BINALLY Iipihunwanctraining comet netinadabock epxeR= 5149 sana ‘www.FreeLibros.me 2avaaone indice Ioormaciin Introduccion Informacion genera sobre PAP ‘arable, constanes psy matrices ceruauras de conta Gestion de formudarios tmiaruncereoelecrénico Amira los errores en un eript PHP EN Training - Libro tine mando. S5@ousesk.com Lros gras Breve historia de PHP EI lenguaje PHP (Personal Home Page histbriamente, ofcimente acrinimo recursive de PH: Hypertext Preprocessor fue dsehado en 1996 por Rasmus Lerdor para sus necesidades personales antes ge su lanzamento a prnapios de 1995. En 1995 se publcd una nueva versién completamente reescnta bajo el nombre de PHPYFI version 2. Esta version, capaz de manejr formulanes y de acceder a la base de datos mSQL, permte al lenguaje crecr rapsament En 1997, el desaroto del lenguaje eae en un equipo Iderado por Rasmus Lerdorty conduc al [Snzamento dee versén 2. En 2000, ef analzador PHP se migra al motor de andisis de Zend para propordonar un mejor ‘endimerte yadmtr un mayor admero de extensiones se trata def version 4 de PHP, En 2004 nace la vrs 5. Esta nueva versin, basada en la verskin del mator Zend 2, aporta varias ‘aracarsts nuevas, a mayors de alas relacionadas on el deenroloarientado a objetoe A dia de hoy, os analstas creen que mas del 60% de los sitos Web utitzan PHP en el mundo (en fnimere de dominios) sutir Ipuhuwenitraining comiclient netimadiabook aspx 85112 ‘www.FreeLibros.me x a" 2awanne ENI Train - Ubrocrtine Los espacios de nombres Los espacios de nombres (namespace en inglés) permiten resolver dos problemas frecuentes en el uso de clases 0 de bibliotecas de funciones: + Uso de un mismo nombre (clase, funcién, constante) en dos bibliotecas. + Manipulacién de nombres especialmente largos que hacen que el codigo sea dificil de escribir. Este concepto se afiadié en la versién 5.3. Un espacio de nombres se declara con la palabra dave namespace al principio de un archivo (de lo contrario, se produce un error grave). Elemplo El mismo espacio de nombres se puede definir en varios archivos, lo que permite organizar el cédigo en varios archivos, agrupandolo dentro del mismo espacio de nombres. Es posible definir varios espacios de nombres en un mismo archivo, pero no es una buena practica de codificacién. Un espacio de nombres se puede definir con subniveles, utilizando el separador de la barra invertida (\): MiBiblioteca\Sub\Nivel. De forma predeterminada, si no se define un espacio de nombres, todas las definiciones (clases, funciones, constantes) se colocan en el espacio de nombres global. La constante _NAMESPACE__da el nombre del espacio de nombres actual (cadena vacia en el espacio global). El espacio de nombres se puede utilizar para cualificar un identificador (constante, funcién, clase) con el separador de barra invertida (\) y asi precisar su origen. El nombre cualificado es relative al espacio de nombres actual sino comienza con una barra invertida; de lo contrario, es absoluto. Si el nombre no est cualificado, esta implicitamente resuelto en el espacio de nombres actual (0 en el espacio de nombres global sino se ha definido un espacio de nombres). La palabra clave namespace se puede utilizar para hacer referencia expliitamente a un elemento del tpenenrring coment ptiedabok spat ” www.FreeLibros.me 2awanne ENI Train - Ubrocrtine espacio de nombres actual, o a un subespacio, Suponiendo que el espacio de nombres actual es Mi Proyecto, tenemos las siguientes resoluciones Referencia Se convierte en £0) \MiProyecto\f() (nombre no cualificado espacio de nombres actual) Biblioteca\f () \Miproyecto\Biblioteca\f() (nombre relativo) \MiProyecto\Biblioteca\f() | \miProyecto\Biblioteca\f() (nombre absoluto) namespace\£ () \MiProyecto\£() (utilizacién de la palabra clave namespace) namespace\Biblioteca\ () \MiProyecto\Biblioteca\f () (utilzacién de la palabra clave namespace) Para hacer referencia a un identificador del espacio global, se puede utilizar un nombre absoluto\nombre (por ejemplo, \time () ). Para facilitar el uso de espacios de nombres en el cédigo, es posible importar un espacio de nombres o hacer referencia a un nombre absoluto con un alias. El alias de nombre y la importacién sélo son posibles para las clases y el espacio de nombres, no para las funciones ni para las constantes. Elalias se crea con el operador use. ‘Sintaxis use nombre [as alias] (, nombre Nombre cualificado absoluto del espacio de nombres o de la clase que se debe importar. La barra invertida inicial del nombre absoluto no es necesario. alias Nombre del alias. Igual al nombre "corto" de nombre (sin la ruta) sino se especifica. El nombre importado debe ser absoluto y no se resuelve desde el espacio de nombres actual. Ejemplo: use MiProyecto\Biblioteca as 1ib; // alias de un espacio de nombres Lib\unaFuncion(); // Lama a MiProyecto\Biblioteca\unaFuncién () use MiProyecto\Biblioteca\unaClase as el; // alias de una clase Sobjeto = new el; // instanciacién de un ebjeto de la clase // wieroyecto\Biblioteca\unaClase use MiProyecto\Biblioteca; // equivalente a // use MiProyecto\Biblioteca as Biblioteca Para ilustrar los diferentes conceptos presentados anteriormente, vamos a considerar el uso de la biblioteca biblioteca. inc siguiente: "; } ) // Pefinicién de una funcibn. Function unaFuncién() { echo __FUNCION__,"
?: 9 Esta biblioteca se utiliza en el siguiente script: "; } , // Definicién de una funcién. function unaFuncion() { echo _ FUNCTON_,"
"; ) // Visualizacion del espacio de nombres actual. echo "Espacio de nombres actual =‘, NAMESPACE,"
"; // tanada de unaFuncién(): /1 nombre no cualificads = espacio de nombres actual echo ‘unafuncién() = 17 unaFuncién() // tianada de Biblioteca\unaFuncién() + /1 nombre cualificado relativo ‘echo "Biblicteca\unafuncién() = Biblioteca\unaFuncién() // Visualizacion de \MiProyecto\Biblioteca\UNo: /1 nombre cualificade abseluto echo '\uiroyecto\Biblioteca\uNo = ', \irroyecto\Biblioteca\uNo, foe P'; // Visualizacién de nanespace\UNO: // utilizacion de 1a palabra clave ‘namespace ‘echo ‘namespace\uNo = ', nnanespace\avO, tebe [o's // Detinicion de un alias de clase. use \MiProyecto\siblioteca\unaClase as cli echo "cl::informacién() ="; el: Finformacién() ; // Definicién de un alias de espacio de nombres. use MiProyecto\Biblioteca as 1ib; echo ' 1ib\unaFuneién() = 1; Lib\unaFuncién () "(espacio actual) Ipihunwanctraiing coment netinedabook sepueR= A544 ‘www.FreeLibros.me 2awanns EN Training - Libro ntine Resultado Espacio de nombres actual = MiProyecto unaFuncién() = MiProyecto\unaFuncién Biblioteca\unaFuncién() = MiProyecto\sibiioteca\unaFuncién \wiProyecto\piblioteca\uno = 1 namespace\UNO = uno cl: :informacién() = Biblioteca Lib\unaFuncién () = Miproyecto\Biblioteca\unaFuncién tipenenrring coment rtiedabok spt ” www.FreeLibros.me 2awanne ENI Train - Ubrocrtine Informacién general 1. Rapido recordatorio sobre los formularios El formulario es un instrumento basico necesario para los sitios Web dindmicos, ya que permite al usuario introdu cir informacién y, por lo tanto, interactuar con el sitio. Un formulario HTML se define entre las etiquetas
y
. Sintaxis simplificada dent Los atributos di action method id target Entre las etiquetas ,
Resultado Iipuhunwenctraining comiclient netinedabock epxeR= 5146 ‘www.FreeLibros.me 2awanne ENI Train - Ubrocrtine |Nombre: Contrasefia: Sexo: © Masculino © Feminino No lo sé ‘ Foto: Colores favoritos: | Azul [| Blanco [| Rojo No lo sé Idioma: Francés |~| |Frutas favoritas: ‘Albaricoques \Cerezas Fresas (Melocotones Gong Yona) (aerate) 2. Interaccién entre un formulario y un script PHP PHP puede intervenir en dos lugares con respecto al formulari * Para la construccién del formulario, si éste debe incluir informacion dinamica. + Para el procesamiento del formulario (es decir, los datos introducidos por el usuario en el formulario), Hay tres métodos principales que se pueden utilizar para interactuar con un formulario y un script PHP: + Colocar el formulario en un documento HTML "puro" (.htm 0 .html), el formulario no contiene ningiin elemento dinamico e indicar el nombre del script PHP que debe procesar el formulario en el atributo act ion de la etiqueta
. Colocar el formulario en un script PHP (por ejemplo, para construir una parte del formulario de forma dinémica) y hacer procesar el formulario’ por otro script PHP (mencionado en el atributo act ion de la etiqueta ). + Colocar el formulario en un script PHP (por ejemplo, para construir una parte del formulario de forma dindémica) y hacerlo procesar por el mismo script PHP (mencionado en el atributoaction de la etiqueta o llamado por defecto si este atributo no esta presente) Ademés, también se puede insertar cualquier parte en otra pagina, un enlace (Entrada de datos, por ejemplo) para llamar al formulario de entrada de datos: + Formulario HTM! Entrada de datos tpanenrning comer rtiedabok asp 85146 ” www.FreeLibros.me 2awanne ENI Train - Ubrocrtine + Formulario PHP: Entrada de datos Primer método Documento HTML entrada.htm entrada ‘post"> Nombre: ‘ok" value="OK" /> Script PHP procesamiento.php Resultado + Presentacién inicial del formulario: Nombre: (0K } + Entrada de informacion Nombre: Olivier (ox } + Elresultado al hacer clic en el botén OK es una pagina en blanco, porque por ahora, el script de procesamiento no hace nada Segundo método Rocumento PHP entrada.php Un poco de cédigo PHP (en negrita) se utiliza para generar una parte dinémica del formulario. <php echo TITULO_PAGINA ENTRADA; 2></citle> </head> <body> <form action="procesamiento.php" method="post"> <aiv> Nonbre: <input type="text" name="nombre" value="<?php echo §nombre; 2>" /> <input type="submit” name="ok" value="OK" /> </div> </form> </body> </atml> ‘Script PHP procesamiento.php <?php /* Por hacer = recuperar 1a informacién introducida = realizar e1 procesamiento - mostrar una nueva pagina ” >> Resultado * Presentacién inicial del formulario (se propone un valor inicial dinémico para el érea de entrada): [Nombre: X (ox } * Entrada de informacién: ‘Nombre: Olvier (0K } + Elresultado al hacer clic en el bot6n OK es una pagina en blanco, porque por ahora, el script de procesamiento no hace nada Tercer método Documento PHP entrada.php tpanenrning comer rtiedabok asp 85146 ” www.FreeLibros.me 2awanne ENT Training - Ubrocrine Es el mismo script que el anterior, simplemente cambia el atributo act ion de la etiqueta <form>para indicar que el formulario debe ser procesado por el mismo entrada .php. <?php // Incluir un archivo que contiene definiciones de // constantes, incluido el titulo de pagina (TITULO_PAGINA_ENTRADA) . require (‘constantes. inc!) ; // Inicializacion de una variable que contiene el valor // inicial del campo de entrada de datos (en la practica este // valor proviene sin duda de otro lugar y no esté codificado de forma W) vigida) . Snombre = /x"; // Bn el cédigo HTML siguiente, inclusién de dos pequefias // porciones de cédigo PHP para mostrar respectivamente el titulo // de ia pagina y el valor inicial del campo de entrada de datos <IDOCTYPE html PUBLIC "-//W3C//DPD XHTML 1.0 Strict//EN" “nttp: //www.w3.org/TR/xhtm11/D7D/xhtml1-strict .dta"> chemi wmins="hrtp://uww.w3.0rg/1999/zhemi"> <head> <title><?php echo TITULO_PAGINA ENTRADA; ?> Nombre: ‘entrada.php” method="post"> Resultado + Presentacién inicial del formulario (se propone un valor inicial dindmico para el drea de entrada): entre XT + Entrada de informacién: ‘Nombre: Olivier [ox] * El resultado al hacer clic en el botén OK es la misma pagina mostrada de nuevo, porque por ahora, el script de procesamiento no hace nada mas: jombre:Xsstst*~*«é« KJ ué método ele: La eleccién de un método en particular depende de la complejidad del sitio y de las preferencias de cada uno. hapitanvenciraring cement native stock asp A545 a ‘www.FreeLibros.me 2awanne ENI Train - Ubrocrtine Algunas consideraciones generales: + Separar la pagina HTML (0 el script PHP que genera el formulario) del script PHP tiene una desventaja en términos de mantenimiento: si se realizan cambios en el formulario, hay dos archivos que modificar (con los consiguientes riesgos de error, olvido...). + Por el contrario, si el formulario no tiene ninguna parte dindmica, escribirlo en un archivo HTML separado del script PHP que lo procesa permite separar la interfaz de usuario (Ia capa de “presentacién) del procesamiento. + En la prdctica, para facilitar el mantenimiento, es conveniente definir ciertos valores presentados en varias ocasiones (nombre de la empresa, por ejemplo) en las constantes variables y utilizar estas constantes y variables en las paginas: todas las paginas se vuelven en un poco dindmicas y el tercer método parece ser el mejor. En el resto de este capitulo, vamos a entrar en los detalles del procesamiento de formularios en PHP, utilizando ejemplos construidos sobre el modelo del tercer método.. hipuhunwenitraing comilient netinedabock spueR= 85145 www.FreeLibros.me m 2awanne ENI Train - Ubrocrtine Recuperar los datos introducidos en el formulario 1. Principio A diferencia de los scripts CGI, no hay necesidad de realizar anilisis complejos de cadenas de caracteres ("parser") para recuperar los valores introducidos por el usuario; estos valores se recuperan con facilidad en el script de procesamiento. Por defecto, todos los campos del formulario se almacenan autométicamente en el script PHP que procesa el formulario, en una matriz asociativa $_POST para los formularios POST y $_GET para los formularios GET: la clave de la matriz es igual al nombre del campo en el formulario (atributoname de la etiqueta , Script entrada.php Resultado + Presentacion inicial y entrada de los diferentes valores Iipihunwanctraining comet netinadabock epxeR= 5147 sts ‘www.FreeLibros.me 2awanne EN Training - Libro ntine ‘Nombre: HEURTEL Contrasefia Sexo: ® Masculine © Feminino © No lo sé Foto: C:\Fotoslidentidad jpg : Colores favoritos: W) Azul MBlanco [WiRojo No lo sé Idioma: Francés [+ Frutas favoritas: |No lo sé ‘Comentarios: Consultor en sistemas informaticos “ Coe Y (orm) (enownesa) + Resultado al hacer clic en el botén OK (visualizacién del contenido de $_POST): $_posr: apellido = REURTEL contrasefa = olivier sexo = M foto = identidad.jps colozes = azul rojo idioma = F fruta = ona Ls comentarios = Consultor en sistemas informaticos invisible = 123 enviar = OK Basdndonos en este ejemplo, vamos a ofrecer algunas explicaciones. Campo que contiene texto Para los campos que contienen texto, es decir los campos de tipo text. (apellido)password (contrasefia), file (foto) y hidden (invisible), asi que para el campo