71
MANUAL DE PHP EMINENTEMENTE PRÁCTICO 1

Manual+PHP

  • Upload
    meli-pm

  • View
    31

  • Download
    1

Embed Size (px)

Citation preview

MANUAL DE PHPEMINENTEMENTE 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 tiposdedatos. (pgina 5)EnterosNmeros en coma flotanteBooleanosCadenas de caracteresArraysObjetosConversin de tiposVariables de formulariosVariables de PHPOtras funcionesConstantes.ExpresionesOperadoresPrecedencia de operadores

3) Operadores. (pgina 9)

4) Estructurasdecontrol (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 yexpresionesregulares (pgina 20) Cadenas de caracteres Visualizacin de cadenas Alteracin de contenido Acceso al contenido Generacin y tratamiento de HTML7) Arrays (pgina 25)

8) Formularios (pgina 29)

9) Programacin orientada aobjetosII (pgina 31)

10) Programacin orientada aobjetosI (pgina 37)

11) Lectura y escrituradeficheros (pgina 43)

12) Subida y descargadeficheros (pgina 47)

13) Sesionesycookies (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 ZendSaltar 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. 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 tiposdedatos.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 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 variablesPHP 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:

ConstantesLas 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:

Para mostrar el valor de las constantes nicamente hay que invocar su nombre, esta vez sin utilizar el smbolo de $.

Variables de tipo variableLas variables permiten almacenar nombres de variables. Esto en un principio puede ser extrao.

Funciones relacionadas con variablesAn 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.

-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() .

-gettype():Con esta funcin podemos averiguar el tipo de dato almacenado en la variable. Nos puede devolver uno de los siguientes valores: integer double string array object

-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.

ResumenHay 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(), etcLa 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.

Operador unario:Este operador (-) tiene la propiedad de hacer a los nmeros, negativos o positivos, dependiendo del signo actual.

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.OperadorOperacinDescripcinEjemploResultado

+SumaSuma entre valores$x=2+24

-RestaResta entre valores$x=5-23

*MultiplicacinMultiplica distintos valores$x=5*525

/DivisinDivide entre valores$x=10/25

%MduloDevuelve el resto de una divisin$x=10%20

++IncrementoSuma una unidad a determinado valor$x=5; $x=++;6

DecrementoResta una unidad a determinado valor$x=5; $x=;4

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

OperadorDescripcinEjemploResultado

==Igual: Compara dos valores (no compara el tipo de variable)$a == $bVerdadero si $a es igual a $b

===Igual: Compara los dos valores si son iguales y del mismo tipo$a === $bVerdadero si $a es igual a $b y son el mismo tipo de variable

!=Distinto: Compara si las variables son diferentes$a!= $bVerdadero si $a es diferente de $b

Distinto: Compara si las variables son diferentes$a $bVerdadero si $a es diferente de $b

!==Distinto: Compara que las dos variables sean diferentes y de diferentes tipos$a!== $bVerdadero si $a y $b son diferentes y son diferentes tipos

Mayor: Compara que la primera variable sea mayor que la segunda$a > $bVerdadero si $a es mayor a $b

= $bVerdadero si $a es mayor o igual a $b

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.

OperadorDescripcinEjemploResultado

AndCompara que las dos variables sean verdaderas$a && $bVerdadero si $a y $b son verdaderos

OrCompara que alguna de las dos variables sean verdaderas$a || $bVerdadero si $a o $b son verdaderos

XorCompara que $a o $b sean verdaderos pero no ambos$a Xor $bVerdadero si $a o $b son verdaderos pero no ambos

NotNiega una condicin!$aVerdadero 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.

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 (` `)

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).

ResumenYa 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 - Estructurasdecontrol

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-ifLa 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 ( { } ).if (condicin) {instruccionl;instruccion2;instruccion3;}-ifelseLa 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:

-switchLa 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;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:

En nuestro ejemplo se imprimir la cadena: El da es Jueves.Estructuras de control repetitivas-whileEl bucle while es el ms bsico de todos. La construccin bsica es la siguiente:while (condicin) {instruccinl;instruccin2;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:

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.-dowhileEste 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:

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.-forLa 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:

En este ejemplo sencillo calculamos la tabla de multiplicar del dos, esa que aprendemos en primero de primaria.-foreachMe reservo esta estructura de control para el captulo dedicado a arrays.-continue, break, exitEstas 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().RESUMENEn 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 - FuncionesLas 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 PHPPHP 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 usuarioAdems 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 nombre_funcin($argumentol, $argumento2, ..){instruccinl;instruccin2;instruccin3;return $variable;}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:

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 variablesLas 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.

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.Resumiendo, las variables pueden ser locales a la funcin, o globales a todo el archivo.Variables estticasPor 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.

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 RFIFunciones recursivasNo voy a entrar en la explicacin de funciones recursivas.Funciones con parmetros variablesPara 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.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.RESUMENYa 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 yexpresionesregulares

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 doblesCadena entre comillas simplesPHP 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.

Propiedades de los stringsLos 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.

OperadoresComo en otros lenguajes de programacin podemos utilizar un operador para concatenar cadenas, en PHP las cadenas se concatenan con el operador punto (.).

Sintaxis para mltiples lneasExiste 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 (-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.

Documento sin ttulo

Nombre:
Asunto:
Cuerpo:

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 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.

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-globalesPHP 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.RESUMENEn 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 aobjetos. 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.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() { }

}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.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 estticosEn 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 pseudo-variable 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) { 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();HerenciaLa 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.InterfacesPHP 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: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 abstractasPHP5 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; }

function calcular_salario() { return 10000; }

}

$director = new Director('Francisco','Belmonte Ruiz');

//Imprime 10000echo $director->calcular_salario();RESUMENHasta 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, etcPHP 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 aobjetos. IIUna 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:

-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.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

Clase Producto

Clase Pelicula

Clase Cd

Clase Juego

Clase Videoclub

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.

Prueba

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 escrituradeficherosHasta 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.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:modoDescripcin

rApertura para slo lectura; coloca el puntero al principio del archivo.

r+Apertura para lectura y escritura; coloca el puntero al principio del archivo.

wApertura 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.

w+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.

aApertura para slo escritura; coloca el puntero al final del archivo. Si el archivo no existe se intenta crear.

a+Apertura para lectura y escritura; coloca el puntero al final del archivo. Si el archivo no existe se intenta crear.

xCreacin 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. Siel archivo no exite se intenta crear.

x+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. Siel archivo no exite se intenta crear.

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.

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.

Lectura de ficherosPHP 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:

-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.

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.

Sistema de ficherosPHP 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.

-rename():Esta funcin renombra un archivo. Toma dos parmetros la ruta al archivo que se quiere renombrar, y el nuevo nombre del archivo.

-unlink():Esta funcin borra un archivo. Toma como parmetro la ruta al archivo.

-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.

RESUMENHemos 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 descargadeficheros.Ahora que ya sabemos manipular archivos vamos a ver un ejemplo sencillo de aplicacin que permita subir y descargar ficheros.Subida de ficherosLos 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.

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.

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.

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.

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.

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 ficherosPara 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_ficheroAccederemos al script de descarga de la siguiente manera:Descargar imagen

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.RESUMENYa 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 - SesionesycookiesHTTP 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.CookiesUna 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; secureDe 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.

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.

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.

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.SesionesPHP 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 el usuario, y si lo hay carga en la variable super-global $_SESSION todas las variables de sesin registradas.

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;

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.