Вы находитесь на странице: 1из 54

MANUAL DE PHP

EMINENTEMENTE PRCTICO

INDICE:
1)

Introduccin (pgina 4)
Qu es PHP? Caractersticas fundamentales del lenguaje. Cmo y cuando funciona el intrprete. PHP se ejecuta en el servidor. El motor Zend.

2) Variables y tipos de datos. (pgina 5)


Enteros Nmeros en coma flotante Booleanos Cadenas de caracteres Arrays Objetos Conversin de tipos Variables de formularios Variables de PHP Otras funciones Constantes. Expresiones Operadores Precedencia de operadores

3) Operadores. (pgina 9) 4) Estructuras de control (pgina 12)


if for foreach while do..while break y continue switch

5) Funciones (pgina 17)


Qu es una funcin? Cmo se definen las funciones? Cmo se ejecuta una funcin? Cmo se pasan los parmetros? mbito de las variables Variables estticas Uso recursivo de funciones Funciones de parmetros variable Variables de funciones.

6) Cadenas y expresiones regulares (pgina 20)


Cadenas de caracteres Visualizacin de cadenas Alteracin de contenido Acceso al contenido Generacin y tratamiento de HTML

7) Arrays

(pgina 25)

8) Formularios (pgina 29) 9) Programacin orientada a objetos II (pgina 31) 10) Programacin orientada a objetos I (pgina 37) 11) Lectura y escritura de ficheros (pgina 43) 12) Subida y descarga de ficheros (pgina 47) 13) Sesiones y cookies (pgina 51)

1 - Introduccin
PHP es un lenguaje de programacin de uso general de cdigo del lado del servidor originalmente diseado para el desarrollo web de contenido dinmico. Fue uno de los primeros lenguajes de programacin del lado del servidor que se podan incorporar directamente en el documento HTML en lugar de llamar a un archivo externo que procese los datos. El cdigo es interpretado por un servidor web con un mdulo de procesador de PHP que genera la pgina Web resultante. PHP ha evolucionado por lo que ahora incluye tambin una interfaz de lnea de comandos que puede ser usada en aplicaciones grficas independientes. PHP puede ser usado en la mayora de los servidores web al igual que en casi todos los sistemas operativos y plataformas sin ningn costo.

Caractersticas

