manual de php conceptos y ejemplos básicos

Upload: davidmy227464

Post on 08-Jul-2015

962 views

Category:

Documents


0 download

DESCRIPTION

Manual de PHP para principiante.

TRANSCRIPT

ESCUELA SUPERIOR POLITECNICA DE CHIMBORAZO FACULTAD DE INFORMATICA Y ELECTRNICA ESCUELA DE INGENIERIA EN ELECTRNICA Y TECNOLOGA EN COMPUTACIN

SEMINARIO I

REALIZADO POR: DAVID MORENO 220166

SEMESTRE

:

Sexto

Tutorial de PHP

2

Captulo 1.Introduccion a PHP PHPConcepto: PHP es un lenguaje interpretado de alto nivel embebido en pginas HTML yejecutado en el servidor. Podemos ver que no es lo mismo que un script CGI escrito en otro lenguaje de programacin como Perl o C. En vez de escribir un programa con muchos comandos para crear una salida en HTML, escribimos el cdigo HTML con cierto cdigo PHP embebido (introducido) en el mismo, que producir cierta salida (en nuestro ejemplo, producir un texto). El cdigo PHP se incluye entre etiquetas especiales de comienzo y final que nos permitirn entrar y salir del modo PHP. Lo que distingue a PHP de la tecnologa Javascript, la cual se ejecuta en la mquina cliente, es que el cdigo PHP es ejecutado en el servidor. Si tuviesemos un script similar al de nuestro ejemplo en nuestro servidor, el cliente solamente recibira el resultado de su ejecucin en el servidor, sin ninguna posibilidad de determinar que cdigo ha producido el resultado recibido. El servidor web puede ser incluso configurado para que procese todos los ficheros HTML con PHP. Al nivel ms bsico, PHP puede hacer cualquier cosa que se pueda hacer con un script CGI, como procesar la informacin de formularios, generar pginas con contenidos dinmicos, o mandar y recibir cookies. Quizas la caracterstica ms potente y destacable de PHP es su soporte para una gran cantidad de bases de datos. Escribir un interfaz via web para una base de datos es una tarea simple con PHP. Las siguientes bases de datos estn soportadas actualmente: Adabas D dBase Empress FilePro IBM DB2 Informix Ingres Internase FrontBase mSQL MySQL ODBC Oracle (OCI7 and OCI8) PostgreSQL Solid Sybase Velocis Unix dbm

PHP tambin soporta el uso de otros servicios que usen protocolos como IMAP, SNMP, NNTP, POP3, HTTP y derivados. Tambien se pueden abrir sockets de red directos (raw sockets) e interactuar con otros protocolos.

Captulo 2. InstalacinTal y como se ha comentado en la introduccin, la configuracin en la que se encuentra de forma ms habitual el lenguaje PHP suele ser conjuntamente con Apache como servidor 3

Web y MySQL como gestor de base de datos. De hecho, est muy extendido el termino LAMP, cuyas iniciales hacen referencia a Linux, Apache, MySQL y PHP (aunque tambin podra ser Perl o Python). Por todo ello, en este capitulo comentaremos la instalacin de estos tres productos en las plataformas Linux y Windows.

Modo de funcionamientoEl intrprete PHP puede ser ejecutado por el servidor Web de dos modos distintos: como mdulo del propio servidor (interfaz SAPI, Server Application Programming Interface) o como programa externo a frente modo CGI, Common Gateway Interface). A grandes rasgos, ejecutar un programa CGI se supone a la maquina donde se esta ejecutando el servidor Web llamar al sistema operativo para que realice las siguientes tareas bsicas: cargar el programa en memoria, anotarlo en la lista de tareas, lanzar su ejecucin, esperar a que termine y, por Fin, descargarlo de memoria y de la lista de tareas. Es de Perogrullo: tantas veces un cliente pida la ejecucin de un programa CGI, tantas veces se repetirn estas acciones en la maquina servidora... Es fcil imaginar que, si el numero de peticiones es medio-alto, el rendimiento general de esta se vera proporcionalmente degradado. No ya solo por el nmero de tareas simultaneas a realizar, sino por la ocupacin de la memoria fsica del equipo servidor con las copias del programa CGI ejecutndose. Por otra parte, podemos pensar en un SAPI como un protocolo que permite acceder directamente a las funciones internas del servidor; por tanto, a travs del SAPI podemos aadir nuevas funcionalidades a un servidor Web (por ejemplo, acceso a bases de datos, autenticacin de usuarios, cacheo de pginas, generacin de imgenes al vuelo, etc.). Lo mas interesante de esta caracterstica es que todas esas nuevas funcionalidades se van a ejecutar de forma ms rpida y eficiente ya que lo van a hacer en el espacio de memoria del propio servidor. Esto significa que las ejecuciones de los programas las har el propio servidor Web y. por tanto, sern mucho ms rpidas y eficaces (no habr creacin de procesos nuevos ni ocupacin extra de la memoria fsica con copias de estos...). Segn el fabrcate de servidores, existen varios tipos de APIs: Apache API para el servidor Apache, ISAPI de Microsoft para su producto Internet Information Server, NSAPI de AOL para el servidor iPtanei (antes, Netscape Enterprise Server) y WSAPI, que es el SAPI del servidor Website Pro de OReilly1. Adems del bajo rendimiento, la versin CGI tiene innumerables problemas de seguridad asociados. Si, por la razn que fuera, se necesitara instalar PHP en su versin CGI (por ejemplo, para que los procesos PHP se ejecuten bajo determinados usuarios), se recomienda la lectura de los siguientes documentos del CERT (Computer Emergency Response Team): http://www.cert.org/advisores/CA.1996-11.htm http://www.cert.org/advisores/CA.1996-11.htm-interpreters_in_cgi_bin_dir.htm

Instalacion en windows4

PHP esta portado para las versiones de Windows de 32 bits, esto es, Windows 95/98/Me y Windows NT/2000/XP.

Instalacin de Apache en WindowsDe las dos ramas de desarrollo del servidor Apache 1.3.x y 2.x, vamos a instalar esta ultima por las ventajas que ofrece en cuanto a rendimiento y amplia gama de posibilidades; de hecho, la versin 2.0 es competitiva con el servidor IIS de Microsoft en cuanto a escalabilidad y rendimiento, De momento, la versin 2.x solo est disponible para Windows NT/2000, plataformas claramente orientadas a trabajar como servidores. En el momento de la edicin de este capitulo, la ltima versin liberada y estable para Windows es la 2.0.44; por tanto, bajaremos de la direccin http: //httpd.apache.org/dist/httpd/binaries/win32/ el fichero apache_2.0.44-win32-x86no_ssl.msi. El nombre del fichero nos permite saber dos cosas: que ser ejecutado por Microsoft System Installer (extensin msi), y que no incorpora las libreas Secure Sockets Layer necesarias para instalar un servidor seguro (con encriptacin): sufijo _no_ssl.. Antes de lanzar la ejecucin del fichero msi desde el explorador de archives, si hubiera un servidor Apache ya instalado (y adems estuviera funcionando), lo primero que habra que hacer es detener su ejecucin. La instalacin de Apache en Windows es muy sencilla, basta seguir las indicaciones y rellenar algunos campos de formulario: Despus de la presentacin y la aceptacin de los trminos de la licencia de uno de este paquete software, aparecer otra ventana donde se nos pide informacin tal como el nombre del dominio donde va a cslar colgetdo el servidor, el nombre con cl que queremos que se de a conocer y la direccin de correo del administrador. En la misma pantalla se nos pide adems si queremos que este paquete se nstate como servicio de Windows (se ejecutara de manera automtica al arrancar el equipo) en el puerto) estndar o well-known 80, o bien, que se instale como una copia para el usuario desde el que se realizando la instalacin y en el puerto 8080. En la siguiente pantalla preguntar si queremos hacer la instalacin tpica (se instala todo, excepto el cdigo fuente) o personalizada. El directorio por omisin donde se instalan todos los ficheros de Apache es c:\Archivos de programa\Apache Group\Apache; all se crearan, entre otros, los directorios confs htdocs, bin, cgi-bin, libexec, logs, etc. Una vez indicados los datos necesarios, procederemos a instalar el paquete pulsando en el botn preparado al efecto. Al terminar esta operacin, deberemos ver la siguiente pantalla: Para comprobar que, efectivamente, hemos hecho una instalacin correcta, arrancamos el servidor (ya esta disponible desde el men Inicio -> Archives de Programa -> Apache HTTP Server 2.0.44 -> Control Apache Server -> Start) y, con un navegador, nos conectamos a los URLs http://localhost/ o http://127.Q.0.1/. Si la instalacin ha sido correcta, veremos la siguiente imagen; Las operaciones de arrancar y parar el servidor podemos realizarlas de tres formas distintas. La primera de ellas es a travs del programa monitor que viene con la instalacin de Apache {Inicio -> Archives de Programa -> Apache HTTP Server 2.0.44 -> Control Apache Server -s Monitor Apache Servers) que nos mostrara la siguiente pantalla: 5

Si esta instalado como servicio de Windows, podemos hacerlo desde el entorno grafico del sistema operativo (Inicio -> Configuracin -> Panel de Control -> Servicios): O desde una ventana de MS-DOS donde, para arrancarlo, habr que ejecutar el comando: net start apache2 Y, para pararlo, el comando: net stop apache2

Instalacin de PHP en WindowsLos pasos bsicos a realizar para la instalacin de PHP en plataformas Windows son: 1. Obtencin de la ltima distribucin PHP En la direccin http://www.php.net/downloads.php encontraremos las versiones binarias del paquete (validas para todas las versiones Windows de 32bits: Win-9x/Me, WinNT/2000/XP). De las dos versiones que all hay, zip y msi, nos bajaremos la primera puesto que en ella se incluye tanto la versin CGI como la versin SAPI para Apache. La ultima versin de PHP estable que encontramos es la 4.2.3 (almacenada en el fichero php4.2.3-Win32.zip). 2. Descomprimir el fichero bajado Una vez tengamos el fichero en nuestro disco duro, e! siguiente paso es descomprimirlo. Nuestra recomendacin es hacerlo bajo un directorio cuyo nombre sea el nombre completo de la distribucin usada (en este caso, c:\php-4.2.3-Win32) dado que PHP es un proyecto que esta en permanente evolucin y, por tanto, aparecen de forma continua nuevas versiones. Albergar la distribucin en una carpeta del disco duro que tenga como parte del nombre el nmero de distribucin evitara mezclar versiones v configuraciones diferentes. 3. Libreras dinmicas Las extensiones de PHP como, por ejemplo, el acceso a bases de datos MySQL, generacin de ficheros PDF, envo de correo, etc., estn en forma de libreras dinmicas (ficheros con extensin dll) y, por esto, es necesario que estn accesibles al interprete PHP. Por esta razn o bien se copian en el directorio del sistema operativo (c:\windows\system, c:\wir.nc\system32, para W9x/Me o WNT/2000, respectivamente), o bien se copian en el directorio donde residen los ejecutables de PHP (php.exe) que va a usar el servidor Web. Nuestra opcin elegida es hacer las copiar en cl directorio del sistema; por lo tanto {y de momento), dado que la librera dinmica php4ts.dll se usa siempre la copiamos en c:\winnt\system32. 4. Fichero de configuracin php.ini Se debe copiar el fichero php.ini-dist al directorio de sistema de Windows con el nombre php.ini, editarlo y modificarlo segn las necesidades. Por ejemplo, si las libreras dinmicas que ofrecen funcionalidades adicionales (acceso a base de datos, criptografa, 6

