Formación Introducción a PHP5Kinética Mobile Development Kinética Mobile Development Curso de PHP5. Francisco José González Lozano Kinética Mobile Development Página 1 de 164 Kinética Mobile Development Curso de PHP5. Página 2 de 164 .................... 53 Sesión 11...... Primera página dinámica............. Introducción al Lenguaje de Modelado Unificado (UML) I............... Primer contacto con PHP... ................. ........................ 13 Sesión 4...................... 150 Página 3 de 164 ... 83 Sesión 17................. Proyecto Orientado a Objetos com UML y PHP.......... ... Introducción al Lenguaje de Modelado Unificado(UML)(II)..... Arrays (II)... .............................................................................................. ........................ Bases de datos.. ............ Modificando información de base de datos................................. ...... 124 TALLER 1............................. Clases y Objetos.. ......................... Interfaces......... ........................ 130 TALLER 4.................................... Herencia............................................................................................................................................... 134 TALLER 6.................... ............................... 66 Sesión 13.......... ÍNDICE Sesión 1.......................... 10 Sesión 3........................................... 79 Sesión 16..... .............................................. 29 Sesión 6......................................................................... 132 TALLER 5............................................ 104 Sesión 20............. 136 TALLER 7.................................... 70 Sesión 14......... 72 Sesión 15............................. Uso de Arrays...... .. Sitios Web estáticos.........................................Kinética Mobile Development Curso de PHP5........................................................................................... .... .... Orientación a Objetos (II)................................................................... 48 Sesión 10.............................................................................................................................................. 140 TALLER 8........ 56 Sesión 12................... Funciones (II)............................... 41 Sesión 8......................................................... 124 TALLER 2........................................................ . Acceso a base de datos........................................................ 91 Sesión 18................................ Subiendo ficheros.................................. 5 Sesión 2.......... Orientación a Objetos (IV).......................................................... ................... Formularios....................... Orientación a Objetos (III)............ Arrays (I).. 142 Referencias... 127 TALLER 3...... ........ ...... ..................................... 33 Sesión 7........ ... Incluyendo ficheros...................................................................... 116 ANEXO................................ ............. ................ Sesiones......... Primeros pasos.......................... Orientación a Objetos (I)... Introducción............................. Características básicas................................ 24 Sesión 5............... Fecha y Hora.......... 99 Sesión 19..................................................................................................................................................................... ................................ Decisión y repetición............... Funciones (I)......... Uso de funciones........................ ................. Subiendo ficheros......................................................................................... 45 Sesión 9......................... ..................... Kinética Mobile Development Curso de PHP5. Página 4 de 164 . Kinética Mobile Development Curso de PHP5. Sesión 1. Sitios Web estáticos. Objetivo. Trabajar con sitios web estáticos para conocer sus ventajas e inconvenientes. Actividades: o Crear un sitio web en el sistema local. Escribimos una página de bienvenida. ARCHIVO index.html <html> <head> <title>Mis Contactos</title> <meta name=”AUTHOR” content=”PAKO”> </head> <body> <H>Hola</H> <br/> <p> Bienvenido/a a su página de contactos. </p> <p> <a href=”contactos.html”>Entrar</a> </p> </body> </html> Creamos una página índice con 2 nombres de contactos. ARCHIVO contactos.html <html> <head> <title>Mis Contactos</title> <meta name=”AUTHOR” content=”PAKO”> </head> <body> <H> Mis Contactos</H> <br/> <p> <a href=”JAniston.html”>Jennifer Aniston</a> <br/> <a href=”MEsparcia.html”>Manolo Esparcia</a> <br/> <br/> </p> <p> Total: 2 contactos. </p> </body> </html> Y dos páginas con la información de cada contacto. ARCHIVO JAniston.html <html> <head> <title>Mis Contactos</title> <meta name=”AUTHOR” content=”PAKO”> </head> <body> <H> Mis Contactos</H> <br/> <p> Nombre: Jennifer <br/> Apellidos: Aniston <br/> Página 5 de 164 Kinética Mobile Development Teléfono: 924 007 001 <br/> Correo:
[email protected] <br/> Lugar de Trabajo: Secretaría General <br/> Imagen: <br> <img src=”janiston.jpg”> </p> <p> <a href="contactos.html">Volver</a> </p> </body> </html> Curso de PHP5. ARCHIVO MEsparcia.html <html> <head> <title>Mis Contactos</title> <meta name=”AUTHOR” content=”PAKO”> </head> <body> <H> Mis Contactos</H> <br/> <p> Nombre: Manuel <br/> Apellidos: Esparcia Montoya <br/> Teléfono: 924 007 557 <br/> Correo:
[email protected] <br/> Lugar de Trabajo: Secretaría General <br/> Imagen: <br> <img src=”mesparcia.jpg”> </p> <p> <a href="contactos.html">Volver</a> </p> </body> </html> Comprobamos en el navegador. Hacemos doble clic en el fichero index.html o escribimos la ruta en el navegador. Página 6 de 164 Kinética Mobile Development Curso de PHP5. o Preparar el contexto. Concepto de cliente/servidor. Proceso de consulta web, servidor web y navegador cliente. 1. Escribimos http://si_cursophp/index.html en la barra de direcciones de nuestro navegador. 2. Nuestro navegador envía un mensaje via Internet al sistema llamado si_curso.php solicitando la página /index.html. 3. Nuestro servidor Apache, que se está ejecutando en la máquina si_cursophp, obtiene el mensaje y lee el fichero catalogo.html desde el disco duro. 4. Apache envía el contenido del fichero de vuelta a nuestro ordenador a través de internet como respuesta a la solicitud de nuestro navegador. 5. El navegador muestra la página en la pantalla, siguiento las instrucciones de las etiquetas HTML de la página recibida, de forma similar a cuando hicimos doble click en el fichero que hemos creado en nuestro ordenador. Cada vez que escribamos en el navegador http://si_cursophp/index.html, el servidor devolverá el mismo contenido del fichero index.html. La unica forma de que ese contenido cambie es modificándolo en el servidor o sobreescribiendo el fichero con uno modificado. o Creación y Mantenimiento del sitio web. Subimos ficheros a nuestro servidor web. Con una herramienta ftp subimos nuestros ficheros a un servidor web para comprobar cómo se desarrolla el trabajo normal al crear y mantener un sitio web. Nota: en nuestro caso a un servidor conectado a nuestra red local para hacer comprobaciones. También es posible crear un servidor local pero no permite comprender claramente el concepto cliente-servidor. Añadimos dos contactos. ARCHIVO contactos.html <html> <head> <title>Mis Contactos</title> <meta name=”AUTHOR” content=”PAKO”> </head> Página 7 de 164 jpg”> </p> <p> <a href="contactos.html”>Bender Doblador</a> <br/> <a ref=”FSmith.html”>Jennifer Aniston</a> <br/> <a ref=”MEsparcia. ARCHIVO BDoblador.Kinética Mobile Development <body> <H> Mis Contactos</H> <br/> <p> <a ref=”JAniston.html <html> <head> <title>Mis Contactos</title> <meta name=”AUTHOR” content=”PAKO”> </head> <body> <H> Mis Contactos</H> <br/> <p> Nombre: Bender <br/> Apellidos: Doblador <br/> Teléfono: 924 007 002 <br/> Correo:
[email protected] <html> <head> <title>Mis Contactos</title> <meta name=”AUTHOR” content=”PAKO”> </head> <body> <H> Mis Contactos</H> <br/> <p> Nombre: Fry <br/> Apellidos: Smith <br/> Teléfono: 924 007 003 <br/> Correo:
[email protected]”> </p> <p> Página 8 de 164 .html">Volver</a> </p> </body> </html> ARCHIVO FSmith. </p> </body> </html> Curso de PHP5.es <br/> Lugar de Trabajo: Secretaría General <br/> Imagen: <br> <img src=”bdoblador.html”>Manolo Esparcia</a> <br/> <a ref=”BDoblador.html”>Fry Smith</a> <br/> <br/> </p> <p> Total: 4 contactos.juntaex.es <br/> Lugar de Trabajo: Secretaría General <br/> Imagen: <br> <img src=”fsmith. El contenido no cambia. cambiando sus datos y subiéndolo de nuevo al servidor. Debemos no solo eliminar los ficheros que muestren información del contacto sino también modificar el listado de contactos. Hay alternativas como las hojas de estilo en cascada (CSS). eliminando las lineas correspondientes. (como tablas.Evaluación: Contenido html exclusivamente. obtenemos la página del contacto. Modificamos el aspecto del sitio. Para modificar la información de algún contacto. Si queremos hacer algún cambio en el aspecto visual de nuestro sitio web. hay que tener en cuenta que cada cambio tenemos que realizarlo en cada página. Eliminamos un contacto. Para añadir un contacto tenemos que crear una nueva página y subirla al servidor. Tenemos tantas páginas web como contactos más el índice. Modificamos la información de un contacto bajándonos el fichero. Si modificamos el aspecto de la presentación de un contacto. Modificamos un contacto. listas etc. Muchos cambios provocan muchos problemas. Página 9 de 164 . La interacción con el usuario se limita a mostrar las páginas web según se navega por el sitio. ¿Mantenimiento? ¿Trabajo? ¿Posibilidad de errores? ¿Actualización engorrosa?¿Ver contactos por lugar de trabajo?¿Agrupar contactos?¿Hacer búsquedas? ¿Mantenimiento de un aspecto uniforme? ¿Necesidades de acceso? ¿Posibilidades de la web dinámica? .Kinética Mobile Development <a href="contactos. el resto no cambia.html">Volver</a> </p> </body> </html> Curso de PHP5. por lo que podemos encontrarnos muchas presentaciones diferentes. pero hay situaciones en las que la apariencia se refiere a cómo se muestra la información. Para eliminar un contacto debemos acceder al servidor y eliminar el archivo que contiene la información del contacto.) y las CSS no evitan que cada cambio conlleve una gran cantidad de trabajo. la modificamos y la devolvemos al servidor. Muy difícil de mantener y actualizar. o Evaluar ventajas e inconvenientes. posiblemente intercambiando datos con un motor de base de datos como MySQL. 1. 8. PHP lee el archivo index. en el escritorio de nuestro PC. PHP envía el resultado de la ejecución del archivo index. Las instrucciones de un programa escrito en PHP hacen que el intérprete de PHP devuelva una página web. Las instrucciones de un programa en Javascript hacen que el navegador realice acciones tales como la aparición de una ventana nueva o el control de la entrada de usuario en un formulario.php. Escribimos http://si_cursophp/index.Kinética Mobile Development Curso de PHP5. 5. 6. Crear nuestra primera web dinámica. El servidor web (Apache) obtiene el mensaje.com) solicitando la página index. • • • • • • • PHP es un lenguaje de programación.php. Sesión 2. 4.php como respuesta al servidor web. Finalmente. Nuestro navegador envía un mensaje a través de internet a un ordenador llamado si_cursophp (o www.php en la direccion de nuestro navegador. reconoce que solicita un archivo PHP y se lo pasa al intérprete de PHP instalado en nuestro servidor para que obtenga el archivo y lo parsee. otros lenguajes o tecnologías como Javascript o Flash se ejecutan en el lado del cliente. 7. 3. PHP interpreta los comandos contenidos en index. El servidor web (Apache) envía el contenido obtenido de PHP de vuelta a nuestro ordenador a través de internet en respuesta a la solicitud de nuestro navegador.miejemplo. 2. El lenguaje se ejecuta a través de un intérprete de PHP alojado en nuestro servidor. PHP es conocido como un lenguaje del lado del servidor porque se ejecuta en el servidor junto a un servidor web. Objetivo. Después. Página 10 de 164 . Arquitectura cliente/servidor + PHP. El intérprete de PHP sigue las instrucciones incluidas en un archivo PHP. Primer contacto con PHP. Actividades: o Sitios web dinámicos.php del disco duro. Primeros pasos. En cambio. o Descripción PHP. nuestro navegador interpreta el codigo html recibido y lo muestra en pantalla. <FORM NAME=’’ METHOD=’’ ACTION=’POST’> <INPUT NAME=’’ ID=’’ TYPE=’text’/> <INPUT NAME=’’ ID=’’ TYPE=’password’/> <INPUT NAME=’’ ID=’’ TYPE=’checkbox’/> <INPUT NAME=’’ ID=’’ TYPE=’radio’/> <INPUT NAME=’’ ID=’’ TYPE=’hidden’/> <INPUT NAME=’’ ID=’’ TYPE=’file’/> <INPUT NAME=’’ ID=’’ TYPE=’submit’/> <TEXTAREA NAME=’’> </TEXTAREA> <SELECT NAME=’’ ID=’’> <OPTION VALUE=’’>Item</OPTION> … </SELECT> <SELECT NAME=’’ ID=’’ MULTIPLE> <OPTION VALUE=’’>Item</OPTION> … </SELECT> </FORM> Atributo READONLY y DISABLED. Uso con formularios. o Repaso de HTML. PHP ya no interviene. éste se ejecuta en el cliente y está totalmente desconectado del programa PHP que ha generado la página. (Ver anexo) Página 11 de 164 .net/w3c/html401-es/cover. • • Una vez que el servidor web ha enviado de vuelta la página web generada al cliente.01 • http://html. Primer contacto con PHP.ejemplo. Especificación HTML 4. o Taller 1. http://www.Kinética Mobile Development Curso de PHP5.com?variable1=valor1&variable2=valor2 Formularios. <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> <BR/> <P></P> <TABLE> <TR><TD></TD></TR> </TABLE> </BODY> </HTML> URL • • Get Variables en una URL.conclase.html Etiquetas principales. Si la página contiene algo de Javascript. pero no una página html por contacto. - Evaluación. Web dinámicas.Kinética Mobile Development Curso de PHP5. ■ Una página inicial puede mostrar un índice con la lista de todos los contactos ■ ■ ■ ■ (pej. se obtienen los datos del contacto y se muestran. así como el número de páginas. eliminar y modificar la información de la fuente de datos. Las páginas se generan acorde a las instrucciones de esos scripts. Página 12 de 164 . La interacción con el usuario es total. por lo que se reduce enormemente el tamaño de la página. 100 enlaces). de forma automática. sino una en PHP para todos. Una sola página se usa para mostrar cada contacto. Lo que antes tenía en 100 paginas web en html ahora lo tengo en 1. ■ Se mezcla html con lenguajes de programación o scripts de alto nivel como PHP. teniendo actualizada la información en todo momento y evitando modificar a mano el contenido del sitio web. pero mientras en una página estática hay que cambiarlo todo a mano en la dinámica se puede generar a partir de un origen de datos. En este caso. Puedo crear páginas dinámicas con scripts que me permitan crear. ya que el usuario puede enviar información para consultar o manipular los datos de la fuente de informacion. jpg" alt="Yo no he sido"> Algunas aplicaciones en PHP utilizan la etiqueta de inicio en modo abreviado. Por lo general es mas aconsejable utilizar el formato regular de etiqueta “<?php” para garantizar que nuestro código será bien interpretado en cualquier servidor. echo " Mundo!".Kinética Mobile Development Curso de PHP5. Espacios y ‘case sensitive’. Objetivo.ini.”). ?> <p> <img src="humor1. Código fuente: Ejemplo 100. Etiquetas de inicio y fin. Conocer las características básicas de PHP. Características básicas. Actividades: o Características generales. <?php echo "¡Hola". (“. Para activar y desactivar esta opción hay que modificar el fichero de configuración de PHP. ?> <?php Página 13 de 164 . <?php ?> Múltiples etiquetas de inicio y fin. • Múltiples instrucciones por línea. echo " Mundo!". Código fuente: Ejemplo 101. ?> <p> Cuatro más cuatro es: <?php echo 4 + 4.jpg" alt="Yo no he sido"> Resultado: Cinco más cinco es: 10<p> Cuatro mas cuatro son: 8<p> <img src="humor1. Cinco más cinco son: <?php echo 5 + 5. Líneas en blanco entre instrucciones: se ignoran. es decir “<?” en lugar de <?php. ?> <?php echo "¡Hola". php. Sesión 3. 50. echo 'precio €9. // Estas cuatro líneas hacen lo mismo echo number_format(285266237). ?> Las instrucciones del lenguage (como echo) y los nombres de funciones (como number_format) no son case-sensitive.'.Kinética Mobile Development Curso de PHP5. ECHO Number_Format(285266237). Código fuente: Ejemplo 102. echo 'precio €3. eChO NUMBER_FORMAT(285266237). <?php echo "Demasiados espacios " . echo "La cantidad idónea de espacios". Comentarios. o PHP tambien soporta # (Perl).'. echo"Sin espacios". ?> PHP también ignora los espacios en blanco entre los comandos y los parámetros. echo "¡Hola".25. // Podemos poner // o # dentro de las líneas de comentario // Si colocamos un indicador // o # en cualquier parte de una línea también Página 14 de 164 . # Añadimos otro plato al menú echo 'Pato a la naranja '. // Esto es una línea de comentario echo "Puchero de garbanzos". • Por línea: o Comienzan con //. echo " Mundo!". Echo number_format(285266237). echo 'pollo'. */ o Textos.php#cena'. La más fácil es acotándola entre comillas simples: Código fuente: Ejemplo 104.'.99 + 1. echo 'Precio: 0. Página 15 de 164 .Pollo al chilindrón .elpuchero. /* Este es el menú antiguo: Las líneas siguientes están dentro del comentario. echo 'http://www. Patatas con carne. // ¡Qué hambre! echo 'precio €25. números y variables en PHP.50'. no se ejecutan echo 'Hamburguesa. ¿no? Curso de PHP5.25 + 9.Kinética Mobile Development // inicia un comentario echo 'Gazpacho Extremeño'. echo 'Precio: 3.com'.50 + 25.Revuelto de ajetes */ echo ' Pollo al chilindrón. /* Vamos a añadir unas cuantas cosas al menú: . Cadenas de texto. o Todo lo que haya entre /* y comentario. o Comienzan con /* y finalizan */. # Un poco caro.00'. echo 'Yo quiero un tazón de sopa.elpuchero.Patatas con carne . Hay varias maneras de usar cadenas en PHP. */ es tratado como un Código fuente: Ejemplo 103. Patatas Fritas. # Si ponemos // o # dentro de una cadena de texto no inicia un comentario echo 'http://www. Revuelto de ajetes'.25 + 1. • Múltiples líneas o bloques.00!'.com/menu. Refresco'. sin saltos ni retornos." añadió él. Aparece todo en una línea. echo '"Estoy cenando.'.pollo06520"Estoy cenando. Curso de PHP5." añadió él. Las comillas simples no son parte de la cadena. Si queremos incluir una comilla simple en la cadena tenemos que usar el carácter de escape que en php es la barra invertida o backslash (\). Mostrará: Usa \ para escapar una cadena También podemos incluir espacios en blanco y nuevas líneas en las cadenas acotadas: echo '<ul> <li>Filete de ternera</li> <li>Ensalada especial</li> <li>Cocktail de Mariscos</li> </ul>'. Resultado: <ul> <li>Filete de ternera</li> <li>Ensalada especial</li> <li>Cocktail de Mariscos</li> </ul> Página 16 de 164 . El resultado será: Yo quiero un tazón de sopa. solo la delimitan. Resultado: ¿Tienen vino ‘de la casa’? El carácter de escape también puede ser escapado: echo 'Usa \\ para escapar una cadena'.Kinética Mobile Development echo '06520'. echo '¿Tienen vino \‘de la casa\’?'. echo "Hoy es un gran día. echo "El precio es: " .’). pero añaden más caracteres especiales: Caracter \n \r \t \\ \$ \" \0 . 'verás como alguien lo jode. • Validando. ' Zeppo ' . verás como alguien lo jode. echo 'Vota $nombre'. algo que no ocurre con las simples: $nombre='Florencio'. Tambien podemos usar las comillas dobles. echo 'Harpo ' . \xFF Significado Nueva línea (ASCII 10) Retorno de carro (ASCII 13) Tabulación (ASCII 9) \ $ " Número octal (base 8) Número hexadecimal (base 16) La mayor diferencia entre ambos tipos de acotados es que con las comillas dobles podemos incluir en la cadena directamente una variable dibujando su valor.. Página 17 de 164 . que funcionan de forma similar a las simples. echo 'pan' . ' y Groucho'. echo "Vota $nombre". " . 'fruta'. Al validar comprobamos que la entrada obtenida cumple un determinado formato.Kinética Mobile Development Curso de PHP5. '€3. \777 \x0 ..95 Harpo Chico Zeppo y Groucho Manipulando texto.'. Las cadenas resultantes son: panfruta Hoy es un gran día. Resultado: Vota $nombre Vota Florencio Para concatenar cadenas se utiliza el carácter punto (‘. El precio es: €3. ' Chico ' .95'. // $_POST['codigoPostal'] almacena el parametro enviado "codigoPostal" $codigoPostal = trim($_POST['codigoPostal']). mostrará el mensaje aunque pasemos consejera@edu.".ES. La función trim( ) elimina los espacios en blanco al principio y al final de la cadena pasada a la función.". Si combinamos ambas obtenemos la longitud de una cadena ignorando los espacios en blanco al principio y al final de la misma.Kinética Mobile Development Curso de PHP5.ES. } Podemos poner juntas ambas funciones: if ( strlen ( trim( $_POST[ 'codigoPostal' ] ) ) != 5 ) { echo "Por favor introduce un código postal de 5 dígitos. } Para comparar dos cadenas se usa el operador (= =). Para pasar de mayúsculas a minúsculas y viceversa: Página 18 de 164 .es ' ) { echo " ¡Ostia! ¡La jefa! ".es no es igual a consejera@edu. Para comparar cadenas sin prestar atención a mayúsculas o minúsculas se utiliza la función strcasecmp( ).juntaex. } Así. 'consejera@edu. • Formateando. // Ahora $codigoPostal almacena ese valor sin espacios iniciales y finales $codigoPostal_longitud = strlen($codigoPostal).juntaex. // Comprobamos si tiene una longitud de 5 caracteres if ( $codigoPostal_longitud != 5 ) { echo "Por favor introduce un código postal de 5 dígitos.juntaex. La función strlen( ). } Cuando usamos este operador las mayúsculas y minúsculas son importantes ya que consejera@edu. if ( strcasecmp ( $_POST[ 'email' ] .juntaex.es' ) == 0 ) { echo " ¡Ostia! ¡La jefa! ". nos proporciona la longitud de una cadena de texto. if ( $_POST [ 'email' ] == '
[email protected]. // Añadimos unos puntos suspensivos echo '.10)... paTO').. -10. // Añadimos unos puntos suspensivos echo '..$mi_clase. Si la posición es negativa comenzará por la parte final de la cadena. // Muestra los 10 últimos caracteres de $_POST['comentario'] echo substr ( $_POST ['comentario' ] . POLLO. '<span class="{clase}">Cochinillo</span> <span class="{clase}">Bacalao al ajoarriero</span>'). Si omitimos el número de caracteres nos devolverá toda la cadena desde la posición indicada hasta el final. 10). CERDO.'. POLLO. acordarme. es decir. // Añadimos unos puntos suspensivos echo '.. Resultado: Carmele Marchante Con substr( ) podemos extraer parte de una cadena: // Muestra los 30 primeros caracteres de $_POST['comentario'] echo substr ( $_POST ['comentario' ] . POLLO. Cuando se combina con strtolower( ) muestra correctamente los nombres. PATO cerdo. busca una subcadena y la reemplaza por otra. Cerdo. r de La Mancha de cuyo nombre no quiero acordarme... Resultado: ternera. la posición inicial de la subcadena a extraer y el número de caracteres a extraer..'.. paTO')..'..Kinética Mobile Development echo strtolower('Ternera.. echo str_replace('{clase}'. 30 ). por ejemplo: En un lugar de La Mancha de cuyo nombre no quiero acordarme El resultado será: En un lugar de La Mancha de cu. echo ucwords ( strtolower ( 'CARMELE MARCHANTE ' ) ) . La función str_replace( ) nos permite cambiar partes de una cadena. Si $mi_clase es ‘comida’: Página 19 de 164 . echo strtoupper('Ternera. 0 . // Muestra la cadena desde la posición 10 de $_POST['comentario'] echo substr ( $_POST ['comentario' ] . Los argumentos de la función substr( ) son la cadena a cortar. Si el valor de la variable comentario es. Cerdo. pollo. pato La función ucwords( ) pone en mayúsculas la primera letra de cada palabra en una cadena. TERNERA. Curso de PHP5. echo -12. $precioTotal = $precio + $totalImpuestos. echo 10 / 3.30. echo -9912111. se identifican con el símbolo $ seguido del nombre de la variable. Operaciones con Variables. echo 56. echo -213. $precioCena = 8. echo 2 + 2.3333333333333 54 5 Variables.com $bebe!mucho $cena+bebida Los nombres de variable son case-sensitive. echo 0. echo 56. echo 0.08.3.95.52222 0 PHP hace una distinción entre números: o con parte decimal (float) o sin parte decimal (integer). <?php $precio = 3.3 56. Página 20 de 164 . Números. echo 17 . Código fuente: Ejemplo 105. En PHP. El resto puede ser cualquier carácter excepto los que coincidan con algunos usados por PHP. Los nombres de variable tienen que empezar con una letra o un caracter de subrayado.Kinética Mobile Development <span class="comida"> Cochinillo <span> <span class="comida"> Bacalao al ajoarriero </span> Curso de PHP5. $piePagina= “ </body> </html>”. echo 6 * 9.5. echo 16777. Operadores Aritméticos.216 0 -213 1298317 -9912111 -12.5 3. echo 0.774422 16777. echo 56. echo 5 % 6. es decir $cena.52222. echo 1298317. $impuestos = 0. Aceptables $longitud $bebida $miBebida $_bebidas $bebida 4mas2 No aceptables $2maso $numero-bebidas
[email protected] 0.00. $platos = 5.3. $cabeceraPagina = “ <html> <head><title>Menú</title></head> <body bgcolor="#fffed9"> <h1>Cena</h1>”.774422. $totalImpuestos = $precio * $impuestos. $cena = 'Solomillo a la pimienta'. $precioComida = $cost_of_dinner. $Cena y $CENA son variables distintas.216. 4 13. 56 56. // Restamos una a lo que me queda $restoEdad = $restoEdad .com Combinaciones: // Sumando de forma regular $precio = $precio + 3.316 El precio total son juan@cursophp. $usuario= 'juan'.com'.= $dominio.soy Combinando con una página html: $tituloPagina = 'Menú'. // Concatenamos de forma regular $usuario= $usuario .$precioTotal. Insertando variables en cadenas de texto: $email = 'florencio@analista. echo $email. $dominio = '@cursophp. $totalImpuestos.Kinética Mobile Development Curso de PHP5. Resultado: Enviar mensaje a: florencio@analista. /////////////////////////////////////// // Añadimos uno a mi edad $edad = $edad + 1. $vegetal = 'Frijones'. /////////////////////////////////////// $usuario = 'juan'. echo 'De impuestos son ' . ?> El resultado es: De impuestos son 0.soy'. // Restamos otro --$restoEdad. // Añadimos otro combinada ++$edad.com'. $dominio. // Sumando 3 combinando con la asignación $precio += 3. $email = $usuario. $dominio.1. echo "Enviar mensaje a: $email". echo " <html> <head><title>$tituloPagina</title></head> <body> <ul> <li> $carne barbacoa <li> $carne en lonchas <li> $carne brasa con $vegetal </ul> </body> Página 21 de 164 . // Concatenamos de forma combinada $usuario . $dominio = '@cursophp. $carne = 'Cerdo'. echo 'El precio total son ' . ”). $iva = $comida * .5% de IVA.16. 3. echo "2 Hamburguesas a $hamburguesa € cada una: 2 * $hamburguesa €. Hay un espacio entre ? y php. 3. Curso de PHP5. Modifica la solución al ejercicio anterior mostrando una factura con formato.' se debe acotar entre comillas dobles y usar un caracter de escape para los segundos (“Un total de 1’ 45\” .95.Kinética Mobile Development </html>".$descuento). Solución: $nombre = 'Juan'. Escribe un programa en PHP que ponga las variables $nombre y $apellidos con tu valores. Imprime la cantidad a descontar. La etiqueta de cierredebería ser ?>. Página 22 de 164 . $comida = 2 * $hamburguesa + $helado + $refresco. echo " 1 Refresco a $refresco €: $refresco €. echo "Con Descuento. <br/>".'. La etiqueta de apertura debe ser <?php. un helado de chocolate con leche a €1. Muestra también la longitud de la cadena. $total = $comida + $iva . no ??>. 2. echo "El precio total de la comida es $total €". echo "<br/>". la cantidad de IVA y el precio total.$descuento. $refresco = . $apellidos = 'Sanchez Sanchez'.($comida + $iva). $helado = 1. ??> Solución: 1. TOTAL: ". <? php echo '¿Cuánto tardó?'. ". 4. <br/>". Nos muestra: <html> <head><title>Menú</title></head> <body> <ul> <li> Cerdo barbacoa <li> Cerdo en lonchas <li> Cerdo brasa con Frijones </ul> </body> </html> Ejercicios. echo 'Un total de 1' 45” .95.075. 1.85. Muestre una cadena con tu nombre y apellidos separados por un espacio. la cantidad y el total.($comida + $iva . Escribe un programa en PHP que calcule el todal de la siguiente comida: 2 hambuguesas a €4. Para cada elemento de la comida dibuja el precio.<br/>". echo "1 Helado a $helado €: $helado €. Solución: echo "El precio total de la comida es $total €". $nombreYapellidos = "$nombre $apellidos". echo "<br/>". <br/>". echo "Total Comida y Bebida: $comida €. $descuento = $comida * ." €. echo strlen($nombreYapellidos). La cadena 'Un total de 1’ 45” . y un refresco a 85 centimos.95 cada una. Busca los errores. echo $nombreYapellidos." €. echo "Total más iva: ". Se le aplica un 7.95. <br/>". Solución: $hamburguesa = 4. 2. pero antes se le aplica un descuento del 16%. $i++. $j *= 2. $i++. Solución: $i = 1. 5. $i++. Escribe un programa PHP que use el operador de incremento (++) y el de multiplicación combinado (*=) para mostrar los números del 1 al 5 y las potencias de 2 desde 2(2^1) hasta 32 (2^5). echo "$i $j". $j *= 2. $j *= 2. $j = 2.Kinética Mobile Development Curso de PHP5. Página 23 de 164 . echo "$i $j". echo "$i $j". $i++. echo "$i $j". echo "$i $j". $j *= 2. Decisión y repetición.".". Conocer las características de decisión y repetición de PHP. if ($entradaValida) { echo "Bienvenido a Contactos. } NOTA: Cuidado al confundir == con =.Kinética Mobile Development Curso de PHP5. } echo "Esto se muestra siempre. } Usando elseif: if ($entradaValida) { // Esto solo se muestra si $entradaValida es true echo "Bienvenido a bordo. } if ( $cena == 'Escalopines') { echo "¿Ein? ¿otra vez?". Objetivo. Hay nuevos mensajes. } else { echo "Lo siento.". intruso.". echo “Esto solo se muestra si $entradaValida es true”. if ( $mensajesNuevos == 10 ) { echo "Tienes 10 mensajes nuevos.". mari … nero". if ($entradaValida) { echo "Bienvenido a bordo.". Actividades: o Decisiones en PHP. } Múltiples instrucciones en un if: echo "Esto se muestra siempre.". Desigualdad. } if ( $mensajesNuevos == $maxMensajes) { echo "Tienes el buzon lleno… cafre!". Código fuente: Ejemplo 107.". mari … nero". Código fuente: Ejemplo 108. Sesión 4. if ( $mensajesNuevos != 10 ) { echo "No tiene 10 nuevos mensajes. $nuevosmensajes y $emergencia son false echo "No te conozco. } else { // Esto se ejecuta si $entradaValida. pues no da error y se evalue a true.". Igualdad. mari … nero". } elseif ($nuevosMensajes) { // Este se ejecuta si $entradaValida es false pero $nuevosMensajes es true echo "Intruso. } o Decisiones complicadas. If else: if ($entradaValida) { echo "Bienvenido a bordo. no tiene mensajes y y no hay ninguna emergencia. } if ( $cena != 'Escalopines') { Página 24 de 164 . } elseif ($emergencia) { // Esto se ejecuta si $entradaValida y $nuevosMensajes son false // y si $emergencia es true echo "No tiene nuevos mensajes pero hay una emergencia. } Comparando números y cadenas.'.".'.'."."x5678").'. La cadena "6 paquetes" no es menor que la cadena "55 tarjetas". } if ( $edad >= 65 ) { edad "ATENCIÓN: Más de 3 viagras pueden provocar la ira.'.'. } if ( $temperatura <= 0 ) { echo "Cuando el grajo vuela bajo hace un frío del carajo. comemos caliente!".'. } // Aquí se usa orden numérico if ( '6 paquetes' < 55) { echo 'La cadena "6 paquetes" es menor que el número 55. } Resultado: La cadena "x54321" no es mayor que la cadena "x5678". Menor y mayor. if ( $x > 0 ) { echo 'La cadena "x54321" es mayor que la cadena "x5678". } else { echo 'La cadena "54321" no es mayor que la cadena "5678". if ( $edad > 17 ) { echo "Demasiado jóven para ver a Nacho Vidal en acción.'. } else { echo 'La cadena "6 paquetes" no es menor que la cadena "55 tarjetas". La cadena "54321" es mayor que la cadena "5678". Página 25 de 164 . Usando strcmp() Con strcmp() nos aseguramos que la comparación sea por órden alfabético.'. // Se comparan según orden alfabético if ( "x54321" > "x5678" ) { echo 'La cadena “x54321" es mayor que la cadena "x5678". $cadena2) Esta función devuelve: Si $cadena1 > $cadena2 -> un número positivo (>0) Si $cadena1 < $cadena2 -> un número negativo (<0) Si $cadena1 == $cadena2 -> 0 $x = strcmp("x54321". strcmp($cadena1.".3 ) { echo "¡Bienvenidos a la Antártida!". } // Estas cadenas se comparan usando órden numérico if ( "54321" > "5678" ) { echo 'La cadena "54321" es mayor que la cadena "5678". } Curso de PHP5.Kinética Mobile Development echo "¡Al fin. } else { echo 'La cadena "x54321" no es mayor que la cadena "x5678". } // Aquí usa orden alfabético if ( '6 paquetes' < '55 tarjetas' ) { echo 'La cadena "6 paquetes" es menor que la cadena "55 tarjetas". La cadena "6 paquetes" es menor que el número 55. } if ( $temperatura < 20. } else { echo 'La cadena "6 paquetes" no es menor que el número 55. Por tanto estamos negando el valor false. Código fuente: Ejemplo 109. Crear una página de recepción en php que muestre solo un mensaje general. } if (($comida == 'desayuno') || ($postre == '')) { echo "A comer tostadas. Asignar un número a cada contacto.'. if ( $x > 0 ) { echo 'La cadena "6 paquetes" es mayor que la cadena "55 tarjetas". if (($edad >= 13) && ($edad < 65)) { echo "Eres demasiado viejo para descuento de niños y demasiado joven para descuento por jubilado. Curso de PHP5. Cuando las dos cadenas sean iguales.'. (Ver anexo) o Crear un formulario de entrada. } Taller 2. } elseif ( $x < 0 ) { echo 'La cadena "6 paquetes" es menor que la cadena "55 tarjetas".$apellido)) { echo '$nombre y $apellido son iguales. } Negación. } $x = strcmp("54321". es decir."5678"). } $x = strcmp('6 paquetes'. y por tanto. Crear una página de recepción en php que muestre un mensaje personalizado. es true. if ( $x > 0 ) { echo 'La cadena "54321" es mayor que la cadena "5678". Operadores lógicos.'. Fusionar todas las páginas de contactos en una dinámica.'. } // La expresión enter (! $terminado) // es true si $terminado es false if (! $terminado) { echo 'Aun no terminado. ".'. } elseif ( $x < 0 ) { echo 'La cadena "54321" es menor que la cadena "5678". } if (! strcasecmp($nombre. echo “<select name=’personas’>”.'. la funcion strcasecmp( ) devuelve 0. Página 26 de 164 .Kinética Mobile Development } elseif ( $x < 0 ) { echo 'La cadena "x54321" es menor que "x5678". While. // La expresión entera ($terminado == false) // es true si $terminado es false if ($finished == false) { echo 'Aun no terminado.".'. $i = 1. Repeticiones en PHP. Aplicar decisiones a la agenda usando una variable con el número. } En este caso el echo se imprime si la condición es true.'.'55 tarjetas'). false. f. $pie = 13. for ( $i = 1. $max = 10. $i <= 10. false b. 1. $max += 10) { echo "<option>$min . determinar si estas expresiones son true or false: a. b. $min += 10. Solución: Página 27 de 164 .40</option> <option>41 .10</option> <option>11 . $min < 50.Kinética Mobile Development while ( $i <= 10) { echo "<option>$i</option>\n". Curso de PHP5. Resultado: <select name="donuts"> <option> 1 . Mostrar que dibujaría este programa en PHP: $edad = 12. $i++. c. if ($edad > $pie) { echo "Mensaje 1. true 2. true d. 100.0" strcmp("false". false e. $i++ ) { echo "<option>$i</option>".30</option> <option>31 .".". true g. } echo "Edad: $edad. g.000 "0. true c.50</option> </select> Ejercicios. For con múltiples expresiones: echo “<select name=’donuts’>”.". false f. e.$max</option>\n". } echo “</select>”. } elseif (($pie++) && ($edad > 20)) { echo "Mensaje 2. Pie: $pie"."False") Solución: a. for ($min = 1. Sin usar PHP para comprobarlo.20</option> <option>21 . d. } echo “</select>”. Resultado: <select name="personas"> <option>1</option> <option>2</option> <option>3</option> <option>4</option> <option>5</option> <option>6</option> <option>7</option> <option>8</option> <option>9</option> <option>10</option> </select> For: echo “<select name=’personas’>”. } else { echo "Mensaje 3.00 .100 "cero" "false" 0 + "true" 0. } echo '</select>'. $fahr += 5. echo “<tr><th>Fahrenheit</th><th>Celsius</th></tr>”. En la Celsius.32) * 5 / 9. En la escala Fahrenheit el agua se congela a grados y hierve a 212 grados.Kinética Mobile Development Mensaje 3. 3. desde –50 grados F hasta 50 grados F incrementos de 5 grados. } echo '</table>'. while ($ini_fahr <= $fin_fahr) { $celsius = ($fahr . echo "<tr><td>$fahr</td><td>$celsius</td></tr>". echo “<table>”. Página 28 de 164 . se multiplica por 5 y se divide entre 9. de en 32 de 4. Solución: echo “<table>”. } echo '</table>'. Solución: $ini_fahr = -50. $fahr <= 50. son 0 y 100. Modifica el ejercicio anterior usando for() en lugar de while(). Para convertir Fahrenheit a Celsius. Utilizando while() muestra una tabla de equivalencias entre las escalas temperatura Fahrenheit y Celsius.Edad: 12. echo "<tr><td>$fahr</td><td>$celsius</td></tr>".32) * 5 / 9. echo “<tr><th>Fahrenheit</th><th>Celsius</th></tr>”. se restan 32. $fahr += 5) { $celsius = ($fahr . $fin_fahr = 50. for ($fahr = -50. Pie: 14 Curso de PHP5. un número. // Array $vegetales con cadenas como índices $vegetales['manzana'] = 'verde'. Crear arrays numéricos con array( ) $cena = array(' Ensalada de Manzana '. 2 => ' Callos en salsa'). $cena = array( 0 => ' Ensalada de Manzana '. $cena [1] = 'Pollo al Limón'. Un índice de array sólo puede ser un numero o cadena. $maquina[2600] = 'Atari'. Para crear un array de forma simple solo hay que asignar un valor a un índice del array. true. Indice manzana limon patata berenjena Valor verde amarillo marron negro De esta forma cualquier valor es accesible de forma directa usando su índice Un array solo puede contener un elemento por clave. $equipos = array( 'trs-80' => ' Equipo de Radio '. // Array $cena con índices numéricos $cena [0] = 'Ensalada de Manzana'. Un valor de un array puede ser una cadena. es decir. la clave no se puede repetir. $vegetales['limon'] = 'amarillo'. $vegetales['patata'] = 'marron'. Crear arrays. Conocer la definición y uso de arrays en PHP (I). Objetivo. false e incluso otro array. Código fuente: Ejemplo 110. $maquina['Targon'] = 'Vaya tela'. 'patata' => 'marron').". Sesión 5. Crear arrays con array( ) $vegetales = array( 'manzana' => 'verde'. 1 => ' Pollo al Limón '. // Array $maquina con índices numéricos y alfanuméricos $maquina['trs-80'] = 'Equipo de Radio'. 'Targon' =>'Vaya tela'). 'limon' => 'amarillo'. 2600 => 'Atari'. Los arrays se utilizan para almacenar datos. $cena [2] = 'Callos en salsa'. ' Pollo al Limón '. Actividades: o Arrays en PHP. en la forma indice -> valor. Arrays (I). Página 29 de 164 . ' Callos en salsa ').Kinética Mobile Development Curso de PHP5. echo "Yo quiero $cena[0] y $cena[1]. echo "<table>\n". ' Pollo al Limón '. Resultado: <table> <tr><td>desayuno</td><td>Catalana</td></tr> <tr><td>almuerzo</td><td> Cocido de Garbanzos </td></tr> <tr><td>aperitivo</td><td>Patatas Fritas</td></tr> <tr><td>cena</td><td> Ensalada Mixta </td></tr> </table> Modificando un array con foreach( ) $dietas = array( 'Catalana' => 1.50). o Manipulando arrays. ' Callos en salsa '). Página 30 de 164 . // Crea $cena con tres elementos $cena = array(' Ensalada de Manzana '. ' Pollo al Limón '. Resultado: Yo quiero Ensalada de Manzana y Pollo al Limón. 'cena' => 'Ensalada Mixta'). El nuevo precio de Cocido de Garbanzos es 9. } // Recorremos de nuevo el array y mostramos los valores que han cambiado foreach ($dietas as $plato => $precio) { echo "El nuevo precio de $plato es $precio €". } echo '</table>'. echo "Hay $tantos platos para cenar. 'Patatas fritas' => 3.00 €. 'almuerzo' => 'Cocido de Garbanzos'. foreach ($dieta as $indice => $valor) { echo "<tr><td>$indice</td><td>$valor</td></tr>\n". 'Cocido de Garbanzos' => 4. $tantos = count($cena). } Resultado: El nuevo precio de Catalana es 2. 'aperitivo' => 'Patatas Fritas'. // Esto crea $comida[1] $comida[] = 'Albondigas en salsa'. Obteniendo el tamaño de un array $cena = array(' Ensalada de Manzana '. Recorriendo un array con foreach( ) $dieta = array( 'desayuno' => 'Catalana'. foreach ($dietas as $plato => $precio) { // $precio = $precio * 2 no funciona $dietas[$plato] = $dietas[$plato] * 2. ' Callos en salsa ').". Añadiendo elementos con [ ] // Crear array $comida con dos elementos // Esto crea $comida[0] $comida[] = 'Patatas con carne'.Kinética Mobile Development Curso de PHP5. 'Ensalada mixta' => 6.90 €.95.00. // Añade un elemento al final de cena // Esto crea $cena[3] $cena [] = 'Ternera al Curry'. Resultado: Hay 3 platos para cenar. ' Callos en salsa' => 3. que devuelve true si existe en el array un elemento con ese índice. foreach ($cena as $plato) { echo "Puede comer: $plato".$menu)) { echo "Tenemos Pepitos de Ternera". } // Esto es true if (array_key_exists(1. 'Gambas al ajillo' => 0). 'Chipirones a la plancha' => 6. $num_platos = count($cena). $cena = array(' Ensalada de Manzana '.$menu)) { echo "Si.". $cena = array(' Ensalada de Manzana '. tenemos Gambas al Ajillo ".00 €. Curso de PHP5. Página 31 de 164 .00. ' Pollo al Limón '. // ¡Estas son gratis! $libros = array(“La guía de los buenos restaurantes”. ' Pollo al Limón' => 4. } Resultado: Puede comer: Ensalada de Manzana Puede comer: Pollo al Limón Puede comer: Callos en salsa Recorriendo un array numérico con for().95. for ($i = 0. $menu = array( ' Ensalada de Manzana ' => 1. ' Callos en salsa '). Se usa la función in_array( ).00. Si estamos buscando un elemento específico en un array no es necesario recorrer el array entero para encontrarlo. $libros)) { echo "El elemento 1 es Cocina tradicional extremeña. // Esto es true if (array_key_exists(' Gambas al ajillo '. Ventaja: más fácil de usar y recordar.Kinética Mobile Development El nuevo precio de Patatas fritas es 6. $menu = array( ' Ensalada de Manzana ' => 1.50. } Resultado: Plato número 0 es Ensalada de Manzana Plato número 1 es Pollo al Limón Plato número 2 es Callos en salsa Comprobando que existe un elemento concreto por índice. “Cocina tradicional extremeña”). ' Callos en salsa '). “Cocina tradicional extremeña”). 'Chipirones a la plancha' => 6. ' Callos en salsa' => 3.95. } Comprobando si existe un elemento con un valor concreto. } // Esto es false if (array_key_exists('Pepito de Ternera'.50. Usando foreach( ) con índices numéricos. ' Pollo al Limón '. El nuevo precio de Ensalada mixta es 13. $i < $num_platos. Para ello se usa la función use array_key_exists( ).00 €. ' Pollo al Limón' => 4. 'Gambas al ajillo' => 0). $i++) { echo "Plato número $i is $cena[$i]". // ¡Estas son gratis! $libros = array(“La Guía de los Buenos Restaurantes”. 'Chipirones a la plancha' => 6. ' Pollo al Limón' => 4.50. $menu)) { echo 'Hay un elemento de 3€. $libros)) { echo "Tenemos el libro Cocina tradicional extremeña ". if ($plato) { echo "$plato cuesta 6. La función array_search( ) es parecida a in_array( ). 'Gambas al ajillo' => 0).50€ Página 32 de 164 . $menu). pero si encuentra un elemento devuelve su índice. pero es case-sesitive en la comparación de cadenas.Kinética Mobile Development // Esto es true: el índice Callos en salsa vale 3. $plato = array_search(6.'. $menu = array( ' Ensalada de Manzana ' => 1. } Resultado: Chipirones a la plancha cuesta 6. } Curso de PHP5. ' Callos en salsa' => 3.50.50€".00€ if (in_array(3. $libros)) { echo "Tenemos el libro La Guía de los Buenos Restaurantes. } // Esto es false: in_array( ) es case-sensitive if (in_array("la guía de los buenos restaurantes ".95.". } // Esto es true if (in_array('Cocina tradicional extremeña'. Encontrar elemento por valor con array_search() La función in_array( ) devuelve true si encuentra el elemento con el valor pasado.00. echo "me gustaría $dieta[almuerzo]. echo $menu. $platos[' Pollo al Limón '] . 1).". $menu = implode('. Los elementos de un array se usan igual que cualquier otra variable. Crear una cadena desde un array con implode( ) Esta función combina todos los elementos de un array en una cadena separados por un carácter delimitador. echo "Para desayunar. no apareciendo al recorrerlo o al contarlo. if ($platos['total']> 15) { echo “Comes demasiado: ". echo "$cantidades [1] para almorzar. me gustaría Tostada Media Manchega y para almorzar. Sesión 6. Resultado: Para desayunar. $platos['total'] = $platos[' Pollo al Limón '] + $platos[' Pato a la Naranja '].Kinética Mobile Development Curso de PHP5. Quiero 2 para desayunar y 1 para almorzar. Quiero $cantidades[0] para desayunar y ". sino que se elimina realmente el indice y el valor. $platos= array('Bonito en Salsa'.'. me gustaría Guiso de Lentejas. $platos).'Tiramisú'). ". Arrays (II). $platos[' Pollo al Limón '] = 12. $dieta['almuerzo'] = 'Guiso de Lentejas'. $cantidades= array(2. Actividades: o Modificar Arrays Código fuente: Ejemplo 111. ' platos de Pollo al Limón. Incluyendo elementos de arrays en cadenas de texto Podemos incluirlos pero si el índice es texto no usamos las comillas para identificarlo. $platos['Pato a la Naranja'] = 3. Filete de Ternera. $dieta['desayuno'] = 'Tostada Media Manchega'. Conocer la definición y uso de arrays en PHP (II). Tiramisú Si no usamos carácter de separación concatenamos todas las cadenas del array. Esto no es lo mismo que poner el valor del elemento a 0 o a vacío. Resultado: Comes demasiado: Has comido 13 platos de Pollo al Limón. Página 33 de 164 . Resultado: Bonito en Salsa. Objetivo. me gustaría $dieta[desayuno] y para almorzar. } echo 'Has comido ' . '.'Filete de Ternera'. $platos[' Pollo al Limón ']++. Eliminar un elemento de un array unset($platos['Pato a la Naranja']). $platos) .'Berenjena'. 'aperitivo' => array('Cacahuetes'. 'picante-salado' => 'pizza picante')). Resultado: El segundo pescado es Carpa o Arrays Multidimensionales Creando arrays multidimensional con array( ) $dietas = array('desayuno' => array('Donuts'. $platos = array('Bonito en Salsa'. echo “</table>”. echo "El segundo pescado es $pescadoLista [1]".'B'.'D').95. implode('</td><td>'.'Arroz'). Página 34 de 164 . echo “<table>”. Resultado: <table> <tr><td> Bonito en Salsa </td><td> Filete de Ternera </td><td> Tiramisu</td></tr> </table> Creando un array desde una cadena con explode( ) Es la función inversa a implode( ).'Pisto')). Carpa.$letras). $dietas['aperitivo'][0]. Resultado: ABCD implode( ) puede ser útil para crear filas en una tabla HTMl. array('Berenjena'. 'almuerzo' => array('Solomillo a la Pimienta'.'Cafe'). $comidas = array( array('Pollo'. $sabores['Mejicano']['salado'] $sabores['Italiano']['caliente'].'Tiramisu'). '</td></tr>'.Kinética Mobile Development Curso de PHP5. // Macedonia // Cacahuetes // Pollo // Pisto // fajita de pollo // lasaña Manejando arrays multidimensionales $precios['cena']['Setas a la Plancha'] = 12.95. $comidas[2][1]. $especiales[0][0] = 'Tarta de Queso'. $pescado). echo '<tr><td>' . Divide una cadena en partes que componen un array $pescado = 'Besugo. Trucha. $especiales[0][1] = 'Bizcocho de Nueces'. $letras = array('A'. 'Macedonia'). array('Terneta'.50. '. Accediendo a elementos de un array multidimensional echo echo echo echo echo echo $dietas['almuerzo'][1].'Fideos'). $precios['cena']['total'] = $precios['cena'][' Setas a la Plancha '] + $precios['cena']['Ensalada Mixta']. 'Italiano' => array('caliente' => 'lasaña'. echo implode(''. $precios ['almuerzo']['Revuelto de Esparragos y Sopa de Fideos'] = 4. $precios ['cena']['Ensalada Mixta'] = 8. $comidas[0][0].'Mostaza'.'C'. 'salado' => 'fajita de pollo'). $sabores = array('Mejicano' => array('caliente' => 'ensalada de jalapeños'. Dorada'.'Filete de Ternera'.'Aceitunas')). $pescadoLista = explode('. Se debe usar sólo en arrays con índices numéricos porque reinicia los índices cuando ordena. ‘Ensalada con Avellanas’)). $especiales[$i][$m] . $m < $num_sub. Un sabor salado Japonés es salsa de soja.'Bizcocho de Almendras'). // Si no indicamos el índice lo añade al final del array // Esto crea $especiales[1][2] $especiales[1][] = 'Banderillas'. Un sabor picante-salado Chino es curry. // $numEspeciales es 2: el numero de elementos en la primera dimension // de $especiales for ($i = 0. $i++) { // $numSub is 3: el numero de elementos en cada sub-array for ($m = 0. $numEspeciales = count($especiales). array('Ensalada con Almendras'. $sabores = array( 'Japones' => array( 'caliente' => 'wasabi'. 'picante-salado' => 'curry')). "<br/>". $especiales[1][0] = 'Almendras saladas'. Curso de PHP5. $especiales[1][1] = 'Ensalada con Nueces'. Página 35 de 164 . $i < $numEspeciales. $num_sub = count($specials[$i]). $m++) { echo "Elemento [$i][$m] es " . } } Resultado: Elemento [0][0] es Tarta de Queso Elemento [0][1] es Bizcocho de Nueces Elemento [0][2] es Bizcocho de Almendras Elemento [1][0] es Ensalada con Almendras Elemento [1][1] es Ensalada con Nueces Elemento [1][2] es Ensalada con Avellanas o Ordenando Arrays La función sort( ) ordena un array por el valor de sus elementos.Kinética Mobile Development $especiales[0][2] = 'Bizcocho de Almendras'. echo “<br/>”.". Con for( ) $especiales = array( array('Tarta de Queso'. Un sabor caliente Chino es mostaza. // $cultura es el índice y $saboresCultura es el valor (un array) foreach ($sabores as $cultura => $saboresCultura) { // $sabor es el índice y $ejemplo es el valor foreach ($saboresCultura as $sabor => $ejemplo) { echo "Un sabor $sabor $cultura es $ejemplo.'Bizcocho de Nueces'. Recorriendo un array multidimensional con foreach( ) Necesitamos sentencias for() o foreach() anidadas. 'salado' => 'salsa soja'). } } Resultado: Un sabor caliente Japonés es wasabi. 'Chino' => array( 'caliente' => 'mostaza'.'Ensalada con Nueces'. } Resultado: Antes de ordenar: $cena: 0 Ensalada de Manzana $cena: 1 Pollo al Limón $cena: 2 Callos en salsa $dieta: desayuno Donuts $dieta: almuerzo Solomillo a la Pimienta y Macedonia $dieta: aperitivo Cacahuetes $dieta: cena Ensalada Mixta Después de ordenar: $cena: 0 Callos en salsa $cena: 1 Ensalada de Manzana $cena: 2 Pollo al Limón $dieta: 0 Cacahuetes $dieta: 1 Donuts $dieta: 2 Ensalada Mixta $dieta: 3 Solomillo a la Pimienta y Macedonia Ordenando con asort( ) Se utiliza para ordenar un array asociativo por el valor de sus elementos. } sort($cena). $dieta = array( 'desayuno' 'almuerzo' 'aperitivo' 'cena' => 'Donuts'. foreach ($cena as $indice => $valor) { echo " \$cena: $indice $valor <br/>". Página 36 de 164 . sort($dieta). $dieta = array( 'desayuno' 'almuerzo' 'aperitivo' 'cena' echo "Antes de ordenar: <br/>". => 'Cacahuetes'. => 'Solomillo a la Pimienta y Macedonia'.Kinética Mobile Development $cena = array( 'Ensalada de Manzana '. => 'Donuts'. ‘Callos en salsa '). => 'Solomillo a la Pimienta y Macedonia'. Mantiene los índices con sus valores. } foreach ($dieta as $indice => $valor) { echo " \$dieta: $indice $valor <br/>". => ‘Ensalada Mixta’). } foreach ($dieta as $indice => $valor) { echo " \$dieta: $indice $valor <br/>". Curso de PHP5. foreach ($dieta as $indice => $valor) { echo " \$dieta: $indice $valor <br/>". echo "Antes de ordenar: <br/>". => 'Cacahuetes'. foreach ($cena as $indice => $valor) { echo " \$cena: $indice $valor <br/>". 'Pollo al Limón '. echo “Después de ordenar: <br/>”. => ‘Ensalada Mixta’). Málaga: 560. => 1605602. 5. 12. Córdoba: 322. 2. => 805304.304. 1.431. foreach ($dieta as $indice => $valor) { echo " \$dieta: $indice $valor <br/>".048. Sevilla: 704. => 704414.414. Página 37 de 164 .996. => 649181.600.602.605. 9. Dibuja una tabla con la información de ciudades y su población. Bilbao: 354. las ciudades más pobladas de España en el 2006 son: 1. 8. 6. Murcia: 416. Resultado: Antes de ordenar: $dieta: desayuno Donuts $dieta: almuerzo Solomillo a la Pimienta y Macedonia $dieta: aperitivo Cacahuetes $dieta: cena Ensalada Mixta Después de ordenar: $dieta: aperitivo Cacahuetes $dieta: desayuno Donuts $dieta: cena Ensalada Mixta $dieta: almuerzo Solomillo a la Pimienta y Macedonia Ejercicios. Madrid: 3. 11. Según el Instituto Nacional de Estadística. Alicante: 322. Define un array (o arrays) que almacene esta información sobre ciudades y habitantes. Las Palmas: 377. Valencia: 805. 10. 4.145. $poblacion = array( 'Madrid’ 'Barcelona’ 'Valencia’ 'Sevilla’ 'Zaragoza’ => 3128600. Palma de Mallorca: 375. echo “Después de ordenar: <br/>”.631. 3. 7.181.Kinética Mobile Development } asort($dieta). así como el total de habitantes de las 12 ciudades.867. Barcelona: 1. Zaragoza: 649.056.128. } Curso de PHP5. echo "<tr><td>$ciudad</td><td>$personas</td></tr>\n". 'Málaga’ => 560631. echo "<table><tr><th>Ciudad</th><th>Poblacion</th></tr>\n".Kinética Mobile Development 'Málaga’ => 'Murcia’ => 'Las Palmas’ => 'Palma de Mallorca’ => 'Bilbao’ => 'Córdoba’ => 'Alicante’ => 560631. => array ( 'Barcelona' => 1605602). 'Córdoba’ => 322867). echo "<tr><td>$ciudad</td><td>$personas</td></tr>\n". // Usa el array $comunidadTotal para almacenar los totales por comunidad $comunidadTotal = array( ). } echo "<tr><td>Total</td><td>$totalPoblacion</td></tr>\n". ksort($poblacion). 'Alicante’ => 322431). echo "</table>\n". Curso de PHP5. => array ( 'Zaragoza’ => 649181). => array ('Bilbao’ => 354145)). a) Modifica la solución al ejercicio anterior para que las filas en la tabla estén ordenadas por población. } echo "<tr><td>Total</td><td>$totalPoblacion</td></tr>\n". => array ( 'Sevilla' => 704414. => array ( 'Palma de Mallorca’ => 375048). => array ( 'Murcia’ => 416996). 3. // Agrupamos las ciudades por comunidad autónoma $comunidad = array( 'Madrid' 'Cataluña' 'Valencia' 'Andalucia' 'Aragon' 'Murcia' 'Canarias' 'Baleares' 'Euskadi' => array ( 'Madrid’ => 3128600). echo "<table><tr><th>Ciudad</th><th>Poblacion</th></tr>\n". 377056. 416996. b) $totalPoblacion = 0. Modifica la solución al primer ejercicio para que la tabla también contenga filas que almacenen el total de habitantes por comunidad autónoma para cada comunidad representada en la lista de ciudades. 322431). echo "<table><tr><th>Comunidad</th></tr>\n". echo "</table>\n". foreach ($poblacion as $ciudad => $personas) { $totalPoblacion += $personas. 375048. echo "<table><tr><th>Ciudad</th><th>Poblacion</th></tr>\n". 354145. foreach ($poblacion as $ciudad => $personas) { $totalPoblacion += $personas. b) Despúes modifica la solución para ordenar por el nombre de la ciudad. 322867. => array ( 'Las Palmas' => 377056). $totalPoblacion = 0. asort($poblacion). Página 38 de 164 . } echo "<tr><td>Total</td><td>$totalPoblacion</td></tr>\n". echo "<tr><td>$ciudad</td><td>$personas</td></tr>\n". foreach ($poblacion as $ciudad => $personas) { $totalPoblacion += $personas. => array ( 'Valencia' => 805304. $totalPoblacion = 0. a) Usa asort( ) para ordenar por poblacion. echo "</table>\n". $totalPoblacion = 0. 2. echo "<tr><td>$ciudad</td><td>$poblacion</td></tr>\n". muestra cómo almacenarlos en un array y un ejemplo explicativo con varios elementos. echo "</table>\n". $stock = array('Cascos' => 5.'id' => 271231). // $info es un array con las ciudades de cada comunidad y su poblacion foreach($info as $ciudad => $poblacion){ $totalPoblacion += $poblacion. c) Comidas escolares de una semana (cada comida se compone de primero. para el primer caso. Por ejemplo. Página 39 de 164 . Este último array tiene un par índice/valor para el precio y un par índice/valor para cada parte de la comida (primero. 'id' => 818211)). } echo "<tr><td>$comunidadTotal[$com]</td></tr>\n".00. 'Martillos' => 2. 'Guantes' => 3. 'Florencio Martinez' => array('curso' => '5'. Un array asociativo cuyo índice es el día y cuyo valor es otro array asociativo describiendo la comida. podemos decir “Un array asociativo cuyo índice es el nombre del estudiante y cuyo valor es otro array asociativo con el curso y un número identificativo”. Ejemplo: a) El curso y el número identificativo de los estudiantes de una clase. 'Miercoles' => array( 'precio' => 2. $comidas = array( 'Lunes' => array( 'precio' => 1. 4. } echo "<tr><td>Total</td><td>$totalPoblacion</td></tr>\n".50. Para cada uno de los siguientes tipos de información. // incrementamosel total por comunidad $comunidadTotal [$com] += $poblacion. 'primero' => 'Ensalada Mixta'. 'primero' => 'Macarrones con Tomate'. Curso de PHP5. segundo y bebida). 'Linternas' => 6). echo "<tr><th>Ciudad</th><th>Poblacion</th></tr>\n".50. 'segundo' => 'Merluza a la Plancha'. 'Martes' => array( 'precio' => 1.Kinética Mobile Development foreach ($comunidad as $com => $info) { echo "<tr><td>$com</td></tr>\n". $estudiantes = array( 'Juan Sánchez Díaz' => array('curso' => '2'. segundo y bebida) y el coste por dia. 'bebida' => 'Agua'). Un array asociativo cuyo índice es el nombre del elemento y cuyo valor es el número de elementos en stock. b) Cuantos de los elementos almacenados en un inventario está disponible en el almacén. 'bebida' => 'Zumo de Naranja'). 'segundo' => 'Pechuga de Pollo Empanada'. Añadir los contactos de Blender y Fry. 'primero' => 'Ensalada de Tomate'. d) Los nombres de los componentes de tu familia. e) Los nombres. 'edad' => 34). $familia = array( 'Bart' => array('relacion' => 'hermano'. 'segundo' => 'Pez Espada'. 'primero' => 'Esparragos con Mahonesa'. $familia = array('Bart'. Almacenar la información de los contactos en arrays y aglutinar todas las páginas de contactos en una. Página 40 de 164 .'Marge'.'Homer'. edades y relaciones de las personas de tu familia. 'Lisa' => array('relacion' => 'hermana'. 'Maggie' => array('relacion' => 'yomisma'.'Lisa'. 'segundo' => 'Filete de Ternera'. 'Marge' => array('relacion' => 'madre'. 'edad' => 1)). 'Jueves' => array( 'precio' => 1. almacenar la información de los contactos en un array y mostrar la lista con un proceso repetitivo. 'bebida' => 'Te helado')).Kinética Mobile Development Curso de PHP5. (Ver anexo) o o o En la página inicial. Taller 3. 'segundo' => 'Hamburguesa con queso'.'Maggie'). 'Homer' => array('relacion' => 'padre'. 'Viernes' => array( 'precio' => 2. 'bebida' => 'Agua'). 'edad' => 10).15. 'primero' => 'Huevos Fritos'. 'edad' => 7). 'bebida' => 'Refresco de Cola'). 'edad' => 36).35. $usuario". echo '</body></html>'. } Los nombres de función siguen las mismas reglas que los nombres de variables: han de comenzar con una letra o un caracter de subrayado. echo "Bienvenido. echo '<body bgcolor="#' . Funciones (I).Kinética Mobile Development Curso de PHP5. o Llamando a una función. Conocer la definición y uso de funciones en PHP (I). echo "</body></html>". $usuario". } o Pasando parámetros a Funciones. $color . function paginaCabecera( ) { echo '<html><head><title>Bienvenido a mi página web</title></head>'. function paginaPie ( ) { echo '<hr>Gracias por su visita. '">'. Actividades: Código fuente: Ejemplo 112. Sesión 7. echo '<body bgcolor="#ffffff">'. Objetivo. el resto pueden ser letras. echo '<body bgcolor="#ffffff">'. paginaPie ( ). Resultado: <html><head><title>Bienvenido a mi página web</title></head> <body bgcolor="#ffffff"> Bienvenido. } Para llamarla pasándole un parámetro: paginaCabecera2('cc00cc'). o Declarando Funciones. } paginaCabecera( ). Resultado: <html><head><title>Bienvenido a mi sitio web</title></head><body bgcolor="#cc00cc"> Página 41 de 164 . Primero definimos la función: function paginaCabecera2($color) { echo '<html><head><title>Bienvenido a mi sitio web </title></head>'.'. paginaCabecera ( ). invitado </body></html> Las funciones pueden ser definidas antes o después de los lugares donde son llamadas. números o caracteres de subrayado. function paginaCabecera( ) { echo '<html><head><title>Bienvenid@s a mi sitio web</title></head>'. echo "Bienvenido. // $cabecera por defecto paginaCabecera5('66cc99'. // Esto es incorrecto function paginaCabeceraMal ($color = $mi_color) { . Por ejemplo: paginaCabecera2( ). // usa $cabecera por defecto paginaCabecera6( '66cc99' . '">'. function paginaCabeera3($color = 'cc3399') { echo '<html><head><title>Bienvenido a mi sitio</title></head>'. echo "<h1>$cabecera</h1>".Kinética Mobile Development Curso de PHP5. // usa $titulo y $cabecera por defecto paginaCabecera6( '66cc99' . $titulo.'mi pedazo de página'). echo "<h1>$cabecera</h1>". } // Llamadas correctas a esta función: paginaCabecera5('66cc99'. El resultado será: PHP Warning: Missing argument 1 for paginaCabecera2( ) Para evitar esta situación se define el parámetro de la función con un valor por defecto. '</title></head>'. } Llamamos a la función: paginaCabecera4('66cc66'.'¡Hola!¡Bienvenido!'). } // Llamadas correctas a esta función: paginaCabecera6( '66cc99' ). $color . echo '<body bgcolor="#' . '">'.. $color . $titulo . $color . echo '<body bgcolor="#' . Si llamamos a la función sin pasarle el parámetro definido. PHP lanza una advertencia indicando el error. '</title></head>'. '">'. echo '<body bgcolor="#' . echo '<body bgcolor="#' .'¡El mejor sitio web!'). } Definiendo una función con dos parámetros function paginaCabecera4($color.. $titulo) { echo '<html><head><title>Bienvenido a ' . si no se pasa ningún parámetro la función siempre tomará el definido por defecto.'mi pedazo de página'. $cabecera = 'Bienvenido') { echo '<html><head><title>Bienvenido a ' . 'mi pedazo de página').// nada por defecto Página 42 de 164 . '">'. $titulo = 'la página'. '</title></head>'. $title . Los valores por defecto para los argumentos nunca pueden ser otras variables. Resultado: <html><head><title>Bienvenido a mi sitio web </title></head><body bgcolor="#66cc66"> Múltiples parámetros opcionales En este caso se tiene que cumplir que todos los parámetros opcionales deben ir después de los obligatorios. // Un parámetro opcional: debe ir el último function paginaCabecera5($color. 'mi pedazo de página'.'mi sitio web'). $titulo . ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Dos parámetros opcionales: deben ser los dos últimos function paginaCabecera6($color. } Así. $cabecera = 'Bienvenido') { echo '<html><head><title>Bienvenido a ' . $color . '¡El merjor sitio web!'). // usa $cabecera por defecto paginaCabecera7( '66cc99' . para la ejecución y devuelve el valor asociado. '">'.708. cuentaAtras($contador).. Resultado: La población de España es aproximadamente: 44.1. $total = $comida + $totalImpuestos + $totalServicio. function cuentaAtras($fin) { while ($fin > 0) { echo "$fin. echo "<h1>$cabecera</h1>".22€ con un 8. } echo "¡boom!\n". return $total. echo "La población de España es aproximadamente: $numeroAmostrar". $totalServicio = $comida * ($servicio / 100).22. // usa $titulo y $cabecera por defecto paginaCabecera7( '66cc99' . ¡boom! Ahora contador es 5 o Devolviendo valores desde Funciones Capturando un valor de retorno $numeroAmostrar = numeroFormato(44708964). // Todos los parámetros opcionales function paginaCabecera7($color = '336699'. $cabecera = 'Bienvenido') { echo '<html><head><title>Bienvenido a ' .3. $fin--.". // usa todos por defecto paginaCabecera7( '66cc99' ). así que . Cambiando el valor de los parámetros Cualquier cambio que hagamos a un parámetro pasado a una función no afecta al parámetro fuera de la función. function restauranteCuenta($comida.964 Devolviendo un valor desde una función Para devolver valores desde la función que creemos usamos la palabra return y el valor que queremos devolver. } Utilizando un valor devuelto en una cláusula if( ) // Calcula el total de una comida de 15. $titulo .$titulo= 'la página'. } // Llamadas correctas a esta función: paginaCabecera7( ).". '</title></head>'. $servicio) { $totalImpuestos = $comida * ($impuesto / 100).. 'mi pedazo de página' . contador es $counter"..25. echo "Ahora. 15). echo '<body bgcolor="#' . if ($total > 20) { echo "Tengo que pagar con tarjeta de crédito.Kinética Mobile Development ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Curso de PHP5.. 'mi pedazo de página').4. echo 'Solo tengo un billete de 20€ en efectivo. 8. Resultado: 5. $impuesto.. $color ..2..'.. Cuando se está ejecutando una función tan pronto encuentre la palabra return.25% de servicio y un 7% de iva $total = restauranteCuenta (15. Página 43 de 164 . } $contador = 5. } Curso de PHP5. } if ($totales[1] < 20) { echo 'El total con servicio es menor a 20€. return array($totalSinServicio. } else { Página 44 de 164 . $impuesto. if ($totales[0] < 20) { echo 'El total sin servicio es menor de 20€. Usando valores de retorno en un if( ) if (restauranteCuenta (15. function restauranteCuenta2($comida.22. } Funciones que devuelven true o false function puedoPagarEfectivo ($efectivo. Devolviendo un array desde una función Un return solo puede devolver un valor.25.25. 23.15). 15). } else { return true. Resultado: Pagaré con efectivo. $cantidad) { if ($cantidad > $efectivo) { return 'tarjeta de crédito'. necesito mi tarjeta de crédito. 15).Kinética Mobile Development } else { echo "Puedo pagar en efectivo.'.'. } Usando un array devuelto de una función $totales = restauranteCuenta2(15. 8.22. $total)) { echo "Puedo pagar en efectivo.'. } } Pasando un valor de retorno a otra función $total = restauranteCuenta(15. $total). 8. $totalSinServicio = $comida + $totalImpuestos. $totalServicio = $comida * ($servicio / 100). } else { echo 'Demasiado caro. es decir. } Múltiples return en una función function modoPago ($efectivo. Si queremos devolver varios valores podemos almacenarlos en un array y devolver el array.". $servicio) { $totalImpuestos = $comida * ($impuesto / 100). } } $total = restauranteCuenta (15. } else { return 'efectivo'.22.'.". 15) < 20) { echo 'Menos de 20€. pago en efectivo.22. no se pueden devolver valores de la forma return 15.8.25. if (puedoPagarEfectivo (20. 8. $cantidad) { if ($cantidad > $efectivo) { return false. $metodo = modoPago(20. $metodo. echo 'Pagaré con ' . $totalConServicio = $comida + $totalImpuestos + $totalServicio.25. $totalConServicio). El array $GLOBALS Hay dos formas de acceder a una variable global desde una función. echo "<br/>". echo "<br/>". Conocer la definición y uso de funciones en PHP(II). Resultado: Vegetariana Para cenar hay . function cenaVegetariana( ) { echo "Para cenar hay $cena. // Sucumbe a las delicias del oceano echo " pero yo preferiría ". echo "<br/>". echo $cena. cenaNormal ( ). echo $cena. } function cenaNormal( ) { echo "Para cenar hay $cena. o ". } cenaMacrobiotica( ). $cena = 'Pimientos Rellenos'. Sesión 8. echo "Para cenar hay: $cena". Funciones (II). Cada variable global es accesible como un elemento en ese array. o Pollo Kung Pao Normalmente para cenar hay Bonito en Cebolla o Variables Globales. o Alcance de las variables Las variables definidas fuera de una función se llaman variables globales. Objetivo. function cenaMacrobiotica( ) { $cena = "Algunos Vegetales". echo $GLOBALS['cena']. Página 45 de 164 .". Actividades: Código fuente: Ejemplo 113. o Pimientos Rellenos Normal Para cenar hay . $cena = 'Pollo Kung Pao'. $cena = 'Bonito en cebolla'. echo "Normal <br/> ". } echo "Vegetariano <br/> ". echo “Para cenar hay $cena".Kinética Mobile Development echo "Toca tarjeta de crédito. La más común es usando el array especial $GLOBALS. } Curso de PHP5. cenaVegetariana( ). Aquellas definidas dentro de una función se denominan variables locales. Resultado: Para cenar hay Algunos Vegetales pero yo preferiría Bonito en Cebolla Para cenar hay: Bonito en Cebolla Modificando una variable con $GLOBALS $cena = 'Bonito en Cebolla'. $cena = 'Bonito en Cebolla'. o ". echo "Normalmente para cenar hay $cena". La función debe aceptar un argumento obligatorio con la URL de la imagen y otros argumentos opcionales con el texto alternativo alt. if (strlen($alt)) { echo “ alt='” . De esta forma indicamos que la variable a la que se asocia es global. } if ($height) { echo “ height=’$height’”. Por ejemplo. echo "Una cena ligera sería $cena". altura y la anchura de la imagen. pero ahora hay Lomo con Patatas Una cena normal sería Lomo con Patatas Es recomendable usar siempre $GLOBALS. “’”. function cenaVegetariana( ) { global $cena. Resultado: Una cena regular sería Bonito en Cebolla Una cena ligera sería Revuelto de Esparragos La palabra reservada global La segunda forma de acceder a una variable global dentro de una función es usando la palabra clave global. De cena había Bonito en Cebolla. } 2. $fichero. $height = 0. $cena = 'Bonito en Cebolla'. $GLOBALS['rutaImagen'] .”’”. Resultado: Una cena normal sería Bonito en Cebolla.jpg”. $height = 0. cenaVegetariana( ). } echo '>'. Dentro de la función usa una variable global para crear la URL completa de la imagen. Curso de PHP5. cenaLigera( ). entonces el atributo src de la etiqueta <img> debería ser “/imagenes/foto. 1. si pasamos foto. Ejercicios. echo $cena. echo "De cena había $cena.jpg a la funcion y la variable global contiene “/imágenes/”. Modifica el ejercicio anterior para que se pase sólo el nombre del fichero como parámetro URL.<br/>". } echo "Una cena normal sería $cena. $alt = ''. “’”. $url . } if ($height) { echo “ height=’” . $alt . function imgHtml2($fichero. $alt = ''. if (strlen($alt)) { echo “ alt=’$alt’”. pero ahora hay ". echo "Una cena normal sería $cena". $height . function imgHtml($url. ”’”. echo "<br/>". “‘”.Kinética Mobile Development function cenaLigera( ) { $GLOBALS['cena'] = ' Revuelto de Esparragos'. } if ($width) { echo “ width=’”. $width = 0) { echo “<img src=’” . } if ($width) { Página 46 de 164 . $width . echo "<br/>". Crea una funcion para escribir una etiqueta HTML de imagen <img>. $cena = 'Lomo con Patatas'. $width = 0) { echo “<img src=’” . } echo "Una cena regular sería $cena". $verde. echo "Puedo permitirme un servicio del $servicio% ($precio) <br/>". } function cuentaRestaurante($comida. ¿ Qué escribe la siguiente función? $efectivo = 31. 3. $totalServicio = $comida * ($servicio / 100). string dechex ( int numero ) Devuelve una cadena que contiene una representación hexadecimal del argumento numero dado. } Página 47 de 164 .Kinética Mobile Development echo “ width=’$width’”.$impuesto.5) Puedo permitirme un servicio del 14% (30. } Puedo permitirme un servicio del 11% (30) Puedo permitirme un servicio del 12% (30. verde y azul. Haz una función que acepte valores decimales para los parámetros del verde. rojo y azul y devuelve una cadena con el color apropiado para su uso en la web. $azulHex = dechex($azul). $servicio) { $totalImpuesto = $comida * ($impuesto / 100).$servicio)) < $efectivo) { $servicio++. function crearColor($rojo. $impuesto = 10. El mayor número que puede convertirse es 4294967295 en decimal. while(($precio = cuentaRestaurante($menu. $verdeHex = dechex($verde). Los colores web como #ffffff y #cc3399 se crean concatenando valores hexadecimales de color para el rojo. } echo '>'. $menu = 25. return $comida + $totalImpuesto + $totalServicio. } Curso de PHP5. devolvería la cadena #ff00ff.25) Puedo permitirme un servicio del 13% (30.0 y 255. que resulta en "ffffffff". $impuesto. si los parámetros son 255. $servicio = 10. Por ejemplo.$greenhex. Puedes encontrar util la función dechex(). return “#”.$bluehex.$redhex.75) 4. $azul) { $rojoHex = dechex($rojo). $_SERVER[REMOTE_ADDR] Es la dirección IP de la máquina del usuario que solicita alguna página a nuestro servidor web.com $_SERVER[DOCUMENT_ROOT] Es el directorio que contiene las páginas web de mi sitio.php. $_SERVER[QUERY_STRING] Devuelve la parte de la URL que viene después del signo de interrogación.com. $_SERVER[PHP_SELF] Es la página actual a la que accedemos.com/catalogo/almacen.ejemplo. Si ese directorio es /var/www/ para el sitio web www.ejemplo. $_SERVER[SERVER_NAME] Proporciona el nombre del sitio web donde se ejecuta el intérprete de PHP.ejemplo. Objetivo.Kinética Mobile Development Curso de PHP5. resultaría: www. Obtendríamos “category=kitchen&price=5”.ejemplo.php?categoria=cocina&precio=5. Del ejemplo anterior. Por ejemplo: http://www. Formularios. Es útil para hacer que un formulario envíe parámetros a la misma página. en el ordenador que alberga el servidor web.php"> <input type="text" name="idProducto"> <select name="categoria"> <option value="pimienta">Pimienta</option> <option value="oregano">Oregano</option> <option value="albahaca">Albahaca</option> </select> Página 48 de 164 . El array global $_SERVER contiene varios elementos que pueden ser muy útiles por la información que nos proporcionan. Aprender a utilizar los formularios en la web. Los parámetros de la URL y los de formulario con método get se almacenan en el array $_GET. o Accediendo a los parámetros del formulario Al principio de cada petición PHP inicializa los arrays globales que almacenan los valores de cualquier parámetro enviado a través de formulario o pasado en la URL. Actividades: Código fuente: Ejemplo 114.php se correspondería con el fichero en el servidor /var/www/catalogo/almacen. o Variables de Servidor. el URL http://www.com/catalogo/almacen. Sesión 9. Los parámetros de formulario con método post se almacenan en el array $_POST. Formulario de dos elementos <form method="POST" action="catalogo. } else { muestraForm( ). También podemos modificar el array. ?> Elementos de formulario con valores múltiples El nombre del elemento tiene que terminar en corchetes []. } // Muestra el formulario function muestraForm( ) { echo “<form method="POST" action="$_SERVER[PHP_SELF]"> Tu nombre: <input type="text" name="miNombre"> <br/> <input type="submit" value="Enviar"> </form>”. para que PHP lo trate como un array. ". o Procesado formularios con funciones Saludando con funciones // Lógica que muestra contenido según los parámetros enviados if (array_key_exists('miNombre'. $_POST['miNombre']. si hemos seleccionado pollo y ternera: Tu quieres un filete de pollo. } Usando un parámetro oculto para indicar forma de envio En el ejemplo anterior la lógica depende del valor de información específica: el parámetro miNombre. Si la variable Página 49 de 164 . <form method="POST" action="comer. } // Hacer algo cuando se envía el formulario function procesaForm( ) { echo "Hola. En catalogo.php"> <select name="comida[ ]" multiple> <option value="cerdo">Filete de Cerdo </option> <option value="pollo">Filete de Pollo </option> <option value="ternera">Filete de Ternera</option> <option value="cordero">Filete de Cordero</option> <option value="avestrux">Filete de Avestruz</option> </select> <input type="submit" name="Enviar"> </form> En comer. Para resolver este problema usamos variables ocultas (hidden). <br/>". añadiendo algo al final: $_POST['comida’] = 'cordero’.php tenemos: <br/> <?php foreach ($_POST['comida'] as $seleccion) { echo "Tu quieres un filete de $seleccion.php tenemos : idProducto: <?php echo $_POST['idProducto'].Kinética Mobile Development <input type="submit" name="Enviar"> </form> Curso de PHP5.$_POST)) { procesaForm( ). Tu quieres un filete de ternera. ?> <br/> categoria: <?php echo $_POST['categoria']. } ?> Resultado. Areas de Texto $comentarios="Añade aquí tus comentarios". o Mostrando valores por defecto Campos de Texto $defecto=”Escribe aquí tu nombre”. echo “<select name=’diaSemana’>”. if ($opcion == $defecto) { echo “ selected=’selected’”. echo “</textarea>”.Kinética Mobile Development Curso de PHP5. Página 50 de 164 . $_POST['miNombre']. Checkboxes y radio buttons $defecto = array( 'entrega' => 'si'. 'martes' => 'Martes'. lo mostramos. y si no. echo $comentarios. echo “<textarea name=’comentarios’>”. Lista desplegable (Select) $diasSemana = array( 'lunes' => 'Lunes'. $etiqueta es lo que se muestra foreach ($diasSemana as $opcion => $etiqueta) { echo “<option value=’$opcion’”. } echo '</select>'. $defecto=’martes’. } Además hace la lógica principal independiente de los parámetros que pueden cambiar en un formulario. ‘domingo’ => ‘Domingo’). ‘viernes’ =>’Viernes’. 'capacidad' => 'media’). } // Muestra el formulario function muestraForm ( ) { echo “<form method=’POST’ action=’$_SERVER[PHP_SELF]’> Tu nombre: <input type=’text’ name=’miNombre’> <br/> <input type=’submit’ value=’Enviar‘> <input type=’hidden’ name=’_envia_form’ value=’1’> </form>“. // $opcion es el valor de la opción. ¿Por qué no se usa el campo submit para hacer esto? No se usa para tal fin el campo submit porque algunos navegadores no envían el valor de este campo como parte de la información del formulario. oculta existe en el array $_POST procesamos el formulario. Funciona igual para listas con opciones múltiples. echo “<input type=’text’ name=’miNombre’ value=’$defecto’”. 'miercoles' => 'Miércoles'. } else { muestraForm( ). } // Procesamos formulario function procesaForm( ) { echo "Hola. } echo "> $etiqueta</option>\n". // Logica dependiente del campo oculto if ($_POST['_envia_form']) { procesaForm( ). ‘sabado’ => ’Sábado’. 'jueves' => 'Jueves'. ". echo “<input type=’radio’ name=’capacidad’ value=’grande’”.php"> Entrecot de Ternera con: <select name="salsa"> <option>Pimienta</option> <option>Queso</option> <option>Oporto</option> <option>Finas hierbas</option> </select> <br/> Dulces: <select name="dulces[ ]" multiple> <option value="perrunilla">Perrunilla de anís <option value="donut"> Donut de chocolate <option value="galleta"> Galleta de coco <option value="bizcocho"> Bizcocho almendrado </select> <br/> Cantidad de dulces: <input type="text" name="dulcesCantidad"> <br/> <input type="submit" name="Enviar" value="Orden"> </form> Valores de $_POST: array(4) { ["salsa"]=> string(14) "Oporto" ["dulces"]=> array(2) { [0]=> string(10) "perrunilla" [1]=> string(8) "bizcocho" } ["dulcesCantidad"]=> string(1) "4" ["submit"]=> string(5) "Orden" } 2.Kinética Mobile Development Curso de PHP5. echo “<input type=’radio’ name=’capacidad’ value=’pequeña’”. if ($defecto['capacidad'] == ‘grande') { echo “ checked=’checked’”. function procesaForm( ) { echo "<ul>". foreach ($_POST as $elemento=> $valor) { echo "<li> \$_POST[$elemento] = $valor</li>". } echo “> ¿Entrega?”. if ($defecto['entrega'] == 'si') { echo “ checked=’checked’”. echo “<input type=’radio’ name=’capacidad’ value=’media’”. } echo "</ul>". } echo '> Pequeña '. if ($defecto['capacidad'] == 'media') { echo “ checked=’checked’”. Escribe un programa que realize operaciones aritméticas básicas. } echo '> Grande'. producto o división. echo “<input type=’checkbox’ name=’entrega’ value=’sí’”. Se deben mostrar los operandos la operación y el resultado. Escribe una función procesaForm() que muestre todos los parametros del formulario enviado y sus valores. Muestra un formulario que tenga dos campos de texto para dos oeprandos y una lista desplegable para elegir la operación: suma. Por ejemplo: "4 * 2 = 8". el primer y último elemento en la lista de selección múltiple y un 4 introducido en el campo de texto? <form method="POST" action="orden. 1. resta. Ejercicios. } 3. Página 51 de 164 . if ($defecto['capacidad'] == ‘pequeña') { echo “checked=’checked’”. ¿Qué aspecto tiene el array $_POST cuando se envia el siguiente formulario con la tercera opcion seleccionada de la lista desplegable. } echo '> Media'. } elseif ('-' == $_POST['operador']) { $total = $_POST['operando1'] . // El campo oculto _envia_form echo “<input type=’hidden’ name=’_envia_form’ value=’1’/>”.'-'. echo $_POST['operando1'].$_SERVER[PHP_SELF].'*'. // El boton de envio echo “<br/><input type=’submit’ value=’Calcular’/>”. echo $_POST['operando2'] . } else { muestraForm( ). // El operador echo “<select name=’operador’>”.”’/>”.'/'). if ($_POST['_envia_form']) { procesaForm( ). if ($_POST['operador'] == $op) { echo “ selected=’selected’”. } function muestraForm() { // El principio del formulario echo “<form method=’POST’ action=’”. } elseif ('*' == $_POST['operador']) { $total = $_POST['operando1'] * $_POST['operando2']. } echo '</select>'. } Curso de PHP5.”’/>”.$_POST['operando2']. function procesaForm( ) { if ('+' == $_POST['operador']) { $total = $_POST['operando1'] + $_POST['operando2']. // El segundo operando echo “<input type=’text’ name=’operando2’ size=’5’ value='”.”’>”. // El primer operando echo “<input type=’text’ name=’operando1’ size=’5’ value=’”. } elseif ('/' == $_POST['operador']) { $total = $_POST['operando1'] / $_POST['operando2']. } ?> Página 52 de 164 . } echo "> $op</option>". // El final del formulario echo '</form>'. } echo "$_POST[operando1] $_POST[operador] $_POST[operando2] = $total".Kinética Mobile Development <?php $ops = array('+'. foreach ($GLOBALS['ops'] as $op) { echo '<option'. php <?php define(“ALTO”. teniendo disponible todo su código como si estuviese en el archivo en el que se incluye. define(“ANCHO”.php <?php define(“ALTO”. 200).php”). 200). 200).Kinética Mobile Development Curso de PHP5. reutilizando así el código generado. Objetivo. clases. Si almacenamos la definición de las constantes en un archivo aparte. Definiendo constantes y funciones comunes miFoto. constantes.php <?php include (“constantes. Sesión 10. codigo.jpg” height=”<?php echo ALTO?>” width=”<?php echo ANCHO?>” /> Según este código tendríamos que repetir la definición de constantes para cada fichero PHP en el que las utilicemos. Incluyendo ficheros. 200).php. definición de funciones. etc.jpg” height=”<?php echo ALTO?>” width=”<?php echo ANCHO?>” /> Ahora solo tenemos que incluir el fichero de constantes en cualquier fichero PHP que las necesite. Página 53 de 164 . ?> <img src=”miFoto. Estructurar la aplicación PHP en varios ficheros. ?> miFoto1. Actividades: o Introducción PHP permite separar el código en varios archivos e incluirlo en los programas que necesitemos. define(“ANCHO”. ?> <img src=”miFoto. como por ejemplo constantes. Esto funciona tanto para definición de variables. ”’ />”. 200). include_once include_once(“nombreFichero”). o include. Cuando queremos incluir ficheros con variables.php <?php define(“ALTO”.ALTO. Si requerimos (require) un fichero que no existe provocará un error fatal y nuestro programa en PHP parará.php <?php ?> include (“constantes1. 200). define(“ANCHO”.jpg”). require_once Funcionan exactamente igual que include. Si incluimos (include) un fichero que no existe recibiremos un aviso o warning y nuestro script PHP continuará. funciones y clases similares y no queremos sobreescribirlas o queremos asegurarnos de que no se incluyen los mismos elementos varias veces. } ?> Curso de PHP5. También es posible usar variables al incluir ficheros: Página 54 de 164 .ANCHO. o require. Solo se diferencian en la forma en la que manejan los errores en la inclusión de ficheros.”’ width=’”.Kinética Mobile Development constantes1. muestraImagen(“miFoto.php”). miFoto2. Podemos incluir tantos ficheros como necesitemos. function muestraImagen($img){ echo ”<img src=’$img’ height=’”. Página 55 de 164 . Curso de PHP5. Taller 4. (Ver anexo) o Usar funciones e inclusión de ficheros para obtener las cadenas que muestran los datos de usuario.Kinética Mobile Development include (“$archivo”). Disparadores.1. Actividades: Código fuente: Ejemplo 115.Kinética Mobile Development Curso de PHP5. Objetivo. Sesión 11. Bases de datos. tal como Procedimientos Almacenados.0.0. Vamos a ver como se relaciona PHP con MySQL y Oracle. Las principales características de la extensión mysqli son: Página 56 de 164 . Para aprovechar todas estas características se utiliza la extensión PHP para MySQL mysqli disponible como parte de PHP 5. Precisión Matemática y algunas más. La extensión PHP de MySQL utilizada hasta ahora no soporta toda la funcionalidad proporcionada por las versiones de MySQL superiores a 4. Vistas. o PHP y las Bases de Datos PHP soporta la mayor parte de los motores de bases de datos más conocidos: IBM DB2 Informix Ingres Microsoft SQL Server (MS SQL) mSQL MySQL Oracle PostgreSQL Sybase ODBC Existen varios juegos de funciones específico para cada motor de base de datos. Interactuar con bases de datos. por tanto es necesario proporcionar el nombre del sistema en el que está la base de datos. Se puede proporcionar tanto un nombre de dominio como una dirección IP. $clave = “secreto”. - Usuario: Debe existir una cuenta de usuario válida para acceder a la base de datos.1/5. $usuario = “admin”. - Nombre de la Base de Datos: Un motor de base de datos puede crear y mantener muchas bases de datos. ?> Página 57 de 164 . o Conectando con la Base de Datos Para conectar con la base de datos es necesario proporcionar cuatro parámetros: - Localización: La base de datos puede no estar situada en el mismo sistema que el intérprete de PHP. Las extensiones PHP para acceder a Oracle son php_oracle y php_oci8.Kinética Mobile Development Curso de PHP5. por tanto tenemos que indicar qué base de datos queremos utilizar. Si la base de datos se encuentra en el mismo lugar que PHP se puede usar localhost. Un interface orientado a objetos más facil de extender. Vamos a crear un archivo que contenga las variables necesarias para acceder a nuestra base de datos y así. Un interface procedimental similar al de la extensión mysql.0 . poder incluirlo en aquellos ficheros PHP que lo necesiten: config. - - Acceso a todas las ventajas de MySQL 4. $bd = “cursoPHP5”.php <?php $servidor = “localhost”. - Clave: La clave de acceso de la cuenta de usuario. $baseDatos = mysqli_select_db($bd. Usaremos para nuestros ejemplos la tabla productos de la base de datos cursoPHP5.$clave).$usuario. aunque tienen un formato similar. Así podremos incluirlo añadiendo una línea como sigue: include(“config.$usuario. Orientado a Objetos (Recomendada) $conexion = new mysqli($servidor. insertar o eliminar datos en ella.$clave. MySQL 4.Kinética Mobile Development Curso de PHP5.$bd). modificar.1 o superiores: Procedimental $conexion = mysqli_connect($servidor. La conexión de Oracle necesita que esté definida la variable de entorno ORACLE_SID para indicar la instancia deseada de Oracle. Oracle: $conexion = oci_connect($usuario.$usuario. Página 58 de 164 . $baseDatos = mysql_select_db($bd.php”).$conexion). o Consultando la Base de Datos Después de conectar con la base de datos podemos consultar.$clave). MySQL 4. $conexion). Las funciones para conectar con la base de datos no son las mismas para todos los motores de bases de datos. $clave).0 o anteriores versiones: $conexion = mysql_connect($servidor. // mysql_query($consulta. // mysql_result ( $resultado . Resultado: Patatas Manzanas Tomate Limon while ($fila = mysql_fetch_array ( $resultado)) echo " ID: $fila [ id ] Nombre: $fila [ nombre ] Precio: $fila [ precio ] <br/>".00 5. // array numerico while ( $fila = $resultado->fetch_array()) echo " $fila [ 0 ] . $i < mysql_num_rows( $resultado ) .Kinética Mobile Development Curso de PHP5. $i.1 o superiores: $consulta = " SELECT * FROM productos ". $fila[nombre] <br/>".00 5. $fila [ 1 ] <br/>". como la modificación y administración de nuestras bases de datos MySQL. $resultado = mysql_query ( $consulta ). MySQL 4.00 *Clave principal con generación automática. o phpMyAdmin Es una herramienta web para administrar servidores de bases de datos MySQL.00 2. ‘nombre’ )) .0 o anteriores versiones: $consulta = “SELECT * FROM productos”. Id * 1 2 3 4 Nombre Patatas Manzanas Tomate Limon Precio 10.$conexion) for ( $i = 0 . “<br/>”.00 3. ++$i ) echo mysql_result ( $resultado .00 Patatas Manzanas Tomate Precio: Precio: Precio: 10.00 MySQL 4. Página 59 de 164 . Resultado: ID: 1 Nombre: ID: 2 Nombre: ID: 3 Nombre: ID: 4 Nombre: Limon Precio: 2. Podemos crear nuestra base de datos desde PHP pero es más útil y rápido usar este tipo de entornos tanto para la creación. 1 )). //echo " $fila[id] . $resultado = $conexion->query($consulta). $i.00 3. Kinética Mobile Development Curso de PHP5. } Practicamente las tres opciones tienen formatos similares. Esto funciona también para UPDATE y DELETE. 3. Cuando se trata de consultas que no devuelven datos.$cadena). Resultado: 1. MySQL 4. Limon Registros: 4 Patatas Manzanas Tomate Oracle: $cadena = “SELECT * FROM productos”. echo $fila [ 1 ] . while ($fila = oci_fetch_array ($consulta)) { echo $fila [ 0 ] . 2. $fila [ ' nombre ' ] . o Cerrando la conexión Cualquier conexión abierta de base de datos es cerrada cuando finaliza el script PHP. ’$producto’)”. se usan las mismas funciones. actualizaciones o eliminaciones. $consulta = “INSERT INTO productos (id. oci_execute($consulta). $consulta = oci_parse($conexion. " y " .0 o anteriores versiones: $producto = “Jamón”. Si no se devuelve nada. Página 60 de 164 . $fila [ ' id ' ] . <br>". echo “Registros: $resultado->num_rows”. " es lo mismo. $resultado contiene el valor TRUE. nombre) VALUES (null . tales como inserciones. " es lo mismo. 4. " y " . $resultado = mysql_query($consulta). <br/>". 1) 1. Escribe un programa en PHP que muestra todos los platos de la tabla ordenados por precio.0) INSERT INTO platos VALUES (2. Ejercicios.4. Página 61 de 164 .50. esPicante INT ) idPlato como clave principal autoincrementable.0) INSERT INTO platos VALUES (6.2).'Pollo al Curry'.'Gazpacho'.Kinética Mobile Development Curso de PHP5. Para los ejercicios siguientes usaremos una tabla llamada platos: CREATE TABLE platos ( idPlato INT.5. nombrePlato VARCHAR(255).3.00. Creamos varios registros: INSERT INTO platos VALUES (1. mysqli_close ( $conexión ). TRUCO: Para obtener el identificador autogenerado del último insertado: $conexion->insert_id mysql_insert_id() En mysql también podemos hacer la siguiente consulta inmediatamente después de insertar un elemento. Sin embargo.95.1) INSERT INTO platos VALUES (5. precio DECIMAL(4.00. en ocasiones es una buena práctica cerrar la conexión explícitamente en el script para evitar problemas mysql_close ( $conexión ).50. para obtener el id insertado: SELECT LAST_INSERT_ID( ) .1.0) INSERT INTO platos VALUES (3.'Entrecot de Ternera'.00.1. oci_close ( $conexión ).'Revuelto de Esparragos '.'Ensalada de Jalapeños'.6.0) INSERT INTO platos VALUES (4.'Crema de Calabacín'. $conexion = mysqli_connect($servidor. echo “<input type=’hidden’ name=’_envia_form’ value=’1’/>”. } function procesaForm( ) { global $conexion. echo “</td></tr>”. $resultado = $conexion->query($consulta). $bd). $resultado = $conexion->query($consulta). require_once “config. Escribe un programa en PHP que muestre un formulario solicitando un precio. Crea un programa que muestre un formulario con una lista desplegable con los nombres de los platos. if ($_POST['_envia_form']) { procesaForm( ).$clave). echo “<table>”. la aplicación debe escribir el nombre y el precio de aquellos platos cuyo precio sea mayor o igual al enviado.$_SERVER['PHP_SELF']. if($resultado->num_rows>0){ while ( $plato = $resultado->fetch_array()) echo " . } } else { echo “No hay coincidencias. $consulta=”SELECT nombrePlato. echo “</table>”. $conexion = mysqli_connect($servidor. } } ?> 3.php”. $baseDatos = mysqli_select_db($conexion.precio FROM platos ORDER BY precio”. } ?> 2. $baseDatos = mysqli_select_db($conexion. } else { muestraForm( ).$usuario. if ($resultado->num_rows> 0) { while($plato = $resultado->fetch_array()) { echo ". Una vez que el usuario haya elegido un plato de la lista y haya enviado el Página 62 de 164 . No obtener de la base de datos nada que no se vayan a mostrar en la web.$plato[nombrePlato] ( $plato[precio] ) <br/>". “ WHERE precio >=”. } function muestraForm() { // Comienzo del formulario echo “<form method=’POST’ action=’”. $bd). echo “</form>”. // El precio echo “<tr><td>Precio:”.$usuario. Cuando se envíe el formulario.”.php”. echo “<input type=’text’ name='precio' id=’precio’>”.$plato[nombrePlato] ($plato[precio]) <br/>". $consulta=”SELECT nombrePlato.Kinética Mobile Development <?php Curso de PHP5.”’>”. precio FROM platos”. <?php require_once “config. } } else{ echo “No hay platos disponibles.$_POST['precio'].$clave). // Fin del formulario echo “<tr><td colspan=’2’><input type=’submit’ value=’Buscar platos’>”.”. echo “</td></tr>”. “ FROM platos WHERE idPlato= $idPlato”. echo “</td></tr>”. $consulta=”SELECT idPlato. } function procesaForm( ) { global $conexion.$clave). while ($plato = $resultado->fetch_array()) { $platos[ ] = $plato. $resultado = $conexion->query($consulta). $consulta=”SELECT idPlato. $idPlato = $_POST['idPlato'].$_SERVER['PHP_SELF']. echo “<input type=’hidden’ name=’_envia_form’ value=’1’/>”. } if ($_POST['_envia_form']) { procesaForm( ). } function muestraForm() { // Comienzo del formulario echo “<form method=’POST’ action='”.Kinética Mobile Development Curso de PHP5. nombre. precio. $resultado = $conexion->query($consulta). el programa mostrará toda la información referente a ese plato (Id. if ($resultado->num_rows > 0) { echo “ ID: $tabla[idPlato] <br/>". echo “</td></tr>”. if($tabla[esPicante] == 1) echo “ Sí ". // Fin del formulario echo “<tr><td colspan=’2’><input type=’submit’ value=’Buscar platos’>”. echo " Picante: “. echo “<select name='idPlato' >”. // Obtenemos un array con los nombres de platos $platosNombres = array( ). echo " Precio: $tabla[precio] <br/>". echo “</form>”.”’>”. y si es picante).”. $bd). $conexion = mysqli_connect($servidor. echo " Nombre: $tabla[nombrePlato] <br/>". foreach($GLOBALS['platos'] as $id=>$plato ) echo “<option value=’$id’>$plato</option>”. else echo “ No ". // Lista desplegable de platos echo “<tr><td>Plato:”. } else { echo “Ese plato no existe.nombrePlato. <?php require_once “config.$usuario. formulario. $tabla=$resultado->fetch_array(). } } ?> Página 63 de 164 . echo “<table>”.php”. esPicante”. $baseDatos = mysqli_select_db($conexion.nombrePlato FROM platos”. echo “</select>”. echo “</table>”. precio. } else { muestraForm( ). ’$_POST[nombre]’. $platos= array( ). while ($plato = $resultado->fetch_array()) { $platos[ ] = $plato. telefono VARCHAR(15).$usuario.’ $_POST[telefono]’. Crea una nueva tabla que almacene información sobre los clientes del restaurante. nombre. telefono. telefono.Kinética Mobile Development Curso de PHP5. La tabla deberá contener la siguiente información: idCliente. Página 64 de 164 . nombre VARCHAR(255). ?>"> <table> <tr><td>Nombre del Cliente:</td> <td><input type=’text’ name='nombre' id=’nombre’></td></tr> <tr><td>Teléfono:</td> <td><input type=’text’ name=’telefono’ id=’telefono’></td></tr> <tr><td>Plato Favorito:</td> <td> <select name=’platoFavorito’ > <?php foreach($platos as $indice=>$plato) echo “<option value=’$indice’>$plato</option>”. $consulta=”SELECT idPlato. <?php require_once “config. platoFavorito INT PRIMARY KEY (`idCliente`) ) AUTO_INCREMENT=1. 4. } ?> <form method="POST" action="<?php echo $_SERVER['PHP_SELF']. } else { muestraForm( ). $_POST[platoFavorito])”. “ VALUES(null.php”. // Si se ha enviado el formulario. platoFavorito)”. $conexion = mysqli_connect($servidor. La parte del formulario encargada de seleccionar el plato favorito deberá ser una lista desplegable con todos los platos. } function muestraForm() { global $platos. } if ($_POST['_envia_form']) { procesaForm( ). ?> </select> </td></tr> <tr><td colspan="2" align="center"> <input type=’submit’ value=’Nuevo Cliente’> </td></tr> </table> <input type="hidden" name="_envia_form" value="1"/> </form> <?php } // El fin del formulario function procesaForm( ) { global $conexion. Escribe un programa que muestre un formulario que permite insertar nuevos clientes en la tabla. $resultado = $conexion->query($consulta). y el id de su plato favorito.$clave).nombrePlato FROM platos”. $bd). no mostramos nada $defecto = array( ). El id del cliente no se creará desde el formulario sino que será generado automáticamente por la base de datos. $baseDatos = mysqli_select_db($conexion. obtenemos los valores enviados para mostrar if ($_POST['_envia_form']) { $defecto = $_POST. nombre. } else { // Si no. CREATE TABLE cliente( idCliente INT UNSIGNED. $consulta=” INSERT INTO cliente (idCliente. (Ver anexo) • Incluir opciones para insertar. o o Crear una tabla de contactos. Taller 6. modificar y eliminar contactos. (Ver anexo) • Modificar nuestra aplicación para gestionar la información de los contactos desde una base de datos. Página 65 de 164 . // Confirmamos al usuario la inserción echo “Añadido el cliente $_POST[nombre] a la base de datos. Modificar nuestra aplicación para obtener esos datos. Taller 5. } ?> Curso de PHP5.Kinética Mobile Development $resultado = $conexion->query($consulta).”. Si estamos a viernes. ¿Qué hora es? echo "strftime( ) muestra: ". Página 66 de 164 .strftime('%c'). Fecha y Hora.date('r'). o Mostrando la fecha y la hora. Si se omite el segundo se toma el momento actual. Objetivo. echo "date( ) muestra: ". Sesión 12. Conocer el uso de las funciones para el tratamiento de la fecha y hora. la ‘m’ el mes (04) y la ‘y’ el año con dos dígitos (07). La barra inclinada (/) al no ser un carácter que la función date() reconozca. El 13 de abril de 2007 muestra: 13/04/07 Como se puede observar la letra ‘d’ indica el día (13). Mostrando la fecha actual formateada con date( ) echo date(“d/m/y”). 13 Apr 2007 10:27:51 +0200 04/13/07 10:27:51 Ambas funciones tienen dos parámetros: el primero controla el formato a mostrar y el segundo la hora o fecha a tratar. 13 de abril de 2007.Kinética Mobile Development Curso de PHP5. la imprime como un carácter más. el resultado será: strftime( ) muestra: date( ) muestra: Fri. echo "<br/>". Actividades: Código fuente: Ejemplo 116. echo strftime(“Hoy es %d/%m/%y y son las %I:%M:%S'). echo "<br/>". echo "<br/>". Resultado a las 01:49:59: strftime() date( ) muestra: 02:49:59 muestra: 02:49:59 Mostrando una hora con formato desde un texto echo “strftime( ) muestra: “. Mostrando una hora específica con formato echo “strftime() muestra: “. date(“h:i:s”). El resultado es el mismo: 13/04/07 En el apartado de referencias al final de este texto se encuentra una tabla con los caracteres de formato de ambas funciones. tiene sus propios caracteres de formato. echo strftime('%d/%m/%y'). echo “Hoy es “ . time( ) + 60*60). echo strftime('%I:%M:%S'. 13 de abril de 2007 a las 12:00 : strftime( ) muestra: Hoy es 13/04/07 date( ) muestra: Hoy es 13/04/07 y son las 12:00:00 y son las 12:00:00 La característica más importante que hace más atractivo el uso de date() sobre strftime() es que la primera es una función nativa de PHP mientras que la segunda utiliza una función subyacente del sistema en el que se instala PHP. los caracteres a reemplazar van acompañados del carácter de porcentaje (%) y aunque algunos coinciden con date(). Con la función strftime(). echo date('h:i:s'.” y son las “ .Kinética Mobile Development Curso de PHP5. Página 67 de 164 . date(“d/m/y”) . El viernes. time( ) + 60*60). echo “date( ) muestra: “. echo “date( ) muestra: “. de forma que aquellos que omitamos los completa con la hora actual. Por ejemplo mktime(15. echo strftime("antes: %d/%m/%Y \n".$ahora).m. Creando una marca de tiempo // obtenemos los valores de un formulario $usuarioFecha = mktime($_POST['hora']. // Busca la fecha del próximo martes $antes = strtotime('last thursday'.04. echo strftime("despues: %d/%m/%Y \n". $ahora = time( ). // 1:30 pm (y 45 segundos) el 13 de abril de 2007 $tarde = mktime(13. echo strftime('A las %I:%M:%S de %m/%d/%y. 0. de hoy. Todos los parámetros de mktime() son opcionales. Resultado: A las 01:30:45 on 10/20/82.2007). Uso de la función strtotime( ) Cuando quieres obtener una fecha relativa a algun evento concreto se usa strtotime( ).13. $despues).". $_POST['mes']. $despues = strtotime('Thursday'.30.45.$ahora). $tarde). $_POST['dia']. echo "$tarde segundos han pasado desde el 1/1/1970. 403965045 segundos han pasado desde el 1/1/1970. Resultado. el viernes 13 de abril de 2007 es: ahora: despues: antes: 12/04/2007 13/04/2007 19/04/2007 Ejercicios. Solo reconoce descripciones en inglés de momentos concretos y devuelve la fecha correspondiende. '. $_POST['minuto'].Kinética Mobile Development Curso de PHP5. $_POST['año']). Página 68 de 164 . $antes). // Busca la fecha del martes anterior echo strftime("ahora: %d/%m/%Y \n".0) devuelve las 3:30 p. $ahora).30. $marca).Kinética Mobile Development Curso de PHP5. Son las %I:%M %p (es decir las %H:%M). (date(“z”. $anio <= 2020.6.date('F'. echo strftime(“Hoy es día %d de %B y el día %j del año %Y.10.”. echo “Hoy es día “.date(“Y”. echo “ (es decir las “.2004).0. echo “ del año “. echo "<tr><td>$anio</td><td>".$anio). echo “<table>”. echo “<tr><th>Year</th><th>Elecciones</th></tr>”. $marca = mktime(19. // Avanzamos hasta el primer domingo $marca = strtotime('last sunday'.” y día “.45. } echo '</table>'. $marca). 3.”. Son las 07:45 PM (es decir las 19:45). echo "</td></tr>\n".” de “. $marca). $marca = mktime(19. Usa strftime( ) para mostrar lo siguiente: Hoy es día 13 de abril y el día 294 del año 2007.20.$marca). Crea una tabla que muestre la fecha en la que cae el último domingo de mayo desde el 2007 al 2020.”). Usa date( ) para mostrar el mismo resultado que el ejercicio anterior.2004).0. for ($anio = 2007.$marca).m. echo date('F j'.date(“H:i”.$marca)+1). Son las “. Página 69 de 164 . Para mostrar exactamente lo mismo que el ejemplo utiliza mktime() para obtener la marca de tiempo correspondiente al 13 de abril de 2007 a las 7:45 p.$marca.10.20. 1.0.$marca). 2.45.date(“h:i A”.”. $marca).1.date(“d”.0. $anio++) { // Obtenemos la fecha del 1 de mayo del año $anio $marca = mktime(12. jpg'. Subiendo ficheros. Sesión 13.". } return $errores. o Subir ficheros a través de formulario. } else { procesaForm( ). El elemento de formulario <input todo el contenido de un fichero. PHP proporciona acceso al fichero subido a través del array global $_FILES.Kinética Mobile Development Curso de PHP5.". Actividades: Código fuente: Ejemplo 117. echo " de tipo {$_FILES['mFichero']['type']} que tiene un tamaño de ". if ($_POST['_enviado']) { if ($formErrores = validaForm( )) { muestraForm($formErrores). " <input type=’hidden’ name=’MAX_FILE_SIZE’ value=’131072’/>". Objetivo. '.". Aprender a subir ficheros a nuestro sitio web.'. } else { echo "No ha sido posible subifr el fichero. type="file"> nos permite subir a nuestro servidor web Cuando un formulario enviado incluye entre sus elementos uno de tipo file.$errores).”. } echo " <form enctype=’multipart/form-data’ method=’POST’ ". echo implode(“</li><li>”. echo “</li></ul>”. echo “{$_FILES['miFichero']['name']}”. $ficheroDestino = '/var/www/cursoPHP5/ficheros/imagen. " action=’$_SERVER[PHP_SELF]’>". " Archivo a subir: <input name=’miFichero’ type=’file’/>”. } function muestraForm($errores = '') { if ($errores) { echo “Es necesario corregir los siguientes errores: <ul><li>”. $ficheroOrigen=$_FILES['miFichero']['tmp_name']. $ficheroDestino)) { echo "Fichero subido como $destination_file. " <input type=’submit’ value=’Subir’/></form>”. if (($_FILES['miFichero']['error'] == UPLOAD_ERR_INI_SIZE)|| ($_FILES['miFichero']['error'] == UPLOAD_ERR_FORM_SIZE)) { $errores[ ] = “El tamaño del archivo es demasiado grande. } function validaForm( ) { $errores = array( ). } } Página 70 de 164 . " <input type=’hidden’ name=’_enviado’ value=’1’>". } elseif ($_FILES['miFichero']['error'] = = UPLOAD_ERR_PARTIAL) { $errores[ ] = 'La subida del fichero ha sido interrumpida. // La ruta de almacenamiento temporal // del fichero subido en el servidor if (copy ($ficheroOrigen. } function procesaForm( ) { echo "Has subido un archivo llamado {$_FILES['miFichero']['name']} ". echo "{$_FILES['miFichero']['size']} bytes. } } else { muestraForm( ). } elseif ($_FILES['miFichero']['error'] = = UPLOAD_ERR_NO_FILE) { $errores[ ] = 'No hay ficheros para subir. Página 71 de 164 . Taller 7. Curso de PHP5. (Ver anexo) • Modificar nuestra aplicación para subir la imagen de cada contacto.Kinética Mobile Development También es posible usar move_uploaded_file para mover el fichero. Kinética Mobile Development Curso de PHP5. Página 72 de 164 . Conocer cómo gestiona PHP las sesiones web. Los datos permanecen durante las peticiones. El inconveniente de las cookies es que sólo almacenan un valor para cada cookie. o Activando sesiones. Objetivo. de forma que en una solicitud podemos añadir una variable a la sesión de usuario y en una posterior podemos recuperarla sin problemas.Kinética Mobile Development Curso de PHP5. Sesión 14. Una cookie identifica un cliente particular para un servidor web y un intérprete PHP. Cuando queremos almacenar más información son más útiles las sesiones. PHP lee la cookie e identifica que la petición viene del mismo cliente web que hizo otras peticiones antes con la misma cookie. Actividades: Código fuente: Ejemplo 118. Página 73 de 164 . Sesiones. Una sesión usa una cookie para distinguir entre cada usuario y almacena una pila temporal de datos para cada usuario en el servidor. Cada vez que un cliente hace una solicitud envía una cookie con esa solicitud. $_SESSION['contador'] . $_SESSION['contador'] = $_SESSION['contador'] + 1. identificándolo unívocamente en el servidor. Resultado: Página 74 de 164 .Kinética Mobile Development Curso de PHP5. Las sesiones usan una cookie llamada PHPSESSID. Cada cliente web obtiene un identificador de sesión distinto. session_start( ). echo "Has visitado esta página " . o Almacenando y recuperando información. Esto permite mantener pilas separadas de datos para cada cliente. ' veces.'. El valor de PHPSESSID es una cadena alfanumérica aleatoria. Los datos de sesión se almacenan en el array global $_SESSION. Es importante señalar que esta función debe ser llamada antes de que envie nada. PHP comprueba la presencia de esta cookie y la inicializa si no existe. Para usar sesiones en una página utilizamos la función session_start( ) al principio de nuestro script. Cuando iniciamos una sesión en una página. Contando de accesos con sesiones. echo “<br/>”. 'ajetes' => 'Revuelto de Ajetes'. echo “<input type=’hidden’ name=’_envia_form’ value=’1’/>”. . A medida que vayamos visitando la página sin cerrar el navegador y sin cerrar la sesion explícitamente con PHP iremos viendo como se incrementa el contador: Has visitado esta página 2 veces. 'arroz' => "Arroz con Pollo".$_SERVER['PHP_SELF']. foreach($GLOBALS[‘platosPrincipales’] as $indice=>$plato) echo “<option value=’$indice’> $plato</option>”. echo “Gracias por su pedido. Mostrando los datos de sesión. o Guardando datos de formulario en una sesión. } ?> Los datos de sesion no están restringidos a cadenas y números como las cookies.. } function procesaForm( ) { $_SESSION['orden'][ ] = array('plato' => $_POST['plato']. echo “ </select><br/>“. 'ensalada' => 'Ensalada de Verduras'. <?php session_start( ).Kinética Mobile Development Has visitado esta página 1 veces. } function muestraForm() { echo “<form method=’POST’ action=’". $platosPrincipales = array( 'garbanzos' => 'Cocido de Garbanzos'. echo “Cantidad: <input type=’text’ name=’cantidad’ value=’$POST[cantidad]’>”.”.. 'cantidad' => $_POST['cantidad']). echo “<input ytpe=’submit’ value=’Enviar’>”. Curso de PHP5. echo “</form>”. Página 75 de 164 . echo “ Plato: <select name=’dish’>”. 'gazpacho' => 'Gazpacho Extremeño')."’>”. <?php session_start( ). } else { muestraForm( ). 'macarrones' => 'Macarrones con Tomate'. $platosPrincipales = array( 'garbanzos' => 'Cocido de Garbanzos'. if ($_POST['_envia_form']) { procesaForm( ). Has visitado esta página 3 veces. Kinética Mobile Development 'arroz' => "Arroz con Pollo", 'macarrones' => 'Macarrones con Tomate', 'ensalada' => 'Ensalada de Verduras', 'ajetes' => 'Revuelto de Ajetes', 'gazpacho' => 'Gazpacho Extremeño'); if (count($_SESSION['orden']) > 0) { echo “<ul>“; foreach ($_SESSION['orden'] as $orden) { $platoNombre = $platosPrincipales [ $orden['plato'] ]; echo "<li> $orden[cantidad] de $platoNombre </li>"; } echo "</ul>"; } else { echo "No has pedido nada."; } ?> Curso de PHP5. o ¿Por qué session_start( ) tienen que estar al principio de la página? Cuando un servidor web responde a un cliente web la mayor parte de la respuesta es el documento html que el navegador convierte para mostrarlo como una página web. Ese html es una sección de la respuesta que además contiene las cabeceras o headers, que están situadas antes del html. Estas cabeceras no se utilizan para mostrar algo en nuestra web sino para indicar ciertas órdenes o incluir información útil para el navegador. Todas las cabeceras de la respuesta del servidor web han de estar al principio de la respuesta, antes del cuerpo de la página, que es donde html controla lo que se muestra en el navegador. Si se envía algo del cuerpo, aunque sea una línea e incluso un espacio, ya no es posible enviar más cabeceras. Las funciones como setcookie( ) y session_start( ) añaden cabeceras a la respuesta. Para que sean enviadas de forma adecuada deben ser añadidas antes de cualquier tipo de etiqueta de salida. Esto es por lo que estas funciones tienen que ser llamadas antes de cualquier echo() o etiqueta fuera de php. Si se envia cualquier salida antes de session_start( ) se muestra el siguiente error: Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/contactos.php:2) in /www/htdocs/contactos.php on line 4 Página 76 de 164 Kinética Mobile Development Curso de PHP5. Para eliminar una variable de sesión es necesario utilizar unset(), al igual que cualquier otra variable. Para cerrar una sesión se utiliza la función session_destroy(). Ejercicios. 1. Crea una página web que use una variable de sesión que almacene el número de veces que un usuario ha visto la página. Debe mostrar : Número de vistas: 1. Número de vistas: 2. ... session_start( ); $_SESSION['contador'] = $_SESSION['contador'] + 1; echo "Número de vistas: " . $_SESSION['contador'] . “.”; 2. Modifica la página web del primer ejercicio para que muestra un mensaje especial para la vez quinta, décima y décimo quinta. Para la vigésima vez elimina la sesión y comienza de nuevo. <?php session_start( ); $contadorPag = $_SESSION['contador'] + 1; if ($contadorPag == 20) { // un valor vacío elimina la variable session_destroy(); echo "Comenzamos de nuevo."; } else { $_SESSION['contador']= $contadorPag; echo "Número de vistas: $contadorPag"; if ($contadorPag == 5) { echo "<br/> Ésta es tu quinta visita."; } elseif ($contadorPag == 10) { echo "<br/> Ésta es tu décima visita."; } elseif ($contadorPag == 15) { echo "<br/> Ésta es tu décimo quinta visita."; } } ?> Página 77 de 164 Kinética Mobile Development Curso de PHP5. 3. Escribe un programa PHP que muestra un formulario que permita al usuario elegir un color de una lista. Crea otra página cuyo color de fondo se establezca al color elegido por el usuario. Almacena el valor del color en $_SESSION para que ambas páginas puedan utilizarlo. <?php session_start( ); $colores = array( '#ff0000' => 'rojo', '#ff6600' => 'naranja', '#ffff00' => 'amarillo', '#0000ff' => 'verde', '#00ff00' => 'azul', '#ff00ff' => 'purpura'); if ($_POST['_envia_form']) { procesaForm( ); } else { muestraForm( ); } function muestraForm() { echo “<form method=’POST’ action=’".$_SERVER['PHP_SELF']."’>”; echo “Color: <select name=’color’>“; foreach($GLOBALS[‘colores’] as $indice=>$color) echo “<option value=’$indice’>$clor</option>”; echo “</select><br/>”; echo “<input type=’submit’ value=’Selecciona Color’>”; echo “<input type=’hidden’ name=’_envia_form’ value=’1’/>”; echo “</form>”; } function procesaForm( ) { $_SESSION['color'] = $_POST['color']; echo "Tu colo favorito es: " . $GLOBALS['colores'][ $_SESSION['color'] ]; } ?> color.php <?php session_start( ); echo “<html> <body bgcolor=’$_SESSION[color]’> Esta página tiene tu color de fondo personalizado. </body> </html>”; ?> Página 78 de 164 Un contratista se asegura que cada subcontratista termine su trabajo para terminar la obra pero no le interesan los detalles particulares de cada tarea. La POO es similar ya que cada objeto oculta a los demás los detalles de su implementación.Kinética Mobile Development Curso de PHP5. Sesión 15. Ventajas de la POO • La facilidad con la que se pueden trasladar requerimientos individuales de negocios a modulos individuales de código. Lo interesante es el servicio que cada objeto es capaz de proveer. Debido a que la POO permite modelar nuestra aplicación basándonos en la idea de objetos del mundo real. Con la programación estructurada vemos nuestra aplicación como un conjunto de procesos que intercambian información. procesos e ideas del mundo real. ¿Qué es la Programación Orientada a Objetos (POO)? La POO necesita una forma diferente de pensar al crear nuestras aplicaciones. a menudo podremos identificar una relación directa entre personas. Introducción. Con la POO modelamos nuestra aplicación como un conjunto de objetos que colaboran entre sí y realizan de forma independiente ciertas actividades. Orientación a Objetos (I). cosas y conceptos con sus clases equivalentes. Actividades: o Introducción. Sólo necesitan conocer lo relacionado con su actividad. nos acercamos con código a tareas. Cuando se construye una casa los carpinteros no necesitan saber si los circuitos de una habitación son de 10 o 20 amperios. Página 79 de 164 . permitiéndonos identificar rápidamente el código que necesitamos escribir y cómo tienen que interactuar entre sí las diferentes partes. Estas clases tienen las mismas propiedades y comportamientos que los conceptos del mundo real que representan. Objetivo. Conocer qué es la Programación Orientada a Objetos y cómo se implementa en PHP. Cómo haga cada uno su trabajo es irrelevante para el resto de componentes del sistema. Cualquier proceso de la aplicación que utilice la clase Persona.Kinética Mobile Development Curso de PHP5. Esta característica simplifica enormemente la detección y búsqueda de errores y hace la adición de características algo trivial. • Objetos: son instancias concretas de una clase que contienen toda la información necesaria para que nuestra aplicación funcione. habremos reutilizado mucho código. los administrativos. Para cada acción en el cuidado que recibe el paciente. Si descubrimos un error en nuestra clase Persona o queremos añadir algún cambio para que funcione. • Herencia: es la habilidad de definir una clase como un subtipo o hija de una superclase o clase padre. • Polimorfismo: permite definir una clase como miembro de mas de una categoría de clases ( tal como un coche es “una cosa con motor” y “una cosa con ruedas”) • Interfaces: define un contrato específicando que un objeto es capaz de implementar un método sin definir realmente cómo Página 80 de 164 . • Otra de las ventajas viene de la mano de la modularidad de las clases. el registro incluye una nota acerca de la persona que realiza esa acción (prescribir una medicina. etc.) y una indicación sobre si esa persona esta autorizada para realizarla. ser verá inmediatamente afectado por el cambio. los doctores.). Si definimos una clase genérica llamada Persona que contenga todos las propiedades y métodos comunes a toda esa gente. Una clase Persona bien hecha puede ser facilmente copiada de un proyecto a otro con alguno o ningún cambio. una aplicación que de un hospital que gestiona el registro de sus pacientes necesita una clase llamada Persona. Por ejemplo. • La reutilización de código. algo que en la programación estructurada se puede hacer bastante complicado. Para el cuidado del enfermo es necesario cierto número de personas (el paciente. o Conceptos de POO • Clases: son el molde de un objeto donde reside el código que define las propiedades y los métodos. Toda la funcionalidad de la clase está contenida en un único archivo. las enfermeras. etc. solo hay un sitio dónde buscar. la reutilización de código entre proyectos. ofreciendonos toda la funcionalidad desarrollada previamente. un tratamiento. Normalmente necesitamos el mismo tipo de datos en diferentes lugares en la misma aplicación. Esta es otra de los grandes beneficios de la POO. poner el interminente para indicar un giro y hacer sonar el claxon. que describen las características y comportamientos de todos los miembros del conjunto. Un clase llamada Coche describiría las propiedades y métodos comunes a todos los coches. Utilizando el concepto de CLASE la POO permite establecer la idea de coche como algo con todas esas características. Las propiedades tienen un nombre y un valor. un fabricante y un depósito de combustible con una cierta capacidad. Un coche tiene un color. el peso del coche (sin carga ni pasajeros) es un valor fijo. Aunque el color del coche se puede cambiar con una mano de pintura. Página 81 de 164 . • Encapsulación: la habilidad que tiene un objeto de proteger el acceso a sus datos internos.Kinética Mobile Development Curso de PHP5. todos tienen un color. parar. Un coche puede acelerar. Algunas permiten que su valor cambie y otras no. Aunque unos coches pueden tener distinto color. Estos son sus comportamientos. en la clase Coche. Las características de una clase se conocen como sus PROPIEDADES. Una clase es una unidad de código. Clases En el mundo real los objetos tienen características y comportamientos. Estas características y comportamientos son comunes a todos los coches. un peso. Por ejemplo. compuesto de variables y funciones. Estas son sus características. podemos tener propiedades como el color y el peso. las características de funcionamiento de ese motor y el terreno sobre el que el coche se desplaza. sino que es un producto de la cantidad de combustible enviada al motor. De la misma forma que.Kinética Mobile Development Curso de PHP5. muchas casas se pueden construir con el mismo plano. La velocidad del coche no es un valor que se pueda cambiar directamente. Los métodos son equivalentes a las funciones utilizadas en la programación estructurada. podemos construirnos una casa. Con el plano en mano y algunos materiales de construcción. este proceso se conoce como instanciación. Los comportamientos de una clase se conocen como sus MÉTODOS. En una aplicación que simule el funcionamiento de un vehículo. incluso pueden utilizarlas para indicar acciones realizadas por el método o cambiar el estado del objeto modificando valores como la velocidad del coche. La clase define el comportamiento y las características que tendrán los objetos. Como las funciones. usamos la clase para construir un objeto. Objetos Podemos pensar en una clase como en un plano para construir un objeto. en la mayoría de los casos. pero no necesariamente los valores que tendrán esas características. podemos crear múltiples instancias de un objeto desde su clase. pero también pueden actúar sobre las propiedades de su objeto. Pero el plano no especifica detalles tales como el color de las paredes o el tipo de suelo. Las clases funcionan de la misma forma. pueden aceptar cierto número de parámetros. Tu casa es análoga a un objeto de esa clase. que son aquellas características que cambian debido a ciertos eventos pero no son modificables directamente. Sólo indica que esos elementos existirán. Algunos métodos actúan sobre datos externos pasados como parámetros. En POO. la clase Coche puede tener una propiedad llamada velocidad. Algunas propiedades representan el estado del objeto. Un objeto es una entidad concreta construida usando el plano proporcionado por una clase. La idea de casa es análoga a una clase. Instanciar un objeto requiere dos cosas: Página 82 de 164 . Tenemos que usar el plano para construir la casa antes de empapelar las paredes o pintarla con gotelé. Los datos para dar valores a las propiedades. Página 83 de 164 . Los objetos se manipulan en tiempo de ejecución cuando los valores se asignan a sus propiedades y se invocan sus métodos. Conocer qué es la Programación Orientada a Objetos y cómo se implementa en PHP. tenemos que instanciar un objeto de la clase antes de que podamos interactuar con sus propiedades o invocar sus métodos. • • Una zona de memoria donde cargar el objeto. Orientación a Objetos (II). Las clases se manipulan en tiempo de diseño cuando haces cambios en los métodos o propiedades. Sesión 16. Una clase nunca tendrá propiedades con valores o un estado.Kinética Mobile Development Curso de PHP5. un fichero de texto plano. Clases y Objetos. Objetivo. se puede poner a trabajar implementando la lógica de la aplicación. Estos datos pueden venir de una base de datos. otro objeto o algun otro origen. De igual forma. Esto lo hace PHP automáticamente. Después de que un objeto es instanciado. Solo lo tienen los objetos. - Actividades: Código fuente: Ejemplo 119. ?> Incluimos el fichero que contiene la clase y creamos con new una nueva instancia de la clase Demo. Ahora podemos invocar los métodos del objeto y examinar o establecer el valor de sus propiedades. o Clases y Objetos en PHP. Nombrar el archivo class.[NombreClase].Demo.php').Demo. Creando una Clase class. $objDemo.php.php <?php require_once('class. Podemos instanciar un objeto de tipo Demo así: testdemo. $objDemo = new Demo().php <?php class Demo { } ?> Convención de código: • • Poner cada clase en un archivo distinto. Página 84 de 164 .Kinética Mobile Development Curso de PHP5. El valor que devuelve esta clausula es una referencia a la instancia que se asigna a una nueva variable. ?> El operador -> se usa para acceder a todos los métodos y propiedades de nuestros objetos.php'). Añadiendo una Propiedad Página 85 de 164 .Demo1. Aunque la clase no haga nada ni tenga propiedades con las que trabajar. $objDemo = new Demo1(). $objDemo->diHola(‘Florencio’). La clase Demo no es muy útil si no es capaz de hacer algo. Para invocarlo se usa el operador ->: testdemo1. Añadiendo un método.Kinética Mobile Development Curso de PHP5. es una forma válida de definir una clase. } } ?> Un objeto derivado de nuestra clase ahora es capaz de mostrar un mensaje de bienvenida a cualquiera que invoque el método diHola. class.php <?php require_once('class.php <?php class Demo1 { function diHola ( $nombre ) { echo "¡Hola $nombre!".Demo1. $objOtroDemo = new Demo2(). testdemo2.Kinética Mobile Development Curso de PHP5. $objOtroDemo->diHola().Demo2. Simplemente declaramos una variable dentro de la clase. function diHola() { echo " ¡Hola $this->nombre!". por tanto no deben ser accesibles desde código externo. Algunas propiedades existen sólo para uso interno de la clase. Esta variable la declaramos al principio de la declaración de la clase. Página 86 de 164 . ?> Resultado: ¡Hola Florencio!¡Hola Epi! La palabra clave public es usada para indicar que la variable pueda ser usada desde fuera de la clase. dentro de las llaves que conforman el cuerpo de la clase.php').php <?php require_once('class. } } ?> Hemos creado una propiedad de la clase Demo llamada $nombre.Demo2. $objDemo->nombre = ‘Florencio'. $objDemo = new Demo2(). class. Para acceder a esta propiedad usamos el mismo operador que antes -> junto al nombre de la propiedad.php <?php class Demo2 { public $nombre. $objOtroDemo->nombre = 'Epi'. $objDemo->diHola(). php: class. en lugar de pasarle un parámetro. la variable $this permite a cada objeto acceder a sus propiedades y métodos sin tener que saber el nombre de la variable que lo representa en la aplicación. es una referencia a sí mismo. Se conocen como getters y setters porque suelen nombrarse como get[nombrePropiedad]() y set[nombrePropiedad](). en el momento de establecer el valor de la propiedad no puede ser ordenada.Kinética Mobile Development Curso de PHP5. no $objeto->$propiedad.Demo3. es decir. toma el valor de la propiedad $nombre de la clase. por ejemplo. el acceso a las propiedades se hace en forma de funciones que obtienen y establecen las propiedades de la clase. Sin embargo.Demo3. o Protegiendo el acceso Podemos asignar el valor de una propiedad a cualquier cosa que queramos. la sintaxis correcta es $objeto->propiedad . El objeto usa la variable $this para obtener información sobre sí mismo. En este ejemplo. queremos que el valor de la propiedad se pueda establecer y recuperar. La forma de trabajar del método diHola() ha cambiado. un manejador de fichero o cualquier otro valor. la variable $this nos ayuda a referenciar el objeto cuestión En el ejemplo.php <?php class Demo3 { private $nombre. por convenio. Creamos el fichero class. tampoco podemos proteger la clase de un posible error al establecer su valor o un acceso no autorizado al obtenerla. Podemos tener múltiples objetos de una clase y como no es posible conocer de antemano el nombre del objeto. Recordad. Para ello. como a un array de enteros. tanto a otro objeto. validada o actualizada. con lo que. Página 87 de 164 . $objDemo->setNombre('Florencio'). } public function setNombre($nuevoNombre) { Curso de PHP5.php').php: testdemo3.php <?php require_once('class. Página 88 de 164 . asegurando que los valores a asignar serán siempre evaluados por la clase. } } ?> Comprobamos en testdemo3. Sin embargo. tanto las propiedades como los métodos Si las propiedades se convierten en privadas estamos forzados a acceder a ellas a través de los setters/getters. } $this->nombre = $nuevoNombre.Demo3. Además hemos etiquetado el acceso al método como público. "). // esto mostrará un error ?> La palabra reservada private protege el código haciéndolo inaccesible desde fuera del objeto. $objDemo->diHola(). $objDemo = new Demo3(). tanto propiedades como métodos. Si no etiquetamos un miembro de una clase. private. es una buena práctica siempre establecer el nivel de visibilidad. " ! ". $this->getNombre() . Una propiedad o método puede tener tres niveles diferentes de visibilidad: • • public. if(!is_string ($nuevoNombre) || strlen($nuevoNombre) == 0){ die("Valor de nombre inválido. accesibles por cualquier código. accesibles únicamente por la clase en la que se definen.Kinética Mobile Development public function diHola() { echo "¡ Hola ". } public function getNombre() { return $this->nombre. $objDemo->setNombre(37). el nivel de visibilidad que se establece por defecto es public. usual en POO. los constructores tenían el mismo nombre que la clase. Con PHP5. En PHP. que permite realizar las acciones necesarias al instanciar el objeto. etc.php <?php class Demo4 { private $nombre. por norma.Demo4. } } ?> testdemo4. se busca en primer lugar el método __construct() y si no se encuentra busca un método con el mismo nombre que la clase. o Inicializando Objetos En la mayoría de las ocasiones. public function __construct($nombre) { $this->nombre = $nombre. y será PHP quien lo invoque automáticamente cuando instanciemos un objeto de la clase. A veces es necesario obtener cierta información de una base de datos. accesibles por la clase en la que se definen y por aquellas que heredan de ésta. Página 89 de 164 . Utilizar getter/setters con nuestras propiedades hará mucho más simple cualquier cambio debido a nuevos requerimientos en el futuro. • protected. inicializar algunas propiedades. } function diHola() { echo "¡ Hola $this->nombre !".Demo4.php <?php require_once('class. $objDemo = new Demo3(‘Florencio’). $objDemo->diHola(). ?> Nota: En PHP4. se llama __construct().Kinética Mobile Development Curso de PHP5. cuando creamos clases. necesitamos realizar diversas acciones justo cuando se instancia un objeto de la clase. class. para mantener la compatibilidad hacia atrás.php'). Para ello creamos un método llamado constructor. no es necesaria la creación de constructor. Para hacer esto creamos una función llamada __destruct sin parámetros.Kinética Mobile Development Curso de PHP5. En PHP5 es posible detectar cuando se va a destruir un objeto y realizar acciones al efecto. Página 90 de 164 . o Destruyendo Objetos Las variables de objeto que creamos se eliminan de la memoria del sistema cuando la página solicitada se ha terminado de ejecutar o cuando se establece como nula. Si no necesitamos hacer algo especial en la instanciación del objeto. de forma que antes de que el objeto sea destruido será llamada automáticamente. Esto nos permite realizar acciones de última hora como cerrar ficheros o conexiones con bases de datos. número de bastidor. Para asegurar que cada una de estas clases tiene las mismas propiedades podemos copiar el código que las define en cada fichero que contiene la definición de las clases. Un turismo es un coche de cuatro puertas. Una furgoneta no tiene maletero pero tiene una capacidad de carga y un peso máximo aproximado. La herencia nos permite definir una clase base. año. Orientación a Objetos (III). modelo. Página 91 de 164 . etc. o Herencia. La aplicación necesitaría no solo mostrar cuántos de estos elementos tenemos en stock sino también las características de estos vehículos para que los vendedores proporcionen información a los clientes. se puede reutilizar código usando un proceso llamado HERENCIA. Conocer la herencia en PHP. y decir que otras clases son un tipo de Automovil y que tales clases tienen todas las mismas propiedades y métodos que tiene Automovil. Sesión 17. Furgoneta y MonoVolumen. que es la habilidad que tiene una clase para asumir los métodos y propiedades de una clase padre o superclase. Para una monovolumen necesitaremos saber el número de puertas corredizas y número de asientos.Kinética Mobile Development Curso de PHP5. Podemos decir que un Turismo es un Automovil y por lo tanto automáticamente hereda todo lo definido por la clase Automovil sin tener que copiar ningún código. fabricante. Objetivo. Si estamos creando una aplicación de inventario de un concesionario de coches. Actividades: Código fuente: Ejemplo 120. Pero en POO. y probablemente necesitaremos registrar el espacio del habitáculo y la capacidad del maletero. Aunque son diferentes tipos de vehículos comparten ciertos tipos de características como el color. en este caso Automovil. esto no es necesario. que se corresponderían con los mismos tipos de automoviles que tendríamos en el inventario. probablemente tendríamos clases para Turismo. Herencia. solo tenemos que definir las diferencias. o Herencia en PHP. longitud de pelo y velocidad en carrera. Es decir. Los gatos domésticos no tienen ninguna de estas cosas. podemos aceptar objetos de cualquier clase que hereden de Automovil. necesitaríamos una clase Felino. los leones tienen melena y rugen. Sin embargo. Como todos los Turismos. Si tuviesemos que diseñar una aplicacion para gestionar los animales de un zoo. Solo es necesario que añadamos a la clase Turismo las propiedades y métodos que no se comparten con el resto de clases que heredan también de Automovil. Por ejemplo. para tener algo sobre lo que trabajar. Consideremos el ejemplo de los felinos. Antes de escribir código vamos a planificar nuestra jerarquía de clases con diagramas UML. Este método imprime la factura y decrementa el stock. También comparten propiedades como el peso. Los guepardos tienen manchas. color. (Más adelante veremos un poco de UML) Página 92 de 164 . Leon y Guepardo. que toma un parámetro que es un objeto de la clase Automovil. Como heredan de Automovil. podemos pasar objetos de estas clases al método que espera un Automovil. En PHP se especifica que una clase es una subclase de otra usando extends. duermen. estas tres clases contienen las mismas propiedades y métodos base. las similitudes se heredan de la clase base. pero los tres son felinos. Siempre que necesitemos trabajar con métodos o propiedades comumes a todos los Automoviles. escupen bolas de pelo y cazan.Kinética Mobile Development Curso de PHP5. tenemos una clase Cliente con un método comprarAutomovil. Comen. Furgonetas y MiniVolumenes son Automoviles. Tenemos una ventaja mayor con la herencia. Todos los felinos comparten las mismas actividades. } } ?> Esta clase establece los métodos y propiedades comunes a todos los felinos. Este diagrama de clases contiene una clase padre Felino con dos subclases: León y Guerpardo que heredan de Felino. "<br/>". public $velocidadCarrera. // en km/h public function comer() { // código para comer } public function dormir() { // código para dormir } public function cazar(Presa $objPresa) { //código para cazar objetos de tipo Presa // que no definiremos } public function escupirBolaPelo() { echo "jjjjjjjjjjjjjjj." .php <?php class Felino { public $peso. class. class. y Guepardo la propiedad numeroManchas. Además.php Página 93 de 164 .Kinética Mobile Development Curso de PHP5.Leon.Felino.. public $longitudPelo. León implementa la propiedad longitudMelena y el método rugir().. // en kg public $color. Casa. } } ?> Ahora podemos hacer lo siguiente: testLeon. // kg $objLeon->color = 'marron'. // en cm public function rugir() { echo "Roarrrrrrrrr!".Leon. $objLeon->peso = 200.php'). $objLeon->rugir(). ?> Si en otro objeto de nuestra aplicación definimos un método como este: class. <?php require_once('class. } } Podríamos hacer esto: testCasa. $objLeon = new Leon().php').Kinética Mobile Development Curso de PHP5. $objLeon->dormir(). Página 94 de 164 .Leon.php'). // cm $objLeon->comer(). $objLeon->longitudMelena = 36.php class Casa { public function miMascota(Felino $objFelino) { $objFelino->escupirBolaPelo().php <?php include('class.Casa.Felino. class Leon extends Felino { public $longitudMelena.php').php <?php include('class. include('class. Kinética Mobile Development $objLeon = new Leon(). Página 95 de 164 . ?> Curso de PHP5. $objCasa = new Casa().Guepardo. miMascota($objGuepardo).Felino. class Guepardo extends Felino { public $numeroManchas. } } ?> testFelinos. ?> o Sobrescribiendo Métodos.". Heredar de una clase padre no significa que la clase hija tenga que usar la implementación que la clase padre hace en un método. } } $objGuepardo = new Guepardo(). $objFelino = new Felino(). $objCasa->miMascota($objLeon). function miMascota(Felino $objFelino) { if($objFelino->velocidadCarrera < 5) { $objFelino->escupirBolaPelo().php <?php require_once('class. public function __construct() { $this->velocidadCarrera = 100. Vamos a ver cómo un constructor puede extender y especializar una clase. class.php'). Cualquier cambio que hagamos en la clase Felino lo hereda automáticamente la clase Leon. " km/h. se mueve a " .Guepardo.php'). miMascota($objFelino). } else { echo "No puedo atrapar al gato.php <?php require_once('class. $objFelino->velocidadCarrera . Heredando y sobrescribiendo métodos de la clase padre podemos permitir a las subclases especializar la implementación de algunos métodos. Todos los polígonos tienen un area calculable.Rectangulo.Kinética Mobile Development Curso de PHP5. Esta capacidad de averiguar en tiempo de ejecución qué método llamar se llama Polimorfismo.php Página 96 de 164 . Area = (1/2 h) ⋅ b Area = w ⋅ h Si redifinimos el método de la clase podemos tener nuestra propia implementación del cálculo del area. class. si necesitamos crear un programa que calcule el area de diferentes figuras geométricas y tenemos clases como Rectangulo y Triangulo. En el caso de la clase Rectangulo. Por ejemplo. ambas pueden heredar de una clase padre llamada Poligono. Es la habilidad de una aplicación para hacer cosas diferentes basándose en el objeto sobre el que actúa. solo que la forma de calcularla varía con los diferentes tipos de polígonos. La clase Poligono puede tener una propiedad llamada numeroLados y un método llamado getArea. o Sobrescribiendo Métodos en PHP. Una función que tenga como parámetro un Poligono y necesite mostrar el area de ese polígono llamará al método getArea() de la subclase de Poligono que le pasemos (Rectangulo o Triangulo). necesitamos crear dos propiedades nuevas: alto y ancho y sobreescribir el método de Poligono getArea(). Rectangulo.php <?php class Cliente { public $id. class Cuadrado extends Rectangulo { public function __construct($lado) { $this->alto = $lado. } } ?> Curso de PHP5. } public function getArea() { return pow($this->alto.Cliente. $alto) { $this->ancho = $ancho. public function __construct($ancho. sino parte de él. class.php').php <?php require_once('class. public $ancho.Cuadrado. class.Kinética Mobile Development <?php class Rectangulo { public $alto. } public function getArea() { return $this->alto * $this->ancho. } } ?> Preservando la funcionalidad de la clase padre En ocasiones no necesitamos sobrescribir por completo un método de la clase padre. llamamos en primer lugar al método de la clase padre y a continuacióna añadimos nuestro código. $this->alto = $alto. $this->ancho = $lado. 2). Cuando queremos solo añadir cierta funcionalidad al método que hemos heredado. Para obtener la funcionalidad de un método de la clase padre que estamos sobrescribiendo escribimos parent::[nombre método]. Página 97 de 164 . } else { $objCliente = new Cliente(12345). } } ?> Curso de PHP5. if ($promocionActiva) { $objCliente = new PremioCliente (12345). class. $this->clienteNumero = $datos['clienteNumero'].php <?php require_once('class. class PremioCliente extends Cliente { public function __construct($clienteID) { parent::__construct($clienteID). } } } ?> Vamos a ver cómo funciona: testCliente.php').php <?php require_once('class. function bienvenidaCliente (Cliente $objCliente) { echo "¡Bienvenido de nuevo a la tienda $objCliente->nombre!". public function __construct($clienteID) { // Vamos a escribir los datos de cliente // aunque en una aplicación real // obtendríamos los datos de la base de datos $datos = array().PremioCliente. public $nombre. $datos['numeroCliente'] = 1000000.Cliente. } bienvenidaCliente($objCliente).PremioCliente. if($this->clienteNumero == 1000000) { echo "¡Felicidades $this->nombre! " . "¡ Has ganado un cepillo de dientes! ". $this->nombre = $datos['nombre']. // Asignamos los valores al objeto $this->id = $clienteID. $datos['nombre'] = 'Florencio Analista'.Kinética Mobile Development public $numeroCliente. } // Cambiamos este valor para elegir la clase del cliente $promocionActiva = true. "¡Eres el cliente un millón! " .php'). ?> Página 98 de 164 . Abierto. sin embargo. Por ejemplo. Objetivo. Aprender a definir y usar Interfaces en PHP. Declarando un interface e implementándolo en nuestros objetos. Orientación a Objetos (IV). podemos llamar a funciones comunes desde clases completamente diferentes. Actividades: Código fuente: Ejemplo 121.Kinética Mobile Development Curso de PHP5. o Interfaces. Las bicicletas y las pelotas de futbol son cosas totalmente diferentes. Un interfaz permite especificar que un objeto es capaz de realizar una determinada función. ¿Que hacen los Interfaces? Este concepto es aplicable a la POO. Sesión 18. no tienen otro tipo de relación. A veces tenemos un grupo de clases que no están necesariamente relacionadas a través de la herencia. Un interfaz es como un contrato entre varios objetos para confirmar que realizan una determinada función. Página 99 de 164 . un buen sistema de inventario en un almacen de deportes debe ser capaz de tratar los objetos que representan estos elementos sin problemas. sin embargo. pero tienen comportamientos en común. pero no nos dice cómo lo hace. tanto un tarro como una puerta se pueden abrir y cerrar. Un objeto que implemente este interfaz garantiza a quien lo use que es capaz de realizar todas las funciones definidas en la interfaz.php: <?php interface Abierto { abstract function abrir(). interface. Interfaces. Si no lo hacemos así PHP producirá un error. que son definidos como abstractos. está bloqueada. class. o ¿Cómo trabajan los Interfaces? El interfaz Abierto es un contrato con otras partes de la aplicación indicando que cualquier clase que implemente este interfaz debe propocionar dos métodos.Kinética Mobile Development abstract function cerrar(). Un interfaz no tiene propiedades y no implementa ninguno de sus métodos. } public function desbloquearPuerta() { $this->_bloqueada = false. } else { echo "crack. Con este acuerdo permitimos que muchos objetos diferentes reconozcan la misma función sin la necesidad de relaciones de herencia entre ellos. } public function bloquearPuerta () { $this->_bloqueada = true. Convención: para llamar a los ficheros de interfaz interface.Puerta. class Puerta implements Abierto { private $_bloqueada = false. llamados abrir() y cerrar().php').[nombreInterface]. } } public function cerrar() { echo "¡¡ Blam !!<br>".. } } ?> Página 100 de 164 .php. } ?> Curso de PHP5. public function abrir() { if($this->_bloqueada) { echo "No puedo abrir la puerta..Abierto. Definirlos como abstractos implica que cualquier clase que implemente este interfaz está obligado a implementar sus métodos.". sin parámetros.<br>".php <?php require_once('interface. php’).Tarro.php'). porque no forman parte de la interfaz. public function __construct($contenidos) { $this->contenidos = $contenidos.php'). } public function cerrar() { echo "el tarro ahora está cerrado <br/>". } public function abrir() { echo "el tarro ahora está abierto <br/>". abrirAlgo ($objPuerta). class. $objTarro = new Tarro("miel"). podemos llamar a los métodos abrir() y cerrar(). } } ?> testAbierto. class Tarro implements Abierto { private $contenidos.Puerta.Kinética Mobile Development Curso de PHP5. abrirAlgo ($objTarro). function abrirAlgo (Abierto $obj) { $obj->abrir(). pero no podemos acceder a la propiedad $contenidos de Tarro ni a los métodos bloquearPuerta() y desbloquearPuerta(). por lo que podemos pasar sus objetos a la función abrirAlgo(). Página 101 de 164 .Tarro. } $objPuerta = new Puerta().Abierto.php <?php require_once('class. ?> Tanto Puerta como Tarro implementan el interface Abierto. Como la función únicamente acepta aquellos objetos que implementen el interface Abierto. require_once('class.php <? require_once('interface. en un fichero de texto o en un archivo XML.Kinética Mobile Development Curso de PHP5. Podemos tener una clase en la que no necesitamos saber si la información está almacenada en base de datos. Como nada fuera de nuesta clase puede modificar el estado o las propiedades de un objeto de nuestra clase sin querer. La habilidad de ocultar detalles de implementación se conoce como encapsulación y está relacionada con dos conceptos: • • Proteger la información interna de la clase de código externo. Tampoco necesitamos saber si la información que contiene un objeto se implementa como variables simples. 2. pueden ser referenciadas o no desde fuera. Los miembros protegidos solo son visibles para las subclases que heredan de nuestra clase. Una clase bien diseñada proporciona un escudo completo y presenta un interfaz hacia el exterior totalmente separada de su parte interna. es decir. Los miembros privados no son accesibles desde fuera y se utilizan para la implementación interna de la clase. Podemos cambiar los detalles de implementación en cualquier momento sin que afecte al código que usa nuestra clase. arrays o incluso otros objetos. dentro o fuera de la clase. o Encapsulación Los objetos son capaces de ocultar ciertos detalles de su implementación a otros objetos. Haciendo esto obtenemos dos ventajas: 1. Los miembros públicos son utilizables por cualquier código. Ocultar los detalles de implementación. Tanto las propiedades como los métodos de una clase tienen visibilidad. Página 102 de 164 . podemos confiar en que el estado del objeto y el valor de sus propiedades son válidos. es muy aconsejable que cualquier propiedad que pueda se modificada desde fuera se encapsule en un método público para validar y aceptar o denegar los cambios. Normalmente. Página 103 de 164 . Cualquier acceso a estas variables desde fuera de la clase debe ser hecho a través de métodos de acceso (getters/setters).Kinética Mobile Development Curso de PHP5. todos las propiedades internas de la clase deben ser declaradas como privadas. Por lo general. Silvia. Debe permitir a los usuarios web ver detalles de las diferentes bandas que la compañia representa y conocer sus próximos conciertos. Las personas que intervienen en la reunión son Juan. En este momento ya disponemos de los requerimientos iniciales de nuestra aplicación. Sesión 19. el propietario de la empresa. Objetivo. Analizar y diseñar una aplicación usando UML. Vamos a analizar y diseñar un hipotético sistema de gestión de bandas de música: Triunfitos.Kinética Mobile Development Curso de PHP5. y Florencio. es importante identificar bien los roles implicados. En una conversación telefónica inicial. el cliente nos explica que Triunfitos: 1. 2. o Reunión con el cliente. Introducción al Lenguaje de Modelado Unificado (UML) I. un administrativo de la empresa. la gerente. Al principio de la reunión. Actividades: Código fuente: Ejemplo 122. Un cliente de una discográfica ha contactado con nosotros para desarrollar un sistema web para gestionar las bandas de sus clientes. editar la información de las bandas existentes e incluir la reserva de entradas para nuevas actuaciones. o Contexto. En la conversación telefónica concertamos una reunión con el cliente. Página 104 de 164 . Alguien de la discográfica debe ser capaz de añadir nuevas bandas al sistema. 3. es decir. Los usuarios pueden visitar el sitio web de Triunfitos y navegar consultando la información de las bandas. Por tanto. Describe cómo espera ella que el sistema funcione y cómo maneja la empresa actualmente esos procesos. podemos determinar a Silvia como nuestra Experta en el Dominio. Hemos obtenido la siguiente lista de anotaciones de la entrevista: 1. c) Añadir una nueva actuación.Kinética Mobile Development Curso de PHP5. Esto incluye reservar un local y generar entradas. b) Editar la información existente de una banda. Durante las siguientes reuniones contactaremos directamente con ella. Esa información incluye el tipo de banda. Juan no está atento durante la entrevista y es interrumpido constantemente por el móvil para atender asuntos de alto nivel de la empresa. Esta persona se suele llamar Experto en el Dominio. El administrador del sitio puede: a) Añadir información sobre las bandas. o alguien que conoce cómo funciona el negocio y qué necesita nuestro software para modelar correctamente algun proceso de ese negocio. los músicos de la banda y qué instrumentos tocan. La reserva de un local y la generación de entradas se gestiónan a través de otras empresas. Florencio solo aclara que el será la persona responsable de introducir la información en nuestro sistema. 2. Observamos que Silvia es quién habla la mayor parte del tiempo. La persona clave a identificar en la obtención de requisitos es aquella que dispone de los conocimientos detallados acerca del dominio. Los usuarios pueden ver información acerca de las próximas actuaciones que pueden incluir una o varias bandas. el area en el que vamos a modelar nuestro sistema. Página 105 de 164 . Estas empresas tienen sistemas de reserva que usaremos para notificar nuestras actuaciones vía Triunfitos. Esa persona puede ser alguien que realiza de forma manual el proceso que se intenta automatizar. Volvamos a nuestra entrevista. o Diagramas de Casos de Uso Los diagramas de casos de uso muestran el sistema desde el punto de vista del usuario. Por ejemplo. en este caso. aunque también puede representar un sistema externo que actúa sobre el nuestro. El caso de uso Navegar Información Bandas es bastante general. Este es un diagrama de caso de uso simple que muestra que los usuarios visitan el sitio web Triunfitos y navegan consultando la información de las bandas. el escenario para el caso de uso anterior sería: Página 106 de 164 . El monigote se denomina actor y la elipse es el caso de uso.Kinética Mobile Development Curso de PHP5. los casos de uso se pueden dividir en escenarios separados. no es necesario mayor nivel de detalle. Ahora cubriremos todos los casos de uso que nuestro sistema vaya a contemplar. La línea indica que este actor puede realizar ese caso de uso. El actor normalmente es un rol asociado a una persona. Un caso de uso representa una tarea que el usuario intenta realizar con el sistema. Para empezar. Un escenario es la secuencia de pasos que comprende un caso de uso. Si es necesario. El usuario visita el sitio web Triunfitos.Kinética Mobile Development Curso de PHP5. ambos comparten ese caso de uso. El usuario navega por el sitio utilizando el menú. necesaria para los casos de uso de administración. El usuario examina la información de las bandas/músicos/actuaciones. actores diferentes pueden compartir un caso de uso. 3. El cliente mencionó que la sección de administración del sitio estuviese protegida accediendo a través de una contraseña. De hecho. podemos usar un include para indicar que ese caso de uso es parte de los otros tres casos. Página 107 de 164 . En un diagrama de casos de uso pueden aparecer varios actores. Como tanto el administrador como los usuarios normales pueden consultar la información de las bandas. 2. El caso de uso para las tareas administrativas nos quedaría así: Los casos de uso administrativos son las tareas separadas que el administrador puede realizar al usar el sistema Triunfitos. Como el acceso al sistema puede ser visto como una tarea en sí misma. 1. los usuarios pueden ver información sobre los diferentes tipos de músicos. Sería una buena idea tener una clase Musico. Los diagramas de clase son los más importantes en un proyecto. que realiza la tarea de actualizar la información acerca de las próximas actuaciones. y permiten un nivel variable de detalle desde un nivel muy alto hasta uno muy específico sobre los métodos y propiedades de una clase. el sistema de reserva. Este es el diagrama de clases básico: Página 108 de 164 . Además. Los dos diagramas siguientes completan los casos de uso del sistema Triunfitos.Kinética Mobile Development Curso de PHP5. el caso de uso incluirá un actor no humano. o Diagramas de Clases Modelando el Dominio En nuestra aplicación. o incluso mejor. un interface Musico que todos los tipos de músicos puedan implementar. Describen el dominio que estamos modelando. Kinética Mobile Development Curso de PHP5.apellidos : String . } public function setNombre($nombre. String + getBanda() : String La caja del medio muestra sus atributos y la de abajo los métodos. class. $nombre. $this->nombre = $nombre. ‘ ’ .nombreBanda : La caja de arriba muestra el nombre de la clase.nombre : String . El signo más indica que los métodos son públicos.tipo : String . $this->apellidos. $this->tipo = $tipoMusico. private $nombre.Musico. + getNombre() : String + getTipo() : String + setBanda() + setTipo() + setNombre() Los tipos de atributos se indican después de los dos puntos. El signo menos indica que el atributo es un miembro privado de la clase. Musico . se indica después de los dos puntos. private $tipo. Si alguno de los métodos devuelve un valor. } public function setBanda($nombreBanda) { $this->nombreBanda = $nombreBanda. function __construct($apellidos. } public function getBanda() { echo $this->nombreBanda.php class Musico { private $apellidos. $apellidos) { $this->nombre = $nombre. } public function setTipoMusico($tipoMusico) { $this->tipo = $tipoMusico. $tipoMusico) { $this->apellidos = $apellidos. } public function getTipoMusico () { echo $this->tipo. private $nombreBanda. } } Página 109 de 164 . } public function getNombre() { echo $this->nombre . $this->ultimo = $ultimo. Estas ideas nos ayudan en el diseño. Cuando se nos presentan ciertos elementos variables que necesitan mayor grado de complejidad es necesario que tengan sus propias clases. querremos conocer algo más acerca de la banda además de su nombre. una Banda puede tener muchos Musicos.Kinética Mobile Development Curso de PHP5. el atributo nombreBanda ha sido movido a como un atributo de la clase Banda. En nuestro ejemplo usamos cadenas de texto para los tipos de las propiedades y métodos de nuestra clase. o muchos Musicos pueden estar en una Banda. necesitamos conocer cómo interactúan entre ellas. En ocasiones no es necesario mostrar todos los atributos y métodos de una clase. el genero de música que tocan. etc. Esta no es una buena idea. La línea que conecta las dos clases es un tipo de relación conocida como asociación. sino sólo lo relevante en el contexto . Para este ejemplo. Asociaciones Como se observa en la siguiente figura. Relaciones Como Triunfitos necesita varias clases. Página 110 de 164 . Si un músico fuese parte de una banda. la asociación es de uno-a-muchos (1 a *). La línea de asociación puede indicar también la navegabilidad. los otros componentes de la banda. Por ejemplo. una navegabilidad bidireccional. es decir. La realización se dibuja como una línea discontinua con una punta de flecha vacia. Realizaciones y Generalizaciones Como antes vimos. Página 111 de 164 . Si la asociación nos permite navegar en una sola dirección. En el ejemplo. indicamos una relación entre ellas llamada realización. la línea sin flechas muestra que nos podemos mover en ambas direcciones. En la figura siguiente. la clase Musico tiene acceso a cualquier Instrumento en su colección interna.Kinética Mobile Development Curso de PHP5. se trata de una navegabilidad unidireccional. se pueden derivar otras clases como Guitarrista y Percusionista. De esta forma. Cuando queremos mostrar un interface y las clases que lo implementan. pero el Instrumento no es consciente de qué Musico lo posee. Los interfaces en UML son parecidos a los diagramas de clases pero se incluye la palabra interface entre comillas españolas. que siguen las reglas de comportamiento impuestas por Musico. cada clase tiene una referencia interna a la otra. Cuando queremos mostrar herencia desde una clase abstracta o regular usamos la generalización. es una buena idea crear un interface Musico que las otras clases puedan implementar. que es idéntica a la realización pero con línea contínua. Es decir. Una composición es una relación estricta que se caracteriza por dos elementos: 1. el interface Instrumento se implementa en una clase concreta como Guitarra o Piano. 2. La notación para la agregación es la misma que para la composición pero el diamante está vacío. En nuestra aplicación. Un tipo más general de composición se denomina agregación. las relaciones entre clases no están basadas en las asociaciones o la herencia sino en la forma en la que se agrupan las clases. La parte de una composición no puede ser parte de otra relación. Consideremos el ejemplo de la batería. Una instancia de Bateria contendrá instancias de clases Tambor y Platillo. La nueva notación de las líneas con un diamante negro indica que Bateria es una composición de clases Tambor y Platillo. las partes que lo componen también se eliminan. Las clases Bateria. Cuando se elimina una instancia de Batería. Tambor y Platillo también la implementan. Composiciones A menudo.Kinética Mobile Development Curso de PHP5. Página 112 de 164 . public function asignarAbanda(Banda $banda). $apellidos) { $this->apellidos = $apellidos. " " .php <?php interface Banda { public function getNombre(). } interface Musico { public function nuevoInstrumento(Instrumento $instrumento). $this->tipoMusico = "guitarrista". public function getTipoMusico(). } public function getNombre() { return $this->nombre . private $referenciaBanda. $this->apellido. } class Guitarrista implements Musico { private $apellidos. public function nuevoMusico(Musico $musico). public function getGenero(). } public function getInstrumentos() { return $this->instrumentos. private $tipoMusico. function __construct($nombre. public function getInstrumentos(). } public function nuevoInstrumento(Instrumento $instrumento) { array_push($this->instrumentos. Implementación Vamos a ver un ejemplo en código que ilustre todo esto: ejemplo122. $this->instrumentos = array().Kinética Mobile Development Curso de PHP5. } public function asignarAbanda(Banda $banda) { $this->referenciaBanda = $banda. private $nombre. public function getCategoria(). Página 113 de 164 . $this->nombre = $nombre. La agregación permite compartir instancias de otras clases y no es necesario eliminarlas cuando el todo es eliminado. } public function getBanda() { return $this->referenciaBanda. public function getMusicos(). private $instrumentos. } interface Instrumento { public function getNombre(). $instrumento). } public function getTipoMusico () { return $this->tipoMusico. $musico->getBanda()->getGenero(). $this->setTipoMusico ("guitarrista principal"). } public function getCategoria() { return $this->categoria. } public function getGenero(){ return $this->generoBanda. $bandaMiembroB->nuevoInstrumento(new Guitarra("Fender Stratocaster")). " ". $musico->getTipoMusico() . } } Curso de PHP5. } } class BandaRock implements Banda { private $nombreBanda. Página 114 de 164 . $apellido). } public function nuevoMusico (Musico $musico){ array_push($this->musicos. } public function getMusicos() { return $this->musicos. $this->musicos = array(). echo " conocida como " . echo "en la banda de " . $musico->getBanda()->getNombre() . "Float"). } public function getNombre() { return $this->nombreBanda. $banda->nuevoMusico($bandaMiembroB). $banda->nuevoMusico($bandaMiembroA). $bandaMiembroA = new Guitarrista("Juan". } } class Guitarra implements Instrumento { private $nombre. $instrumento->getCategoria() . $bandaMiembroB = new GuitarristaPrincipal("Tommy". function __construct($nombre) { $this->nombre = $nombre.$musico->getNombre() . foreach($banda->getMusicos() as $musico) { echo "Musico ". private $categoria. $bandaMiembroA->nuevoInstrumento(new Guitarra("Gibson Les Paul")). $bandaMiembroB->nuevoInstrumento(new Guitarra("Hondo H-77")).Kinética Mobile Development } public function setTipoMusico ($tipoMusico) { $this->tipoMusico = $tipoMusico. "<br>". foreach($musico->getInstrumentos() as $instrumento) { echo "Y toca la " . echo "es el " . $this->generoBanda = "rock". private $generoBanda. } } class GuitarristaPrincipal extends Guitarrista { function __construct($nombre. $apellido) { parent::__construct($nombre. $this->categoria = "guitarra". "<br>". function __construct($nombreBanda) { $this->nombreBanda = $nombreBanda. $musico). } public function getNombre() { return $this->nombre. "<br>". "Integer"). private $musicos. $musico->asignarAbanda($this). // Probar Objetos $banda = new BandaRock("Los Variables"). Kinética Mobile Development echo $instrumento->getNombre() . "<br>"; } echo "<p>"; } ?> Curso de PHP5. Vemos como no es necesario saber con qué tipo de Musico o Instrumento estamos tratando antes de llamar a sus métodos. Como se siguen las reglas definidas en la interface sabemos que los objetos responderán apropiadamente. Esto es un ejemplo de polimorfismo. Si necesitamos añadir otro tipo de músico escribimos la nueva clase y definimos su comportamiento implementanto el interface Musico. Página 115 de 164 Kinética Mobile Development Curso de PHP5. Sesión 20. Introducción al Lenguaje de Modelado Unificado(UML)(II). Objetivo. Analizar y diseñar una aplicación usando UML. Actividades: o Diagramas de Actividad. Silvia mencionó en la reunión que la aplicación Triunfitos, al añadir una nueva actuación, necesitará enganchar con otros dos sistemas de terceros: el sistema de entradas y el sistema de reserva de locales. Para comprender el orden en el que tienen que realizarse las diferentes tareas podemos dibujar lo que se conoce como diagrama de actividad. Los diagramas de actividad son muy recomendables en aquellas situaciones en las que es necesario comprender el flujo de las actividades que tienen lugar en un caso de uso. En este ejemplo, el caso de uso es la reserva de una actuación por parte del administrador de Triunfitos. Conversaciones posteriores con Silvia revelaron que el sistema no solo tendrá que enviar un mensaje al sistema de reservas del local, sino que también necesita recibir información de ambos sistemas. El sistema de locales enviará una confirmación de que el local está disponible y el sistema de entradas devolverá cierta información tal como el precio. Si el administrador intenta reservar un local en una hora o fecha no disponible, el sistema de reserva de locales debe indicarlo al sistema y éste al administrador, que lo intentará con otra fecha. Página 116 de 164 Kinética Mobile Development Curso de PHP5. La siguiente figura muestra el diagrama de actividades descrito: Los diagramas de actividad comienzan con un círculo negro, llamado punto de inicio. Desde ahí el flujo del proceso sigue las flechas, llamadas transiciones, hacia los rectángulos redondeados que representan actividades. Un diamante vacío indica un punto de decisión. El flujo se divide según la condición expresada en la decisión. La decisión en el ejemplo es si el local está o no disponible para la fecha dada. Después de la decisión, una barra negra (fork) divide el flujo en dos actividades diferentes. En el sistema de locales, se genera una confirmación que será enviada de vuelta al sistema Triunfitos y el sistema de entradas genera las entradas para el evento. Tanto el sistema de entradas como el de locales envían información de vuelta a Triunfitos hacia otra barra negra (join). El join indica que los mensajes de vuelta de ambos sistemas tienen que llegar para proceder con el paso final del diagrama: almacenar y actualizar la información sobre la nueva actuación. Página 117 de 164 Por ejemplo. Es útil visualizar cómo los mensajes se mueven entre los objetos. Podemos dividir ese caso de uso en otros más específicos. Para ello UML proporciona el diagrama de secuencias. Página 118 de 164 . Los tres grandes rectángulos (calles o carriles) dividen el diagrama en las actividades particulares de cada sistema. Los diagramas de secuencia normalmente se ciñen a un caso de uso individual. Durante el uso de la aplicación. El diagrama termina en un circulo doble negro que indica la finalización de las actividades.Kinética Mobile Development Curso de PHP5. los mensajes se retransmiten a través de las relaciones entre los objetos. Aunque los carriles no son obligatorios. Anteriormente vimos un caso de uso general llamado “Navegar Información Bandas”. ayudan a clarificar el diagrama cuando están implicados varios sistemas. enviará un mensaje llamando al método getInstrumentos() de todos sus Musicos. Podemos considerar las llamadas a métodos como un tipo de mensaje que un objeto envía a otro. si una instancia de Banda necesita conocer qué Instrumentos tocan sus Musicos. Las Bandas contienen Musicos que tienen Instrumentos que pueden estar compuestos por otros instrumentos. o Diagramas de Secuencia Triunfitos tiene una jerarquía de clases. la linea de vida no indica la creación (mensaje create()) o destrucción (X en la línea de vida) de nuestros objetos.Kinética Mobile Development Curso de PHP5. es decir. Las cajas superiores muestran las instancias de objetos implicados en la secuencia. La linea discontinua que desciende de cada objeto es la línea de vida del objeto. Para el caso de uso “buscar instrumentos por banda’’. El rectángulo vertical muestra la activación del objeto. el diagrama de secuencia debería mostrar todos los objetos implicados y los mensajes pasados entre ellos para realizar la tarea. el tiempo durante el cual el objeto está implicado en la ejecución de una operación concreta. se supone que están y estarán ahí después de esta tarea. Página 119 de 164 . En este caso. Una caja con un nombre subrayado denota una instancia de clase. 2. Se nombran con el nombre de método correspondiente del objeto. De esta forma. 6. 3. Los diagramas de estado son muy útiles cuando queremos mostrar los cambios que soporta un objeto durante su vida. Un usuario solicita ver todos los instrumentos de una banda particular escribiendo su nombre. opción mejor que interactuar directamente con nuestros objetos. El objeto sistema busca la referencia a la banda haciéndose una llamada a sí mismo.Kinética Mobile Development Curso de PHP5. Las flechas indican mensajes. En Triunfitos. la clase Actuacion tiene una vida que podemos documentar con un diagrama de estados. El objeto sistema utiliza la referencia a la banda encontrada para llamar a su método getMiembrosBanda(). la aplicación tiene un único punto de entrada. 4. 5. o Diagramas de Estado. En este diagrama se introduce otro objeto en la aplicación: el objeto Sistema. Los nombres de los instrumentos son devueltos al objeto sistema para postrarlos al usuario. Los cambios de estado pueden ser desde simples diferencias en las propiedades hasta cosas más complejas como sondear esperando una respuesta de una fuente externa. el objeto Sistema recibe todos los mensajes del interfaz de usuario web. El objeto musico llama al método getNombre() en cada uno de sus instrumentos asignados. En nuestra aplicación. Siguiendo los mensajes la secuencia es como sigue: 1. Página 120 de 164 . El objeto banda llama al método getInstrumentos() de los músicos asignados a esa banda. se almacena la actuación en la base de datos. como que el estado de esperando confirmación se mantiene como máximo un minuto. Si no se acepta la reserva. o Diagramas de Componentes y Despliegue Los diagramas de componentes proporcionan una visión abstracta de alto nivel de nuestro software. Página 121 de 164 . el objeto Actuacion informa al sistema y es destruido. Las flechas indican las transiciones de un estado a otro. El círculo sólido muestra el comienzo de la vida del objeto. la mayor parte del código se reduce a un único componente en el servidor web. Si la respuesta confirma la reserva. Cuando se crea un nuevo objeto Actuacion. éste debe contactar con el sistema de reserva de locales y esperar una confirmación. se utiliza una Anotación o Nota. Para el diagrama de componentes de Triunfitos. Para indicar alguna información extra. Este elemento se puede utilizar en cualquier diagrama UML para aclarar algún concepto. se espera confirmación de ese sistema.Kinética Mobile Development Curso de PHP5. Después de inicializar un nuevo objeto Actuacion y enviar un mensaje al sistema de reservas. Normalmente representan el almacenamiento físico de nuestros componentes en los archivos del sistema de ficheros. Los nodos identifican piezas separadas del hardware físico o. conceptualmente. En la figura. La parte web de Triunfitos (GUI) depende de la aplicación Triunfitos en el servidor web. Como vimos anteriormente. Las líneas continuas muestran una conexión entre nodos. Página 122 de 164 .Kinética Mobile Development Curso de PHP5. por ejemplo. el navegador web comunicándose sobre HTTP. como sistemas separados de software como un servidor web. nuestra aplicación tiene un interface único llamado Sistema que todos los clientes tienen que utilizar. los cubos se denominan nodos. Otro interface se muestra dentro del nodo del sistema de reservas. Los círculos pequeños son un tipo de atajo para mostrar un interface. pero no al contrario. Los diagramas de despliegue nos muestran algunos elementos físicos de la infraestructura de nuestra aplicación. como. No necesitamos nada mas para trabajar con este sistema de reservas. Las flechas discontinuas son dependencias. solo necesitamos conocer los métodos del API que nos pasan. Elementos técnicos como un servidor web forman parte de otro diagrama UML llamado diagrama de despliegue. Los componentes son pequeños rectángulos dentro de los nodos. como por ejemplo los distintos servidores que están involucrados. La empresa que maneja el sistema de reservas nos ha pasado una lista de métodos públicos que podemos usar. Kinética Mobile Development Curso de PHP5. Taller 8. (Ver anexo) • Crear un proyecto en PHP orientado a objetos y modelado con UML. Página 123 de 164 Kinética Mobile Development Curso de PHP5. ANEXO. TALLER 1. Primer contacto con PHP. Utilidades: Editor de textos sencillo. Navegador web. Cliente ftp. Cuando pasamos un programa PHP al intérprete, éste presta atención únicamente a la parte del contenido que se encuentra entre las etiquetas de inicio “<?php” (en algunos casos la abreviada “<?”) y fin “?>” de PHP. Todas las páginas escritas en PHP se identifican con la extensión “.php”. Cualquier elemento que se encuentra fuera de esas etiquetas será dibujado sin modificaciónes. Esto hace fácil embeber pequeños trozos de código PHP que mayoritariamente contienen HMTL, aunque lo aconsejable es no mezclar. Ejemplo 1. ¡Hola Mundo! Estático <html> <head> <title>PHP dice hola</title> </head> <body> <b> ¡Hola Mundo! </b> </body> </html> Ejemplo 2. ¡Hola Mundo! Dinámico. <html> <head> <title>PHP dice hola</title> </head> <body> <b> <?php echo "¡Hola Mundo!"; ?> </b> </body> </html> La salida es: <html> <head> <title>PHP says hello</title> </head> <body> <b> Hello, World! </b> </body> </html> En el navegador aparece así: Página 124 de 164 Kinética Mobile Development Curso de PHP5. • • Una de las mayores fuentes de información para los programas en PHP es el mismo usuario que visita nuestro sitio. El navegador muestra un formulario, el usuario introduce información y pulsa el botón enviar, el navegador envía esa información al servidor y éste finalmente lo pasa al intérprete PHP donde es finalmente accesible por tu aplicación PHP. Ejemplo 3.1. Formulario HTML para enviar datos. <form method="POST" action="diHola.php"> Tu nombre: <input type="text" name="usuario"> <br/> <input type="submit" value="Di Hola"> </form> Nos aparece así. Ejemplo 3.2. Fichero en PHP diHola.php que muestra el saludo dependiendo del nombre introducido en el formulario. <?php echo "Hello, "; // Muestra la información enviada por el formulario en el parámetro ‘usuario’ echo $_POST['usuario']; echo "!"; ?> Si escribimos Florencio en la caja de texto y enviamos el formulario, nuestro programa dibuja ¡ Hola Florencio!. Página 125 de 164 o Todas las variables en PHP comienzan con el carácter ‘$’.Kinética Mobile Development Curso de PHP5. • Observaciones. o La variable global de PHP $_POST almacena todos los valores enviados por un formulario con el método POST. Página 126 de 164 . Realmente se trata de un array que puede ser modificado. ?> • Asignar un número a cada contacto y modificar enlaces para apuntar a una sola página: contactoDatos. TALLER 2. echo "Bienvenido/a a la página de contactos. • Modificar la página de bienvenida en contactos haciéndola dinámica." <br/>".php Nuestra página de inicio tiene este contenido: <html> <head> <title>Mis Contactos</title> <meta name="AUTHOR" content="PAKO"> </head> <body> <center> <h1>Hola</h1> <br/> <p> Bienvenido/a a su página de contactos. Herramientas: .Editor de textos sencillo. ?> Ahora uno mostrando la bienvenida al usuario pasado en el formulario: <?php echo "Hola ".php.Cliente ftp.Kinética Mobile Development Curso de PHP5.php): <?php echo "Bienvenido/a a la página de contactos. Modificamos contactos.php Fusionar todas las páginas de contactos en una dinámica y aplicar decisiones a la agenda usando una variable con el número. . Crear una página de recepción en php que muestre solo un mensaje general.".php. o o o o o Crear un formulario de entrada. Crear una página de recepción en php que muestre un mensaje personalizado. .php"> Usuario: <input type="text" name="usuario" method=”POST”> <input type="submit" value="Entrar"> </form> </p> Modificamos la página que muestra la lista de contactos para que muestre un mensaje de bienvenida general.<br/> <form action="contactos.php?contacto=1">Jennifer Aniston</a> <br/> Página 127 de 164 . introduzca su nombre de usuario.Navegador web. Primera página dinámica.php <p> <a href="contactoDatos. Ésta página ya contiene php (contactos.$_POST["usuario"].html">Entrar</a> </p> </center> </body> </html> Vamos a incluir un formulario de bienvenida para introducir el nombre del usuario que accede a nuestros contactos: <p> Por favor. Creamos contactoDatos. Asignar un número a cada contacto y modificar enlaces para apuntar a una sola página: contactoDatos. </p> <p> <a href="contactos. Modificamos contactos.". elseif( $contacto == 2) echo "<img src='mesparcia. elseif( $contacto == 2) echo "mesparcia@edu. ?> <br/> Lugar de Trabajo: <?php if( $contacto == 1 || $contacto == 2 ) echo "Secretaría General". if( $contacto == 1 ) echo "Jennifer". ?> <br/> Teléfono: <?php if( $contacto == 1 ) echo "924 007 001". ?> </p> <p> <a href="contactos. ?> <br/> Imagen: <br/> <?php if( $contacto == 1 ) echo "<img src='janiston. Creamos contactoDatos. ?> <br/> Apellidos: <?php if( $contacto == 1 ) echo "Aniston". • Fusionar todas las páginas de contactos en una dinámica y aplicar decisiones a la agenda usando una variable con el número.juntaex.php?contacto=2">Manolo Esparcia</a> <br/> <br/> </p> Curso de PHP5.php">Volver</a> </p> </center> </body> Página 128 de 164 .php <html> <head> <title>Mis Contactos</title> <meta name="AUTHOR" content="PAKO"> </head> <body> <center> <h1>Mis Contactos</h1> <br/> <p> Nombre: <?php $contacto=$_GET["contacto"]. elseif( $contacto == 2) echo "924 007 002".juntaex.Kinética Mobile Development <a href=" contactoDatos. ?> <br/> Correo: <?php if( $contacto == 1 ) echo "janiston@edu. elseif( $contacto == 2) echo "Esparcia". elseif( $contacto == 2) echo "Manuel".jpg'>".jpg'>".es".es". echo "Hola $usuario. el enlace no pasa ninguna variable. En contactos. ?> Página 129 de 164 . el enlace de cada contacto queda: <?php $usuario=$_POST["usuario"]. el mensaje de bienvenida anterior usando la variable usuario no funcionará porque al volver.". <br/>".?>Jennifer Aniston</a> <a href="contactoDatos.php?usuario=<?php echo $usuario. según el contacto. echo "Hola $usuario. ?> <p> <a href="contactos.?>">Manolo Esparcia</a> Enlazamos variables en la url con el carácter &. por lo tanto será necesario pasarle el usuario a la página datosContacto.php.php para luego devolverlo.php">Volver</a> </p> Así.php?contacto=1&usuario="<?php echo $usuario. echo "Bienvenido/a a la página de contactos. Observemos el enlace para volver a la pagina de contactos: <p> <a href="contactos. Actualizamos contactos.Kinética Mobile Development </html> Curso de PHP5. nos mostrará una información u otra.". ?> <a href="contactoDatos.php: <?php if($_POST["usuario"]) $usuario=$_POST["usuario"].?>">Volver</a> </p> Aun así observamos que tampoco muestra el usuario en el mensaje de bienvenida. echo "Bienvenido/a a la página de contactos. por lo que tambíen tenemos que contemplar esta posibilidad. De esta forma. Eso es porque usamos la variable global $_POST pero pasamos la variable en la URL.php?contacto=2&usuario="<?php echo $usuario. elseif($_GET["usuario"]) $usuario=$_GET["usuario"].php: <?php $usuario=$_GET["usuario"]. <br/>". Ahora modificamos datosContacto. 2 => "Manolo Esparcia"). <?php $contactos = array( 1 => "Jennifer Aniston". echo "Tfno: {$item['tfno']} <br/>". echo "Nombre: {$item['nombre']} <br/>".es'. Uso de Arrays. => 'mesparcia@edu.?>"><?php echo $item. $item=$contactos[$contacto]. <?php $contactos= array (array ( 'nombre' 'apellidos' 'tfno' 'email' 'lugar' 'img' array ( 'nombre' 'apellidos' 'tfno' 'email' 'lugar' 'img' ?> <html> <head> <title>Mis Contactos</title> <meta name="AUTHOR" content="PAKO"> </head> <body> <center> <h1>Mis Contactos</h1> <br/> <?php $contacto=$_GET["contacto"]. echo "Lugar de Trabajo: {$item['lugar']} <br/>".Cliente ftp.jpg'). . => '924 007 002'. $usuario=$_GET["usuario"].jpg')). => 'janiston@edu. echo "<img src='{$item['img']}'/>".?>&usuario=<?php echo $usuario. TALLER 3. echo "Apellidos: {$item['apellidos']} <br/>". Página 130 de 164 . => 'Aniston'. echo "</p>". Herramientas: .Editor de textos sencillo.juntaex.juntaex. echo "<p>".Kinética Mobile Development Curso de PHP5. => 'Esparcia Montoya'. ?> <p> <?php foreach($contactos as $indice => $item){ ?> <a href="contactoDatos. => 'mesparcia. echo "Email: {$item['email']} <br/>".Navegador web. => '924 007 001'. echo "<br/>".php?contacto=<?php echo $indice. => 'Secretaría General'. => 'janiston.es'. ?> => 'Jennifer'.?> contactos. => 'Manuel'. => 'Secretaría General'. almacenar la información de los contactos en un array y mostrar la lista con un proceso repetitivo.?></a> <br/> <?php } ?> <br/> </p> <p> Total: <?php echo count($contactos). • En la página inicial. </p> • Almacenar la información de los contactos en arrays y aglutinar todas las páginas de contactos en una. . jpg'). => 'Doblador'. => 'Smith'. => '924 007 004'. => 'bdoblador@edu. <a href="contactos. => 'Fry'. => 'fsmith. => 'Secretaría General'. => 'Secretaría General'. => '
[email protected].?>">Volver</a> </p> </center> </body> </html> • Añadir el contacto de Blender Doblador y Fry Smith. => '924 007 003'. array ( 'nombre' 'apellidos' 'tfno' 'email' 'lugar' 'img' array ( 'nombre' 'apellidos' 'tfno' 'email' 'lugar' 'img' => 'Bender'.es'. Página 131 de 164 .php?usuario=<?php echo $usuario.jpg')).juntaex. => 'bdoblador.Kinética Mobile Development <p> Curso de PHP5.es'. • Separamos el array que almacena los datos de usuario en otro fichero: datos. global $usuario.php.php". echo "Bienvenido/a a la página de contactos.juntaex. $usuario=usuario().jpg')). => '
[email protected]'. . funciones. => '924 007 002'. => 'Secretaría General'.Kinética Mobile Development Curso de PHP5.jpg'). <br/>". } function usuario(){ if($_POST['usuario']) return $_POST['usuario']. $item=$contactos[$cont]. echo "Hola $usuario. TALLER 4. Uso de funciones. } } function detalleContacto($cont){ global $contactos. => 'Secretaría General'.Cliente ftp.php para poder usar esos datos. => 'mesparcia. echo "<p>".".es'.php <?php $contactos= array (array ( 'nombre' 'apellidos' 'tfno' 'email' 'lugar' 'img' array ( 'nombre' 'apellidos' 'tfno' 'email' 'lugar' 'img' ?> => 'Jennifer'. => 'janiston@edu. echo "Nombre: $item[nombre] <br/>". => 'Esparcia Montoya'.juntaex.php <?php function hola(){ global $usuario. => 'janiston. ?> • En otro fichero guardaremos las funciones comunes que vamos a usar para mostrar diversos datos.Editor de textos sencillo. foreach($contactos as $indice=>$item){ echo "<a href='contactoDatos. • Incluimos el fichero de datos en el archivo contactos. echo "Apellidos: $item[apellidos] <br/>". => 'Manuel'.php". "?contacto=$indice&usuario=$usuario'>$item[nombre]</a><br/>". => 'Aniston'. => '924 007 001'. Herramientas: . Página 132 de 164 . . elseif($_GET['usuario']) return $_GET['usuario'].Navegador web. datos. else return "". } function listaContactos(){ global $contactos. como por ejemplo el mensaje de bienvenida (hola()) y la lista de contactos (listaContactos()). <?php require_once "datos. echo "</p>". </p> </center> </body> </html> • El archivo con la información de cada contacto resulta: <?php require_once "datos. detalleContacto($contacto).php nos queda así: <?php require_once "datos.php". ?> <p> <a href="contactos. ?> <br/> </p> <p> Total: <?php echo count($contactos).php?usuario=<?php echo $usuario.php". require_once "funciones. $usuario=$_GET["usuario"]. ?> <html> <head> <title>Mis Contactos</title> <meta name="AUTHOR" content="PAKO"> </head> <body> <center> <h1>Mis Contactos</h1> <br/> <p> <?php hola().Kinética Mobile Development echo "Tfno: $item[tfno] <br/>". echo "Lugar de Trabajo: $item[lugar] <br/>". ?> </p> <p> <?php listaContactos(). } ?> Curso de PHP5.php". echo "Email: $item[email] <br/>". ?> <html> <head> <title>Mis Contactos</title> <meta name="AUTHOR" content="PAKO"> </head> <body> <center> <h1>Mis Contactos</h1> <br/> <?php $contacto=$_GET["contacto"]. echo "<br/>".php". echo "<img src='$item[img]'/>". • El archivo contactos.?>">Volver</a> </p> </center> </body> </html> Página 133 de 164 . require_once "funciones.?> contactos. PhpMyAdmin.php. Modificar nuestra aplicación para gestionar la información de los contactos desde una base de datos.php").es'.jpg'). 'Secretaría General'. funciones. o Modificar nuestra aplicación para obtener esos datos. nombre VARCHAR( 64 ) NOT NULL . "usuario". 'mesparcia. o Crear una tabla de contactos. 'Esparcia Montoya'.php que contiene el array con los datos ya no es necesario. function hola(){ global $usuario. Página 134 de 164 . echo "Bienvenido/a a la página de contactos.juntaex. las funciones necesarias para conectar a la base de datos y para obtener la información a mostrar. el archivo datos. INSERT INTO `contactos` VALUES ( INSERT INTO `contactos` VALUES ( NULL . config. '924 007 002'. Acceso a base de datos. Navegador web. Incluimos en nuestro proyecto el archivo de ejemplo usado anteriormente para guardar la configuración de acceso a la base de datos. Cliente ftp.Kinética Mobile Development Curso de PHP5. '924 007 001'. En primer lugar. 'janiston@edu. "clave".es'. TALLER 5. apellidos VARCHAR( 64 ) NOT NULL . 'janiston.php <?php require_once("config. lugar VARCHAR( 255 ) NULL .juntaex.jpg'). ?> Añadimos en el archivo funciones. NULL . email VARCHAR( 255 ) NULL . 'mesparcia@edu. 'Manuel'. <br/>". img VARCHAR( 255 ) NULL ) o Insertamos los dos registros que tenemos actualmente. "cursoPHP5").". config. 'Aniston'. CREATE TABLE contactos ( idContacto INT NOT NULL AUTO_INCREMENT PRIMARY KEY . $usuario=usuario().php. 'Secretaría General'. Herramientas: • Editor de textos sencillo. echo "Hola $usuario.php <?php $datosConexion= array( 'servidor'=> 'usuario' => 'clave' => 'bd' => "localhost". tfno VARCHAR( 20 ) NULL . 'Jennifer'. $consulta="SELECT * FROM contactos".php? ". $conexion = mysqli_connect($datosConexion['servidor']. $datosConexion['bd']). el fichero con el detalle de los contactos difiere únicamente en la inclusión del fichero de datos. $resultado = $conexion->query($consulta). echo "<br/>". echo "Email: $contacto[email] <br/>". $consulta="SELECT * FROM contactos WHERE idContacto=$cont". no es necesario. $num = $resultado->num_rows. echo "Tfno: $contacto[tfno] <br/>". global $usuario. Total: <?php echo numContactos().Kinética Mobile Development } function usuario(){ if($_POST['usuario']) return $_POST['usuario']. else return "". } function numContactos(){ $conexion=conecta(). "$item[nombre] $item[apellidos]</a><br/>". $conexion=conecta(). excepto en la sección que muestra el número de contactos que tenemos registrados. echo "Lugar de Trabajo: $contacto[lugar] <br/>". echo "Nombre: $contacto[nombre] <br/>". Para ello usamos la función que hemos añadido en el archivo funciones. echo "<p>". echo "<img src='$contacto[img]'/>". $resultado = $conexion->query($consulta). } ?> El archivo que muestra la lista de contactos inicial no varía con respecto al Taller 4. "contacto=$item[0]&usuario=$usuario'>". $contacto = $resultado->fetch_array(). function listaContactos(){ global $conexion. $baseDatos = mysqli_select_db($conexion. return $num. Finalmente. $datosConexion['clave']). elseif($_GET['usuario']) return $_GET['usuario']. Página 135 de 164 . } Curso de PHP5.nombre.?> contactos. $datosConexion['usuario']. Otra forma de hacerlo sería obteniendo ese número aprovechando la consulta que muestra la lista de contactos. } } function detalleContacto($cont){ $conexion=conecta().apellidos FROM contactos". $lista = array( ).php. return $conexion. $consulta="SELECT idContacto. por lo tanto eliminamos esa referencia. como ya hemos mencionado. echo "</p>". que. } foreach($lista as $indice=>$item){ echo "<a href='contactoDatos. $resultado = $conexion->query($consulta). } function conecta(){ global $datosConexion. echo "Apellidos: $contacto[apellidos] <br/>". while ($contacto = $resultado->fetch_array()) { $lista[]=$contacto. echo "Contacto añadido. Comenzamos creando un archivo que contenga un formulario para solicitar los datos del contacto a insertar. $usuario=$_GET["usuario"]. modificar y eliminar contactos.php <?php require_once "funciones.php". nuevoContacto. Herramientas: • Editor de textos sencillo. Navegador web.". $campos[]=$_POST['lugar']. TALLER 6.php' method='POST'> Nombre: <input type='text' name='nombre'> Apellidos: <input type='text' name='apellidos'> Telefono: <input type='text' name='telefono'> Email: <input type='text' name='email'> Lugar de Trabajo: <input type='text' name='lugar'> Imagen: <input type='text' name='imagen'> <input type='submit' value='Enviar'> <input type='hidden' name='_envia_form' value='1'> </form> <?php } else{ nuevoContacto(). function nuevoContacto(){ $campos= array(). $campos[]=$_POST['apellidos']. $campos[]=$_POST['telefono']. Página 136 de 164 . } ?> </body> </html> En la página de funciones creamos una nueva que haga la inserción en la base de datos del nuevo contacto que queremos crear. Cliente ftp. $campos[]=$_POST['nombre'].Kinética Mobile Development Curso de PHP5. $campos[]=$_POST['email']. phpMyAdmin Incluir opciones para insertar. ?> <html> <head> <title>Mis Contactos</title> </head> <body> <h1>Mis Contactos</h1> Nuevo Contacto <?php if(!$_POST['_envia_form']) { ?> <form action='nuevoContacto. Modificando información de base de datos. ”. Creamos un fichero que muestre un formulario con los datos del contacto. } A continuación. apellidos.'$campos[3]'. ofreciendo la posibilidad de modificar esa información y enviarla para actualizar la base de datos. lugar. echo "Contacto modificado.Kinética Mobile Development Curso de PHP5.'$campos[5]')".'$campos[2]'. en la lista de contactos.php <?php require_once "funciones. '$campos[0]'. $consulta= "INSERT INTO contactos (idContacto. $conexion=conecta(). ". } ?> </body> </html> En la página de funciones creamos una nueva que nos permita obtener los datos del contacto a modificar y otra que haga la modificación en la base de datos del contacto editado. $usuario=$_GET["usuario"]. añadimos una opción para poder acceder a la página que acabamos de agregar. ?> <html> <head> <title>Mis Contactos</title> </head> <body> <h1>Mis Contactos</h1> <p> Editar Contacto </p> <?php if(!$_POST['_envia_form']) { $datos=obtenerDatos($_GET['cont']). editarContacto. img) VALUES (null. <a href="nuevoContacto. "'$campos[1]'.php' method='POST'> Nombre: <input type='text' name='nombre' value='<?php echo $datos['nombre']?>'> Apellidos: <input type='text' name='apellidos' value='<?php echo $datos['apellidos']?>'> Telefono: <input type='text' name='telefono' value='<?php echo $datos['tfno']?>'> Email: <input type='text' name='email' value='<?php echo $datos['email']?>'> Lugar de Trabajo: <input type='text' name='lugar' value='<?php echo $datos['lugar']?>'> Imagen: <input type='text' name='imagen' value='<?php echo $datos['img']?>'> <input type='submit' value='Enviar'> <input type='hidden' name='idContacto' value='<?php echo $datos['idContacto']?>'> <input type='hidden' name='_envia_form' value='1'> </form> <?php } else{ modificarContacto(). "tfno.php". email.php">Nuevo Contacto</a> Para modificar un contacto hacemos algo similar a lo hecho para crear uno nuevo. $resultado = $conexion->query($consulta).'$campos[4]'. ?> <form action='editarContacto. $campos[]=$_POST['imagen']. function obtenerDatos($cont){ Página 137 de 164 .". nombre. } ?> </body> </html> Como en los casos anteriores agregamos una función que nos permita hacer el borrado del contacto de la base de datos. $consulta="SELECT * FROM contactos WHERE idContacto=$cont".$datos['apellidos']?>' <input type='submit' value='Aceptar'> <input type='hidden' name='idContacto' value='<?php echo $datos['idContacto']?>'> <input type='hidden' name='_envia_form' value='1'> </form> <?php } else{ eliminarContacto()." . function eliminarContacto(){ Página 138 de 164 . $resultado = $conexion->query($consulta). $campos[]=$_POST['email']." . " nombre='$campos[1]'. $conexion=conecta(). $campos[]=$_POST['nombre']. $campos[]=$_POST['telefono']. $usuario=$_GET["usuario"]." ".php". echo "Contacto eliminado.". " img='$campos[6]'"." . " WHERE idContacto=$campos[0]". " apellidos='$campos[2]'. " tfno='$campos[3]'. " lugar='$campos[5]'. " email='$campos[4]'. $campos[]=$_POST['idContacto']. } Curso de PHP5. Para eliminar un contacto creamos una página que simplemente nos pida la confirmación para borrar ese contacto de la base de datos.php <?php require_once "funciones.Kinética Mobile Development $conexion=conecta(). $campos[]=$_POST['imagen']. $campos[]=$_POST['apellidos']. eliminarContacto." . $campos[]=$_POST['lugar']." . return $contacto = $resultado->fetch_array(). $resultado = $conexion->query($consulta). } function modificarContacto(){ $campos= array(). ?> ¿Desea eliminar el siguiente contacto? <br/> <form action='eliminarContacto. ?> <html> <head> <title>Mis Contactos</title> </head> <body> <h1>Mis Contactos</h1> <p> Eliminar Contacto </p> <?php if(!$_POST['_envia_form']) { $datos=obtenerDatos($_GET['cont']).php' method='POST'> <?php echo $datos['nombre']. $consulta= "UPDATE contactos set ". while ($contacto = $resultado->fetch_array()) { $lista[]=$contacto. } Página 139 de 164 . global $usuario. uno para editar y otro para borrar. $consulta="SELECT idContacto.php function listaContactos(){ global $conexion.nombre. funciones. echo "</td><td width='5%' style='font-size: 12px'>". $resultado = $conexion->query($consulta). "&usuario=$usuario'>$item[nombre] $item[apellidos]</a>". echo "<a href='eliminarContacto.php?contacto=$item[0] ". echo "</tr>". echo "<a href='editarContacto. $consulta = "DELETE FROM contactos WHERE idContacto=$contacto". $conexion=conecta(). foreach($lista as $indice=>$item){ echo "<tr><td width='90%' style='border-bottom: 1px solid #CCC'>". $resultado = $conexion->query($consulta). } echo "<table width='60%'>".php?cont=$item[0]'>Borrar</a></td>". echo "<a href='contactoDatos. $lista = array( ). echo "</td><td width='5%'style='font-size: 12px'>". Bastará con incluir al final de cada contacto dos enlaces.Kinética Mobile Development Curso de PHP5. añadimos los enlaces necesarios para poder llevar a cabo estas acciones.php?cont=$item[0]'>Editar</a>". en la lista de contactos. } Finalmente. $conexion=conecta().apellidos FROM contactos". $contacto =$_POST['idContacto']. } echo "</table>". $usuario=$_GET["usuario"].php". Modificamos el archivo encargado de crear un contacto nuevo. ?> <html> <head> <title>Mis Contactos</title> </head> <body> <h1>Mis Contactos</h1> Nuevo Contacto <?php if(!$_POST['_envia_form']) { ?> <form action='nuevoContacto. phpMyAdmin Incluir opciones para subir imágenes a nuestros contactos. TALLER 7. Subiendo ficheros. } ?> </body> </html> En el archivo encargado de las funciones genéricas añadimos las líneas de cósigo necesarias para el tratamiento de ficheros. funciones.". $campos[]=$_POST['apellidos'].Kinética Mobile Development Curso de PHP5. $campos[]=$_POST['telefono']. echo "Contacto añadido. $campos[]=$_POST['nombre']. Cliente ftp. nuevoContacto.php <?php require_once "funciones.php function nuevoContacto(){ $campos= array(). Herramientas: • Editor de textos sencillo. Navegador web. Página 140 de 164 .php' method='POST' enctype="multipart/form-data"> Nombre: <input type='text' name='nombre'> Apellidos: <input type='text' name='apellidos'> Telefono: <input type='text' name='telefono'> Email: <input type='text' name='email'> Lugar de Trabajo: <input type='text' name='lugar'> Imagen: <input type='file' name='imagen'> <input type='submit' value='Enviar'> <input type='hidden' name='_envia_form' value='1'> </form> <?php } else{ nuevoContacto(). $consulta= "UPDATE contactos set ". $campos[]=$_POST['nombre']. $ficheroOrigen). $campos[]=$_POST['telefono']. $resultado = $conexion->query($consulta). img) VALUES (null. $resultado = $conexion->query($consulta).'$campos[3]'. " apellidos='$campos[2]'. $resultado = $conexion->query($consulta). if (move_uploaded_file($_FILES['imagen']['tmp_name']." . ''. lugar.$imagen[0]). $campos[]=$_POST['lugar']. } } Modificamos el archivo encargado de editar un contacto y modificarlo. $consulta= "INSERT INTO contactos (idContacto. $campos[]=$_POST['apellidos']. " nombre='$campos[1]'. unlink("c:\\wamp\\www\\cursoPHP5\\taller\\taller7\\"." .'$campos[5]')". $campos[]=$_FILES['imagen']['name'].php. " WHERE idContacto=$campos[0]". $ficheroDestino)) { echo "Fichero subido como $destination_file. " and img not like ''". } else { echo "No ha sido posible subifr el fichero.'$campos[2]'. " img='$campos[6]'". apellidos. ''." . " email='$campos[4]'. function eliminarContacto(){ $contacto =$_POST['idContacto']. $conexion=conecta(). if($_FILES['imagen']) { subirFichero(). } Al eliminar un contacto también tenemos que tener en cuenta la eliminación del archivo de imagen asociado. $campos[]=$_POST['email'].'. $campos[]=$_FILES['imagen'][‘name’]. "'$campos[1]'.”.". ".php para que la modificacion de archivo también sea posible. } $conexion=conecta(). $campos[]=$_POST['lugar']. cambiando el formulario de la misma forma que el de nuevoContacto. $resultado = $conexion->query($consulta).php function modificarContacto(){ $campos= array(). $campos[]=$_FILES['imagen'][‘name’].'$campos[4]'. $ficheroOrigen. $consulta="DELETE FROM contactos WHERE idContacto=$contacto". funciones." .. " lugar='$campos[5]'. De igual forma modificamos funciones. nombre. "tfno. Página 141 de 164 . " tfno='$campos[3]'." . $ficheroDestino = '/var/www/cursoPHP5/' . $consulta= "SELECT img FROM contactos WHERE idContacto=$contacto".Kinética Mobile Development $campos[]=$_POST['email']. } function subirFichero( ) { $ficheroOrigen = str_replace('/'.". email. $ficheroOrigen = str_replace('. $imagen=$resultado->fetch_array(). $campos[]=$_POST['idContacto']. } Curso de PHP5. '$campos[0]'. $conexion=conecta(). if($_FILES['imagen']) { subirFichero(). $_FILES['imagen']['name']). Diagrama UML de la Agenda de Contactos Antes de nada se debe hacer un análisis de los requisitos y a continuación obtener casos de uso de alto nivel. una página web. PhpMyAdmin. fax. un responsable. como el servicio tendrá. apellidos. es decir. Esta metodología incluye mayor nivel de detalle y documentación. un nombre. el diseño de las tablas en la base de datos. Nuestra agenda de contactos maneja datos sobre personas. Herramientas: Editor de textos sencillo. teléfono personal.3 aun en estudio. dirección del trabajo. Además los datos de cada contacto son: un identificador. un correo electrónico. Lo que nosotros veremos aquí sería la etapa de diseño. una dirección física. Vamos a variar un poco nuestra aplicación de agenda de contactos para practicar creando un proyecto en PHP. en el análisis. cada uno. modificar y eliminar contactos (administrador). Descripción grosso modo de lo que se espera que haga la aplicación: Debe almacenar información sobre personas y la estructura en una base de datos y mostrarlas en una página web. Por tanto tendremos en cuenta que cada persona trabaja en cero o una sección y que una sección pertenece a un servicio. Aun no tenemos en cuenta cómo almacenamos esos datos de forma permanente.Kinética Mobile Development } Curso de PHP5. Eso lo retomamos después del modelado en el apartado del diseño del dominio de la aplicación. teléfono del trabajo. tanto en diagramas como en plantillas textuales. Esta lista de requisitos. También tendrán un identificador. Hemos identificado dos roles o perfiles: uno encargado de crear. Página 142 de 164 . que será la utilizada en el desarrollo de cualquier aplicación en la sección de desarrollo del servicio de informatica de la Consejeria de Educacion. obteniendo una lista de requisitos identificados a los que poder referirnos durante el diseño y que podamos validar con el cliente. dirección personal. se detalla en más profundidad. Es importante aclarar que la solución aplicada en este caso es una de las muchas posibles. email del trabajo y email personal. y otro que solo consulta los contactos (usuario). un nombre. Con nuestra aplicación de modelado (ArgoUML) vamos a crear un nuevo fichero llamado AgendaContactos. Una organización tiene ninguno o muchos empleados. Tanto el análisis como el diseño se hacen en este taller de forma combinada y con la mayor brevedad. una vez terminada esa fase de diseño. Los contactos pueden tener ninguna o muchas direcciones. Herramienta de modelado UML (ArgoUML). Navegador web. e-mails y números de teléfono. orientado a objetos y modelado con diagramas UML. Debe permitir al usuario consultar y manejar la información de esos contactos. y utiliza también UML para el modelado. Vamos a ampliar su espectro hacia la organización de la Secretaría General de la Consejería de Educación de la Junta de Extremadura. Tanto la sección. Cliente ftp. ya que el modelado puede variar tanto por los elementos a tener en cuenta como por los diseñadores que lo lleven a cabo. o Creando la Agenda de Contactos. Una persona pertenece a una organización. un télefono y un fax. Proyecto Orientado a Objetos com UML y PHP. Existe una metodología de desarrollo de software basada en Métrica v. TALLER 8. los trataremos como tales para ver como interactuan diferentes roles con nuestros casos de uso. Página 143 de 164 . ya que no hay control de acceso. Aunque nuestra aplicación no contemple diferencia entre ambos.Kinética Mobile Development Curso de PHP5. Creamos nuestros caso de uso. se llame. Página 144 de 164 . obviamente. Así. De ambas observaciónes podemos determinar que en lugar de contacto la clase que se refiere a las personas en sí. Persona y establecemos una nueva clase Contacto que contenga tanto las propiedades como los métodos comunes a todas las clases. Los servicios y las secciones son también contactos. Esa clase por sí sola no tiene sentido. hacemos que esas clases hereden de la clase Contacto. 2. Las clases que obtenemos según nuestros casos de uso son: Como vemos.Kinética Mobile Development Curso de PHP5. así que la creamos como abstracta. están representadas las asociaciones entre los contactos y las secciones y servicios. Hay mucha información y actividades repetidas. Pero si observamos detenidamente podemos determinar que: 1. Por tanto. que será con la que tratemos para ejecutar todas las peticiones que necesitemos. encargado de la validación de los valores que se establezcan para las propiedades de Página 145 de 164 . Para que nuestra aplicación funciones de forma que exista un solo punto de entrada. Para tratar con los datos de la base de datos creamos una clase llamada GestorDatos.Kinética Mobile Development Curso de PHP5. que en este caso será igual a la concatenación del nombre y los apellidos. el diagrama de clases nos queda así: En el caso del nombre de la persona. Para indicar además que hay un responsable tanto en Seccion como en Servicio añadimos una asociación con Persona desde ambas clases. Añadimos un interfaz que indica que todas aquellas clases que lo realicen deben implementar un método validar(). nos creamos una clase Aplicación. se sobreescribe la propiedad denominacion. fax. nombre. direccion. direccionPersonal. id_servicio.. fax.N pertenece 0. Existe una aproximación que permite relacionar de una forma más directa ambos modelos. que almacenaría aquellos campos comunes a las demás tablas. denominacion. direccion. email } Persona:{id_contacto. podemos hacer coincidir la clave de Contacto con la clave de Persona y Unidad. insertar. id_unidad} Unidad: { id_unidad. apellidos. es decir. id_contacto. Si además. id_responsable. fax. id_contacto. direccion. direccion. id_unidadSuperior} Si además. fax. denominacion. Contacto: { id_contacto. denominacion. que contengan una serie de métodos encargados de consultar. apellidos. id_servicio } Servicio: { id_servicio.nombre. denominacion. En ocasiones podemos modelar nuestras clases para que sean simples gestores de consultas. telefono. email } El modelo relacional y el modelo orientado a objetos suele variar sustancialmente. id_responsable} Podemos mejorar este diseño combinando las tablas de Sección y Servicio en una única tabla: Unidad. direccion. Crear cada clase como encargada de mantener una tabla de la base de datos. eliminar o actualizar datos de las tablas resultantes del modelo de dominio. Contacto tiene una relación de uno a uno con Persona y Unidad. direccion. id_seccion} Seccion: { id_seccion.telefonoPersonal. En nuestro caso nos permitiría tener una nueva tabla..direccionPersonal. es decir. Contacto: { id_contacto. id_unidadSuperior} De forma que aquel registro cuya id_unidadSuperior sea cero indicará que es un servicio y si es distinto de cero.emailPersonal. denominacion. id_responsable } Servicio: { id_servicio. fax. Persona 0. telefono. tipo} Persona:{id_contacto. el modelo de dominio de la aplicación.id_unidad} Unidad: { id_contacto.1 Servicio Por tanto las tablas resultantes son: Persona: { id_persona.N pertenece 0. Contactos. nombre. email } Persona: { id_persona.Kinética Mobile Development Curso de PHP5. email. esas clases. Contacto: { id_contacto.nombre. fax. necesitamos crear un campo tipo en contactos. id_contacto. indica que se trata de una sección y de que unidad (servicio) depende. id_responsable. id_responsable. telefono. email.1 Seccion 0. tenemos que diseñar cómo almacenar la información en la base de datos MySQL. Contacto: { id_contacto. desde contactos necesitamos saber de qué tipo de contacto se trata. si es una Persona o una Unidad. como puede observarse.. es decir. nombre. fax. email } Persona: { id_persona. telefono.apellidos. denominacion.id_unidad} Unidad: { id_contacto. id_unidadSuperior} Página 146 de 164 . telefonoPersonal. apellidos. direccion. id_contacto. apellidos. email. telefono. telefono.emailPersonal . telefono. id_seccion} Seccion: { id_seccion.. Ahora que hemos hecho una primera aproximación a la solución del problema. Es decir. es decir. Ahora veremos cómo podemos dibujar el comportamiento de nuestras clases.1 Persona 0. un punto de entrada. Pero nuestra aplicación tiene que tener un comienzo. Con el cliente. Contacto Es un Es un 0.. Página 147 de 164 . Ya hemos finalizado el modelado de la parte estática de nuestra aplicación. Hemos determinado que la clase Aplicación gestione todos los mensajes que podemos pasar a nuestro programa.1 0.. dejamos este diseño como válido.N depende Unidad Es responsable Estos cambios en el modelo de dominio también pueden afectar a nuestro modelo de diseño de objetos. hemos confirmado que el caso de uso Listar Contactos sea lo primero que se ejecute al llamar a nuestro programa. el funcionamiento de nuestra aplicación. es posible que nuestras clases se vean condicionadas por el resultado en el modelo de datos..Kinética Mobile Development Curso de PHP5. Se podría mejorar mucho más hasta hacer que toda esa información provenga de una única tabla. pero a efectos de mostrar cómo funciona el modelado con UML. Definimos un diagrama de secuencia. Página 148 de 164 . Creamos el interfaz y las clases necesarias en PHP.Kinética Mobile Development Curso de PHP5. Cada elemento de la lista es la denominación del contacto y un enlace para ver la información detallada del mismo. Continuamos con la fase de implementación en la que también cubriremos sólo hasta este caso de uso. El código está en el cd que acompaña a este manual. Según el caso de uso Listar Contactos. Vamos a llegar hasta este punto en el diseño para no extendernos demasiado en el taller. tenemos que mostrar una lista de todos los contactos. Kinética Mobile Development Curso de PHP5. Página 149 de 164 . +/-HHMM (e. "th". numérico. Nombre completo del mes. Día del mes. numérico. numérico. numérico. Número de días del mes. Número de semana del año. Día de la semana. numérico. Sufijo ordinal en inglés para el día del mes. numérico. 29. Minuto. numérico. formato 12 horas. 1 = Lunes. formato 12 horas. Abbreviated weekday name..Kinética Mobile Development Curso de PHP5. Día de la semana. o p. con espacio a la izquierda. -1200-+1200 01-12 1-12 28. numérico. con espacio a la iquierda. Siglo. A.j. cero principal ajustado. Día del mes. numérico. formato 24 horas. "rd" Página 150 de 164 . numérico. Hora. texto. Hora. +0230).m. texto. 31 00-99 00-99 00-53 00-53 0-23 0-11 00-59 00-61 [2] Rango 00-23 01-12 0-23 1-12 01-31 1-31 001-366 strftime().M. Segundo. -0400. 0 = Domingo. texto. Hora. Formato estándar de fecha y hora. Nombre completo del dia de la semana. Igual que %b. Día del año. con espacio a la iquierda. "nd". sin cero. la primera semana comienza el primer lunes del año. formato 12 horas. a. Referencias Caracteres de formato de strftime( ) y date( ) Tipo strftime( ) %H %I %k Hora %l %p %P A a G g Minuto Segundo %M %S %d %e %j Día %u %w w j S %a %A Semana %U %W %B %b Mes %h %m m n t %C Año %y %Y Zona Horaria Compuesta %z %Z %c %D y Y O T F M D l z i s d date( ) H h Descripción Hora. numérico. numérico. Zona horaria. Mes. numérico. Día del mes. text for current locale. nombre o abreviación. Número de semana del año. numérico. Año con 2 dígitos. Hora. 30. formato 24 horas. texto. la primera semana comienza el primer domingo del año. Nombre abreviado del mes. Igual que %m/%d/%y. Diferencia horaria GMT. numérico. cero principal ajustado. numérico. texto. numérico. sin cero a la izquierda.M. numérico. Mes. numérico. numérico. numérico. Año con 4 dígitos. texto. formato 24 horas.m. Hora. 0-365 date() 1-7 0-6 1-31 "st". o P. numérico. 13 Abr 2007 16:01:07 +0200". "Vie. Hora en formato 24 horas ( igual que H:%M:%S). Formato de fecha RFC 822 ej. Carácter % Carácter de nueva línea.M.Kinética Mobile Development Curso de PHP5. Caracteres de formato de strftime( ) y date( ) Tipo strftime( ) %F %r %R %T %x %X r %% Edición %n %t date( ) Descripción Igual que %Y-%m-%d. Rango [2] El rango de segundos se extiende a 61 por el salto de segundos. Hora en formato 24 horas. Formato estándar de hora (sin fecha). Carácter de tabulación.M. o P. Hora en A. Página 151 de 164 . Formato estándar de fecha (sin hora). Página 152 de 164 .Kinética Mobile Development Curso de PHP5. Página 153 de 164 .Kinética Mobile Development Curso de PHP5. Página 154 de 164 .Kinética Mobile Development Curso de PHP5. Página 155 de 164 .Kinética Mobile Development Curso de PHP5. Kinética Mobile Development Curso de PHP5. Página 156 de 164 . a partir de aquí podemos crear tablas. insertar datos en una tabla ya creada anteriormente. Página 157 de 164 .Kinética Mobile Development Curso de PHP5. la pantalla inicial (imagen 2) da la opción tanto de seleccionar una base de datos ya creada desde el menú de la izquierda. y elegimos la base de datos (imagen 3): Imagen 3 Una vez seleccionada procederemos a gestionar la base de datos. buscar registros. y el cifrado. desplegaremos el combo de la izquierda de la pantalla. modificar el nombre de la base. como de crear una nueva base de datos: Imagen 2 Para seleccionar una base de datos existente. Manual Básico de phpMyAdmin Con phpMyAdmin podremos gestionar nuestras bases de datos MySQL. sentencias SQL. Las secciones principales en phpMyAdmin para realizar estas gestiones son: 1) Estructura (imagen4). En la pestaña de estructura podremos crear tablas dentro de nuestra base de datos. modificarlos. etc. Nulo.Kinética Mobile Development Curso de PHP5. 5. 4. accederemos a la configuración de los campos de la tabla (imagen 6): imagen 6 Dispone las siguientes opciones para configurar cada campo: 1. Página 158 de 164 . Predeterminado. Collation (cifrado). imagen 5 Una vez pinchado el botón de continuar. 6. 3. 7. Tipo de campo (texto. fecha/hora. imagen 4 Para crear una nueva tabla introduciremos el nombre que le queramos asignar y el número de campos (imagen 5). 2. etc. Nombre del campo. numérico. Atributos.) Longitud/Valores. insertar. 8. Tipo de tabla. 10. Comentarios de la tabla. Mediante consultas SQL también podremos realizar cualquier operación de las tablas. 3. Collation. Clave primaria / Índice / Único. realizar búsquedas. 2. 9. etc.Kinética Mobile Development Curso de PHP5. modificar o eliminar registros. Como opciones de la tabla tenemos las siguientes: 1. Una vez creados los campos podremos insertar registros completando el siguiente formulario (imagen 7): Imagen 7 2) Consultas sql e importar bases de datos. Extras (Aquí establecemos la propiedad Autoincrement: autonumérico). Página 159 de 164 . Las sentencias SQL también puede generarlas con el propio generador de consultas (imagen 9) Página 160 de 164 . Imagen 8 También puede crear la sentencia SQL en un fichero *.SQL.Kinética Mobile Development Curso de PHP5. incluyendo la sentencia SQL en el fichero *.*.txt. Desde aquí también podremos importar las bases de datos.sql y después subirlo mediante el apartado localizar del archivo de texto . el tamaño máximo de dicho fichero debe ser 2 megas. Página 161 de 164 . En esta pestaña disponemos de una serie de operaciones básicas de modificación y mantenimiento de la base de datos (imagen 11). Desde esta pestaña usted puede exportar de una forma sencilla sus bases de datos (imagen 10). imagen 9 3) Exportar. Imagen 10 4) Operaciones.Kinética Mobile Development Curso de PHP5. imagen 11 1) Modificar el orden de aparición de los campos en una tabla. podremos: 1) 2) 3) 4) 5) Revisar la tabla. Analizar la tabla. Vaciar caché. En lo referente a Mantenimiento de la tabla. Optimizar la tabla.Kinética Mobile Development Curso de PHP5. 3) Mover tablas de una base de datos a otra. tanto revisar posibles fallos en las tablas. 6) Definir el tipo de tabla. 5) Añadir comentarios a una tabla. 2) Cambiar el nombre de la tabla. Reparar la tabla. Se recomienda encarecidamente realizar las tareas de mantenimiento de las bases de datos periódicamente. para posteriormente poder repararla. 8) Distintas opciones de tabla. 7) Collation. Todas estas tareas de mantenimiento hacen que las bases funcionen fluidamente evitando problemas a la hora de navegar por el sitio web. como analizar las bases en busca de errores. 4) Copiar tablas de una base de datos a otra. Página 162 de 164 .. Kinética Mobile Development Curso de PHP5. Página 163 de 164 .