Orientado al desarrollo de aplicaciones web dinmicas con acceso a informacin almacenada en una base de datos. Es considerado un lenguaje fcil de aprender, ya que en su desarrollo se simplificaron distintas especificaciones, como es el caso de la definicin de las variables primitivas, ejemplo que se hace evidente en el uso de php arrays. El cdigo fuente escrito en PHP es invisible al navegador web y al cliente, ya que es el servidor el que se encarga de ejecutar el cdigo y enviar su resultado HTML al navegador. Esto hace que la programacin en PHP sea segura y confiable. Capacidad de conexin con la mayora de los motores de base de datos que se utilizan en la actualidad, destaca su conectividad con MySQL y PostgreSQL. Capacidad de expandir su potencial utilizando mdulos (llamados ext's o extensiones). Posee una amplia documentacin en su sitio web oficial, entre la cual se destaca que todas las funciones del sistema estn explicadas y ejemplificadas en un nico archivo de ayuda. Es libre, por lo que se presenta como una alternativa de fcil acceso para todos. Permite aplicar tcnicas de programacin orientada a objetos. Incluso aplicaciones como Zend framework, empresa que desarrolla PHP, estn totalmente desarrolladas mediante esta metodologa. No requiere definicin de tipos de variables aunque sus variables se pueden evaluar tambin por el tipo que estn manejando en tiempo de ejecucin. Tiene manejo de excepciones (desde PHP5). Si bien PHP no obliga a quien lo usa a seguir una determinada metodologa a la hora de programar, an hacindolo, el programador puede aplicar en su trabajo cualquier tcnica de programacin o de desarrollo que le permita escribir cdigo ordenado, estructurado y manejable. Un ejemplo de esto son los desarrollos que en PHP se han hecho del patrn de diseo Modelo Vista Controlador (MVC), que permiten separar el tratamiento y acceso a los datos, la lgica de control y la interfaz de usuario en tres componentes independientes. Debido a su flexibilidad ha tenido una gran acogida como lenguaje base para las aplicaciones WEB de manejo de contenido, y es su uso principal.

Motor Zend
Saltar a: navegacin, bsqueda

El motor Zend es un motor de procesamiento para la interpretacin y cifrado del cdigo php, desde la versin 4. Desarrollado por Zend Technologies para brindar un equipo de soporte y acelerar la carga de aplicaciones realizadas con php. Entre las funciones ms importantes que realiza este motor de procesamiento est la posibilidad de cifrar el cdigo fuente de las pginas desarrolladas en php para as luego hacer posible la comercializacin de este.
4

Debido a las limitaciones de este sistema en volcar el desarrollo de php a una ndole comercial un grupo de gurus hackers desarrolladores en php se dieron a la tarea de crear un algoritmo que descifrara el cdigo generado por el motor, cosa que fue lograda poco despus de su lanzamiento.
Instalacin y configuracin

Aplicaciones web y sitios web (scripting del lado del servidor) Scripting en la lnea de comandos Aplicaciones de escritorio (GUI)

Para la primera forma mencionada, que es la ms comn, se necesitan tres cosas: PHP, un servidor web y un navegador web. Seguramente ya disponga del navegador web y, dependiendo de la configuracin del sistema operativo, quiz ya tenga un servidor web (p.ej. Apache en Linux y MacOS X; IIS en Windows). Tambin puede alquilar espacio web en una empresa. De esta forma, no se necesita instalar nada, solo tiene que escribir los scripts de PHP, subirlos al servidor que alquile y ver los resultados en su navegador. En caso de configurar el servidor y PHP por su cuenta, existen dos opciones para el modo de conectar PHP con el servidor. Para muchos servidores, PHP tiene un mdulo de interfaz directo (tambin llamado SAPI). Entre estos servidores se incluyen Apache, Microsoft Internet Information Server, Netscape y iPlanet. Muchos otros servidores tienen soporte para ISAPI, el mdulo de interfaz de Microsoft (OmniHTTPd por ejemplo). Si PHP no tiene soporte para el mdulo de su servidor web, siempre puede usarlo como procesador CGI o FastCGI. Esto significa configurar el servidor para usar el CGI ejecutable de PHP para procesar cada una de las peticiones a ficheros PHP en el servidor. Si tambin est interesado en usar PHP bajo la lnea de comandos (p.ej. escribir scripts que autogeneran imgenes de forma offline, o procesar ficheros de texto dependiendo de los argumentos que se les pasen), siempre necesitar el ejecutable de lnea de comandos. Para ms informacin, lea la seccin sobre escribir aplicaciones PHP desde la lnea de comandos. En este caso, no se necesita ningn servidor o navegador. Con PHP tambin se pueden escribir aplicaciones GUI de escritorio usando la extensin PHP-GTK. Este enfoque no tiene nada que ver con escribir pginas web, ya que no se muestra nada de HTML, pero gestiona ventanas y objetos dentro de ellas. Para ms informacin acerca de PHP-GTK, por favor visite el sitio dedicado a esta extensin. PHP-GTK no est incluido en la distribucin oficial de PHP. De aqu en adelante, esta seccin trata de la configuracin de PHP para servidores web sobre Unix y Windows con interfaces de mdulo de servidor y ejecutables CGI. Tambin se puede encontrar informacin sobre ejecutables de lnea de comandos en las siguientes secciones. El cdigo fuente de PHP y las distribuciones binarias para Windows pueden encontrarse en http://www.php.net/downloads.php. Recomendamos elegir un sitio alternativo cercano para descargar las distribuciones.

2 - Variables y tipos de datos.


Las variables son almacenes de informacin. Su finalidad es guardar datos e informacin que podrs utilizar a lo largo del script. Las variables comienzan por el smbolo del dlar ($) y no necesitan ser declaradas con algn tipo de datos como en otros lenguajes de programacin. Un nombre de variable vlido ser aquel que empiece por un caracter alfabtico [a-z] o de subrayado [_], seguido de caracteres alfanumricos [a-z y 0-9] y de subrayado [_]. En otras palabras, una variable NO
5

puede empezar con caracteres numricos, ni puede contener caracteres especiales (signos de puntuacin, letras especiales como , acentos, etc.). Slo letras, nmeros y caracteres de subrayado (_). Adems, el nombre de variable es case sensitive, es sensible a maysculas y minsculas; por lo tanto, no es lo mismo una variable con nombre $edad que $Edad.
Tipos de variables

PHP es un lenguaje con un control de tipos muy bajo, permitiendo almacenar en una variable distintos tipos de datos durante la vida de la variable. Existen varios tipos de datos: -Entero (Integer): Representa nmeros enteros, positivos o negativos. Puede utilizarse el sistema decimal, octal o hexadecimal. -Coma flotante (Float o Double): Representa nmeros decimales, postivios o negativos. -Booleanos (Boolean): Tipo de datos que representa dos valores, true(verdadero) o false (falso) utilizados para realizar operaciones de lgica. -Cadenas de carcteres (String): Representan cdenas de carcteres que pueden incluir carcteres alfanumricos, signos, espacios, etc. Su finalidad es transmitir informacin textual. Van encerrados entre comillas simples o dobles, pero tambin su puede utilizar la sintaxis HEREDOC y NOWDOC. Lo veremos en ms profundidad cuando estudiamos el captulo dedicado a la manipulacin de strings, as como el uso de los carcteres de escape. -Vectores (Array): Conjunto de datos organizados. Los arrays pueden ser arrays nmericos cuyo ndice es numrico, o arrays asociativos, cuyo indice es una clave que puede ser alfanumrica. Los arrays en PHP no tienen un tipo incluido, esto permite almacenar distintos tipos de datos en su interior, ya sean nmeros o cadenas. Los veremos en ms profundidad cuando estudiemos el captulo dedicado a arrays. -Objetos (Object): Los objetos son un tipo especial de datos que veremos ms adelante en el captulo dedicado a la programacin orientada a objetos en PHP. Seguramente si ya habeis utilizado un lenguaje de programacin como Java o algunos de la plataforma .NET ya tengais experiencia manipulando objetos y utilizando la metodologa de la programacin orientada a objetos. -Recursos (Resources): Es un tipo de datos especial que devuelven algunas funciones y sirve para identificar un tipo de recurso, como por ejemplo, un puntero a una base de datos, o uno hacia un fichero abierto en modo lectura. -Null: Es un tipo de datos especial utilizado para indicar que no est inicializado. Ejemplo de tipos de datos:
<?php $numero_entero = 12343; //Integer $numero_flotante = 12343.123; //Float o Double $cadena = "Hola Mundo, soy el robot N13"; //String $booleano = true; //Boolean $vacio = null; //Null

$objeto= new Persona("Juan"); ?>

Constantes

Las constantes son tipos de datos que no varan en el desarrollo de un programa. En la vida real existen muchos tipos de constantes, el nmero pi, la temperatura de congelacin del agua, el nombre de la Empresa, etctera. Para crear una constante tiene que usar la funcin define () de la siguiente forma:
<?php define("CURSO","Introduccion a PHP"); define("AUTOR","Francisco Belmonte Ruiz"); ?>

Para mostrar el valor de las constantes nicamente hay que invocar su nombre, esta vez sin utilizar el smbolo de $.
<?php echo AUTOR; echo CURSO; ?>

Variables de tipo variable

Las variables permiten almacenar nombres de variables. Esto en un principio puede ser extrao.
<?php $variable="Hola" $$variable="Mundo" echo $variable.$Hola; //Imprime HolaMundo ?>

Funciones relacionadas con variables

An no hemos hablado de que son las funciones y ya vamos a utilizarlas. Las funciones tienen el mismo significado en PHP que en cualquier otro lenguaje de programacin. Son trozos de cdigo destinadas a realizar alguna funcin. Se utilizan para reutilizar cdigo y no tener que reescribir siempre lo mismo cuando se necesite la misma funcin a lo largo del cdigo. Ya lo veremos con ms profundidad en el captulo dedicado a funciones.
-isset():

Con esta funcin podemos averiguar si una funcin existe dentro de nuestro programa. Si existe devuelve true y si no existe false.
7

<?php $nombre = "Francisco"; if (isset($nombre)) echo ("La variable nombre existe."); ?>

-unset():

Libera la memoria ocupada por una variable, destruyendo su nombre y su contenido. Despus de usar unset(), la variable destruida aparecer como false al utilizar la funcin isset() .
<?php //Inicializamos la variable nombre con la cadena Francisco. $nombre = "Francisco"; //Como la variable existe imprime por pantalla la cadena pasada a echo. if (isset($nombre)) echo ("La variable nombre existe."); //Destruimos la variable y su contenido. unset($nombre); //Comprobamos si la variable existe. Como no existe imprime la cadena pasada a echo. if(!isset($nombre)) echo("La variable nombre no existe"); ?>

-gettype():

Con esta funcin podemos averiguar el tipo de dato almacenado en la variable. Nos puede devolver uno de los siguientes valores: object
<?php //Inicializamos la variable nombre con la cadena Francisco. $nombre = "Francisco"; //Imprimimos el tipo de la variable $nombre: string. echo ( gettype($nombre) ); ?>

integer double string array

-settype():

Convierte el tipo de la variable al especificado en la funcin. El tipo debe especificarse eligiendo uno de los siguientes: array, double, integer, object o string. Si la funcin no es capaz de convertir el tipo de la variable devuelve el valor false. Tambin podemos realizar castings en vez de utilizar la funcin settype() si queremos tratar una variable como otro tipo de datos.
<?php

//Inicializamos la variable nombre con la cadena Francisco. $cadena_numerica = "1234"; //Seteamos el tipo de variable string a integer. settype($cadena_numerica, 'integer'); //Sumamos 1234 a la variable cadena_numerica $suma=$cadena_numerica+1234; //Imprimimos el resultado: 2468 echo( $suma ); ?>

Resumen

Hay ms funciones relacionadas con el uso de variables que no vamos a dedicar en este captulo. Podeis dirigiros a la documentacin oficial de PHP para ver su uso, algunas de ellas son empty(), is_double(), is_integer(), is_string(), is_numeric(), etc La base de nuestras aplicaciones reside en la creacin y manipulacin de variables. Ya hemos aprendido a declarar variables, inicializarlas, hemos estudiado los diferentes tipos de datos yel uso de algunas funciones, as como declarar constantes. En el siguiente captulo aprenderemos a utilizar los diferentes operadores y estructuras de control tpicas de todos los lenguajes de programacin. En algunos ejemplos de este captulo ya hemos utilizado algunas, como el operador de igualdad, o de suma, o la estructura de control condicional if.

3 - Operadores.
Los operadores sirven para realizar operaciones entre variables.
Operador de asignacin:

El ms bsico es el operador de asignacin (=), utilizado para dar valores a las variables que usamos en nuestro cdigo.
<?php $variable = 5; $variable2 = "Asignacin de valores"; ?>

Operador unario:

Este operador (-) tiene la propiedad de hacer a los nmeros, negativos o positivos, dependiendo del signo actual.
<?php $entero = 100; $entero_negativo = -$entero; // El valor ahora es -100 $entero_positivo = -$entero__negativo; // El valorahora es 100

?>

Operadores aritmticos:

Este tipo de operadores forman parte de la aritmtica bsica. Nos resultar familiar porque son smbolos muy utilizados en el aprendizaje de las matemticas. Operador + * / % ++ Operacin Suma Resta Multiplicacin Divisin Mdulo Incremento Decremento Descripcin Suma entre valores Resta entre valores Multiplica distintos valores Divide entre valores Devuelve el resto de una divisin Suma una unidad a determinado valor Resta una unidad a determinado valor Ejemplo $x=2+2 $x=5-2 $x=5*5 $x=10/2 $x=10%2 $x=5; $x=++; $x=5; $x=; Resultado 4 3 25 5 0 6 4

Operadores condicionales:

Los operadores condicionales se utilizan para comparar valores. Devuelven true o false.

Operador == === != <> !== < > <= >=

Descripcin Ejemplo Igual: Compara dos valores (no compara $a == $b el tipo de variable) Igual: Compara los dos valores si son iguales y del mismo tipo Distinto: Compara si las variables son diferentes Distinto: Compara si las variables son diferentes Distinto: Compara que las dos variables sean diferentes y de diferentes tipos Menor: Compara que la primera variable sea ms pequea que la segunda Mayor: Compara que la primera variable sea mayor que la segunda $a === $b $a != $b $a <> $b $a !== $b $a < $b $a > $b

Resultado Verdadero si $a es igual a $b Verdadero si $a es igual a $b y son el mismo tipo de variable Verdadero si $a es diferente de $b Verdadero si $a es diferente de $b Verdadero si $a y $b son diferentes y son diferentes tipos Verdadero si $a es menor que $b Verdadero si $a es mayor a $b Verdadero si $a es menor o igual a $b Verdadero si $a es mayor o igual a $b

Menor o igual: Compara que la primera $a <= $b variable sea menor o igual que la segunda Mayor o igual: Compara que la primera $a >= $b variable sea mayor o igual que la segunda

10

Operadores lgicos:

Durante el desarrollo de las aplicaciones podemos encontrar situaciones en las que necesite hacer varias comparaciones seguidas para que se cumpla una determinada condicin. Para esto sirven los operadores lgicos.

Operador And Or Xor Not

Descripcin Compara que las dos variables sean verdaderas Compara que alguna de las dos variables sean verdaderas Compara que $a o $b sean verdaderos pero no ambos Niega una condicin

Ejemplo $a && $b $a || $b $a Xor $b !$a

Resultado Verdadero si $a y $b son verdaderos Verdadero si $a o $b son verdaderos Verdadero si $a o $b son verdaderos pero no ambos Verdadero si $a es f

Operador ternario:

Los operadores que hemos visto hasta ahora son capaces de manejar un operando (unarios) o dos operandos (binarios). El operador ternario, o de comparacin, evala un operando y, dependiendo de si es falso o verdadero, evala el segundo operando o el tercero.
<?php $valor = false; $valor == true ? $resultado = "OK" : $resultado = "FALLO"; // Si $value es true $resultado ser OK // Si es false $re sultado ser FALLO echo $resultado; ?>

Operadores de bit a bit:

Este tipo de operadores no vamos a verlos porque no suelen utilizarse mucho en las aplicaciones webs.
Operador de ejecucin:

Mediante el operador de ejecucin podemos ejecutar comandos del sistema en nuestras aplicaciones PHP. El operador es las comillas invertidas (` `)
<?php $listado_archivos = `ls-la`; echo $listado_archivos; ?>

11

Operador de supresin de errores:

Cuando algo falla en nuestras aplicaciones PHP el navegador informa de una serie de errores. Esta no es una buena prctica porque un atacante podra aprovecharse de los cdigos de error para recabar informacin de como esta diseado el interior de nuestras aplicaciones. Para suprimir los errores se utiliza el smbolo (@). Hace tiempo le en un artculo de mejora de rendimiento de las aplicaciones, que este operador consuma bastantes recursos del servidor. As que es bueno no utilizarlo muy a menudo. Si lo que queremos es no mostrar errores, podemos configfurar PHP para que no muestre ninguno mediante error_reporting(0).
<?php /*En este ejemplo abrimos un fichero en modo lectura. Si el fichero no existe, el navegador emitira un error de acceso. Mediante el operador @ no lo mostramos en el navegador. */ $fichero = @fopen("prueba.txt","r") ; ?>

Resumen

Ya sabemos como utilizar los diferentes tipos de operadores en PHP. La preferencia de operadores es la utilizada en las matemticas. No voy a entrar mucho en detalle. En el prximo captulo aprenderemos a utilizar las estructuras de control condicionales y posiblemente las estructuras de control repetitivas.

4 - Estructuras de control
os scripts son un conjunto de instrucciones que se ejecutan una detrs de otra. Si queremos cambiar el rumbo de nuestros scripts debemos utilizar estructuras de control. Las estructuras de control nos permiten elegir diferentes caminos en funcin de los datos que evaluamos en cada momento. En este captulo trataremos dos tipos de estructuras de control: -Estructuras de control condicionales. -Estructuras de control repetitivas. Las estructuras condicionales permiten evaluar una condicin o varias y elegir el camino correcto. Las estructuras repetitivas repiten un nmero determinado de veces un conjunto de instrucciones.
Estructuras de control condicionales -if

La sintaxis de esta estructura es: if (condicin) instruccin; Si se cumple la condicin se ejecuta la instruccin que le sigue. Si quiere que se ejecuten varias instrucciones, debe encerrar el conjunto de instrucciones entre llaves ( { } ).
12

if (condicin) { instruccionl; instruccion2; instruccion3; }


-ifelse

La estructura if puede ampliarse para que se pueda elegir entre condicin verdadera y falsa. if (condicin) { instruccionl; instruccin2; instruccion3; } else { instruccionl ; instruccin2; instruccion3; } Si la condicin es verdadera se ejecutan las instrucciones inmediatamente despus del if y si la condicin es falsa se ejecutan las instrucciones dispuestas despus de la palabra else. Ejemplo de ifelse:
<?php $valor = 50; $valor2 = 100; //Comprobamos mediante un operador de condicin. En este caso como //$valor es menor que $valor2 se imprimir la cadena: // "La variable valor es menor que valor2". if ($valor < $valor2) { echo "La variable valor es menor que valor2"; } else { echo "La variable valor es mayor que valor2"; } ?>

-switch

La construccin switch comprueba el valor de una expresin y permite elegir entre un conjunto de instrucciones. El formato es el siguiente: switch (expresin) { case valor1 : instruccionl; instruccion2; instruccion3; break;

case valor2: instruccionl;


13

instruccion2; instruccion3; break;

default: instruccionl; instruccion2; instruccion3; } La expresin puede ser de cualquier tipo, siempre que devuelva un valor de tipo entero, de coma flotante o de cadena de caracteres. Una vez evaluada la expresin, se busca el valor en la instruccin case y, si coincide, se ejecutan todas las instrucciones hasta la palabra reservada break. Si no coincide ningn valor, se ejecutan las instrucciones por defecto. Ejemplo de switch:
<?php $dia = 4 ; switch ($dia) { case 1: echo "El da es break; case 2 : echo "El da es break; case 3 : echo "El da es break; case 4 : echo "El da es break; case 5: echo "El da es break; case 6 : echo "El da es break; case 7: echo "El da es break; default: echo "El da de } ?>

Lunes"; Martes"; Mircoles"; Jueves"; Viernes"; Sbado"; Domingo" ; la semana es incorrecto";

En nuestro ejemplo se imprimir la cadena: El da es Jueves.


Estructuras de control repetitivas -while

El bucle while es el ms bsico de todos. La construccin bsica es la siguiente: while (condicin) { instruccinl; instruccin2;
14

instruccin3; } La condicin se evala al principio. Si es verdadera, se ejecutan las instrucciones que estn dentro del bucle y se vuelve a evaluar la condicin. Si la condicin es falsa no se ejecutan las instrucciones y se contina con el desarrollo del programa. Puesto que la condicin se evala antes de ejecutar las instrucciones, es posible que algunos bucles no se ejecuten ninguna vez. Ejemplo de while:
<?php $variable = false; while ($variable) { echo "Esta linea no se ejecuta nunca"; } $variable = true; while ($variable) { echo "Esta linea se ejecuta siempre ya que el bucle es infinito"; } ?>

Hay que tener especial cuidado con los bucles infinitos. Normalmente la condicin utilizada como guarda deber cambiar en algn momento a false para asegurar que el bucle no se ejecute infinitamente.
-dowhile

Este bucle es igual que el anterior, pero la condicin se evala al final de las instrucciones. Por lo tanto, el cdigo que est entre las llaves se ejecuta al menos una vez. El formato bsico es el siguiente: do { instruccinl; instruccin2; instruccin3; } while (condicin); Ejemplo de do while:
<?php $anterior = 1; $posterior = 1; $serie = 1; $fin = 5000; echo "Serie de Fibonacci:"; do { echo $serie.", " ; $serie = $anterior + posterior; $anterior = $posterior; $posterior = $serie; } while ($serie < $fin);

15

?>

En el ejemplo hemos programado un algoritmo que calcule la serie de Fibonnaci comenzando por el nmero 1 hasta llegar a un nmero menor de 5000. No hay mucho que explicar ya que el algortimo se entiende perfectamente. No es que est muy optimizado pero sirve perfectamente como un ejemplo bsico del bucle dowhile.
-for

La construccin de bucle ms complicada es la del for. Tiene la siguiente sintaxis: for (expresin inicial; condicin de fin; expresin de fin) { instruccinl; instruccin2; instruccin3; } El funcionamiento es muy sencillo. La expresin inicial se ejecuta una sola vez al principio del bucle. La condicin de fin se evala cada vez que se ejecuta el bucle. Si es verdadera se contina la ejecucin y si es falsa se sale del bucle. Al final de cada interaccin se ejecuta la expresin de fin. Ejemplo de for:
<?php for ($x = l;$x <= 10; $x++ ) { echo '2 * '.$x.' = '.(2*$x); echo '<br />' } ?>

En este ejemplo sencillo calculamos la tabla de multiplicar del dos, esa que aprendemos en primero de primaria.
-foreach

Me reservo esta estructura de control para el captulo dedicado a arrays.


-continue, break, exit

Estas tres palabras reservadas no son estructuras de control. Se utilizan en el interior de bucles de esta manera: - break: Sale del bucle actual y contina el programa. - continue: Salta hasta el final de la iteraccin y contina la ejecucin desde el principio del bucle. - exit: Finaliza la interpretacin del cdigo PHP. Tambin puede utilizarse la funcin die().
16

RESUMEN

En tres captulos ya hemos aprendido a utilizar variables, operadores y estructuras de control. Ya estamos casi a punto de empezar a crear aplicaciones dinmicas totalmente funcionales, claro est si tenemos cierto conocimiento avanzado de las tecnologas XHTML, CSS y JavaScript. En el siguiente captulo estudiaremos las funciones y como podemos cerarnos nuestras propias funciones para reutilizar cdigo.

5 - Funciones
Las funciones son grupos de instrucciones independientes que tienen un propsito determinado. As, podemos tener una funcin que calcule la raz cuadrada, o otra que calcule el nmero de caracteres a que tiene una cadena. La sintaxis bsica de una funcin es la siguiente: nombre_funcin (parmetrol, parmetro2 , parmetro3parmetro_n); Las funciones pueden ser llamadas con varios parmetros o con ninguno, dependiendo de su definicin. Cuando PHP encuentra en el cdigo la llamada a una funcin, primero, evala cada argumento y los utiliza como parmetro de entrada. Despus, ejecuta la funcin y devuelve el valor solicitado o realiza alguna accin sin enviar ningn valor de salida.
Funciones de PHP

PHP cuenta con un gran nmero de funciones que podeis utilizar directamente en vuestras aplicaciones. Podis estudiar la documentacin en lnea a travs de la pgina oficial de PHP cuando no sepis como utilizar una funcin. En ella encontrareis ejemplos bsicos, y toda la documentacin referente a cada una de las funciones predefinidas en PHP. Teneis funciones de todo tipo, para manejar bases de datos, para manejar ficheros, para manipular imgenes, para crear documentos pdfs, para interactuar con diferentes protocolos mediante sockets, etc. La cuestin es no reinventar la rueda, si PHP cuenta con una funcin que necesiteis es mejor utilizarla ya que estar programada eficazmente por un amplio grupo de desarrolladores con mucha ms experiencia que nosotros.
Funciones de usuario

Adems de todas las funciones predefinidas en PHP, nosotros podremos crear nuestras propias funciones. As nuestro cdigo ser menos extenso y ms legible. Antes de invocar uan funcin tenemos que definirla. El formato para definir una funcin es el siguiente: function { instruccinl; instruccin2; instruccin3; return } nombre_funcin($argumentol, $argumento2, ..)

$variable;

17

Comenzamos con la palabra reservada function seguida del nombre de la funcin que utilizaremos para invocarla. A continuacin entre parntesis el nmero de argumentos que le pasaremos a la funcin. Y encerrados entre llaves todas las instrucciones referentes a nuestra funcin. Las funciones pueden retornar un valor mediante la palabra reservada return, o no devolver ninguno. Ejemplo de funcin:
<?php function factorial($numero) { $resultado = 1; for ($i = $numero; $i > 0; $i--) { $resultado = $resultado * $i; } return $resultado; } echo "El factorial de 3 es ".factorial(3)."<br>"; echo "El factorial de 4 es ".factorial(4)."<br>" ; echo "El factorial de 5 es ".factorial(5). "<br>"; ?>

En este ejemplo hemos definido la funcin factorial, que calcula el factorial del nmero pasado como parmetro. Despes hacemos uso de ella invocndola para calcular el factorial de 3, de 4 y de 5.
mbito de las variables

Las variables definidas permanecen declaradas en todo el fichero, menos en las funciones. Las funciones crean un entorno de ejecucin donde slo pueden ver las variables que estn dentro de las mismas. Vamos a observar el comportamiento de las variables con un ejemplo.
<?php $cadena="Adios"; //Imprime Adios echo $cadena; function mostrar() { $cadena="Hola"; echo($cadena); } //Imprime Hola mostrar(); //Imprime Adios echo $cadena; ?>

En este ejemplo podemos observar el comportamiento de la variable $cadena. La variable $cadena dentro de la funcin sustituye a la variable $cadena de fuera, pero no reemplaza el valor. Para la funcin, la variable $cadena de fuera no tiene nada que ver con la variable $cadena de dentro. As en el ltimo echo podemos observar que imprime Adios ya que la funcin no reemplaza el valor de la variable $cadena de fuera. An as hay un mecanismo que permite utilizar las variables de fuera dentro de las funciones siempre que se declare como variable global mediante la palabra reservada global.
18

Resumiendo, las variables pueden ser locales a la funcin, o globales a todo el archivo.
Variables estticas

Por defecto, las funciones que creamos en PHP no retienen en memoria el valor de las variables que se utilizan. Cada llamada a una funcin implica la nueva creacin de las variables locales con su valor inicial. La declaracin static aadida a una variable causa que la funcin retenga en memoria el valor de esa variable en cada llamada.
<?php //Cada vez que se llame a esta funcin, aumentar en // uno la variable contador, no se inicializar a cero. function contador() { static $contador = 0; $contador = $contador + 1; return $contador; } ?>

include() y require()

Estas dos funciones incluyen archivos en nuestros documentos. As podemos organizar todas las funciones en archivos separados e incluirlas en los documentos donde tengamos que hacer uso de ellas. Es una manera de estructurar el cdigo de nuestras aplicaciones. Otra versin de estas dos funciones son include_once() y require_once() que comprueba si el archivo ya est incluido para no hacer dobles inclusiones. Estas dos funciones en PHP pueden ser peligrosas si no se utilizan bien. Podeis ver el artculo dedicado a ataques RFI que hacen uso de la mala programacin de esta funcin para incluir scripts maliciosos remotos. Introduccin a los ataques RFI
Funciones recursivas

No voy a entrar en la explicacin de funciones recursivas.


Funciones con parmetros variables

Para invocar funciones con un nmero variable de parmetro podemos utilizar las siguientes tcnicas: -Definir la funcin con argumentos por defecto, de esta forma podemos hacer llamadas a la funcin con un nmero menor de parmetros sin que ocurra un error. -Usando un array como parmetro para pasar las variables. -Usando las funciones de argumentos variables de PHP, func_num_args(), func_get_arg() y func_get_args(). Para m la mejor forma es la segunda, pasar los argumentos en un array, ya que la ltima tiene una serie de limitaciones que no me gustan.

19

NOTA: Los parmetros se pasan por valor, esto quiere decir que las funciones se ejecutan con copias de las variables pasadas como argumentos, as que no modifican ninguna variable. Antiguamente se podan pasar parmetros por referencia utilizando el aspersand &, pero est obsoleto en las nuevas versiones de PHP. Los objetos en PHP se pasan por referencia, pero ya entraremos en detalle en el captulo dedicado a la POO en PHP.
RESUMEN

Ya hemos aprendido como definir nuestras propias funciones en archivos por separado e inclurilas en nuestros documentos mediante las funciones include() y require(). Tambin hemos aprendido como definir funciones con parmetros variables. En el siguiente captulo estudiaremos las cadenas y las funciones que dispone el API de PHP para manipularlas. Trataremos tambin un poco el tema de las expresiones regulares.

6 - Cadenas y expresiones regulares


Los strings son cadenas de carcteres que se les puede asignar a una variable si se encierran entre comillas simples o dobles. Cadena entre comillas dobles Cadena entre comillas simples PHP interpreta de distinta forma las cadenas que van entre comillas dobles y las que van entre comillas simples. Los strings entre comillas dobles pueden sustituir el valor de las variables. Las comillas simples, simplemente muestran todo el contenido, sin atender a las variables. Cuando utilizamos simplemente cadenas es ms eficiente encerrarlas entre comillas simples ya que evitamos que el motor de PHP tenga que evaluar la cadena en busca de variables en las que sustituir por su valor.
<?php $nombre = "Francisco"; $frase1 = "Hola $nombre"; $frase2 = 'Hola $nombre'; //Imprime Hola Francisco echo $frase_1; //Imprime Hola $nombre echo $frase_2; ?>

Propiedades de los strings

Los strings son cadenas de caracteres, as podemos acceder a cualquier carcter de la cadena mediante los smbolos de llave ({}), y un ndice numrico. Podemos observar en el ejemplo que el primer carcter de la cadena posee el ndice cero.
<?php $nombre = "Francisco"; //Imprime F echo $nombre{0}; //Imprime r echo $nombre{1}; ?>

20

Operadores

Como en otros lenguajes de programacin podemos utilizar un operador para concatenar cadenas, en PHP las cadenas se concatenan con el operador punto (.).
<?php $nombre = "Francisco"; //Imprime Hola Francisco $frase = 'Hola '.$nombre; ?>

Sintaxis para mltiples lneas

Existe en PHP una forma ms de introducir cadenas, aparte de las comillas, muy recomendable para largos textos. La sintaxis es muy sencilla y comienza con el operador (<<<) seguido de una etiqueta que indica el principio del texto. Despus de esto podemos escribir un conjunto de caracteres muy numerosos y, para finalizar, la etiqueta de fin.
<?php $cadena= <<<EOF Hola, soy una cadena que contiene m&#250;ltiples lneas. Para ello utilizo la sintaxis heredoc que permite escribir cadenas muy largas mientras no incluyamos la palabra que he utilizado en este caso como inicio. EOF; echo $cadena; ?>

Funciones predefinadas en PHP para manipular cadenas

PHP cuenta con un conjunto amplio de funciones para realizar todo tipo de manipulaciones con las cadenas de caracteres. Vamos a ver unas cuantas. Para mayor informacin podeis acudir como siempre recomiendo a la documentacin oficial en lnea de PHP, donde estn definidas todas las funciones que engloba PHP.
-strlen()

La funcin strlen() devuelve como resultado el nmero de caracteres de la cadena que pasemos como parmetro.
<?php $cadena = "Hola mundo"; $numero = strlen($cadena); //Imprime: La variable $cadena tiene 10 caracteres echo 'La variable $cadena tiene '.$numero.' caracteres'; ?>

-strpos()

La funcin strpos() encuentra en una cadena de caracteres la primera ocurrencia de un carcter determinado o una cadena de caracteres. Devuelve la posicin donde se encuentra, y si no se encuentra devuelve el booleano false.
21

<?php $cadena = "Hola, me llamo Francisco Belmonte y esto es un curso de PHP"; //Imprime: La primera ocurrencia de Francisco es 15. echo "La primera ocurrencia de 'Francisco' es " . strpos($cadena, 'Francisco').'<br />'; ?>

Si lo que queremos es empezar a buscar la cadena o el caracter desde el ltimo caracter podemos utilizar la funcin strrpos().
-strcmp()

Con el operador == podemos evaluar si dos cadenas de caracteres son iguales. Pero tambin podemos utilizar la funcin strcmp() que compara dos cadenas pasadas como parmetros y devuelve un valor en funcin de la comparacin. Si el valor que se obtiene es 0, las cadenas son exactamente iguales. Si el valor que se obtiene es <0, el primer string es menor que el segundo. Si el valor que se obtiene es >0 el primer string es mayor que el segundo. Si queremos que no se distingan entre maysculas y minsculas podemos utilizar la funcin strcasecmp().
<?php $cadena1 = "Hola"; $cadena2 = "Hola"; if (strcmp($cadenal,$cadena2) == 0) { echo "Las dos cadenas son iguales"; } elseif (strcmp($cadenal,$cadena2) < 0) { echo "La cadena1 es menor que la cadena2"; ?>

En nuestro ejemplo, se imprimir la cadena: Las dos cadenas son iguales.


-strstr()

La funcin strstr() toma como parmetro dos cadenas de caracteres, el primer string es el string donde queremos buscar el segundo. Si lo encuentra devuelve una cadena de caracteres que comienza justo en el string encontrado hasta el final del primer string. Puede que la explicacin sea un poco liosa, pero vamos a verlo ms facilmente con un ejemplo.
<?php $cadena1 = "Hola Francisco, qu tal ests?"; $cadena2 = "Francisco"; //imprime: Francisco, qu tal ests? echo ( strstr($cadena1,$cadena2) ); ?>

-substr()

La funcin substr() permite seleccionar un conjunto de caracteres de una cadena sin modificar el string original. Puede tomar varios parmetros: -substr(cadena, ndice ) : Cadena es el conjunto de caracteres que queremos cortar e ndice la posicin a partir de la cual se cortar la cadena hasta el final.

22

-substr (cadena ,ndice, nmero) : Cadena es el conjunto de caracteresque queremos cortar e ndice la posicin a partir de la cual se cortar la cadena tantas posiciones como indique el nmero.
<?php $cadena1 = "Hola Francisco, qu tal ests?"; //imprime: Hola Francisco, qu tal ests? echo ( substr($cadena1,0) ); //imprime: Francisco echo ( substr($cadena1,5,9) ); ?>

-ltrim(), chop(), trim()

Estas funciones borran cualquier espacio en blanco al principio, al final, o a ambos respectivamente de la cadena que se pasa como parmetro. Se utilizan por ejemplo, cuando el usuario introduce datos desde un formulario y queremos comprobar que no haya insertado ningn espacio en blanco por equivocacin.
-str_replace()

Esta funcin busca una cadena de caracteres en otra cadena de caracteres y reemplaza las coincidencias encontradas por otra cadena de caracteres. Se utilizan por ejemplo para sustituir Smilies por las imgenes correspondientes.
<?php $cadena1 = "Hola Francisco, qu tal ests?"; //imprime: Hola Paco, qu tal ests? echo ( str_replace('Francisco', 'Paco', $cadena1) ); ?>

Si en la cadena existe ms de una instancia del patrn buscado se reemplaza en todas las coincidencias.
-strtolower(), strtoupper()

Estas dos funciones cambian la cadena pasada como parmetro a minsculas o a maysculas respectivamente.
<?php $cadena1 = "FrAnCiScO"; //imprime: francisco echo ( strtolower($cadena1) ); //imprime: FRANCISCO echo ( strtoupper($cadena1) ); ?>

Expresiones regulares

Las funciones que hemos visto de manipulacin de cadenas son tiles cuando tenemos que buscar o sustituir caracteres, pero son poco tiles cuando tenemos que comprobar que una cadena siga un patrn determinado. Por ejemplo, imaginaros que tenemos un formulario donde el usuario introduce su email para enviarle las ofertas relacionadas con sus preferencias. En nuestra aplicacin tendremos que comprobar que el dato introducido en ese campo sea una direccin de correo vlida. Para este tipo de operaciones utilizamos expresiones regulares.
23

Las expresiones regulares podemos decir que son patrones de bsqueda dentro de cadenas. En un principio, suele ser difcil utilizarlas, pero poco a poco vas viendo el potencial que tienen. Vamos a ver las reglas sintcticas para formar expresiones regulares POSIX que son las aceptadas por el motor de PHP. Voy a intentar no liar mucho la perdiz. Los caracteres no especiales se escriben como de costumbre. Si queremos buscar en un cadena de caracteres la cadena aabb, podemos utilizar la expresion regular aabb. El smbolo ^ indica que tenemos que empezar a buscar el patrn al inicio de la cadena. As la siguiente expresin regular ^a solo evalua como ciertas aquellas cadenas que empiezen por el caracter a. El smbolo $ obliga al patrn a cumplirse hasta el final de la cadena. As la siguiente expresin regular aabb$ solo evaluar como ciertas aquellas cadenas que terminen por aabb. El smbolo . simboliza cualquier caracter. As la expresin regular ^a.b evaluar como ciertas las cadenas que empiezen por el caracter a, seguido de otro caracter cualquiera, seguido del caracter b. Los smbolos [] indican que se pueden encontrar el caracter encerrado entre los corchetes. Vamos a ver este caso con mayor detalle. Si utilizamos la expresin regular [aeiou] evaluar como ciertas cualquier cadena que contenga una vocal. Si utilizamos la expresin regular [a-z] evaluar como cierta cualquier cadena que contenga un caracter entre el rango a-z, es decir cualquier letra del abecedario en minsculas. Tambin puede incluir un conjunto de rangos mediante el patrn [a-zA-Z]. Tambin podemos excluir un conjunto de rangos mediante el smbolo ^ solo si es utilizado dentro de los corchetes. El smbolo * indica que puede haber cero o ms instancias. El smbolo + indica que pueden haber una o ms instancias. El smbolo | indica una alternativa en el patrn. El smbolo \ es el caracter de escape por si queremos buscar un caracter especial. Hasta aqu todo lo referente a las expresiones regulares. La mejor forma de entenderlas es viendo ejemplos distintos. En este caso vamos a formar una expresin regular que permita validar correos del estilo: correo@dominio.com o correos del estilo: correo@subdominio.dominio.com Vamos a comenzar con el ejemplo. En primer lugar permitimos desde el comienzo un nmero de letras, al menos tiene que tener una: ^[a-zA-Z]+ Seguido de una @ y un conjunto de letras: ^[a-z]+@[a-z]+ Seguido de un .com final: ^[a-z]+@[a-z]+\.com$
24

Esta expresin regular ya acepta correos con el primer estilo que queramos correo@dominio.com pero no acepta el segundo estilo ya que despes de la arroba no hemos aceptado el caracter punto. ^[a-z | \.]+@[a-z | \.]+\.com$ Ahora ya acepta los dos estilos de correos electrnicos. Ya hemos construido nuestra primera expresin regular utilizando los smbolos especiales. Este no es un buen patrn para validar correos electrnicos pero pede srvirnos como ejemplo introductorio al mundo de las expresiones regulares.
-ereg(), eregi()

La uncin ereg() es capaz de comprobar si una cadena cumple con el patrn de la expresion regular que se pasa como parmetro. Devuelve true si lo aceota, false en caso contrario.
<?php $cadena1 = "correo@dominio.com"; //imprime: Correo vlido if( ereg( ^[a-z | \.]+@[a-z | \.]+\.com$ , $cadena ) ) echo ( "Correo vlido" ); ?>

El equivalente eregi() no es sensible a maysculas y minsculas.


-ereg_replace(), eregi_replace()

Esta funcin toma tres parmetros. El primero es una expresin regular, el segundo un string por el que se cambiarn todas las ocurrencias del patrn encontrado, y el tercer un string donde se buscar el patrn.
<?php $cadena1 = "correo@dominio.com"; //imprime: Hola Francisco echo( ereg_replace( ^[a-z | \.]+@[a-z | \.]+\.com$ , "Hola Francisco", $cadena ) ); ?>

RESUMEN

Hasta qu este captulo extenso dedicado a la manipulacin de cadenas de caracteres y el uso de expresiones regulares POSIX. Hemos aprendido a declarar variables de tipo string, manipularlas para buscar cadenas y realizar otro tipo de operaciones. Y por ltimo hemos aprendido a construir expresiones regulares para buscar patrones en las cadenas de caracteres. Una forma muy potente de validar cadenas. En el prximo captulo trataremos los arrays.

7 - Arrays
Un array es una coleccin de datos que podemos almacenar en una variable con un nico nombre. Para acceder a los datos podemos utilizar ndices nmericos o alfanumricos. En PHP los arrays no se definen con un tipo base y pueden almacenar distintos tipos de variables en su interior, ya sean integers, cadenas u objetos. Adems son dinmicos, esto quiere decir que no necesitamos definirlos con un tamao como en la mayora de lenguajes de programacin, ya que van creciendo dinamicamente a medida que utilizamos nuevos ndices.
25

Para crear un array podemos utilizar la funcion array() que crea un array con los datos que se le pasen como parmetros.
<?php $numeros = array(1,2,3,4,5,6); ?>

En nuestro ejemplo hemos creado un array de ndice numrico ya que para acceder a los datos de su interior utilizamos ndices numricos de esta forma:
<?php $numeros = array(1,2,3,4,5,6); $numero1=numeros[0]; //$numero1=1 $numero2=numeros[1]; //$numero2=2 $numero3=numeros[2]; //$numero3=3 ?>

La funcin array() tambin nos permite crear arrays asociativos para acceder a los datos utilizando claves alfanumricas.
<?php $agenda = array("Lunes" => "Estudiar PHP", "Martes" => "Estudiar CSS", "Mircoles" => "Examen de Java", "Jueves" => "Estudiar SQL", "Viernes" => "Salir de fiesta"); //Imprime la cadena: Hoy es Lunes, toca Estudiar PHP echo 'Hoy es Lunes, toca '.$agenda['Lunes']; ?>

En este ejemplo hemos almacenado en un array 5 par de claves/valor y hemos accedido al valor de la clave Lunes.
Arrays multidimensionales

Hasta ahora hemos utilizado un array unidimensional. PHP soporta arrays de varias dimensiones, aunque no suele utilizarse ms all de una tercera dimensin porque aumenta bastante la complejidad de manipularlos.
<?php $tecnologias=array( 'web' => array( 'programacion' => 'PHP', 'marcado' => 'XHTML', 'presentacion' => 'CSS'), 'escritorio' => array( 'programacion' => 'Java', 'otro' => 'C++')) ?>

Hemos creado un array de dos dimensiones. Para acceder a los datos podemos utilizar:
<?php echo $tecnologias['web']['programacion']; //Imprime PHP ?>

26

Funciones de manipulacin de arrays

La API de PHP tiene numerosas funciones de manipulacin de arrays, como siempre para reducir la extensin del curso voy a referirme a alguna de ellas pero podeis encontrar informacin ms exhaustiva en la documentacin oficial en lnea de PHP.
-count(), sizeof()

Esta funcin cuenta el nmero de elementos de un array. Tambin puede utilizarse la funcin sizeof() que funciona de la misma manera.
<?php $agenda = array("Lunes" => "Estudiar PHP", "Martes" => "Estudiar CSS", "Mircoles" => "Examen de Java", "Jueves" => "Estudiar SQL", "Viernes" => "Salir de fiesta"); echo count( $agenda ); //Imprime 5 ?>

-in_array()

Esta funcin busca un valor pasado como argumento dentro del array pasado como argumento. Si lo encuentra devuelve true, en caso contrario, devuelve false.
<?php $agenda = array("Lunes" => "Estudiar PHP", "Martes" => "Estudiar CSS", "Mircoles" => "Examen de Java", "Jueves" => "Estudiar SQL", "Viernes" => "Salir de fiesta"); if (in_array( "Salir de fiesta" , $agenda ) ) echo "En nuestra agenda hay un da para salir de fiesta"; ?>

-unset()

Podemos utilizar esta funcin para borrar un dato del interior del array, as como el array entero.
<?php unset($agenda['Viernes']); //Borramos de nuestra agenda el par clave/valor del Viernes. unset($agenda) //Borramos el array entero ?>

Recorrer un array mediante foreach

Cuando estudiamos las estructuras de control me salt la estructura de control llamada foreach que se utiliza para recorrer arrays. Es hora de estudiarla. Su sintaxis es la siguiente: foreach($array as $valor ) o
27

foreach($array as $indice=>$valor ) As podemos utilizar dentro del bucle las variables $indice y $valor que contendrn el ndice y el valor respectivamente de cada elemento del array.
<?php foreach( $agenda as $clave => $valor) { echo 'El da '.$clave.' toca '.$valor.'<br />' } ?>

En nuestro ejemplo recorremos el array asociativo $agenda. En la variable $clave almacenamos la clave de cada elemento y en la variable $valor almacenamos el valor de cada elemento del array asociativo.
Recorrer un array utilizando funciones

Los arrays tambin podemos recorrerlos utilizando una serie de funciones que manejan el puntero interno del array. El puntero inicialmente apunta al inicio del array. La funcin current() devuelve el valor del elemento al que apunta el puntero. Podemos incrementar el puntero con la funcin next() y decrementarlo con la funcin prev(). Tambin podemos situar el puntero al inicio del array con la funcin reset() o al final del array con la funcin end(). Si el puntero llega al final del array la funcin next() devuelve false.
<?php $valor_inicial=current($agenda); echo $valor_inicial.'<br />'; //Imprime Estudiar PHP while( next($agenda) ) { echo current($agenda).'<br />'; } reset($agenda); ?>

En este ejemplo hemos recorrido el array $agenda de uno de los ejemplos anteriores utilizando el puntero interno y las funciones de recorrido. Podeis utilizar esta forma tambin, aunque es mucho ms elegante recorrerlos con la estructura de control foreach.
Funciones para insertar o extraer elementos -array_push(), array_pop()

La funcin array_push() inserta un elemento al final del array. Analogamente, la funcin array_pop() extrae y devuelve el ltimo elemento del array.
<?php $numeros=array(1,5,6,8,10,25); array_push($numeros, 2, 5, 6); echo array_pop($numeros); //Imprime 6 ?>

28

Funciones para ordenar arrays -asort(), arsort(), ksort(), krsort(), sort(), rsort()

Esta serie de funciones se utilizan para ordenar arrays. La funcin asort() ordena los valores del array ascendentemente. La funcin arsort() ordena el array por valores descendentes. La funcin ksort() ordena el array por claves ascendentes. La funcin krsort() ordena el array por claves descendentes. La funcin sort() ordena el array ascendentemente con el inconveniente de que se pierde la asociatividad entre la clave y el valor, es decir si le pasamos un array asociativo de vuelve un array de ndice numrico. La funcin rsort() tiene el mismo inconveniente y ordena los valores descendentemente.
<?php $array_numerico=array( "Lunes", "Martes", "Miercoles", "Jueves", "Viernes" var_dump(sort($array_numerico)); var_dump(rsort($array_numerico)); $array_asociativo=array("Lunes" => "Lentejas", "Martes" => "Macarrones", "Miercoles" => "Spaguettis", "Jueves" => "Albondigas", "Viernes" => "Morcilla"); var_dump(asort($array_asociativo)); var_dump(arsort($array_asociativo)); var_dump(ksort($array_asociativo)); var_dump(krsort($array_asociativo)); ?> );

En este ejemplo, hemos ordenado un array de ndice numrico y un array asociativo, y hemos mostrado el valor de los arrays mediante la funcin var_dump(). Esta funcin ms que nada sirve para depuracin de los cdigos ya que muestra el contenido de cualquier variable pasada como parmetro.
RESUMEN

Hemos visto como utilizar arrays de ndice numricos y arrays asociativos. Hemos aprendido a ordenarlos y a recorreros mediante la estructura de control foreach y el puntero interno. Hemos visto algunas funciones para manipular arrays. En el siguiente captulo aprenderemos a acceder a las variables de formularios, tanto del mtodo POST como del mtodo GET. Poco a poco vamos adentrandonos en el mundo de PHP, con el siguiente captulo ya podreis crear algunas aplicaciones bsicas. Pero todava falta mucho por ver.

9 - Formularios
A lo largo del curso ya hemos visto muchas caractersticas bsicas de PHP pero la verdadera potencia del lenguaje reside en la comunicacin con el usuario que utilize nuestras aplicaciones, para ello PHP puede acceder a las variables de los formularios o a travs de la barra de direccin del navegador.

29

PHP cuenta con dos arrays super-globales $_POST y $_GET para acceder a las variables de formulario enviadas a travs del mtodo POST y GET respectivamente. En versiones anteriores de PHP se poda acceder a travs de los arrays $HTTP_POST_VARS y $HTTP_GET_VARS, y aunque su uso ya sea obsoleto podemos utilizarlos igualente si activamos la directiva register_long_arrays. PHP tambin cuenta con un estilo corto para acceder a las variables de formulario utilizando directamente el nombre del atributo name de cada campo. Esta forma de acceder a los datos no es recomendable para la seguridad de nuestras aplicaciones, ya que un usuario malintencionado podra pasar otras variables que utilizaramos en nuestros cdigos e interferir en la lgica programada. En la configuracin de PHP ya viene desactivado su uso, pero para asegurarnos desactivaremos la directiva register_globals.
Formularios XHTML

Antes de empezar a utilizar PHP para manipular las variables de formularios vamos a hacer un repaso de las etiquetas XHTML para el marcado de formularios y los distintos campos. No va a ser una gua en profundidad, ms bien un repaso, ya que presupongo que si estais aprendiendo PHP es que ya teneis algunos conocimientos intermedios de HTML/XHTML. La etiqueta <form> cuenta con una serie de atributos a destacar: -method: Este atributo puede ser POST o GET e indica el mtodo con el que se pasaran los datos al servidor. Si utilizamos el mtodo GET los datos se pasaran por la URL y sern visibles por todos los usuarios. Si utilizamos el mtodo POST los datos van incluidos en el cuerpo de la peticin HTTP al servidor. -action: Este atributo indica el archivo PHP que procesar la informacin. Puede ser una ruta relativa o absoluta. Dentro de la etiqueta <form> podemos encerrar distintos campos de texto, de password, checkbuttons, radiobuttons, listas, etc. De estos campos cabe destacar el atributo name ya que accederemos a los datos de cada campo en el servidor utilizando el valor de ese atributo.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Documento sin t&#237;tulo</title> </head> <body> <form method="post" action="contacto.php"> <label for="nombre">Nombre:</label> <input type="text" name="nombre" id="nombre" /> <br /> <label for="asunto">Asunto:</label> <input type="text" name="asunto" id="asunto" /> <br /> <label for="cuerpo">Cuerpo:</label> <br /> <textarea name="cuerpo" id="cuerpo" rows="10" /> </form> </body> </html>

Un ejemplo de un formulario muy bsico sin estilos CSS y no muy bien diseado pero que nos sirve como ejemplo para explicar como acceder a los datos que el usuairo introduce. En nuestro ejemplo tenemos tres
30

campos, nombre, asunto y cuerpo. Adems enviamos los datos a travs del mtodo POST. Vamos a ver como acceder a estos datos a travs de PHP.
<?php $nombre = $_POST['nombre']; $asunto = $_POST['asunto']; $cuerpo = $_POST['cuerpo']; ?>

De esta forma accedemos a los datos del formulario a travs del array super-global $_POST. Hemos declarado tres variables y hemos introducido el valor de cada campo en ellas, ahora podemos manipular esas variables como queramos. Si hubieramos enviado el formulario a travs del mtodo GET no cambiara mucho la cosa, solo hay que tener en cuenta que no podemos enviar todo lo que queramos por GET porque tiene una limitacin por caracteres y adems es visible en la barra de direcciones.
Variables super-globales

PHP cuenta con una serie de arrays super-globales: -$_GET: Almacena las variables que se pasan desde un formulario mediante el mtodo GET. -$_POST: Almacena las variables pasadas por POST. -$_COOKIE: Guarda los valores que estn almacenados en cookies. Ya veremos en captulos sucesivos cmo utilizarlo. -$_SESSlON: Guarda las variables que se pasan entre sesiones. Ya veremos en captulos sucesivos cmo utilizarlo. -$_SERVER: Contiene numerosos valores relativos al servidor. -$_FILES : Los archivos que enviemos a travs de un formulario sern recogidos en este array. Ya veremos en captulos sucesivos cmo utilizarlo.
RESUMEN

En este captulo hemos aprendido como acceder a los datos que introducen los usuarios a travs de fomularios o la URL. No hemos entrado en detalles en temas sobre seguridad, pero hay que tener claro que nunca podemos confiar en los datos de entrada de los usuarios y tienen que pasar por un control exhaustivo para garantizar la integridad de la aplicacin. Podeis ver una serie de artculos en este mismo blog dedicado a temas de vulnerabilidades web. En el prximo captulo entraremos en el mundo de la programacin orientada a objetos en PHP. En un principio puede parecer que cada curso no est muy detallado, en realidad no intenta ser un curso con muchos detalles sino ms bien una introduccin rpida al mundo de PHP. Esto es as porque posteriormente quiero entrar en temas ms detallados y realizar algunos talleres de ejemplos de aplicaciones del mundo real.

9 -Programacin orientada a objetos. I


En este captulo voy a explicar los conceptos relacionados con la programacin orientada a objetos en PHP. No va a ser un curso dedicado al anlisis y desarrollo de aplicaciones siguiendo esta metodologa porque para ello hara falta un libro entero. Disponeis de un buen libro en la seccin dedicada al analisis y diseo orientado a objetos.

31

PHP fue diseado originalmente como un lenguaje de scripting, pero a medida que se avanzaba en su desarrollo, se fueron incluyendo caractersticas para programar con orientacin a objetos. Hoy en da con PHP5 contamos ya con una buena plataforma de programacin orientada a objetos. Hay mucha controversia sobre la mejor forma de afrontar un proyecto web. Hay partidarios de utilizar PHP como un gran nmero de funciones separadas e ir realizando las llamadas necesarias, es decir, utilizar PHP como un simple lenguaje de scripting utilizando la metodologa de la programacin estructurada. Por el contrario tenemos a desarrolladores que prefieren dedicar ms tiempo a disear un buen sistema orientado a objetos utilizando los distintos frameworks disponibles, como symfony, zend o code igniter. No tengo la experiencia necesaria para decantarme por uno de los diferentes mtodos de desarrollo, es obvio, que utilizar la metodologa de la programacin estructurada es ms sencillo ya que aprender a utilizar los distintos frameworks requiere tiempo y esfuerzo dando lugar a una curva de aprendizaje ms larga. An as, este pequeo inconveniente no debera frenaros. En mi caso por ejemplo, empez utilizando PHP probando el desarrollo con funciones separadas y organizadas en archivos. El paso a la programacin orientada a objetos no me cost mucho porque ya haba tocado lenguajes como Java o C# y algo de analisis y diseo OO con UML. Hoy en da todava no he aprendido a usar bien el primer framework con el que estoy practicando, symfony, pero poco a poco fui capaz de ir desarrollando pequeas cosas con este framework dandote cuenta de la potencia que tiene este framework para desarrollar aplicaciones dinmicas. Cuando acabe el curso de PHP intentar comenzar uno de Symfony. En este captulo voy a explicar los conceptos de la POO en PHP, y luego intentar mostraros algunos ejemplos. Voy a presuponer que el lector tiene algunos conocimientos de los pilares bsicos de la POO: encapsulacin, herencia y polimorfismo, ya que no sern explicados en profundidad.
Clases y objetos:

Una clase es un tipo de datos que define el estado y el comportamiento de los objetos que se instancian a partir de ellas. Contiene un conjunto de atributos/propiedades/campos y un conjunto de funciones/mtodos/operaciones. En PHP las clases se crean utilizando la palabra clave reservada class:
class nombreClase { }

Dentro de la definicin de clase podemos declarar variables y funciones. Las variables pueden declararse utilizando la palabra clave var, pero en PHP5 ya existen los modificadores de acceso public, protected y private tpicos de los lenguajes orientados a objetos.
class nombreClase { private $atributo_privado; protected $atributo_protegido; public $atributo_publico; private function operacion_1() { } public function operacion_2() { }

32

Modificadores de acceso:

Si no especificamos ningn modificador de acceso, por defecto las variables y funciones son public, es decir, son accesibles desde dentro y fuera del objeto. Esto es una mala prctica de programacin porque rompe con los principios de la POO, ya que hay que garantizar la integridad de los datos, es decir, lo ideal sera encapsular los datos para que solo el propio objeto pudiera manipularlos y exponer una interfaz para poder acceder a ellos. Las variables y funciones declaradas como private solo son accesibles dentro de la clase. Las clases que hereden de ella tampoco tendrn acceso a las variables y funciones declaradas con el modificador de acceso private. Si queremos que las variables y las funciones sean accesibles tambin para las clases que heredan pero que no se puedan manipular desde fuera podemos declararlas con el modificador de acceso protected.
Constructor:

Existe un conjunto de funciones especiales en la definicion de una clase. Una de ellas es el constructor de la clase. Cada vez que creemos/instanciemos un objeto se llama al constructor de la clase que es el encargado de inicializar los atributos del objeto. En versiones anteriores de PHP la funcin constructora se llamaba igual que el nombre de la clase. A partir de PHP5 se utiliza el nombre __construct(). Si en una clase no se encuentra una funcin con este nombre PHP buscar una funcin con el mismo nombre que la clase.
class nombreClase { private $atributo_privado; protected $atributo_protegido; public $atributo_publico; function __construct($param1, $param2, $param3) { $atributo_privado=$param1; $atributo_protegido=$param2; $atributo_publico=$param3; echo 'Constructor de la clase'; } private function operacion_1() { } public function operacion_2() { } }

Cabe destacar que PHP5 admite la sobrecarga de funciones, lo que significa que podemos realizar dos funciones con el mismo nombre y diferentes tipos o cantidad de parmetros.
Destructor:

Otra de las funciones especiales de clase es el destructor. Su tarea es lo contrario al constructor. Esta funcin se ejecuta cada vez que se destruye un objeto, lo que ocurre cuando se eliminan todas las referencias al objeto. El nombre del destructor es __destruct(). Los destructores no aceptan parmetros.
33

class nombreClase { private $atributo_privado; protected $atributo_protegido; public $atributo_publico; function __construct($param1, $param2, $param3) { $atributo_privado=$param1; $atributo_protegido=$param2; $atributo_publico=$param3; echo 'Constructor de la clase'; } function __destruct() { echo 'Destructor de la clase'; } private function operacion_1() { } public function operacion_2() { } }

Atributos y funciones de clase:

Podemos utilizar los atributos y las funciones de clase dentro de nuestra clase. Para referirnos a ella contamos con la pseudo-variable $this que hace referencia a la propia clase.
Constantes de clase:

En PHP5 podemos crear constantes en una clase pudiendo acceder a ella desde fuera de la clase sin la necesidad de instanciar un objeto. Las constantes se crean con la palabra reservada const, y accedemos a ella con la siguiente sintaxis, nombreClase::nombreConstante.
class Matematicas { const pi = 3.1416; const e = 2.7182; } echo Matematicas::pi.' '.Matematicas::e;

Mtodos estticos

En PHP5 podemos crear mtodos estticos y acceder a ellos sin la necesidad de instanciar un objeto. Las mtodos estticos se declaran con la palabra reservada static y se accede a ellos mediante la sintaxis, nombreClase::nombreFuncion. Cabe destacar que no podemos acceder a las constantes ni a los mtodos estticos con la pseudo-variable $this. Para poder acceder a ellas dentro de una clase utilizamos la pseudovariable self::nombreConstante o self::nombreFuncion(). Por ltimo decir que dentro del cuerpo de una funcin esttica solo podemos utilizar variables estticas, no variables de clase.
class Matematicas { public static function cuadrado($numero)

34

{ return $numero*$numero; } } echo Matematicas::cuadrado(5);

Instancias:

La clase por s sola no realiza nada, no es ms que una plantilla con la que podemos crear/instanciar objetos. En PHP los objetos se instancian con el operador new seguido del nombre de la clase. A continuacin entre parntesis todos los parmetros que sean necesarios suministrar al constructor. Podemos acceder a las variables y a las funciones publicas mediante el operador ->.
$variable_objeto = new nombreClase($param1, $param2, $param3); $variable_objeto->operacion2();

Herencia

La herencia nos permite crear una relacion jerrquica entre las clases. La clase hija o subclase se comporta de la siguiente manera: -Hereda automaticamente todas las variables y funciones miembros de la clase padre que tengan un modificador de acceso public y protected. -Puede definir nuevas variables y funciones, as como reescribir variables y funciones de la clase padre siempre que no se hayan declarado como finales. -Puede acceder a las variables y funciones de la clase padre mediante la pseudo-variable parent::. En PHP podemos crear una subclase de una superclase utilizando la palabra reservada extends de la siguiente manera:
class SubClase extends SuperClase { }

En el interior de las llaves definiremos las nuevas variables y funciones de la clase hija, adems podemos reemplazar las funciones definidas en la clase padre siempre que no se hayan deifnidido con el modificador final. Para ello solo tenemos que definir una funcion que se llame igual y contenga el mismo nmero de parmetros que en la clase padre. Si la clase padre se ha declarado como final no se podr heredar una subclase.
Interfaces

PHP no permite la herencia mltiple, es decir, poder crear una subclase a partir de varias superclases. Pero se puede simular su comportamiento si utilizamos las interfaces. Una interfaz no es ms que la declaracin de un conjunto de constantes y funciones que deben ser definidas en la clase que implemente dicha interfaz. Una interfaz en PHP se crea utilizando la palabra reservada interface de la siguiente manera:
35

interface Listar { function listar_nombre(); }

En este ejemplo hemos creado una interfaz llamada Listar que define una funcion listar_nombre(). La clase que implemente esta interfaz debera implementar todas las funciones de la interfaz. Una clase puede implementar una interfaz mediante la palabra reservada implements de la siguiente forma:
class Ejemplo implements Listar { function listar_nombre() { echo 'Francisco'; } }

De esta forma podemos simular la herencia mltiple ya que podemos implementar todas las interfaces que queramos si las separamos por comas, con el inconveniente que debemos implementar todas las funciones declaradas en la interfaz.
Clases abstractas

PHP5 tambin incluye el concepto de clases abstractas tpicas de otros lenguajes orientados a objetos. Las clases abstractas se definen en PHP5 utilizando la palabra reservada abstract de la siguiente manera:
abstract class nombreClase { }

Una clase abstracta no puede ser instanciada, sirve como clase base para que otras hereden de ella. Una clase abstracta define una serie de funciones abstractas que no tienen implementacin. Las clases que hereden de una clase abstacta tendrn que implementar esas funciones, sino automaticamente se convierten en clases abstractas. Imaginaros la siguiente situacin. Tenemos una clase Persona que representa una persona, con una serie de atributos como nombre, apellidos y dni. Y queremos construir clases que representen diferentes tipos de personas, como, Empleado, Director, Funcionario y Conserje. Necesitamos un mtodo que calcule el salario de cada tipo de persona. Para ello podemos definir una clase abstracta Persona con una serie de variables y una funcin asbtracta llamada calcular_salario(). Todas las dems clases heredarn de esta clase base y tendrn que sobreescribir el mtodo calcular_salario() de la clase padre.
class Persona { protected $nombre; protected $apellidos; abstract function calcular_salario(); } class Director extends Persona { function __construct($nombre, $apellidos) { $this->nombre=$nombre; $this->apellidos=$apellidos; }

36

function calcular_salario() { return 10000; } } $director = new Director('Francisco','Belmonte Ruiz'); //Imprime 10000 echo $director->calcular_salario();

RESUMEN

Hasta ahora hemos visto una serie de conceptos orientados a objetos en PHP : crear clases, instanciar objetos, utilizar modificadores de acceso, crear constantes y funciones estticas, crear clases abstractas e interfaces, aprender a heredar a partir de otras clases, acceder a las variables y funciones de los objetos, acceder a las variables y funciones de la clase padre, etc PHP cuenta con muchos ms conceptos que los vistos aqu y no estara mal que mirarais la documentacin oficial para ver algunos conceptos que no hemos visto en este curso, como el uso de mtodos mgicos. Una vez visto los principales conceptos vamos a dedicar la segunda parte de este captulo a crear un ejemplo bsico de aplicacin que utilize objetos, como un gestor de un videoclub.

10 - Programacin orientada a objetos. II


Una vez visto gran parte de los conceptos orientados a objetos en PHP vamos a mostrar un ejemplo que maneja objetos para gestionar un videoclub. Antes de nada, hay que decir que este ejemplo no est completo, ni siquiera es la forma ideal de realizar una aplicacin de gestin, pero nos sirve como ejemplo para aprender a manejar objetos. Vamos a realizar en primer lugar un diagrama de clases en UML para representar grficamente las clases que vamos a utilizar para gestionar los diferentes objetos. Para no alargar mucho el ejemplo, vamos a contar con una serie de clases muy limitadas:

37

-La clase Videoclub: es la clase principal de nuestra aplicacin. Representa a un videoclub en el dominio del problema y cuenta con una coleccin de clientes y productos registrados. As como mtodos para alquilar un producto a un cliente, y registrar nuevos productos y clientes en el videoclub. -La clase Cliente: representa a un cliente. Cuenta con una variable que representa la coleccin de productos alquilados. -La clase Producto: clase abstracta que representa un producto del videoclub. No podemos instanciar objetos Producto. Cuenta con una serie de atributos que heredarn las subclases, nombre y precio. -Las clases Pelicula, Cd, Juego: clases derivadas de la clase padre Producto. Representan los diferentes productos del que dispone el videoclub. Cada producto tiene asignado un precio diferente de alquiler. Para mostrar un ejemplo de clases abstractas, herencias y reemplazo de mtodos, he diseado la clase Producto con un mtodo abstracto getPrecio() que debern implementar las clases derivadas. As cada tipo de Producto contar con un mtodo getPrecio() que devolver el precio en funcin del tipo de producto que sea. Las peliculas devolvern 2 euros, los cds de msica devolvern 1 euro y los juegos 3 euros.

38

Tras esta breve descripcin de las clases del dominio de nuestra aplicacin, vamos a crear el cdigo PHP que utilizaremos para instanciar objetos: Clase Cliente
<?php /* Clase que representa a un cliente en el dominio del problema */ class Cliente { private $nombre; private $productosAlquilados; public function __construct($nombre) { $this->nombre=$nombre; $this->productosAlquilados=array(); } public function getNombre() { return $this->nombre; } public function getProductosAlquilados() { return $this->productosAlquilados; } public function alquilarProducto($producto) { $this->productosAlquilados[]=$producto; return true; } } ?>

Clase Producto
<?php abstract class Producto { protected $nombre; protected $precio; public function getNombre() { return $this->nombre; } abstract public function getPrecio(); } ?>

Clase Pelicula
<?php class Pelicula extends Producto { private $idioma; private $duracion;

39

private $genero; public function __construct($nombre,$idioma,$duracion,$genero) { $this->nombre = $nombre; $this->precio = 2; $this->idioma = $idioma; $this->duracion = $duracion; $this->genero=$genero; } public function getPrecio() { return $this->precio; } public function getIdioma() { return $this->precio; } public function getDuracion() { return $this->precio; } } ?>

Clase Cd
<?php class Cd extends Producto { private $duracion; private $genero; public function __construct($nombre,$duracion,$genero) { $this->nombre = $nombre; $this->precio = 1; $this->genero = $genero; $this->duracion = $duracion; } public function getPrecio() { return $this->precio; } public function getDuracion() { return $this->duracion; } public function getGenero() { return $this->Genero; } } ?>

Clase Juego
40

<?php class Juego extends Producto { private $plataforma; private $genero; public function __construct($nombre,$plataforma,$genero) { $this->nombre = $nombre; $this->precio = 3; $this->idioma = $idioma; $this->duracion = $duracion; } public function getPrecio() { return $this->precio; } public function getPlataforma() { return $this->plataforma; } public function getGenero() { return $this->Genero; } } ?>

Clase Videoclub
<?php include_once('class.cliente.php'); include_once('class.producto.php'); include_once('class.pelicula.php'); include_once('class.cd.php'); include_once('class.juego.php'); class Videoclub { private $nombre; private $productos; private $clientes; public function __construct($nombre) { $this->nombre=$nombre; $this->productos=array(); $this->clientes=array(); } public function addProducto($producto) { $this->productos[]=$producto; } public function getProductos() { return $this->productos;

41

} public function addCliente($cliente) { $this->clientes[]=$cliente; } public function getClientes() { return $this->clientes; } public function alquilar($cliente,$producto) { $cliente->alquilarProducto($producto); } } ?>

Ya tenemos creadas las clases que vamos a utilizar para instanciar objetos y gestionar nuestro videoclub. Ahora realizamos un pequeo script de ejemplo que muestr el manejo de estos objetos.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Prueba</title> </head> <body> <?php include_once('class.videoclub.php'); //Creamos un videoclub $videoclub= new Videoclub('VideoMax'); //Creamos un nuevo cliente de nombre Francisco $cliente=new Cliente('Francisco'); //Creamos una nueva pelicula $pelicula=new Pelicula('El seor de los Anillos','Castellano','3 horas','Fantasa'); //Registramos el cliente y el producto en el videoclub $videoclub->addCliente($cliente); $videoclub->addProducto($pelicula); //El cliente alquila la pelicula $videoclub->alquilar($cliente, $pelicula); //Obtenemos la lista de clientes registrados $clientes = $videoclub->getClientes(); //Imprimimos la lista de clientes registrados echo '<p>Lista de Clientes:</p>'; foreach($clientes as $cliente) { echo $cliente->getNombre().'<br />'; } //Obtenemos la lista de productos registrados $productos = $videoclub->getProductos(); echo '<p>Lista de Productos:</p>'; foreach($productos as $producto)

42

{ echo $producto->getNombre().'<br />'; } ?> </body> </html>

No hay mucho ms que decir de este script de ejemplo ya que el cdigo viene muy detallado. Creamos una instancia del videoclub, un nuevo cliente y un nuevo producto, los registramos dentro del videoclub, y alquilamos la pelicula al cliente. Despes obtenemos los clientes y productos registrados y los mostramos por pantalla. Y hasta aqu nuestra pequea aplicacin de prueba. Vuelvo a repetir, que no es una buena forma de implementar una aplicacin de gestin, ya que no persisten los datos. Con cada nueva peticin, se crear un nuevo videoclub vacio. Y se volvern a aadir el cliente y la pelcula. Adems las clases estn incompletas, faltan mtodos, como el de devolver el producto, eliminar un cliente, eliminar un producto, comprobar si el producto est disponible y no est alquilado, y ni siquiera interacta con el usuario, simplemente sigue las mismas instrucciones con cada peticin. En definitiva, que es una chapuza de aplicacin lo que hemos creado, pero sirve bastante bien para ver como podemos manejar objetos a partir de clases creadas por nosotros mismos. Cuando vayamos avanzando en el curso de PHP seremos capazes de crear aplicaciones profesionales, utilizando patrones de diseo, frameworks orientados a objetos como symfony para estructurar bien el cdigo siguiendo una arquitectura MVC (modelo-vista-controlador). Aprenderemos a persistir datos mediante ficheros y bases de datos. A persistir estados entre distintas peticiones del mismo usuario mediante las sesiones y mucho ms. Paso a paso, nutriendonos de conocimiento. El prximo captulo supongo que lo dedicar al manejo de ficheros.

11 - Lectura y escritura de ficheros


Hasta ahora casi todo lo que hemos visto son algunos aspectos de PHP en lo referente al lenguaje, como: - Manipular datos en variables, ya sean cadenas, enteros, flotantes, booleanos o arrays. - Utilizar funciones definidas en la API de PHP y crear nuestras propias funciones. - Utilizar operadores para realizar clculos y las estructuras de control para cambiar el flujo de nuestros scripts. - Nos hemos introducido en el mundo de la POO y hemos manipulado objetos. - Hemos accedido a las datos que los usuarios envian a travs de formularios con el mtodo POST y GET. Pero an estamos muy lejos del camino de poder juntar todo lo aprendido para realizar aplicaciones webs dinmicas. En este captulo vamos a ver como podemos manejar ficheros en el servidor con PHP. En PHP5 existen un conjunto de funciones para manipular ficheros, no vamos a ver todas, solo las ms utilizadas. Si quereis ver ms ejemplos o una documentacin ms detallada como siempre podeis acudir a la documentacin oficial en lnea de PHP.

43

Apertura de ficheros -fopen()

Para abrir un fichero en PHP se utiliza la funcin fopen() que devuelve un recurso que apunta al fichero abierto. Los 2 parmetros que se pasan a esta funcin son los siguiente: - Nombre del fichero. PHP5 puede acceder a ficheros locales o ficheros remotos mediante HTTP y FTP. El fichero que se quiere abrir debe tener los permisos adecuados. -Modo de apertura. Especifica el tipo de acceso que se tendr al fichero. Os incluyo la tabla de la especificacin oficial para que veais los diferentes modos de apertura:
modo

Descripcin Apertura para slo lectura; coloca el puntero al principio del archivo. Apertura para lectura y escritura; coloca el puntero al principio del archivo. Apertura para slo escritura; coloca el puntero al principio del archivo y trunca el archivo a longitud cero, por lo que borrar todo su contenido. Si el archivo no existe se intenta crear. Apertura para lectura y escritura; coloca el puntero al principio del archivo y trunca el archivo a longitud cero, por lo que borrar todo su contenido. Si el archivo no existe se intenta crear. Apertura para slo escritura; coloca el puntero al final del archivo. Si el archivo no existe se intenta crear.

r r+ w

w+ a

a+ Apertura para lectura y escritura; coloca el puntero al final del archivo. Si el archivo no existe se intenta crear. Creacin y apertura para slo escritura; coloca el puntero al principio del archivo. Si el archivo ya existe, la llamada a fopen() fallar devolviendo FALSE y generando un error de nivel E_WARNING. Si el archivo no exite se intenta crear. Creacin y apertura para lectura y escritura; coloca el puntero al principio del archivo. Si el archivo ya existe, la llamada a fopen() fallar devolviendo FALSE y generando un error de nivel E_WARNING. Si el archivo no exite se intenta crear.

x+

Tambin se puede especificar b de binario o c de texto en combinacin con los diferentes modos de apertura. Solo en sistemas Windows se diferencia entre archivos binarios y de texto, as que si se quiere lograr la mayor portabilidad del cdigo sera ms eficiente abrir los archivos en modo binario. -El tercer parmetro es opcional, es un booleano que indica si debe buscar el archivo en la directiva include_path en el archivo de configuiracin de PHP. En este ejemplo abrimos un fichero en modo binario para leer y escribir al final del fichero, sin borrar el contenido. El tercer parmetro lo establecemos a true para que busque el fichero en el include_path. Utilizamos el operador para suprimir los posibles errores que muestre la funcin fopen() si algo va mal. Comprobamos si el puntero es FALSE, y en ese caso mostramos un mensaje de error.
<?php $fichero = @fopen('archivo.txt', 'a+b', true ); if(!$fichero)

44

{ echo 'No se puede abrir el fichero.'; } ?>

Escritura de ficheros -fwrite() y fputs():

PHP cuenta con una serie de mtodos para escribir en un fichero abierto para escritura. Podemos utilizar la funcin fwrite() o fputs(). A estas dos funciones que funcionan de la misma manera, ya que fputs() es un alias de fwrite(), se les tiene que pasar dos parmetros, el recurso apuntador del fichero y la cadena que quiere escribirse. El tercer parmetro es opcional e indica la longitud en bytes que se va a escribir. La funcin devuelve el nmero de bytes escritos o FALSE si hubo algn error.
<?php $fichero = @fopen('archivo.txt', 'a+b', true ); if(!$fichero) { echo 'No se puede abrir el fichero.'; } $cadena="Hola, esto es un ejemplo de escritura en ficheros."; fwrite($fichero, $cadena, strlen($cadena)); ?>

Lectura de ficheros

PHP tambin cuenta con una serie de funciones para leer ficheros. Podemos utilizar por ejemplo la funcin fread(). Esta funcin toma dos parmetros, el recurso que apunta al fichero, y el nmero de bytes que queremos leer. Esta funcin es poco manejable cuando queremos buscar en un fichero, as que PHP cuenta con funciones ms precisas para leer lneas del fichero apoyandose en otras funciones relacionadas.
-feof():

Esta funcin toma como parmetro el recurso que apunta al fichero y devuelve TRUE si el puntero se encuentra al final del archivo.
-fgets():

Esta funcin se utiliza para leer lnea a lnea un fichero. Toma como parmetro el puntero al fichero y opcionalmente una longitud y leer una nueva lnea o hasta que alcanze la longitud establecida en el segundo parmetro opcional. Utilizar esta funcin es la forma ideal de ir analizando el fichero lnea a lnea para encontrar la informacin que estamos buscando. Vamos a ver un ejemplo de lectura utilizando la funcin fgets() y feof() para leer un fichero lnea a lnea y mostrarlo en pantalla:
<?php $fichero = @fopen('archivo.txt', 'rb', true ); if(!$fichero) { echo 'No se puede abrir el fichero.'; } $num=1; while (!feof($fichero))

45

{ $linea = fgets ($fichero) ; echo 'Linea '.$num.': '.$linea.'<br />'; $num++; } ?>

-fgetc():

Esta funcin es muy parecida a la anterior pero devuelve un solo carcter.


-readfile() y file_get_contents():

Estas dos funciones sirven para leer todo el fichero de una vez. La funcin readfile() toma como parmetro la ruta absoluta del fichero y muestra todo su contenido en pantalla sin la necesidad de haber abierto el fichero para lectura. La funcin file_get_contents() funciona de manera similar pero no imprime el contenido en la salida estndar sino que lo guarda en una variable de tipo cadena.
<?php $archivo = file_get_contents('archivo.txt', true); echo $archivo; ?>

Cierre de ficheros -fclose():

Cerrar un fichero es tan fcil como abrirlo. Para ello utilizamos la funcin fclose() que toma como parmetro el puntero al fichero que queremos cerrar.
<?php $archivo = file_get_contents('archivo.txt', true); echo $archivo; fclose($archivo); ?>

Sistema de ficheros

PHP cuenta con una serie de funciones para manipular el sistema de ficheros, con ellas podemos copiar, renombrar y mover ficheros.
-copy():

Esta funcin copia un archivo a un destino. Toma dos parmetros, la ruta al archivo qeu se quiere copiar, y una ruta donde se quiere copiar el fichero. Devuelve TRUE en caso de xito o FALSE en caso contrario.
<?php $archivo = 'archivo.txt'; $nuevo_archivo = 'copia.txt'; if (!copy($archivo, $nuevo_archivo)) { echo 'Error al copiar.'; } ?>

46

-rename():

Esta funcin renombra un archivo. Toma dos parmetros la ruta al archivo que se quiere renombrar, y el nuevo nombre del archivo.
<?php $archivo = 'archivo.txt'; $nuevo_archivo = 'nuevo.txt'; if (!rename($archivo, $nuevo_archivo)) { echo 'Error al renombrar.'; } ?>

-unlink():

Esta funcin borra un archivo. Toma como parmetro la ruta al archivo.


<?php $archivo = 'archivo.txt'; if (!unlink($archivo)) { echo 'Error al borrar.'; } ?>

-file_exists():

Esta funcin comprueba si existe un fichero que se le pase como parmetro. Devuelve TRUE si existe, FALSE en caso contrario. Hay que tener en cuenta que el parmetro no es un puntero al fichero, sino el nombre del fichero.
<?php $archivo = 'archivo.txt'; if (file_exists($nombre_archivo)) { echo "El archivo $archivo existe"; } else { echo "El archivo $archivo no existe"; } ?>

RESUMEN

Hemos visto algunas funciones interesantes para abrir, escribir, leer y cerrar ficheros, asi como para borrar, renombrar y copiar ficheros. PHP cuenta con muchas ms funciones referentes al sistema de ficheros y directorios que no vamos a ver en este cptulo para no hacerlo tan extenso. Podeis echarles un vistazo en la documentacin oficial. Ya sabeis siempre que tengais alguna duda de si existe una funcin es mejor buscar una que te pueda servir en la API de php, y sino crearte la tuya propia. En el proximo captulo veremos como subir archivos al servidor mediate un formulario.

12 - Subida y descarga de ficheros.


Ahora que ya sabemos manipular archivos vamos a ver un ejemplo sencillo de aplicacin que permita subir y descargar ficheros.

47

Subida de ficheros

Los formularios pueden contener un campo para subir ficheros al servidor. Antes de ver la lgica del sistema de subida de ficheros que vamos a implementar, vamos a explicar la variable super-global $_FILES de PHP y los atributos que hay que modificar en el formulario para permitir la subida de ficheros.
<form method="post" action="subir.php" enctype="multipart/form-data"> <input type="file" name="archivo" id="archivo" /> <input type="submit" value="Subir fichero" /> </form>

Este formulario de ejemplo muy sencillo lo hemos diseado con dos campos, un campo de tipo file para seleccionar el archivo que se subir al servidor, y un botn de tipo submit que enva el formulario por el mtodo post al script subir.php. Cabe destacar el uso del atributo enctype=multipart/form-data que aadir la cabecera en la peticin HTTP para indicarle al servidor que el cuerpo de la peticin incluye un archivo. Cuando envamos una peticin HTTP con archivos al servidor, PHP detecta que estamos subiendo un archivo y lo almacena en un directorio temporal establecido en la directiva upload_tmp_dir del archivo de configuracin de PHP. El tamao del archivo no debe sobrepasar lo establecido en la directiva upload_max_filesize. Podemos acceder al fichero subido a travs del array super-global $_FILES['name del campo file'] que nos ofrece un conjunto de propiedades a las que podemos acceder: - $_FILES['archivo']['tmp_name']: El valor almacenado en esta clave devuelve el directorio temporal en el que se ha almacenado el archivo en el servidor. - $_FILES['archivo']['name']: El nombre del archivo en el sistema del usuario. - $_FILES['archivo']['size']: El tamao en bytes del archivo subido. - $_FILES['archivo']['type']: El tipo MIME del archivo, por ejemplo text/plain o image/gif. - $_FILES['archivo']['error']: Cdigo de error si se ha producido algn error.
Comprobando que se ha subido el fichero:

Podemos utilizar la funcin is_uploaded_file() que toma como parmetro el nombre temporal del fichero subido al servidor, no el nombre del fichero del usuario, para ver si se ha subido satisfactoriamente al servidor. Esta funcin devuelve TRUE si el archivo est en el directorio temporal, y FALSE en caso contrario.
<?php if (is_uploaded_file($_FILES['archivo']['nombre_tmp'])) { echo 'El archivo se ha subido con xito'; } ?>

Comprobando que el fichero no sobrepasa el tamao permitido:

Una simple comparacin entre el tamao que queramos permitir subir y $_FILES['archivo']['size'] bastar para asegurarnos que no se sobrepasa el tamao permitido.
48

<?php if ( is_uploaded_file($_FILES['archivo']['tmp_name']) ) { echo 'El archivo se ha subido con xito'; if( $_FILES['archivo']['size']<(512*1024) ) { echo 'El archivo no sobrepasa el tamao mximo: 512KB'; } } ?>

Comprobando que el fichero tiene una extensin permitida:

Para comprobar si el fichero tiene una extensin permitida basta con comprobar el tipo MIME del fichero con las extensiones que permitimos.
<?php if ( is_uploaded_file($_FILES['archivo']['tmp_name']) ) { echo 'El archivo se ha subido con xito'; if( $_FILES['archivo']['size']<(512*1024) ) { echo 'El archivo no sobrepasa el tamao mximo: 512KB'; if( $_FILES['archivo']['type']=='image/jpeg') { echo 'La extensin JPEG est permitida'; } } } ?>

Mover el fichero del directorio temporal a nuestro directorio de subidas:

Si no movemos el archivo del directorio temporal a un directorio donde tengamos almacenados los ficheros subidos por los usuarios, el fichero se perder en el limbo de PHP y no podremos recuperarlo. Para ello contamos con la funcin move_uploaded_file() que toma dos parmetros, la ruta del fichero en el directorio temporal y la nueva ruta donde queramos almacenarlo.
<?php if ( is_uploaded_file($_FILES['archivo']['tmp_name']) ) { echo 'El archivo se ha subido con xito'; if( $_FILES['archivo']['size']<(512*1024) ) { echo 'El archivo no sobrepasa el tamao mximo: 512KB'; if( $_FILES['archivo']['type']=='image/jpeg') { echo 'La extensin JPEG est permitida'; $rand = rand(1000,999999); $origen = $_FILES['archivo']['tmp_name']; $destino = 'uploads/'.$rand.$_FILES['archivo']['name']; move_uploaded_file($origen, $destino);

49

} } } ?>

El nmero aleatorio rand entre 1000 y 999999 lo utilizamos para prevenir la sobreescritura de ficheros con el mismo nombre. De esta forma ya hemos implementado un sistema de subida de archivos JPEG de tamao menor a 512KB. Ahora bien, este sistema no es del todo seguro para evitar la subida de archivos maliciosos diseados para atacar nuestra aplicacin, como por ejemplo, una shell en php. Queda pendiente realizar una entrada para evitar esta vulnerabilidad de las aplicaciones web. Hasta ahora contais con dos artculos dedicados a las principales vulnerabilidades: evitar XSS y evitar RFI y FLI.
Descarga de ficheros

Para descargar ficheros normalmente ponemos la ruta al fichero en el enlace y el navegador ya se encarga de realizar la peticin HTTP oportuna al servidor. Pero, que ocurre cuando el archivo que se desea bajar se ha generado dinmicamente y an no est guardando en ningn directorio dentro del servidor o solo queremos que se puedan descargar archivos a travs de un script de PHP? Pues que tendremos que disear algn mtodo que permita forzar la descarga de archivos. La solucin es enviar la peticin HTTP de respuesta mediante cdigo PHP enviandouna serie de cabeceras HTTP mediante la funcin header() de PHP que solo funciona si no se ha enviado nada al flujo de salida. Las cabeceras de la respuesta HTTP que vamos a enviar son: - Content-Type: application/force-download - Content-Disposition: attachment; filename=nombre_del_fichero - Content-Transfer-Enconding: binary - Content-Length: tamao_del_fichero Accederemos al script de descarga de la siguiente manera:
<a href="descarga.php?archivo=imagen5.jpeg" >Descargar imagen</a> <?php //Si la variable archivo que pasamos por URL no esta //establecida acabamos la ejecucion del script. if (!isset($_GET['archivo']) || empty($_GET['archvo'])) { exit(); } //Utilizamos basename por seguridad, devuelve el //nombre del archivo eliminando cualquier ruta. $archivo = basename($_GET['archivo']); $ruta = 'imagenes/'.$archivo; if (is_file($ruta)) { header('Content-Type: application/force-download'); header('Content-Disposition: attachment; filename='.$archivo); header('Content-Transfer-Encoding: binary'); header('Content-Length: '.filesize($ruta));

50

readfile($ruta); } else exit(); ?>

Verificamos que el archivo existe, enviamos las cuatro cabeceras, y utilizamos la funcion readfile() que devuelve el contenido del archivo por el flujo de salida. Podemos mejorar mucho ese script aadiendo el content-type adecuado, y haciendo ms comprobaciones de seguridad.
RESUMEN

Ya hemos visto como implementar dos sitemas sencillos de subida y descargas de fichero y como utilizar la variable super-global $_FILES[] para acceder a los datos de los ficheros subidos al servidor. Queda pendiente realizar un artculo sobre las vulnerabilidades en las subidas de archivos. Me documentar sobre esta cuestin y ms adelante intentar redactar un artculo dedicado a este tema. En el prximo captulo veremos como persistir datos entre diferentes peticiones HTTP del mismo usuario.

13 - Sesiones y cookies
HTTP es un protocolo sin estado. Esto quiere decir que el protocolo no dispone de un mtodo para conservar el estado entre dos peticiones de un mismo usuario. PHP dispone de una forma para implementar las sesiones generando un identificador de sesin aleatorio que se almacena en el lado del cliente en forma de cookie, o si el cliente tiene deshabilitada las cookies se pasa al servidor por la URL. Este identificador actua como una clave y nos permite almacenar variables de sesin que se guardan en el servidor.
Cookies

Una cookie es es un fragmento de informacin que queda almacenada en el ordenador del usuario. Las cookies contienen pares de clave/valor y solo son accesibles por el dominio que las crea. En PHP hay dos formas de crear cookies en el ordenador del usuario, mediante la funcin setcookie() o enviando una cabecera en la respuesta HTTP. Para poder utilizar los dos mtodos no se deben haber enviado datos al flujo de salida. Vamos a ver como crear cookies utilizando los dos mtodos y como recuperar la informacin pasada por cookies desde el servidor con PHP.
-Cabecera Set-Cookie:

El protocolo HTTP cuenta con una cabecera para establecer cookies y podemos enviarla con la funcin header() como hemos visto en captulos anteriores. La cabecera en cuestin tiene la siguiente sintaxis: - Set-Cookie: NOMBRE=VALOR; expires=FECHA; path=RUTA; domain=NOMBRE_DOMINIO; secure De esta forma se crea una cookie con el nombre NOMBRE y con el valor VALOR. Los dems parmetros son opcionales, el campo expires establece el tiempo que se mantendr la cookie en el lado del cliente, path y domain los podemos utilizar para restringir el acceso a la cookie a ciertos dominios o rutas, y secure establece si la cookie se envia a travs de una conexin segura HTTPS.
<?php header('Set-Cookie: nombre=Francisco;'); ?>

51

En este ejemplo hemos creado una cookie en el ordenador del usuario con la clave nombre y el valor francisco.
- setcookie():

Esta funcin recibe como parmetros los mismos que la cabecera Set-Cookie, un nombre, un valor, una fecha, una ruta, un dominio y un booleano para establecer cookies seguras.
<?php setcookie('nombre','Francisco'); ?>

El mismo ejemplo utilizando la funcin.


-Acceder a las cookies desde PHP:

Podemos acceder a las cookies definidas mediante la variable super-global $_COOKIE, un array asociativo que almacena los valores mediantes las claves definidas en las cookies. De esta forma en nuestro ejemplo podemos acceder a la cookie creada de la siguiente forma.
<?php $nombre=$_COOKIE['nombre']; //Imprimir Francisco echo $nombre; ?>

Podemos eliminar las cookies si establecemos la misma cookie con una fecha de caducidad pasada. El problema de utilizar cookies para guardar informacin referente al usuario es que los datos se almacenan en el ordenador del usuario, y pueden no estar disponibles si el usuario ha deshabilitado el uso de cookies en su navegador. Esta es la principal razn por las que se utilizan las sesiones para guardar datos entre distintas peticiones del mismo usuario.
Sesiones

PHP utiliza por defecto cookies con sesiones. Esto quiere decir que si el navegador del usuario acepta cookies se definir una para almacenar el identificador de sesin. Si el navegador del usuario no acepta cookies, el identificador se pasar como un parmetro ms por la URL. Si queremos utilizar este ltimo mtodo siempre, debemos activar la directiva session.use_trans_sid en el archivo de configuracin de PHP, aunque no est muy recomendado. Los pasos que hay que seguir para utilizar sesiones son los siguientes: 1. Iniciar una sesin. 2. Registrar variables de sesin. 3. Utilizar estas variables. 4. Anular las variables registradas y eliminar la sesin.
Iniciando una sesin:

Para iniciar una sesin basta con llamar a la funcin session_start() antes de enviar cualquier caracter al flujo de salida siempre que queramos utilizar sesiones. Esta funcin comprueba si hay un identificador para
52

el usuario, y si lo hay carga en la variable super-global $_SESSION todas las variables de sesin registradas.
<?php session_start(); ?>

Registrando variables de sesin:

Para registrar variables de sesin basta con definir un elemento en el array asociativo $_SESSION de la siguiente forma: $_SESSION['clave']=valor;
<?php session_start(); $_SESSION['nombre']='Francisco'; ?>

Utilizando variables de sesin:

Antes de poder utilizar las variables de sesin definidas tenemos que iniciar la sesin. Una vez iniciadas ya podemos acceder a las variables desde el array asociativo $_SESSION['clave']. Si utilizamos objetos como variables de sesin debe incluir antes la definicin de clase.
<?php session_start(); //Imprimir Francisco echo $_SESSION['nombre']'; ?>

Anular las variables de sesin y eliminar la sesin:

Para eliminar una variable de sesin cuando ya no necesitemos utilizarla, podemos llamar a la funcin unset() pasandole como argumento la variable que queramos eliminar. No intenteis borrar el array $_SESSION completo porque puede deshabilitar las sesiones. Si queremos anular todas las variables podemos crear un nuevo array vaco. Para destruir la sesin llamamos a la funcin session_destroy().
<?php session_start(); //Eliminamos un par clave/valor unset($_SESSION['nombre']); //Eliminamos todas las variables de sesin $_SESSION = array(); //Destruimos la sesion session_destroy(); ?>

Configurar el control de sesiones:

En el archivo de configuracin de PHP existe un conjunto de directivas para configurar las sesiones. Ya hemos visto la directiva session.use_trans_sid que permitia establecer la forma de pasar el id a travs de las URLs.
53

Algunas directivas que podemos configurar son: - session.auto_start : Inicia las sesiones automticamente, con el inconveniente que no se pueden almacenar objetos como variables de sesin. - session.cache_expire: Establece la duracin en minutos de la sesin. - session.cookie_lifetime: Indica el tiempo que permanecer la cookie de sesin en el navegador del usuario. Por defecto est 0, que indica que se borrar la cookie cuando el navegador se cierre. - session.use_cookies: Establece las sesiones para que utilizen cookies. Por defecto viene activado.
RESUMEN

Utilizando las sesiones en PHP podemos implementar la autenticacin de usuarios, por ejemplo, para mostrar ciertos contenidos dependiendo del usuario que est utilizando la aplicacin. Bastara con definir una variable de sesin con el nombre o el id del usuario registrado en el sistema. Ya hemos visto gran parte de los conceptos que utiliza PHP para intercambiar informacin entre distintas peticiones. En el prximo captulo vamos a ver como podemos interactuar con el sistema gestor de base de datos MySQL desde PHP, pero antes voy a intentar redactar un artculo sobre el lenguaje de consulta estructurado SQL.

54

Вам также может понравиться