generacin de documentos en formato pdf, etc.) no estuvieran en el directorio habitual de la instalacin por defecto, entonces, tendramos que modificar la directiva extension_dir que sirve para este propsito, 5. Modificacin del fichero httpd.conf de Apache Si el servidor Web elegido es Apache, hay que indicarle a 6ste un par de cosas para que se de por enterado. Con esa intenci6n modificamos su fichero de configuracin httpd.conf (recomendamos guardar una copia de respaldo del fichero de configuracin) con cualquier editor de texto (bloc de notas, por ejemplo). Es de resaltar que, segn estemos hablando de directorios de Windows o de nombres de directorios en los ficheros de configuracin de Apache, la notacin cambia: en el primer caso, se usara la barra inversa o backslash ("\"), mientras que en el segundo ser la barra normal o slash ("/"). Despus de realizar cualquier modificacin en el fichero httpd.conf, es conveniente ejecutar desde una ventana de MS-DOS la instruccin c:\archivos de programa\apache group\apache\Apache.exe -t, para asegurarnos de que los cambios estn bien hechos, ya que esta instruccion comprueba la sintaxis del fichero de configuraci6n httpd.conf. La instalacin de PHP bajo Apache en Windows puede hacerse de las dos formas que comentamos al principio del capitulo: como modulo o como CGI. 6 a) Modo SAPI: modificacin del fichero httpd.conf de Apache Hay que asegurarse de que las siguientes lneas estn en el fichero de configuracin de Apache: LoadKodule php4_Module AddType applicacion/x-httpd-php.php.phtml c:/php-4.2.3-win32/sapi/php4apache.dll

] PHP ofrece una caracterstica muy til que consiste en poder visualizar el programa:) fuente de cualquier script PHP con la .sintaxis del lenguaje resaltada en distintos colores. Para conseguir esto, necesitamos hacer dos cosas: que el fichero tenga la extensin php y aadir al fichero de configuracin httpd.conf la lnea: AddType application/x-httpd-php-source .phps 6 b) Modo CCI: modificacin del fichero httpd.conf de Apache Despus de descomprimir el fichero empaquetado en el directorio c:\php-4.2.3, hay que asegurarse de que tenemos las siguientes lneas en el fichero httpd.conf de configuracin de Apache: ScriptAlias /php/ c:/php-4.2.3-win32/ AddType application/x-httpd-php .php .phtml Action applicatiort/x-httpd-php /php-4.2.3-Win32/php. exe

7

En modo de configuracin, si queremos visualizar el programa fuente de cualquier script PHP con la sintaxis del lenguaje resaltada en distintos colores, necesitaremos crear otro fichero que contenga la funcin show_source(). Por ejemplo, para ver el programa mi_script.php, escribimos el programa: 7. Comprobacin de la instalacin Para ver que, efectivamente, PHP se esta ejecutando, arrancamos Apache y nos conectamos a una pagina de prueba que contenga nicamente: Cuyos resultados se visualiza en la siguiente imagen:

Instalacin de MySQL en WindowsLo primero que hacemos es bajarnos la ultima distribucin de MySQL de la direccin http://www.mysql..com/donloads/mysql-3.2.3.html (la encontrada en el momento de la edicin de este capitulo fue la 3.23.49) y descomprimirla en un directorio temporal. Luego, nos cambiamos a dicho directorio temporal y ejecutamos el programa setup.exe, que es el que har la verdadera instalaci6n de este paquete: El directorio por omisin donde se instala MySQL es c:\mysql. En esta carpeta encontraremos, entre otros, los directorios bin (donde se almacenan los programas para arrancar y parar el servidor), data (donde se almacenan las bases de datos) y doc (documentacin muy til relativa a la instalacin, mantenimiento, etc.). Por fin, necesitamos tener en el directorio raz (c:\) el fichero de configuracin de MySQL my.cnf: copiamos uno de los ficheros de ejemplo de configuraci6n que viene en la distribucin (por ejemplo, my-small.cnf) a c:\my.cnf. Si, por el motivo que fuese, necesitramos instalar la aplicacin en un directorio distinto a c:\mysql, deberemos incluir en el fichero c:\my.enf las siguientes lneas: [mysqld] basedir=UNIDAD:/ruta-instalacion/ datadir=UNIDAD:/ruta-datos/ Con el paquete MySQL viene una herramienta grafica, de nombre winmysqladmin.exe, gracias a la cual podremos realizar de manera sencilla e intuitiva la administraci6n de nuestro gestor de base de datos. Con ella podremos conocer datos sobre el equipo servidor donde se esta ejecutando, los mensajes que se produjeron al arrancar el servicio, mensajes de error que hayan ocurrido, variables del sistema, procesos en ejecucin, bases de datos existentes, informes y, sobre todo, podremos editar el fichero de configuraci6n. 8

Por ltimo, para arrancar y parar manualmente el proceso servidor de MySQL deberemos: Arrancar Parar mysqld mysqladmin -u root shutdown instalacion del servicio: eliminacin del servicio: mysqld-nt --install mysqlld-nt --remove net start mysql net stop mysql mysqld-nt --standalone mysqladmin -u root shutdown

9X/Me NT/2000 (servicio) NT/2000 consola

En caso de problemas, el fichero c:\mysql\data\mysgl.err nos puede ser de gran utilidad ya que es en ese fichero donde el servidor escribe los mensajes de error.

Instalacin de Apache+PHP+MySQL en Windows: SokkitNo obstante, existe una aplicacin que nos facilita todas las tareas anteriores, ya que nos instala las tres aplicaciones ya vistas a partir de un solo ejecutable. Esta aplicacin se llama Sokkit (anteriormente llamada PHPTrial) y se puede descargar de http://www.phpgeek.com/. De all nos bajamos (y luego ejecutamos) el fichero phptriadsetup2-n.exe (la versin 3, basada en Apache2, aun esta' en desarrollo); Esta versin nos instala los siguientes paquetes: Apache PHP MySQL PHPMyAdmin Perl 1.3.14 4.0.5 3 .23 .32 2.1.0 5.005 03

Captulo 3. Referencia del Lenguaje Sintaxis bsicaSaliendo de HTMLHay varias formas de salir de HTML y entrar en el modo de cdigo PHP: Ejemplo 3-1. Formas de salir de HTML 1.

9

Esto devuelve el siguiente resultado:

2. Esto devuelve el siguiente resultado:

3. echo ("a algunos editores (como FrontPage) no les gustan las intrucciones de procesado"); Esto devuelve el siguiente resultado:

10

La primera forma slo est disponible si se han habilitado las etiquetas cortas. Esto se puede hacer a travs de la funcin short_tags(), habilitando la opcin de configuracin short_open_tag en el archivo de configuracin de PHP, o compilando PHP con la opcin enable-short-tags en configure.

Separacin de instruccionesLas instrucciones se separan igual que en C o perl - terminando cada sentencia con un punto y coma. La etiqueta de cierre (?>) tambin implica el fin de la sentencia, as lo siguiente es equivalente: Esto devuelve el siguiente resultado:

Esto devuelve el siguiente resultado:

11

ComentariosPHP soporta comentarios tipo C, C++ y shell de Unix. Por ejemplo: Esto devuelve el siguiente resultado:

El tipo de comentario de "una lnea"slo comenta, en realidad, hasta el fin de la lnea o el bloque actual de cdigo PHP, lo que venga primero. Esto es un ejemplo. La cabecera de arriba dir Esto es un ejemplo. Se debera tener cuidado para no anidar comentarios de tipo C, lo cual puede ocurrir cuando se comentan grandes bloques. 12

Esto devuelve el siguiente resultado:

Captulo 4. Tipos de variablesPHP soporta los siguientes tipos: array nmeros en punto flotante entero objeto Cadena

El tipo de una variable normalmente no lo indica el programador; en su lugar, lo decide PHP en tiempo de ejecucin dependiendo del contexto en el que se utilice esa variable. Si se quisiese obligar a que una variable se convierta a un tipo concreto, se podra forzar la variable o usar la funcin settype() para ello. Ntese que una variable se puede comportar de formas diferentes en ciertas situaciones, dependiendo de qu tipo sea en ese momento. Para ms informacin, vea la seccin Conversin de Tipos.

EnterosLos enteros se puede especificar usando una de las siguientes sintaxis: $a = 1234; # nmero decimal $a = -123; # un nmero negativo 13

$a = 0123; # nmero octal (equivalente al 83 decimal) $a = 0x12; # nmero hexadecimal (equivalente al 18 decimal) Ejemplo: Esto devuelve el siguiente resultado:

Nmeros en punto flotanteLos nmeros en punto flotante ("double") se pueden especificar utilizando cualquiera de las siguientes sintaxis: $a = 1.234; $a = 1.2e3; Ejemplo: Esto devuelve el siguiente resultado:

14

CadenasLas cadenas de caracteres se pueden especificar usando uno de dos tipos de delimitadores. Si la cadena est encerrada entre dobles comillas ("), las variables que estn dentro de la cadena sern expandidas (sujetas a ciertas limitaciones de interpretacin). Como en C y en Perl, el carcter de barra invertida ("\") se puede usar para especificar caracteres especiales: Tabla 4-1. Caracteres protegidos

Se puede proteger cualquier otro carcter, pero se producir una advertencia en el nivel de depuracin ms alto. La segunda forma de delimitar una cadena de caracteres usa el carcter de comilla simple (""). Cuando una cadena va encerrada entre comillas simples, los nicos caracteres de escape que sern comprendidos son "\\"y "\". Esto es por convenio, as que se pueden tener comillas simples y barras invertidas en una cadena entre comillas simples. Las variables no se expandirn dentro de una cadena entre comillas simples. Otra forma de delimitar cadenas es usando la sintaxis de documento incrustado (">"). Se debe proporcionar un identificador despus de >, despus la cadena, y despus el mismo identificador para cerrar el entrecomillado. 15

Las cadenas se pueden concatenar usando el operador . (punto). Ntese que el operador + (suma) no sirve para esto. Se puede acceder a los caracteres dentro de una cadena tratndola como un array de caracteres indexado numricamente, usando una sintaxis similar a la de C. Vea un ejemplo ms abajo. Ejemplo 4-1. Algumos ejemplos de cadenas Esto devuelve el siguiente resultado:

16

Conversin de cadenasCuando una cadena se evala como un valor numrico, el valor resultante y el tipo se determinan como sigue.La cadena se evaluar como un doble si contiene cualquiera de los caracteres ., e, o E. En caso contrario, se evaluar como un entero. El valor viene dado por la porcin inicial de la cadena. Si la cadena comienza con datos de valor numrico, este ser el valor usado. En caso contrario, el valor ser 0 (cero). Los datos numricos vlidos son un signo opcional, seguido por uno o ms dgitos (que opcionalmente contengan un punto decimal), seguidos por un exponente opcional. El exponente es una e o una E seguidos por uno o ms dgitos. Cuando la primera expresin es una cadena, el tipo de la variable depender de la segunda expresin. $foo = 1 + "10.5"; // $foo es doble (11.5) $foo = 1 + "-1.3e3"; // $foo es doble (-1299) $foo = 1 + "bob-1.3e3"; // $foo es entero (1) $foo = 1 + "bob3"; // $foo es entero (1) $foo = 1 + "10 Cerditos"; // $foo es entero (11) $foo = 1 + "10 Cerditos"; // $foo es entero (11) $foo = "10.0 cerdos " + 1; // $foo es entero (11) $foo = "10.0 cerdos " + 1.0; // $foo es double (11) Ejemplo: Esto devuelve el siguiente resultado:

Si quisiera probar cualquiera de los ejemplos de esta seccin, puede copiar los ejemplos e insertar la siguiente lnea para ver por s mismo lo que va ocurriendo: echo "\$foo==$foo; el tipo es " . gettype( $foo ) . "
\n";

ArraysLos arrays actualmente actan tanto como tablas hash (arrays asociativos) como arrays indexados (vectores).

Arrays unidimensionalesPHP soporta tanto arrays escalares como asociativos. De hecho, no hay diferencias entre los dos. Se puede crear una array usando las funciones list() o array(), o se puede asignar el valor de cada elemento del array de manera explcita. $a[0] = "abc"; $a[1] = "def"; $b["foo"] = 13;

18

Tambin se puede crear un array simplemente aadiendo valores al array. Cuando se asigna un valor a una variable array usando corchetes vacos, el valor se aadir al final del array. $a[] = "hola"; // $a[2] == "hola" $a[] = "mundo"; // $a[3] == "mundo" Los arrays se pueden ordenar usando las funciones asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort(), y uksort() dependiendo del tipo de ordenacin que se desee. Se puede contar el nmero de elementos de un array usando la funcin count(). Se puede recorrer un array usando las funciones next() y prev(). Otra forma habitual de recorrer un array es usando la funcin each(). Ejemplo: convertir un decimal a romano romanos #Decimal #Romano Esto devuelve el siguiente resultado:

20

Arrays MultidimensionalesLos arrays multidimensionales son bastante simples actualmente. Para cada dimensin del array, se puede aadir otro valor [clave] al final: $a[1] = $f; # ejemplos de una sola dimensin $a["foo"] = $f; $a[1][0] = $f; # bidimensional $a["foo"][2] = $f; # (se pueden mezclar ndices numricos y asociativos) $a[3]["bar"] = $f; # (se pueden mezclar ndices numricos y asociativos) $a["foo"][4]["bar"][0] = $f; # tetradimensional! En PHP3 no es posible referirse a arrays multidimensionales directamente dentro de cadenas. Por ejemplo, lo siguiente no tendr el resultado deseado: $a[3][bar] = Bob; echo "Esto no va a funcionar: $a[3][bar]"; En PHP3, lo anterior tendr la salida Esto no va a funcionar: Array[bar]. De todas formas, el operador de concatenacin de cadenas se puede usar para solucionar esto: $a[3][bar] = Bob; echo "Esto no va a funcionar: " . $a[3][bar]; En PHP4, sin embargo, todo el problema se puede circunvenir encerrando la referencia al array (dentro de la cadena) entre llaves: $a[3][bar] = Bob; echo "Esto va a funcionar: {$a[3][bar]}"; Se pueden "rellenar"arrays multidimensionales de muchas formas, pero la ms difcil de comprender es cmo usar el comando array() para arrays asociativos. Estos dos trozos de cdigo rellenarn el array unidimensional de la misma manera: Ejemplo 1: $a["color"] = "rojo"; $a["sabor"] = "dulce"; $a["forma"] = "redondeada";

21

$a["nombre"] = "manzana"; $a[3] = 4; Ejemplo 2: $a = array( "color" => "rojo", "sabor" => "dulce", "forma" => "redondeada", "nombre" => "manzana", 3 => 4 ); La funcin array() se puede anidar para arrays multidimensionales: Ejemplo3: triangulo

23

ObjetosInicializacin de ObjetosPara inicializar un objeto, se usa la sentencia new para instanciar el objeto a una variable. class foo { function do_foo () { echo "Doing foo."; } } $bar = new foo; $bar->do_foo();

Type jugglingPHP no requiere (o soporta) la declaracin explcita del tipo en la declaracin de variables; el tipo de una variable se determina por el contexto en el que se usa esa variable. Esto quiere decir que si se asigna un valor de cadena a la variable var, var se convierte en una cadena. Si despus se asigna un valor entero a la variable var, se convierte en una variable entera. Un ejemplo de conversin de tipo automtica en PHP3 es el operador suma +. Si cualquiera de los operandos es un doble, entonces todos los operandos se evalan como dobles, y el resultado ser un doble. En caso contrario, los operandos se interpretarn como enteros, y el resultado ser tambin un entero. Ntese que esto NO cambia los tipos de los operandos propiamente dichos; el nico cambio est en cmo se evalan los operandos. $foo = "0"; // $foo es una cadena (ASCII 48) $foo++; // $foo es la cadena "1" (ASCII 49) $foo += 1; // $foo ahora es un entero (2) $foo = $foo + 1.3; // $foo ahora es un doble (3.3) $foo = 5 + "10 Cerditos Pequeitos"; // $foo es entero (15) $foo = 5 + "10 Cerditos"; // $foo es entero (15) Si los ltimos dos ejemplos anteriores parecen confusos, vea Conversin de cadenas. 24

Si se desea obligar a que una variable sea evaluada con un tipo concreto, mire la seccin Forzado de tipos. Si se desea cambiar el tipo de una variable, vea la funcin settype(). Si quisiese probar cualquiera de los ejemplos de esta seccin, puede cortar y pegar los ejemplos e insertar la siguiente lnea para ver por s mismo lo que va ocurriendo: echo "\$foo==$foo; el tipo es " . gettype( $foo ) . "
\n"; Nota: La posibilidad de una conversin automtica a array no est definida actualmente. $a = 1; // $a es un entero $a[0] = "f"; // $a se convierte en un array, en el que $a[0] vale "f" Aunque el ejemplo anterior puede parecer que claramente debera resultar en que $a se convierta en un array, el primer elemento del cual es f, consideremos esto: $a = "1"; // $a es una cadena $a[0] = "f"; // Qu pasa con los ndices de las cadenas? Qu ocurre? Dado que PHP soporta indexacin en las cadenas va offsets usando la misma sintaxis que la indexacin de arrays, el ejemplo anterior nos conduce a un problema: debera convertirse $a en un array cuyo primer elemento sea "f", o debera convertirse "f" en el primer carcter de la cadena $a? Por esta razn, tanto en PHP 3.0.12 como en PHP 4.0b3-RC4, el resultado de esta conversin automtica se considera que no est definido. Los parches se estn discutiendo, de todas formas.

Forzado de tiposEl forzado de tipos en PHP funciona como en C: el nombre del tipo deseado se escribe entre parntesis antes de la variable a la que se pretende forzar. $foo = 10; // $foo es un entero $bar = (double) $foo; // $bar es un doble Los forzados de tipo permitidos son: (int), (integer) - fuerza a entero (integer) (real), (double), (float) - fuerza a doble (double) (string) - fuerza a cadena (string) (array) - fuerza a array (array) (object) - fuerza a objeto (object) Ntese que las tabulaciones y espacios se permiten dentro de los parntesis, as que los siguientes ejemplos son funcionalmente equivalentes: $foo = (int) $bar; $foo = ( int ) $bar; Puede no ser obvio que ocurrir cuando se fuerce entre ciertos tipos. Por ejemplo, lo siguiente debera ser tenido en cuenta.

25

Cuando se fuerza el cambio de un escalar o una variable de cadena a un array, la variable se convertir en el primer elemento del array: $var = ciao; $arr = (array) $var; echo $arr[0]; // produce la salida ciao Cuando se fuerza el tipo de una variable escalar o de una cadena a un objeto, la variable se convertir en un atributo del objeto; el nombre del atributo ser scalar: $var = ciao; $obj = (object) $var; echo $obj->scalar; // produce la salida ciao

Captulo 5. VariablesConceptos BsicosEn PHP las variables se representan como un signo de dlar seguido por el nombre de la variable. El nombre de la variable es sensible a minsculas y maysculas. $var = "Bob"; $Var = "Joe"; echo "$var, $Var"; // produce la salida "Bob, Joe" En PHP3, las variables siempre se asignan por valor. Esto significa que cuando se asigna una expresin a una variable, el valor ntegro de la expresin original se copia en la variable de destino. Esto quiere decir que, por ejemplo, despus e asignar el valor de una variable a otra, los cambios que se efecten a una de esas variables no afectar a la otra. Para ms informacin sobre este tipo de asignacin, vea Expresiones. PHP4 ofrece otra forma de asignar valores a las variables: asignar por referencia. Esto significa que la nueva variable simplemente referencia (en otras palabras, "se convierte en un alias de"o "apunta a") la variable original. Los cambios a la nueva variable afectan a la original, y viceversa. Esto tambin significa que no se produce una copia de valores; por tanto, la asignacin ocurre ms rpidamente. De cualquier forma, cualquier incremento de velocidad se notar slo en los bucles crticos cuando se asignen grandes arrays u objetos. Para asignar por referencia, simplemente se antepone un ampersand (&) al comienzo de la variable cuyo valor se est asignando (la variable fuente). Por ejemplo, el siguiente trozo de cdigo produce la salida Mi nombre es Bob dos veces: Esto devuelve el siguiente resultado:

Algo importante a tener en cuenta es que slo las variables con nombre pueden ser asignadas por referencia. Esto devuelve el siguiente resultado:

27

Variables predefinidasPHP proporciona una gran cantidad de variables predefinidas a cualquier script que se ejecute. De todas formas, muchas de esas variables no pueden estar completamente documentadas ya que dependen de sobre qu servidor se est ejecutando, la versin y configuracin de dicho servidor, y otros factores. Algunas de estas variables no estarn disponibles cuando se ejecute PHP desde la lnea de comandos. A pesar de estos factores, aqu tenemos una lista de variables predefinidas disponibles en una instalacin por defecto de PHP 3 corriendo como modulo de un Apache http://www.apache.org/) 1.3.6 con su configuracin tambin por defecto. Para una lista de variables predefinidas (y muchas ms informacin til), por favor, vea (y use) phpinfo(). Nota: Esta lista no es exhaustiva ni pretende serlo. Simplemente es una gua de qu tipo de variables predefinidas se puede esperar tener disponibles en un script.

Variables de ApacheEstas variables son creadas por el servidor web Apache (http://www.apache.org/). Si se est utilizando otro servidor web, no hay garanta de que proporcione las mismas variables; pueden faltar algunas, o proporcionar otras no listadas aqu. Dicho esto, tambin estn presentes las variables de la especificacin CGI 1.1 (http://hoohoo.ncsa.uiuc.edu/cgi/env.html), por lo que tambin se deben tener en cuenta. Tenga en cuenta que unas pocas, como mucho, de estas variables van a estar disponibles (o simplemente tener sentido) si se ejecuta PHP desde la lnea de comandos. GATEWAY_INTERFACE Qu revisin de la especificacin CGI est usando el servidor; por ejemplo CGI/1.1. SERVER_NAME El nombre del equipo servidor en el que se est ejecutando el script. Si el script se est ejecutando en un servidor virtual, este ser el valor definido para dicho servidor virtual. SERVER_SOFTWARE Una cadena de identificacin del servidor, que aparece en las cabeceras al responderse a las peticiones. SERVER_PROTOCOL Nombre y revisin del protocolo a travs del que se solicit la pgina; p.ej. HTTP/1.0; REQUEST_METHOD Qu mtodo de peticin se us para acceder a la pgina; p.ej. GET, HEAD, POST, PUT. 28

QUERY_STRING La cadena de la peticin, si la hubo, mediante la que se accedi a la pgina. DOCUMENT_ROOT El directorio raz del documento bajo el que se ejecuta el script, tal y como est definido en el fichero de configuracin del servidor. HTTP_ACCEPT Los contenidos de la cabecera Accept: de la peticin actual, si hay alguna. HTTP_ACCEPT_CHARSET Los contenidos de la cabecera Accept-Charset: de la peticin actual, si hay alguna. Por ejemplo: iso-8859-1,*,utf-8. HTTP_ENCODING Los contenidos de la cabecera Accept-Encoding: de la peticin actual, si la hay. Por ejemplo: gzip. HTTP_ACCEPT_LANGUAGE Los contenidos de la cabecera Accept-Language: de la peticin actual, si hay alguna. Por ejemplo: en. HTTP_CONNECTION Los contenidos de la cabecera Connection: de la peticin actual, si hay alguna. Por ejemplo: Keep-Alive. HTTP_HOST Los contenidos de la cabecera Host: de la peticin actual, si hay alguna. HTTP_REFERER La direccin de la pgina (si la hay) desde la que el navegador salt a la pgina actual. Esto lo establece el navegador del usuario; no todos los navegadores lo hacen. HTTP_USER_AGENT Los contenidos de la cabecera User_Agent: de la peticin actual, si hay alguna. Indica el navegador que se est utilizando para ver la pgina actual; p.ej. Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Entre otras cosas, se puede usar este valor con get_browser() para adaptar la funcionalidad de la pgina a las posibilidades del navegador del usuario.

29

REMOTE_ADDR La direccin IP desde la que el usuario est viendo la pgina actual. REMOTE_PORT El puerto que se est utilizando en la mquina del usuario para comunicarse con el servidor web. SCRIPT_FILENAME La va de acceso absoluta del script que se est ejecutando. SERVER_ADMIN El valor que se haya dado a la directiva SERVER_ADMIN (en Apache) en el fichero de configuracin del servidor web. Si el script se est ejecutando en un servidor virtual, ser el valor definido para dicho servidor virtual. SERVER_PORT El puerto del equipo servidor que est usando el servidor web para la comunicacin. Para configuraciones por defecto, ser 80; al usar SSL, por ejemplo, cambiar al puerto que se haya definido como seguro para HTTP. SERVER_SIGNATURE Una cadena que contiene la versin del servidor y el nombre del servidor virtual que es aadida a las pginas generadas por el servidor, si est caracterstica est activa. PATH_TRANSLATED Va de acceso basada en el sistema de ficheros- (no el directorio raz del documento-) del script en cuestin, despus de que el servidor haya hecho la conversin virtual-areal. SCRIPT_NAME Contiene la va de acceso del script actual. Es til para pginas que necesitan apuntar a s mismas. REQUEST_URI La URI que se di para acceder a esta pgina; por ejemplo, /index.html.

Variables de entornoEstas variables se importan en el espacio de nombres global de PHP desde el entorno en el que se est ejecutando el intrprete PHP. Muchas son proporcionadas por el intrprete de comandos en el que se est ejecutando PHP, y dado que a sistemas diferentes les gusta ejecutar diferentes tipos de intrpretes de comandos, es imposible hacer una lista definitiva. 30

Por favor, mire la documentacin de su intrprete de comandos para ver una lista de las variables de entorno definidas. Otras variables de entorno son las de CGI, que estn ah sin importar si PHP se est ejecutando como un mdulo del servidor o como un intrprete CGI.

Variables de PHPEstas variables son creadas por el propio PHP. argv Array de argumentos pasados al script. Cuando el script se ejecuta desde la lnea de comandos, esto da un acceso, al estilo de C, a los parmetros pasados en lnea de comandos. Cuando se le llama mediante el mtodo GET, contendr la cadena de la peticin. argc Contiene el nmero de parmetros de la lnea de comandos pasados al script (si se ejecuta desde la lnea de comandos). PHP_SELF El nombre del fichero que contiene el script que se esta ejecutando, relativo al directorio raz de los documentos. Si PHP se est ejecutando como intrprete de lnea de comandos, esta variable no est disponible. HTTP_COOKIE_VARS Un array asociativo de variables pasadas al script actual mediante cookies HTTP. Slo est disponible si el seguimiento de variables ha sido activado mediante la directiva de configuracin track_vars o la directiva . HTTP_GET_VARS Un array asociativo de variables pasadas al script actual mediante el mtodo HTTP GET. Slo est disponible si variable tracking ha sido activado mediante la directiva de configuracin track_vars o la directiva . HTTP_POST_VARS Un array asociativo de variables pasadas al script actual mediante el mtodo HTTP POST. Slo est disponible si variable tracking ha sido activado mediante la directiva de configuracin track_vars o la directiva .

Ambito de las variablesEl mbito de una variable es el contexto dentro del que la variable est definida. La mayor parte de las variables PHP slo tienen un mbito simple. Este mbito simple tambin abarca los ficheros incluidos y los requeridos. Por ejemplo: $a = 1; include "b.inc"; 31

Aqu, la variable $a dentro del script incluido b.inc. De todas formas, dentro de las funciones definidas por el usuario aparece un mbito local a la funcin. Cualquier variables que se use dentro de una funcin est, por defecto, limitada al mbito local de la funcin. Por ejemplo: $a = 1; /* mbito global */ Function Test () { echo $a; /* referencia a una variable de mbito local */ } Test (); Este script no producir salida, ya que la orden echo utiliza una versin local de la variable $a, a la que no se ha asignado ningn valor en su mbito. Puede que usted note que hay una pequea diferencia con el lenguaje C, en el que las variables globales estn disponibles automticamente dentro de la funcin a menos que sean expresamente sobreescritas por una definicin local. Esto puede causar algunos problemas, ya que la gente puede cambiar variables globales inadvertidamente. En PHP, las variables globales deben ser declaradas globales dentro de la funcin si van a ser utilizadas dentro de dicha funcin. Veamos un ejemplo: $a = 1; $b = 2; Function Sum () { global $a, $b; $b = $a + $b; } Sum (); echo $b; El script anterior producir la salida "3". Al declarar $a y $b globales dentro de la funcin, todas las referencias a tales variables se referirn a la versin global. No hay lmite al nmero de variables globales que se pueden manipular dentro de una funcin. Un segundo mtodo para acceder a las variables desde un mbito global es usando el array $GLOBALS propio de PHP3.El ejemplo anterior se puede reescribir as: $a = 1; $b = 2; Function Sum () { $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; } Sum (); echo $b; El array $GLOBALS es un array asociativo con el nombre de la variable global como clave y los contenidos de dicha variable como el valor del elemento del array. Otra caracterstica importante del mbito de las variables es la variable static. Una variable esttica existe slo en el mbito local de la funcin, pero no pierde su valor

32

cuando la ejecucin del programa abandona este mbito. Consideremos el siguiente ejemplo: Function Test () { $a = 0; echo $a; $a++; } Esta funcin tiene poca utilidad ya que cada vez que es llamada asigna a $a el valor 0 y representa un "0". La sentencia $a++, que incrementa la variable, no sirve para nada, ya que en cuanto la funcin termina la variable $a desaparece. Para hacer una funcin til para contar, que no pierda la pista del valor actual del conteo, la variable $a debe declararse como esttica: Function Test () { static $a = 0; echo $a; $a++; } Ahora, cada vez que se llame a la funcin Test(), se representar el valor de $a y se incrementar. Las variables estticas tambin proporcionan una forma de manejar funciones recursivas. Una funcin recursiva es la que se llama a s misma. Se debe tener cuidado al escribir una funcin recursiva, ya que puede ocurrir que se llame a s misma indefinidamente. Hay que asegurarse de implementar una forma adecuada de terminar la recursin. La siguiente funcin cuenta recursivamente hasta 10, usando la variable esttica $count para saber cundo parar: Function Test () { static $count = 0; $count++; echo $count; if ($count < 10) { Test (); } $count-; }

Variables variablesA veces es conveniente tener nombres de variables variables. Dicho de otro modo, son nombres de variables que se pueden establecer y usar dinmicamente. Una variable normal se establece con una sentencia como: $a = "hello"; Una variable variable toma el valor de una variable y lo trata como el nombre de una variable. En el ejemplo anterior, hello, se puede usar como el nombre de una variable utilizando dos signos de dlar. p.ej.

33

$$a = "world"; En este momento se han definido y almacenado dos variables en el rbol de smbolos de PHP: $a, que contiene "hello", y $hello, que contiene "world". Es ms, esta sentencia: echo "$a ${$a}"; produce el mismo resultado que: echo "$a $hello"; p.ej. ambas producen el resultado: hello world. Para usar variables variables con arrays, hay que resolver un problema de ambigedad. Si se escribe $$a[1] el intrprete necesita saber si nos referimos a utilizar $a[1] como una variable, o si se pretenda utilizar $$a como variable y el ndice [1] como ndice de dicha variable. La sintaxis para resolver esta ambiguedad es: ${$a[1]} para el primer caso y ${$a}[1] para el segundo.

Variables externas a PHPFormularios HTML (GET y POST)Cuando se enva un formulario a un script PHP, las variables de dicho formulario pasan a estar automticamente disponibles en el script gracias a PHP. Por ejemplo, consideremos el siguiente formulario: Ejemplo 5-1. Variables de formulario simples Nombre: Esto devuelve el siguiente resultado: 34

Cuando es enviado, PHP crear la variable $name, que contendr lo que sea que se introdujo en el campo Name: del formulario. PHP tambin maneja arrays en el contexto de variables de formularios, pero slo en una dimensin. Se puede, por ejemplo, agrupar juntas variables relacionadas, o usar esta caracterstica para recuperar valores de un campo select input mltiple: Ejemplo 5-2. Variables de formulario ms complejas Nombre: Email: Cerveza : Warthog Guinness Stuttgarter Schwabenbru 35

Esto devuelve el siguiente resultado:

Si la posibilidad de PHP de track_vars est activada, ya sea mediante la opcin de configuracin track_vars o mediante la directiva , las variables enviadas con los mtodos POST o GET tambin se encontrarn en los arrays asociativos globales $HTTP_POST_VARS y $HTTP_GET_VARS.

IMAGE SUBMIT variable namesCuando se enva un formulario, es posible usar una imagen en vez del botn submit estndar con una etiqueta como: Cuando el usuario hace click en cualquier parte de la imagen, el formulario que la acompaa se transmitir al servidor con dos variables adicionales, sub_x y sub_y. Estas contienen las coordenadas del click del usuario dentro de la imagen. Los ms experimentados puede notar que los nombres de variable enviados por el navegador contienen un guin en vez de un subrayado (guin bajo), pero PHP convierte el guin en subrayado automticamente.

Cookies HTTPPHP soporta cookies de HTTP de forma transparente tal y como estn definidas en en las Netscapes Spec (http://www.netscape.com/newsref/std/cookie_spec.html). Las cookies son un mecanismo para almacenar datos en el navegador y as rastrear o identificar a usuarios que vuelven. Se pueden crear cookies usando la funcin SetCookie(). Las cookies son parte de la cabecera HTTP, as que se debe llamar a la funcin SetCookie antes de que se enve cualquier salida al navegador. Es la misma restriccin que para la funcin Header(). Cualquier cookie que se reciba procedente del cliente ser convertida automticamente en una variable de PHP como con los datos en los mtodos GET y POST.

36

Si se quieren asignar mltiples valores a una sola cookie, basta con aadir [] al nombre de la. Por ejemplo: SetCookie ("MyCookie[]", "Testing", time()+3600); Ntese que una cookie reemplazar a una cookie anterior que tuviese el mismo nombre en el navegador a menos que el camino (path) o el dominio fuesen diferentes. As, para una aplicacin de carro de la compra se podra querer mantener un contador e ir pasndolo. P.ej. Ejemplo 5-3. SetCookie Count++; SetCookie ("Count", $Count, time()+3600); SetCookie ("Cart[$Count]", $item, time()+3600);

Variables de entornoPHP hace accesibles las variables de entorno automticamente tratndolas como variables normales. echo $HOME; /* Shows the HOME environment variable, if set. */ Dado que la informacin que llega va mecanismos GET, POST y Cookie crean automticamente variables de PHP, algunas veces es mejor leer variables del entorno explcitamente para asegurarse de que se est trabajando con la versin correcta. La funcin getenv() se puede usar para ello. Tambin se puede asignar un valor a una variable de entorno con la funcin putenv().

Puntos en los nombres de variables de entradaTpicamente, PHP no altera los nombres de las variables cuando se pasan a un script. De todas formas, hay que notar que el punto no es un carcter vlido en el nombre de una variable PHP.

Por esta razn, mire esto: $varname.ext; /* nombre de variable no vlido */ Lo que el intrprete ve es el nombre de una variable $varname, seguido por el operador de concatenacin, y seguido por la prueba (es decir, una cadena sin entrecomillar que no coincide con ninguna palabra clave o reservada conocida) ext. Obviamente, no se pretenda que fuese este el resultado. Por esta razn, es importante hacer notar que PHP reemplazar automticamente cualquier punto en los nombres de variables de entrada por guiones bajos (subrayados).

Determinando los tipos de variablesDado que PHP determina los tipos de las variables y los convierte (generalmente) segn necesita, no siempre resulta obvio de qu tipo es una variable dada en un momento concreto. PHP incluye varias funciones que descubren de qu tipo es una variable. Son gettype(), is_long(), is_double(), is_string(), is_array(), y is_object().

37

Captulo 6. ConstantesPHP define varias constantes y proporciona un mecanismo para definir ms en tiempo de ejecucin. Las constantes son como las variables, salvo por las dos circunstancias de que las constantes deben ser definidas usando la funcin define(), y que no pueden ser redefinidas ms tarde con otro valor. Las constantes predefinidas (siempre disponibles) son: __FILE__ El nombre del archivo de comandos que est siendo interpretado actualmente. Si se usa dentro de un archivo que ha sido incluido o requerido, entonces se da el nombre del archivo incluido, y no el nombre del archivo padre. __LINE__ El nmero de lnea dentro del archivo que est siendo interpretado en la actualidad. Si se usa dentro de un archivo incluido o requerido, entonces se da la posicin dentro del archivo incluido. PHP_VERSION La cadena que representa la versin del analizador de PHP en uso en la actualidad; e.g. 3.0.8-dev. PHP_OS El nombre del sistema operativo en el cul se ejecuta el analizador PHP; e.g. Linux. TRUE Valor verdadero. FALSE Valor falso. E_ERROR Denota un error distinto de un error de interpretacin del cual no es posible recuperarse. E_WARNING Denota una condicin donde PHP reconoce que hay algo errneo, pero continuar de todas formas; pueden ser capturados por el propio archivo de comandos. Un ejemplo sera una invlida regexp en ereg(). E_PARSE

38

El interprete encontr sintaxis invlida en el archivo de comandos. La recuperacin no es posible. E_NOTICE Ocurri algo que pudo ser o no un error. La ejecucin contina. Los ejemplos incluyen usar una cadena sin comillas como un ndice "hash", o acceder a una variable que no ha sido inicializada. Las constantes E_* se usan tpicamente con la funcin error_reporting() para configurar el nivel de informes de error. Se pueden definir constantes adicionales usando la funcin define(). Ntese que son constantes, no macros tipo C; con una constante slo se pueden representar datos escalares vlidos. Ejemplo 6-1. Definiendo Constantes Esto devuelve el siguiente resultado:

Ejemplo 6-2. Usando __FILE__ y __LINE__ Esto devuelve el siguiente resultado:

39

Captulo 7. ExpresionesLas expresiones son la piedra angular de PHP. En PHP, casi cualquier cosa que escribes es una expresin. La forma ms simple y ajustada de definir una expresin es "cualquier cosa que tiene un valor". Las formas ms bsicas de expresiones son las constantes y las variables. Cuando escribes "$a = 5", ests asignando 5 a $a. 5, obviamente, tiene el valor 5 o, en otras palabras 5 es una expresin con el valor 5 (en este caso, 5 es una constante entera). Despus de esta asignacin, esperars que el valor de $a sea 5 tambin, de manera que si escribes $b = $a, esperas que se comporte igual que si escribieses $b = 5. En otras palabras, $a es una expresin tambin con el valor 5. Si todo va bien, eso es exactamente lo que pasar. Las funciones son un ejemplo algo ms complejo de expresiones. Por ejemplo, considera la siguiente funcin: function foo () { return 5; } Suponiendo que ests familiarizado con el concepto de funciones, asumirs que teclear $c = foo() es esencialmente lo mismo que escribir $c = 5, y has acertado. Las funciones son expresiones que valen el valor que retornan. Como foo() devuelve 5, el valor de la expresin foo() es 5. Normalmente las funciones no devuelven un valor fijo, sino que suele ser calculado. Desde luego, los valores en PHP no se limitan a enteros, y lo ms normal es que no lo sean. PHP soporta tres tipos escalares: enteros, punto flotante y cadenas (los tipos escalares son aquellos cuyos valores no pueden dividirse en partes menores, no como los arrays, por ejemplo). PHP tambin soporta dos tipos compuestos (no escalares): arrays y objetos. Se puede asignar cada uno de estos tipos de valor a variables o bien retornarse de funciones, sin ningn tipo de limitacin.

40

Hasta aqu, los usuarios de PHP/FI 2 no deberan haber notado ningn cambio. Sin embargo, PHP lleva las expresiones mucho ms all, al igual que otros lenguajes. PHP es un lenguaje orientado a expresiones, en el sentido de que casi todo es una expresin. Considera el ejemplo anterior $a = 5. Es sencillo ver que hay dos valores involucrados, el valor de la constante entera 5, y el valor de $a que est siendo actualizado tambin a 5. Pero la verdad es que hay un valor adicional implicado aqu, y es el valor de la propia asignacin. La asignacin misma se evala al valor asignado, en este caso 5. En la prctica, quiere decir que $a = 5, independientemente de lo que hace, es una expresin con el valor 5. De esta manera, escribir algo como $b = ($a = 5) es como escribir $a = 5; $b = 5; (un punto y coma marca el final de una instruccin). Como las asignaciones se evalan de derecha a izquierda, puedes escribir tambin $b = $a = 5. Otro buen ejemplo de orientacin a expresiones es el pre y post incremento y decremento. Los usuarios de PHP/FI 2 y los de otros muchos lenguajes les sonar la notacin variable++ y variable. Esto son las operaciones de incremento y decremento. En PHP/FI 2, la instruccin $a++ no tiene valor (no es una expresin), y no puedes asignarla o usarla de ningn otro modo. PHP mejora las caractersticas del incremento/decremento hacindolos tambin expresiones, como en C. En PHP, como en C, hay dos tipos de incremento - pre-incremento y post-incremento. Ambos, en esencia, incrementan la variable y el efecto en la variable es idntico. La diferencia radica en el valor de la propia expresion incremento. El preincremento , escrito ++$variable, se evala al valor incrementado (PHP incrementa la variable antes de leer su valor, de ah el nombre preincremento). El postincremento, escrito $variable++, se evala al valor original de $variable antes de realizar el incremento (PHP incrementa la variable despus de leer su valor, de ah el nombre postincremento). Un tipo muy corriente de expresiones son las expresiones de comparacin. Estas expresiones se evalan a 0 o 1,significando FALSO (FALSE) o CIERTO (TRUE), respectivamente. PHP soporta > (mayor que), >= (mayor o igual que), == (igual que), ! = (distinto), < (menor que) y Esto devuelve el siguiente resultado:

Operadores LgicosTabla 8-5. Operadores Lgicos La razn de las dos variaciones de "y"y "o"es que operan con distinta precedencia (ver Precedencia de Operadores.)

Precedencia de Operadores

La precedencia de operadores especifica cmo se agrupan las expresiones. Por ejemplo, en la expresin 1 + 5 * 3, la respuesta es 16 y no 18 porque el operador de multiplicacin ("*") tiene una mayor precedencia que el de adicin ("+"). La siguiente tabla lista la precedencia de operadores, indicndose primero los de menor precedencia. Tabla 8-6. Precedencia de Operadores

46

Operadores de CadenasHay dos operadores de cadenas. El primero es el operador de concatenacin (.), que devuelve el resultado de concatenar sus operandos izquierdo y derecho. El segundo es el operador de concatenacin y asignacin (.=). Consulta Operadores de Asignacin para ms informacin. $a = "Hola "; $b = $a . "Mundo!"; // ahora $b contiene "Hola Mundo!" $a = "Hola "; $a .= "Mundo!"; // ahora $a contiene "Hola Mundo!"

Captulo 9. Estructuras de Control y BuclesTodo archivo de comandos PHP se compone de una serie de sentencias. Una sentencia puede ser una asignacin, una llamada a funcin, un bucle, una sentencia condicional e incluso una sentencia que no haga nada (una sentencia vaca). Las sentencias normalmente acaban con punto y coma. Adems, las sentencias se pueden agrupar en grupos de sentencias encapsulando un grupo de sentencias con llaves. Un grupo de sentencias es tambin una sentencia. En este captulo se describen los diferentes tipos de sentencias.

ifLa construccin if es una de las ms importantes caractersticas de muchos lenguajes, incluido PHP. Permite la ejecucin condicional de fragmentos de cdigo. PHP caracteriza una estructura if que es similar a la de C: 47

if (expr) sentencia Como se describe en la seccin sobre expresiones, expr se evala a su valor condicional. Si expr se evala como TRUE, PHP ejecutar la sentencia, y si se evala como FALSE - la ignorar. El siguiente ejemplo mostrara a es mayor que b si $a fuera mayor que $b: if ($a > $b) print "a es mayor que b"; A menudo, se desea tener ms de una sentencia ejecutada de forma condicional. Por supuesto, no hay necesidad de encerrar cada sentencia con una clusula if. En vez de eso, se pueden agrupar varias sentencias en un grupo de sentencias. Por ejemplo, este cdigo mostrara a es mayor que b si $a fuera mayor que $b, y entonces asignara el valor de $a a $b: if ($a > $b) { print "a es mayor que b"; $b = $a; } Las sentencias if se pueden anidar indefinidamente dentro de otras sentencias if, lo cual proporciona una flexibilidad completa para ejecuciones condicionales en las diferentes partes de tu programa.

elseA menudo queremos ejecutar una sentencia si se cumple una cierta condicion, y una sentencia distinta si la condicin no se cumple. Esto es para lo que sirve else. else extiende una sentencia if para ejecutar una sentencia en caso de que la expresin en la sentencia if se evale como FALSE. Por ejemplo, el siguiente cdigo mostrara a es mayor que b si $a fuera mayor que $b, y a NO es mayor que b en cualquier otro caso: if ($a > $b) { print "a es mayor que b"; } else { print "a NO es mayor que b"; } La sentencia else se ejecuta solamente si la expresin if se evala como FALSE, y si hubiera alguna expresin elseif - slo si se evaluaron tambin a FALSE (Ver elseif).

elseif

48

elseif, como su nombre sugiere, es una combinacin de if y else. Como else, extiende una sentencia if para ejecutar una sentencia diferente en caso de que la expresin if original se evala como FALSE. No obstante, a diferencia de else, ejecutar esa expresin alternativa solamente si la expresin condicional elseif se evala como TRUE. Por ejemplo, el siguiente cdigo mostrara a es mayor que b, a es igual a b o a es menor que b: Ejemplo: Esto devuelve el siguiente resultado:

Puede haber varios elseifs dentro de la misma sentencia if. La primera expresin elseif (si hay alguna) que se evale como true se ejecutara. En PHP, tambin se puede escribir else if (con dos palabras) y el comportamiento sera idntico al de un elseif (una sola palabra). El significado sintctico es ligeramente distinto (si estas familiarizado con C, es el mismo comportamiento) pero la lnea bsica es que ambos resultaran tener exactamente el mismo comportamiento. La sentencia elseif se ejecuta slo si la expresin if precedente y cualquier expresin elseif precedente se evalan como FALSE, y la expresin elseif actual se evala como TRUE.

Sintaxis Alternativa de Estructuras de ControlPHP ofrece una sintaxis altenativa para alguna de sus estructuras de control; a saber, if, while, for, y switch. En cada caso, la forma bsica de la sintaxis alternativa es cambiar 49

abrir-llave por dos puntos (:) y cerrar-llave por endif;, endwhile;, endfor;, or endswitch;, respectivamente. A es igual a 5 En el ejemplo de arriba, el bloque HTML "A = 5"se anida dentro de una sentencia if escrita en la sintaxis alternativa. El bloque HTML se mostrara solamente si $a fuera igual a 5. La sintaxis alternativa se aplica a else y tambin a elseif. La siguiente es una estructura if con elseif y else en el formato alternativo: if ($a == 5): print "a es igual a 5"; print "..."; elseif ($a == 6): print "a es igual a 6"; print "!!!"; else: print "a no es ni 5 ni 6"; endif;

whileLos bucles while son los tipos de bucle ms simples en PHP. Se comportan como su contrapartida en C. La forma bsica de una sentencia while es: while (expr) sentencia El significado de una sentencia while es simple. Le dice a PHP que ejecute la(s) sentencia(s) anidada(s) repetidamente, mientras la expresin while se evale como TRUE. El valor de la expresin es comprobado cada vez al principio del bucle, as que incluso si este valor cambia durante la ejecucin de la(s) sentencia(s) anidada(s), la ejecucin no parar hasta el fin de la iteracin (cada vez que PHP ejecuta las sentencias en el bucle es una iteracin). A veces, si la expresin while se evala como FALSE desde el principio de todo, la(s) sentencia(s) anidada(s) no se ejecutarn ni siquiera una vez. Como con la sentencia if, se pueden agrupar multiples sentencias dentro del mismo bucle while encerrando un grupo de sentencias con llaves, o usando la sintaxis alternativa: while (expr): sentencia ... endwhile; Los siguientes ejemplos son idnticos, y ambos imprimen nmeros del 1 al 10: /* ejemplo 1 */ $i = 1; while ($i Esto devuelve el siguiente resultado:

do..whileLos bucles do..while son muy similares a los bucles while, excepto que las condiciones se comprueban al final de cada iteracin en vez de al principio. La principal diferencia frente a los bucles regulares while es que se garantiza la ejecucin de la primera iteracin de un bucle do..while (la condicin se comprueba slo al final de la iteracin), mientras que puede no ser necesariamente ejecutada con un bucle while regular (la

51

condicin se comprueba al principio de cada iteracin, si esta se evala como FALSE desde el principio la ejecucin del bucle finalizar inmediatamente). Hay una sola sintaxis para los bucles do..while: $i = 0; do { print $i; } while ($i>0); El bucle de arriba se ejecutara exactamente una sola vez, despus de la primera iteracin, cuando la condicin se comprueba, se evala como FALSE ($i no es ms grande que 0) y la ejecucin del bucle finaliza. Los usuarios avanzados de C pueden estar familiarizados con un uso distinto del bucle do..while, para permitir parar la ejecucin en medio de los bloques de cdigo, encapsulandolos con do..while(0), y usando la sentencia break. El siguiente fragmento de cdigo demuestra esto: do { if ($i < 5) { print "i no es lo suficientemente grande"; break; } $i *= $factor; if ($i < $minimum_limit) { break; } print "i es correcto"; ...procesa i... } while(0); Ejemplo: Esto devuelve el siguiente resultado:

52

forLos bucles for son los bucles ms complejos en PHP. Se comportan como su contrapartida en C. La sintaxis de un bucle for es: for (expr1; expr2; expr3) sentencia La primera expresin (expr1) se evala (ejecuta) incondicionalmente una vez al principio del bucle. Al comienzo de cada iteracin, se evala expr2 . Si se evala como TRUE, el bucle contina y las sentencias anidadas se ejecutan. Si se evala como FALSE, la ejecucin del bucle finaliza. Al final de cada iteracin, se evala (ejecuta) expr3. Cada una de las expresiones puede estar vaca. Que expr2 est vaca significa que el bucle debera correr indefinidamente (PHP implicitamente lo considera como TRUE, al igual que C). Esto puede que no sea tan intil como se podra pensar, puesto que a menudo se quiere salir de un bucle usando una sentencia break condicional en vez de usar la condicin de for. Considera los siguientes ejemplos. Todos ellos muestran nmeros del 1 al 10: Esto devuelve el siguiente resultado:

Por supuesto, el primer ejemplo parece ser el mas elegante (o quizs el cuarto), pero uno puede descubrir que ser capaz de usar expresiones vacas en bucles for resulta til en muchas ocasiones. PHP tambin soporta la "sintaxis de dos puntos"alternativa para bucles for. for (expr1; expr2; expr3): sentencia; ...; endfor; Otros lenguajes poseen una sentencia foreach para traducir un array o una tabla hash. PHP3 no posee tal construccin; PHP4 s . En PHP3, se puede combinar while con las funciones list() y each() para conseguir el mismo efecto.

foreachPHP4 (PHP3 no) incluye una construccin foreach, tal como perl y algunos otros lenguajes. Esto simplemente da un modo fcil de iterar sobre arrays. Hay dos sintaxis; la segunda es una extensin menor, pero til de la primera: foreach(expresion_array as $value) sentencia foreach(expresion_array as $key => $value) sentencia

54

La primera forma recorre el array dado por expresion_array. En cada iteracin, el valor del elemento actual se asigna a $value y el puntero interno del array se avanza en una unidad (as en el siguiente paso, se estar mirando el elemento siguiente). La segunda manera hace lo mismo, salvo que la clave del elemento actual ser asignada a la variable $key en cada iteracin. Nota: Cuando foreach comienza su primera ejecucin, el puntero interno a la lista (array) se reinicia automticamente al primer elemento del array. Esto significa que no se necesita llamar a reset() antes de un bucle foreach. Nota: Hay que tener en cuanta queforeach con una copia de la lista (array) especificada y no la lista en si, por ello el puntero de la lista no es modificado como en la construccin each. Puede haber observado que las siguientes son funcionalidades idnticas: Ejemplo1: Esto devuelve el siguiente resultado:

Ejemplo2: Esto devuelve el siguiente resultado:

breakbreak escapa de la estructuras de control iterante (bucle) actuales for, while, o switch. break accepta un parmetro opcional, el cual determina cuantas estructuras de control hay que escapar. Ejemplo: Esto devuelve el siguiente resultado:

56

continueContinue se usa dentro de la estructura del bucle para saltar el resto de la iteracin actual del bucle y continuar la ejecucin al comienzo de la siguiente iteracin. continue accepta un parmetro opcional, el cual determina cuantos niveles (bluces) hay que saltar antes de continuar con la ejecucin. Ejemplo: Esto devuelve el siguiente resultado:

switchLa sentencia switch es similar a una serie de sentencias IF en la misma expresin. En muchas ocasiones, se quiere comparar la misma variable (o expresin) con nuchos valores diferentes, y ejecutar una parte de cdigo distinta dependiendo de a qu valor es igual. Para ello sirve la sentencia switch. 57

Los siguientes dos ejemplos son dos modos distintos de escribir la misma cosa, uno usa una serie de sentencias if, y el otro usa la sentencia switch: Esto devuelve el siguiente resultado:

Es importante entender cmo se ejecuta la sentencia switch para evitar errores. La sentencia switch ejecuta lnea por lnea (realmente, sentencia a sentencia). Al comienzo, no se ejecuta cdigo. Slo cuando se encuentra una sentencia case con un valor que coincide con el valor de la expresin switch PHP comienza a ejecutar las sentencias. PHP contina ejecutando las sentencias hasta el final del bloque switch, o la primera vez que vea una sentencia break. Si no se escribe una sentencia break al final de una lista de sentencias case, PHP seguir ejecutando las sentencias del siguiente case. Por ejemplo: switch ($i) { case 0: print "i es igual a 0"; case 1: print "i es igual a 1"; 58

case 2: print "i es igual a 2"; } Aqu, si $i es igual a 0, PHP ejecutara todas las sentecias print! Si $i es igual a 1, PHP ejecutara las ltimas dos sentencias print y slo si $i es igual a 2, se obtendra la conducta esperada y solamente se mostrara i es igual a 2. As, es importante no olvidar las sentencias break (incluso aunque pueda querer evitar escribirlas intencionadamente en ciertas circunstancias). En una sentencia switch, la condicin se evala slo una vez y el resultado se compara a cada sentencia case. En una sentencia elseif, la condicin se evala otra vez. Si tu condicin es ms complicada que una comparacin simple y/o est en un bucle estrecho, un switch puede ser ms rpido. La lista de sentencias de un case puede tambin estar vaca, lo cual simplemente pasa el control a la lista de sentencias del siguiente case. switch ($i) { case 0: case 1: case 2: print "i es menor que 3, pero no negativo"; break; case 3: print "i es 3"; } Un case especial es el default case. Este case coincide con todo lo que no coincidan los otros case. Por ejemplo: switch ($i) { case 0: print "i es igual a 0"; break; case 1: print "i es igual a 1"; break; case 2: print "i es igual a 2"; break; default: print "i no es igual a 0, 1 o 2"; } La expresin case puede ser cualquier expresin que se evale a un tipo simple, es decir, nmeros enteros o de punto flotante y cadenas de texto. No se pueden usar aqu ni arrays ni objetos a menos que se conviertan a un tipo simple.

59

La sintaxis alternativa para las estructuras de control est tambin soportada con switch. switch ($i): case 0: print "i es igual 0"; break; case 1: print "i es igual a 1"; break; case 2: print "i es igual a 2"; break; default: print "i no es igual a 0, 1 o 2"; endswitch;

Otras sentencias

require()La sentencia require() se sustituye a s misma con el archivo especificado, tal y como funciona la directiva #include de C. Un punto importante sobre su funcionamiento es que cuando un archivo se incluye con include() o se requiere con require()), el intrprete sale del modo PHP y entra en modo HTML al principio del archivo referenciado, y vuelve de nuevo al modo PHP al final. Por esta razn, cualquier cdigo dentro del archivo referenciado que debiera ser ejecutado como cdigo PHP debe ser encerrado dentro de etiquetas vlidas de comienzo y fin de PHP. require() no es en realidad una funcin de PHP; es ms una construccin del lenguaje. Est sujeta a algunas reglas distintas de las de funciones. Por ejemplo, require() no esta sujeto a ninguna estructura de control contenedora. Por otro lado, no devuelve ningn valor; intentar leer un valor de retorno de una llamada a un require() resulta en un error del intrprete. A diferencia de include(), require() siempre leer el archivo referenciado, incluso si la lnea en que est no se ejecuta nunca. Si se quiere incluir condicionalmente un archivo, se usa include(). La sentencia conditional no afecta a require(). No obstante, si la lnea en la cual aparece el require() no se ejecuta, tampoco se ejecutar el cdigo del archivo referenciado. De forma similar, las estructuras de bucle no afectan la conducta de require(). Aunque el cdigo contenido en el archivo referenciado est todava sujeto al bucle, el propio require() slo ocurre una vez. Esto significa que no se puede poner una sentencia require() dentro de una estructura de bucle y esperar que incluya el contenido de un archivo distinto en cada iteracin. Para hacer esto, usa una sentencia include().require( header.inc ); 60

En PHP3, es posible ejecutar una sentencia return dentro de un archivo referenciado con require(), en tanto en cuanto esa sentencia aparezca en el mbito global del archivo requerido (require()). No puede aparecer dentro de ningn bloque (lo que siginifica dentro de llaves({})). En PHP4, no obstante, esta capacidad ha sido desestimada. Si se necesita esta funcionalidad, vase include().

include()La sentencia include() incluye y evala el archivo especificado. Si "URL fopen wrappers"esta activada en PHP (como est en la configuracin inicial), se puede especificar el fichero que se va a incluir usando una URL en vez de un fichero local (con su Path) Ver Ficheros remotos y fopen() para ms informacin. Un punto importante sobre su funcionamiento es que cuando un archivo se incluye con include() o se requiere con require(), el intrprete sale del modo PHP y entra en modo HTML al principio del archivo referenciado, y vuelve de nuevo al modo PHP al final. Por esta razn, cualquier cdigo dentro del archivo referenciado que debiera ser ejecutado como cdigo PHP debe ser encerrado dentro de etiquetas vlidas de comienzo y fin de PHP. Esto sucede cada vez que se encuentra la sentencia include(), as que se puede usar una sentencia include() dentro de una estructura de bucle para incluir un nmero de archivos diferentes. $archivos = array (primero.inc, segundo.inc, tercero.inc); for ($i = 0; $i < count($archivos); $i++) { include $archivos[$i]; } include() difiere de require() en que la sentencia include se re-evala cada vez que se encuentra (y slo cuando est siendo ejecutada), mientras que la sentencia require() se reemplaza por el archivo referenciado cuando se encuentra por primera vez, se vaya a evaluar el contenido del archivo o no (por ejemplo, si est dentro de una sentencia if cuya condicin evaluada es falsa). Debido a que include() es una construccin especial del lenguaje, se debe encerrar dentro de un bloque de sentencias si est dentro de un bloque condicional. /* Esto es ERRNEO y no funcionar como se desea. */ if ($condicion) include($archivo); else include($otro); /* Esto es CORRECTO. */ if ($condicion) { include($archivo); } else { include($otro); 61

} En ambos, PHP3 y PHP4, es posible ejecutar una sentencia return dentro de un archivo incluido con include(), para terminar el procesado de ese archivo y volver al archivo de comandos que lo llam. Existen algunas diferencias en el modo en que esto funciona, no obstante. La primera es que en PHP3, return no puede aparecer dentro de un bloque a menos que sea un bloque de funcin, en el cual return se aplica a esa funcin y no al archivo completo. En PHP4, no obstante, esta restriccin no existe. Tambin, PHP4 permite devolver valores desde archivos incluidos con include(). Se puede capturar el valor de la llamada a include() como se hara con una funcin normal. Esto genera un error de intrprete en PHP3. Ejemplo 9-1. include() en PHP3 y PHP4 Asumamos la existencia del siguiente archivo (llamado test.inc) en el mismo directorio que el archivo principal: Asumamos que el archivo principal (main.html) contiene lo siguiente: Cuando se llama a main.html en PHP3, generar un error del intrprete en la linea 2; no se puede capturar el valor de un include() en PHP3. En PHP4, no obstante, el resultado ser: Antes del return El archivo devolvi: 27 Ahora, asumamos que se ha modificado main.html para que contenga lo siguiente: En PHP4, la salida ser: Antes del return De vuelta en main.html No obstante, PHP3 dar la siguiente salida: Antes del return 27 De vuelta en main.html

62

Parse error: parse error in /home/torben/public_html/phptest/main.html on line 5 El error del intrprete es resultado del hecho de que la sentencia return est encerrada en un bloque de no-funcin dentrode test.inc. Cuando el return se mueve fuera del bloque, la salida es: Antes del return 27 De vuelta en main.html El 27 espreo se debe al hecho de que PHP3 no soporta devolver valores con return desde archivos como ese.

Captulo 10. FuncionesFunciones definidas por el usuarioUna funcin se define con la siguiente sintaxis: function foo ($arg_1, $arg_2, ..., $arg_n) { echo "Funcin de ejemplo.\n"; return $retval; } Cualquier instruccin vlida de PHP puede aparecer en el cuerpo de la funcin, incluso otras fusiones y definiciones de clases. En PHP3, las funciones deben definirse antes de que se referencien. En PHP4 no existe tal requerimiento. PHP no soporta la sobrecarga de funciones, y tampoco es posible redefinir u ocultar funciones previamente declaradas. PHP3 no soporta un nmero variable de parmetros, aunque s soporta parmetros por defecto (ver Valores por defecto de de los parmetros para ms informacin). PHP4 soporta ambos: ver Listas de longitud variable de parmetros y las referencias de las funciones func_num_args(), func_get_arg(), y func_get_args() para ms informacin.

Parmetros de las funcionesLa informacin puede suministrarse a las funciones mediante la lista de parmetros, una lista de variables y/o constantes separadas por comas. PHP soporta pasar parmetros por valor (el comportamiento por defecto), por referencia, y parmetros por defecto. Listas de longitud variable de parmetros slo estn soportadas en PHP4 y posteriores; ver Listas de longitud variable de parmetros y la referencia de las funciones func_num_args(), func_get_arg(), y func_get_args()

63

para ms informacin. Un efecto similar puede conseguirse en PHP3 pasando un array de parmetros a la funcin: function takes_array($input) { echo "$input[0] + $input[1] = ", $input[0]+$input[1]; }

Pasar parmetros por referenciaPor defecto, los parmetros de una funcin se pasan por valor (de manera que si cambias el valor del argumento dentro de la funcin, no se ve modificado fuera de ella). Si deseas permitir a una funcin modificar sus parmetros, debes pasarlos por referencia. Si quieres que un parmetro de una funcin siempre se pase por referencia, puedes anteponer un ampersand (&) al nombre del parmetro en la definicin de la funcin: function add_some_extra(&$string) { $string .= y algo ms.; } $str = Esto es una cadena, ; add_some_extra($str); echo $str; // Saca Esto es una cadena, y algo ms. Si deseas pasar una variable por referencia a una funcin que no toma el parmetro por referencia por defecto, puedes anteponer un ampersand al nombre del parmetro en la llamada a la funcin: function foo ($bar) { $bar .= y algo ms.; } $str = Esto es una cadena, ; foo ($str); echo $str; // Saca Esto es una cadena, foo (&$str); echo $str; // Saca Esto es una cadena, y algo ms.

Parmetros por defectoUna funcin puede definir valores por defecto para los parmetros escalares estilo C++: function makecoffee ($type = "cappucino") { return "Hacer una taza de $type.\n"; } echo makecoffee (); echo makecoffee ("espresso"); La salida del fragmento anterior es: Hacer una taza de cappucino.

64

Hacer una taza de espresso. El valor por defecto tiene que ser una expresin constante, y no una variable o miembro de una clase. En PHP 4.0 tambin es posible especificar unset como parmetro por defecto. Esto significa que el argumento no tomar ningn valor en absoluto si el valor no es suministrado. Destacar que cuando se usan parmetros por defecto, estos tienen que estar a la derecha de cualquier parmetro sin valor por defecto; de otra manera las cosas no funcionarn de la forma esperada. Considera el siguiente fragmento de cdigo: function makeyogurt ($type = "acidophilus", $flavour) { return "Haciendo un bol de $type $flavour.\n"; } echo makeyogurt ("mora"); // No funcionar de la manera esperada La salida del ejemplo anterior es: Warning: Missing argument 2 in call to makeyogurt() in /usr/local/etc/httpd/htdocs/php3test/functest.html on line 41 Haciendo un bol de mora. Y ahora, compralo con: function makeyogurt ($flavour, $type = "acidophilus") { return "Haciendo un bol de $type $flavour.\n";} echo makeyogurt ("mora"); // funciona como se esperaba La salida de este ejemplo es: Haciendo un bol de acidophilus mora.

Lista de longitud variable de parmetrosPHP4 soporta las listas de longitud variable de parmetros en las funciones definidas por el usuario. Es realmente fcil, usando las funciones func_num_args(), func_get_arg(), y func_get_args(). No necesita de ninguna sintaxis especial, y las listas de parmetros pueden ser escritas en la llamada a la funcin y se comportarn de la manera esperada.

Devolver valoresLos valores se retornan usando la instruccin opcional return. Puede devolverse cualquier tipo de valor, incluyendo listas y objetos. function square ($num) { return $num * $num; } 65

echo square (4); // saca 16. No puedes devolver mltiples valores desde una funcin, pero un efecto similar se puede conseguir devolviendo una lista. function small_numbers() { return array (0, 1, 2); } list ($zero, $one, $two) = small_numbers();

old_functionLa instruccin old_function permite declarar una funcin usando una sintaxis idntica a la de PHP/FI2 (excepto que debes reemplazar function por old_function). Es una caracterstica obsoleta, y debera ser usada nicamente por el conversor PHP/FI2->PHP3. Aviso Las funciones declaradas como old_function no pueden llamarse desde el cdigo interno de PHP. Entre otras cosas, esto significa que no puedes usarlas en funciones como usort(), array_walk(), y register_shutdown_function(). Puedes solventar esta limitacin escribiendo un "wrapper"(en PHP3 normal) que a su vez llame a la funcin declarada como old_function.

Funciones variablePHP soporta el concepto de funciones variable, esto significa que si una variable tiene unos parntesis aadidos al final, PHP buscar una funcin con el mismo nombre que la evaluacin de la variable, e intentar ejecutarla. Entre otras cosas, esto te permite implementar retrollamadas (callbacks), tablas de funciones y dems. Ejemplo 10-1. Ejemplo de funcin variable Esto devuelve el siguiente resultado:

66

Captulo 11. Clases y ObjetosClassUna clase es una coleccin de variables y de funciones que acceden a esas variables. Una clase se define con la siguiente sintaxis: El ejemplo define una clase llamada Cart que consiste en un array asociativo de artculos en el carro y dos funciones para meter y sacar tems del carro Las clases son tipos, es decir, son plantillas para variables. Tienes que crear una variable del tipo deseado con el operador

67

new. $cart = new Cart; $cart->add_item("10", 1); Este ejemplo crea un objeto $cart de clase Cart. La funcin add_item() de ese objeto se llama para aadir un item del artculo nmero 10 al carro. Las Clases pueden ser extensiones de otras clases. Las clases extendidas o derivadas tienen todas las variables y funciones de la clase base y lo que les aadas al extender la definicin. La herencia mltiple no est soportada. class Named_Cart extends Cart { var $owner; function set_owner ($name) { $this->owner = $name; } } Ese ejemplo define una clase Named_Cart (carro con nombre o dueo) que tiene todas las variables y funciones de Cart, y adems aade la variable $owner y una funcin adicional set_owner(). Un carro con nombre se crea de la forma habitual y, una vez hecho, puedes acceder al propietario del carro. En los carros con nombre tambin puedes acceder a las funciones normales del carro: $ncart = new Named_Cart; // Creamos un carro con nombre $ncart->set_owner ("kris"); // Nombramos el carro print $ncart->owner; // Imprimimos el nombre del propietario $ncart->add_item ("10", 1); // Funcionalidad heredada de Cart Entre funciones de una clase, la variable $this hace referencia al propio objeto. Tienes que usar $this->loquesea para acceder a una variable o funcin llamada loquesea del objeto actual.

ConstructorLos constructores son funciones de una clase que se llaman automticamente al crear una nueva instancia (objeto) de una clase. Una funcin se convierte en constructor cuando tiene el mismo nombre que la clase. class Auto_Cart extends Cart { function Auto_Cart () { $this->add_item ("10", 1); } } Este ejemplo define una clase Auto_Cart que es un Cart junto con un constructor que inicializa el carro con un item del tipo de artculo "10"cada vez que se crea un nuevo Auto_Cart con "new". Los constructores tambin pueden recibir parmetros y estos parmetros pueden ser opcionales, lo que los hace ms tiles. 68

class Constructor_Cart extends Cart { function Constructor_Cart ($item = "10", $num = 1) { $this->add_item ($item, $num); } } // Compramos las mismas cosas aburridas de siempre $default_cart = new Constructor_Cart; // Compramos las cosas interesantes $different_cart = new Constructor_Cart ("20", 17); Atencin Para las clases derivadas, el constructor de la clase padre no es llamado automticamente cuando se llama al constructor de la clase derivada.

Captulo 12. Base de datosLas teoricas ventajas de esta implementation se basan en la rapidez con que podemos programar las rutinas de acceso a los registros (insertar, eliminar, modificar, etc.) e, incluso, que en cualquier momento podemos ver o modificar dicho fichero con cualquier editor de lexto. Sin embargo, usar ficheros de texto tiene rnuchos inconvenientes. El mas evidente esta en que, conforme crece el volumen de informacion almacenado, la gestifin de los datos se vuelve cada vez mas lenta pues los accesos a ellos son secuenciales, esto es, siempre desde el principio del fichero. Mas razones de peso para no usar ficheros de texto como elementos de alrnacenamiento de informacio'n: los accesos concurrentes son muy poco eficientes, results muy complicado (imposible en ocasiones) limitar los accesos de manera selectiva (en funcion de usuarios y en funcion de determinadas tareas), la generacion de inconsistencias es muy facil que aparezcan y muy dificil de gestionarlas, etc., Por lo tanto, si necesitamos que el rendimiento sea 6ptimo, tendremos que usar un gestor de base de datos.

Bases de datos relacionalesExisten muchos tipos de base de datos en funcion del rnodo en que almaccnan y acceden a la informacion que guardan: relacional, jerarquica, en red, orientada a objetos, etc. Ejemplos de gestores de bases de daios relacionales o RDBMS (Relational Database Management System) hay muchos: MySQL, Oracle, Informix, SyBase, Microsoft SQL Server, PostGres, mSQL, etc. Basicamente, un gestor de base de datos relacional alrnacena los datos en tab las, cada una de las cuales esta formada por filas (o registros), y estas, a su vez, cstan formadas por columnas (o campos). Antes de definir una tabla, hay que normalizarla, proceso que consiste en evitar redundancias, cs decir, que la informacion este duplicada ya que, si hubiera que cambiar un dato que estuviera repetido, habria que carnbiarlo varias veces. Por otra parte, el acceso a los gestores de bases de datos se hace a travs del lenguaje SQL (Structured Query Language).

69

SQLEl lenguaje de consulta estructurado (SQL) es un lenguaje de base de datos normalizado, utilizado por el motor de base de datos de Microsoft Jet. SQL se utiliza para crear objetos QueryDef, como el argumento de origen del mtodo OpenRecordSet y como la propiedad RecordSource del control de datos. Tambin se puede utilizar con el mtodo Execute para crear y manipular directamente las bases de datos Jet y crear consultas SQL de paso a travs para manipular bases de datos remotas cliente - servidor.

Componentes del SQLEl lenguaje SQL est compuesto por comandos, clusulas, operadores y funciones de agregado. Estos elementos se combinan en las instrucciones para crear, actualizar y manipular las bases de datos.

ComandosExisten dos tipos de comandos SQL:

DLL que permiten crear y definir nuevas bases de datos, campos e ndices. DML que permiten generar consultas para ordenar, filtrar y extraer datos de la base de datos.

Comandos DLL Comando Descripcin CREATE Utilizado para crear nuevas tablas, campos e ndices DROP Empleado para eliminar tablas e ndices Utilizado para modificar las tablas agregando campos o cambiando la ALTER definicin de los campos.

Comando SELECT INSERT UPDATE DELETE

Comandos DML Descripcin Utilizado para consultar registros de la base de datos que satisfagan un criterio determinado Utilizado para cargar lotes de datos en la base de datos en una nica operacin. Utilizado para modificar los valores de los campos y registros especificados Utilizado para eliminar registros de una tabla de una base de datos

ClusulasLas clusulas son condiciones de modificacin utilizadas para definir los datos que desea seleccionar o manipular. Clusula Descripcin FROM Utilizada para especificar la tabla de la cual se van a seleccionar los registros

70

Utilizada para especificar las condiciones que deben reunir los registros que se van a seleccionar GROUP BY Utilizada para separar los registros seleccionados en grupos especficos HAVING Utilizada para expresar la condicin que debe satisfacer cada grupo Utilizada para ordenar los registros seleccionados de acuerdo con un orden ORDER BY especfico WHERE

Operadores LgicosOperador AND OR NOT Uso Es el "y" lgico. Evalua dos condiciones y devuelve un valor de verdad slo si ambas son ciertas. Es el "o" lgico. Evala dos condiciones y devuelve un valor de verdar si alguna de las dos es cierta. Negacin lgica. Devuelve el valor contrario de la expresin.

Operadores de ComparacinOperador < > EMPLEADOS CODIGO al archivo llamado

75

NOMBRE APELLIDO SALARIO COMISION MULTAS ATRAS Esto devuelve el siguiente resultado:

Al dar click en la opcion Actualizar nos conectaremos al archivo llamado modificar.htm este se conectara al archivo modificar.php y este a actualizar.php .Finalmente se mostrara con el achivo buscara.php el registro actualizado.

modificar.htm actualizar

76

Busqueda por codigo Ingrese el codigo de la persona que desea modificar:

ATRAS Esto devuelve el siguiente resultado:

modificar.php actualizar 77

EMPLEADOS CODIGO NOMBRE APELLIDO SALARIO COMISION MULTAS