php_avanzado

Upload: david-useche

Post on 08-Apr-2018

221 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/7/2019 php_avanzado

    1/120

    PHP AVANZADO

    Capitulo 1. Qu es PHP?Capitulo 2. Una explicacin sencillaCaptulo 3. Consideraciones generales de instalacin

    Captulo 4. Configuracin del comportamiento de PHPCaptulo 5. Sintaxis bsicaCaptulo 6. TiposCaptulo 7. VariablesCaptulo 8. ConstantesCaptulo 9. ExpresionesCaptulo 10. OperadoresCapitulo 11. Estructuras de controlCapitulo 12. FuncionesCaptulo 13. Clases y Objetos (PHP 4)

  • 8/7/2019 php_avanzado

    2/120

    Capitulo 1: Qu es PHP?

    PHP (acrnimo de "PHP: Hypertext Preprocessor") es un lenguaje de "cdigoabierto" interpretado, de alto nivel, embebido en pginas HTML y ejecutado en elservidor.Una respuesta corta y concisa, pero, qu significa realmente? Un ejemplo nosaclarar las cosas:Ejemplo 1-1. Un ejemplo introductorio Ejemplo

    Puede apreciarse que no es lo mismo que un script escrito en otro lenguaje deprogramacin como Perl o C -- En vez de escribir un programa con muchoscomandos para crear una salida en HTML, escribimos el cdigo HTML con ciertocdigo PHP embebido (incluido) en el mismo, que producir cierta salida (ennuestro ejemplo, producir un texto). El cdigo PHP se incluye entre etiquetasespeciales 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 mquinacliente, es que el cdigo PHP es ejecutado en el servidor. Si tuvisemos un scriptsimilar al de nuestro ejemplo en nuestro servidor, el cliente solamente recibira elresultado de su ejecucin en el servidor, sin ninguna posibilidad de determinar qucdigo ha producido el resultado recibido. El servidor web puede ser inclusoconfigurado para que procese todos los archivos HTML con PHP.Lo mejor de usar PHP es que es extremadamente simple para el principiante, pero

    a su vez, ofrece muchas caractersticas avanzadas para los programadoresprofesionales. No sienta miedo de leer la larga lista de caractersticas de PHP, enpoco tiempo podr empezar a escribir sus primeros scripts.Aunque el desarrollo de PHP est concentrado en la programacin de scripts en ellado del servidor, se puede utilizar para muchas otras cosas.

  • 8/7/2019 php_avanzado

    3/120

    Captulo 2. Una explicacin sencilla

    A continuacin, le introduciremos a PHP en un pequeo y sencillo manual. Estedocumento explica cmo crear pginas web dinmicas para Internet con PHP,aunque PHP no solamente est diseado para la creacin de stas. Consulte laseccin titulada Qu se puede hacer con PHP? para ms informacin.

    Las pginas web que utilizan PHP son tratadas como pginas de HTML comunes ycorrientes, y puede crearlas y editarlas de la misma manera que lo hace condocumentos normales de HTML.Qu necesito?En este manual vamos a asumir que usted cuenta con un servidor que soporta PHPy que todos los archivos con la extensin .php son manejados por PHP. En lamayora de servidores, sta es la extensin que toman los archivos PHP pordefecto, pero pregunte al administrador de su servidor para estar seguro. Si suservidor soporta PHP, entonces no necesita hacer nada, solamente crear susarchivos .php y guardarlos en su directorio web, y el servidor, como por arte de

    magia, los analizar para usted. No hay necesidad de compilar nada, tampoco tienenecesidad de instalar otras herramientas. Mrelo de esta manera, estos archivos dePHP son tan simples como archivos de HTML con una nueva familia de etiquetasque le permiten una gran cantidad de cosas. La mayora de las compaas dehospedaje de pginas web ofrecen el soporte que necesita para usar PHP, pero sipor alguna razn ellos no lo hacen, considere leer la seccin titulada Recursos PHPpara mas informacin acerca de compaas de hospedaje que soportan PHPDigamos que usted tiene limitado acceso a internet y se encuentra programandolocalmente. En este caso, querr instalar un servidor de web como Apache, y PHP.Lo ms seguro es que tambin quiera instalar una base de datos como MySQL.

    Puede instalar estos productos individualmente o simplemente localizar un paquetepre-configurado que automticamente instale todos estos productos con solamenteunos movimientos de su ratn. Es muy fcil instalar un servidor web con soportepara PHP en cualquier sistemas operativo, incluyendo Linux y Windows. En Linux,rpmfind y PBone le ayudarn a encontrar un RPM.

    Su primera pgina con PHPComienze por crear un archivo llamado hola.php y colocarle en el "directorio raz"(DOCUMENT_ROOT) con el siguiente contenido:Ejemplo 2-1. Nuestro primer script PHP: hola.php

    Ejemplo de PHP Utilice su navegador web para acceder al archivo, con la URL terminando en"/hola.php". Si est programando localmente este URL lucir algo como

    http://localhost/hola.php o http://127.0.0.1/hola.php pero esto depende de laconfiguracin de su servidor web. Aunque este tema est fuera del alcance de estetutorial, tambin puede ver las directivas DocumentRoot y ServerName en la

  • 8/7/2019 php_avanzado

    4/120

    configuracin de su servidor (en Apache, esto es httpd.conf). Si todo estconfigurado correctamente, el archivo ser analizado por PHP y el siguientecontenido aparecer en su navegador:

    Ejemplo de PHP

    Hola Mundo

    Note que esto no es como los scripts de CGI. El archivo no necesita ninguna claseespecial de permisos para ser ejecutado. Piense en ellos como si fueran archivosHTML con un conjunto muy especial de etiquetas disponibles, y que hacen muchas

    cosas interesantes.Este programa es extremadamente simple, y no necesita usar PHP para crear unapgina como sta. Todo lo que hace es mostrar: Hola Mundo usando la sentenciaecho().Si ha intentado usar este ejemplo, y no produjo ningn resultado, preguntando sideseaba descargar el archivo, o mostr todo el archivo como texto, lo ms seguroes que PHP no se encuentra habilitado en su servidor. Pdale a su administradorque active esta funcin por usted, o use el captulo titulado Instalacin en elmanual. Si est trabajando localmente, lea tambin el captulo dedicado a lainstalacin, y asegrese de que todo est configurado apropiadamente. Si el

    problema contina, por favor use una de las muchas opciones para obtener ayudacon PHP.El objetivo de este ejemplo es demostrar cmo puede usar las etiquetas PHP. Eneste ejemplo usamos . Puede salir de PHPy regresar cuantas veces lo desee usando este mtodo. Para ms informacin,puede leer la seccin en el manual titulada Sintaxis bsica de PHP.Una nota acerca de editores de texto: Hay muchos editores de texto y EntornosIntegrados de Desarrollo (IDE por sus siglas en Ingls) que puede usar para crear,editar, y organizar archivos PHP. Puede encontrar una lista parcial de stos en Lista

    de editores de PHP. Si desea recomendar un editor, por favor visite la pginamencionada anteriormente, y comunique su recomendacin a las personasencargadas del mantenimiento para que lo incluyan en la lista. Contar con uneditor que resalte la sintaxis de PHP puede ser de mucha ayuda.Una nota acerca de los procesadores de palabras: Los procesadores de palabrascomo "StarOffice", "Microsoft word" y "Abiword" no son buenas opciones paraeditar archivos de PHP. Si desea usar uno de stos programas para probar susscripts, primero debe asegurarse de guardar el documento en formato de "Texto"puro, o PHP no ser capaz de ejecutar el script.Una nota acerca del "Bloc de Notas de Windows": Si desea escribir sus archivos

    PHP usando el "Bloc de Notas de Windows" o en algn otro editor de texto paraWindows necesita asegurarse de que sus archivos sean guardados con la extensin.php (la mayora de editores de texto en Windows automticamente tratarn de

  • 8/7/2019 php_avanzado

    5/120

    aadir la extensin .txt a los archivos a menos que tome los siguientes pasos paraprevenirlo). Cuando guarde sus archivos y el programa le pregunte qu nombre ledesea dar al archivo, use comillas para indicar el nombre (es decir, "hola.php").Una alternativa es, en la lista de opciones "Archivos de Texto *.txt", seleccionar laopcin "Todos los archivos *.*". Aqu puede escribir el nombre del archivo sin lascomillas.

    Ahora que ha creado un pequeo script de PHP que funciona correctamente, eshora de trabajar con el script de PHP ms famoso; vamos a hacer una llamada a lafuncin phpinfo() para obtener informacin acerca de su sistema y configuracincomo las variables predefinidas disponibles, los mdulos utilizados por PHP, y lasdiferentes opciones de configuracin. Tomemos unos segundos para revisar estainformacin.Algo tilHagamos ahora algo que puede ser ms til. Vamos a chequear qu clase denavegador web utiliza. Para hacerlo, vamos a consultar la informacin que elnavegador nos enva como parte de su peticin HTTP. Esta informacin es

    guardada en una variable. Las variables siempre comienzan con un signo de dlar("$") en PHP. La variable que vamos a utilizar en esta situacin es$_SERVER["HTTP_USER_AGENT"].Nota: $_SERVER es una variable reservada por PHP que contiene toda lainformacin del servidor web. Es conocida como Autoglobal (o Superglobal).Consulte el manual en su seccin titulada Autoglobales para mas informacin.stas son variables especiales que fueron introducidas en la versin 4.1.0 de PHP.Antes podamos usar las matrices $HTTP_*_VARS, tales como$HTTP_SERVER_VARS. Aunque stas han sido marcadas como obsoletas, talesmatrices todava existen. (Tambin puede echar un vistazo a las notas relacionadas

    con el cdigo antiguo.)Para poder ver esta variable solo necesita:Ejemplo 2-2. Impresin de una variable (elemento de la matriz)Un ejemplo de los resultados de este programa sera:Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)Hay muchos tipos de variables en PHP. En el ejemplo anterior imprimimos unamatriz. Las matrices pueden ser muy tiles.$_SERVER es simplemente una variable que se encuentra disponibleautomticamente para usted en PHP. Puede encontrar una lista en la seccin

    titulada Variables Reservadas del manual, o puede generar una lista completacreando un archivo como el presentado a continuacin:Ejemplo 2-3. Consultar todas las variables predefinidas con phpinfo()Si abre este archivo con su navegador, puede ver una pgina con informacinacerca de PHP, junto a una lista de todas las variables que puede usar.Puede usar ms de un declaracin PHP dentro de una etiqueta PHP, y crearpequeos segmentos de cdigo que pueden hacer ms que un "echo". Por ejemplo,si quisiramos detectar el uso de "Internet Explorer", haramos algo as:Ejemplo 2-4. Ejemplos de uso de estructuras de control y funciones

  • 8/7/2019 php_avanzado

    6/120

    }?>Un ejemplo de los resultado del script puede ser:Est usando Internet ExplorerA continuacin introduciremos un par de conceptos nuevos. Tenemos unadeclaracin "if". Si est familiarizado con la sintaxis bsica del lenguaje "C", esto se

    vera lgico, Pero si no entiende "C", u otros lenguajes de programacin dondeencuentra la sintaxis usada anteriormente, probablemente debera conseguir unlibro que le introduzca mejor a PHP, y lea los primeros captulos, o tambin puedever la parte del manual titulada Referencia del lenguaje. Puedes encontrar una listade libros sobre PHP en /books.php.El segundo concepto que introducimos fue la funcin llamada strstr(). strstr() esuna funcin integrada de PHP que busca un cadena dentro de otra cadena mslarga. En el caso anterior estamos buscando "MSIE" dentro de$_SERVER["HTTP_USER_AGENT"]. Si la cadena fue encontrada, la funcindevolver verdadero ("TRUE"), la declaracin "if" se evala a verdadero ("TRUE") y

    el cdigo adentro de las llaves {} es ejecutado. De otra manera no resultaejecutado. Tmese la libertad de crear ejemplos similares usando "if", "else" ("deotra manera"), y otras funciones como strtoupper() y strlen(). Cada pgina delmanual contiene ejemplos que puede usar. Si no est seguro sobre el modo de usostas funciones, es recomendable que lea las pginas del manual tituladas Cmoleer una definicin de funcin y la seccin relacionada a Funciones en PHPPodemos continuar y demostrar cmo puede saltar adentro y afuera del modo PHPen el medio de un bloque de cdigo.Ejemplo 2-5. Mezcla de los modos HTML y PHPstrstr debe haber devuelto verdaderoEst usando Internet Explorerstrstr debi devolver falsoNo est usando Internet ExplorerUn ejemplo de los resultados de este script puede ser:strstr debe haber devuelto verdadero Est usando Internet ExplorerEn vez de usar una sentencia PHP "echo" para demostrar algo, saltamos fuera delcdigo PHP y escribimos HTML puro. Este es un punto muy importante y potenteque debemos observar aqu, y es que la fluidez lgica del script est intacta.Slamente las partes donde hay HTML sern enviadas a su navegador dependiendode los resultados que strstr() devuelve (si fue verdadero [TRUE], o falso [FALSE]).

    En otras palabras, si la cadena MSIE fue encontrada o no.Uso de Formularios HTMLOtra de las caractersticas de PHP es que gestiona formularios de HTML. El

  • 8/7/2019 php_avanzado

    7/120

    concepto bsico que es importante entender es que cualquier elemento de losformularios estar disponible automticamente en su cdigo PHP. Por favorrefirase a la seccin titulada Variables fuera de PHP en el manual para msinformacin y ejemplos sobre cmo usar formularios HTML con PHP. Observemosun ejemplo:Ejemplo 2-6. Un formulario HTML sencillo

    Su nombre: Su edad: No hay nada especial en este formularo, es HTML limpio sin ninguna clase deetiquetas desconocidas. Cuando el cliente llena ste formulario y oprime el botnetiquetado "Submit", una pgina titulada accion.php es llamada. En este archivoencontrar algo as:

    Ejemplo 2-7. Procesamiento de informacin de nuestro formulario HTMLHola .Tiene aosUn ejemplo del resultado de este script podra ser:Hola Jos.Tiene 22 aosEs aparentemente obvio lo que hace. No hay mucho ms que decir al respecto. Lasvariables $_POST["nombre"] y $_POST["edad"] son definidas automticamente porPHP. Hace un momento usamos la variable autoglobal $_SERVER, ahora hemosintroducido autoglobal $_POST, que contiene toda la informacin enviada por el

    mtodo POST. Fjese en el atributo method en nuestro formulario; es POST. Sihubiramos usado GET, entonces nuestra informacin estara en la variableautoglobal $_GET. Tambin puede utilizar la autoglobal $_REQUEST si no leimporta el origen de la peticin. sta variable contiene una mezcla de informacinGET, POST y COOKIE. Tambin puede ver la funcin import_request_variables().Use de cdigo antiguo con nuevas versiones de PHPAhora que PHP ha crecido y se ha convertido en un lenguaje popular, hay muchosms recursos que contienen cdigo que puede reusar en sus propios programas.Por lo general, las personas que se encargan del desarrollo de PHP tratan de que ellenguaje sea compatible con versiones anteriores, para que los programas escritos

    con versiones antiguas continen funcionando cuando instale una nueva versin dePHP. En un mundo perfecto, nunca necesitara modificar su cdigo para hacerlofuncionar con versiones nuevas del lenguaje; pero, como todos sabemos, este noes un mundo perfecto, y usualmente son necesarios los cambios en su cdigo.Dos de los cambios mas importantes que afectan el cdigo viejo son:

    La desaparicin de las matrices $HTTP_*_VARS (que usualmente son usadascomo globales al interior de una funcin o mtodo). Las siguientes matricesautoglobales fueron introducidas en la versin 4.1.0 de PHP. Estas son:$_GET, $_POST, $_COOKIE, $_SERVER, $_FILES, $_ENV, $_REQUEST, y$_SESSION. Las antiguas $HTTP_*_VARS, como $HTTP_POST_VARS, todava

    existen, y han existido desde PHP 3. Las variables externas que ya no son registradas automticamente. En otraspalabras, a partir de PHP 4.2.0, la directiva PHP register_globals est

  • 8/7/2019 php_avanzado

    8/120

    deshabilitada (su valor es off) en php.ini. El mtodo preferido para obteneracceso a stos valores es por medio de las "matrices autoglobales"mencionados anteriormente. Los scripts, libros y tutoriales antiguos puedenasumir que sta directiva es definida automticamente como "on". Si es as,puede usar, por ejemplo, $id desde la URLhttp://www.example.com/foo.php?id=42. Por otra parte, no importa si el

    valor de la directiva es "on" u "off", $_GET['id'] est siempre disponible.Y ahora qu?Con lo que hemos visto, puede entender la mayor parte del manual, y tambin losejemplos que estn disponibles en los archivos. Tambin puede encontrar otrosejemplos en los diferentes sitios de php.net en la seccin de enlaces: /links.php.Para ver una presentacin que muestra ms acerca de lo que puede hacer PHP,visite los diferentes sitios con material relacionado a las conferencias realizadas:http://conf.php.net/ y http://talks.php.net/.

    Captulo 3: Consideraciones generales de instalacin

    Antes de instalar PHP, necesitais saber porque quereis utilizarlo. Existen trescampos principales en donde PHP se puede usar, tal y como se describe en laseccin Qu se puede hacer con PHP?:

    Scripts en la parte del servidor Scripts en linea de comandos Aplicaciones grficas clientes

    El primero es el ms tradicional y el principal campo de trabajo. Se necesitan trescosas para que funcione. El analizador PHP (CGI mdulo), un servidor web y unnavegador. Dependiendo de la versin de sistema operativo que utiliceis,probablemente tengais un servidor web (p.ej: Apache en Linux y MacOS X IIS enWindows). Tambin se puede alquilar espacio web en una empresa que ofrezcaeste servicio. De esta manera no se necesita instalar nada, solamente escribir losscripts PHP, subirlos al espacio alquilado y ver el resultado en vuestro navegador.Teneis dos maneras de utilizar PHP, si instalais vosotros el servidor y PHP. Existenmdulos directos (tambin llamados SAPI) para muchos servidores web, como

    Apache, Microsoft Internet Information Server, Netscape e iPlanet. Muchos otrosservidores soportan ISAPI, (p.ej.:OmniHTTPd). Si PHP no soporta un mdulo paratu servidor web, siempre se puede usar como binario CGI. Esto significa que el

  • 8/7/2019 php_avanzado

    9/120

    servidor se configura para usar el ejecutable para linea de comandos de PHP en elprocesado de peticiones de ficheros PHP.Si estais interesados en usar PHP desde la linea de comandos (p.ej.: para generarimagenes offline procesar ficheros de textos, etc) necesitais el ejecutable paralinea de comandos. Para ms informacin, lea la seccin Usando PHP desde la lneade comandos. En este caso no se necesita ni servidor web, ni navegador.

    Con PHP tambien se puede escribir aplicaciones grficas usando la extensinPHP-GTK. Esta es una forma totalmente distinta de utilizar PHP que cuando seutiliza para escribir pginas web, ya que no se genera cdigo HTML sino que setrabaja con ventanas y objetos dentro de las mismas. Para ms informacin sobrePHP-GTK, visitar las pginas dedicadas a esta extensin. PHP-GTK no se incluye enla distribucin oficial de PHP.A partir de ahora, esta seccin tratar sobre la configuracin de PHP con servidoresweb, en Unix y Windows, tanto como mdulo, como binario CGI.PHP, el cdigo fuente y distribuciones binarias para Windows se pueden encontraren /. Recomendamos utilizar un servidor espejo cerca de donde esteis para bajaros

    la versin de PHP que querais.Otros problemasSi todavia teneis el mismo problema, alguien en la lista de correos sobreinstalacin de PHP, puede ayudaros. Primero, comprobar en los archivos de la listasi vuestro problema ya ha sido contestado. Los archivos se encuentran disponiblesen las pgina de soporte /support.php. Para subscribirse a esta lista de correosmandar un correo vaco a [email protected]. La direccin de lalista es [email protected] quereis conseguir ayuda en la lista de correo, intentar describir lo msdetalladamente posible vuestro problema, los datos sobre vuestro sistema (sistema

    operativo que utilizais, versin de PHP, servidor web, si usais PHP como binario CGI como mdulo, safe mode, etc...) y a ser posible cdigo suficiente para poderreproducir vuestro problema.Informes sobre BugsSi creeis que habeis encontrado un bug (error de programacin) en PHP,mandarnos un informe. Probablemente los desarrolladores de PHP no lo conozcan ysi no informais sobre el mismo no podr arreglarse. Podeis informar sobre bugs atraves del sistema de seguimiento de bugs en http://bugs.php.net/. No mandarinformes a la lista de correos en mensajes privados a los desarrolladores. Elsistema de seguimiento tambien se puede utilizar para pedir nuevas caracteristicas

    en versiones futuras.

  • 8/7/2019 php_avanzado

    10/120

    Captulo 4: Configuracin del comportamiento de PHP

    El archivo de configuracin

    El archivo de configuracin (llamado php3.ini en PHP 3, y simplemente php.ini apartir de PHP 4) es ledo cuando arranca PHP. Para las versiones de PHP comomdulo de servidor esto slo ocurre una vez al arrancar el servidor web. Para laversin CGI y CLI, esto ocurre en cada llamada.La localizacin por defecto de php.ini es definida en tiempo de compilacin(Consultar la FAQ), pero puede ser cambiada en la versin CGI y CLI con la opcinde la linea de comandos -c, consultar el cpitulo sobre como usar PHP desde la

    linea de comandos. Tambin se puede definir la variable de entorno PHPRC con un"path" adicional para la bsqueda del archivo php.iniSi php-SAPI.ini existe es usado en vez de php.ini.Nota: El servidor web Apache cambia al directorio raiz al arrancar, por ello PHPintentar leer el archivo php.ini en el directorio raiz, si existe.Las directivas php.ini gestionadas por extensiones estn documentadas en cadauna de las pginas de las extensiones respectivamente. La lista de directivas dencleo se encuentra disponible en el apndice.La mayoria de directivas PHP estanlistadas en ini_set() con los respectivos permisos y enlaces a la documentacion.Para obtener una lista completa de todas las directivas disponibles en su versin de

    PHP, por favor lea su archivo php.ini, el cual debe estar bien documentado.Alternativamente, puede encontrar til la ltima versin del archivo php.ini desdeCVS.

  • 8/7/2019 php_avanzado

    11/120

    Ejemplo 9-1. Ejemplo php.ini; any text on a line after an unquoted semicolon (;) is ignored[php] ; section markers (text within square brackets) are also ignored; Boolean values can be set to either:; true, on, yes; or false, off, no, none

    register_globals = offtrack_errors = yes

    ; you can enclose strings in double-quotesinclude_path = ".:/usr/local/lib/php"

    ; backslashes are treated the same as any other characterinclude_path = ".;c:\php\lib"Como cambiar los valores de la configuracinEjecucin de PHP como un mdulo de Apache

    Cuando se usa PHP como un mdulo de Apache, se pueden cambiar valores de laconfiguracin usando directivas en los archivos de configuracin de apache,httpd.conf y .htaccess. Necesitar de los privilegios "AllowOverride Options" o"AllowOverride All" para hacerlo.Con PHP 4 y PHP 5, hay varias directivas Apache que permiten cambiar laconfiguracin de PHP desde los archivos de configuracin de apache. Para obteneruna lista de que directivas son del tipo PHP_INI_ALL, PHP_INI_PERDIR, PHP_INI_SYSTEM, consultar la lista que se encuentra en la documentacin de lafuncin ini_set().Nota: Con PHP 3, existen directivas que corresponden a cada parmetro de

    configuracin en php3.ini, con el prefijo "php3_".php_value nombre valorAsigna el valor de la directiva especificada. Puede ser usado solamente condirectivas del tipo PHP_INI_ALL y PHP_INI_PERDIR. Para borrar un valorprevio, asignar none como valorNota: No use php_value para definir valores booleanos. Debera usarsephp_flag en su lugar (vea ms abajo).

    php_flag nombre on|offUsado para asignar una directiva de configuracin booleana. Puede ser usadosolamente con directivas del tipo PHP_INI_ALL y PHP_INI_PERDIR.

    php_admin_value nombre valorAsigna el valor de la directiva especificada. Esto no puede usarse en archivos.htaccess. Todo tipo de directiva asignada con php_admin_value no puedeser cambiada con .htaccess directivas "virtualhost". Para borrar un valorprevio, asignar none como valor.

    php_admin_flag nombre on|offUsado para asignar una directiva de configuracin booleana. Esto no puede usarseen archivos .htaccess. Todo tipo de directiva asignada con php_admin_flag nopuede ser cambiada con .htaccess directivas.Ejemplo 9-2. Ejemplo de configuracin de Apache

    php_value include_path ".:/usr/local/lib/php" php_admin_flag safe_mode on

  • 8/7/2019 php_avanzado

    12/120

    php_value include_path ".:/usr/local/lib/php" php_admin_flag safe_mode on

    php3_include_path ".:/usr/local/lib/php" php3_safe_mode on

    Atencin

    Las Constantes en PHP no existen fuera de PHP. Por ejemplo, enhttpd.conf no se pueden usar constantes PHP tales como E_ALL E_NOTICE para definir la directiva error_reporting, ya que no tendrningn significado y ser evaluada como 0. Usar los valores asociadosde "bitmask" en su lugar. Estas constantes pueden ser usadas enphp.ini

    Modificacin de la configuracin de PHP usando el registro de WindowsCuando se usa PHP en Windows, se pueden cambiar los valores de configuracinpara cada directorio por medio de los registros de Windows. Los valores deconfiguracin se guardan en la llave de registro HKLM\SOFTWARE\PHP\PerDirectory Values, en las subllaves correspondientes al PATH. Por ejemplo, losvalores de configuracion del directorio c:\inetpub\wwwroot se guardarn enHKLM\SOFTWARE\PHP\Valores Por Directorio\c\inetpub\wwwroot. La configuracinde un directorio es vlida para todos los scripts ejecutados en el mismo y sussubdirectorios. Los valores en la llave deben de definirse con el nombre de la

    directiva de configuracin de PHP y el valor tipo cadena. Las constantes PHP en losvalores no son analizadas.Otras interfaces con PHPIndependientemente del modo en que ejecute PHP, es posible cambiar ciertosvalores en tiempo de ejecucin usando ini_set(). Vea la documentacin en lapgina sobre ini_set() para ms informacin.Si est interesado en una lista completa de parmetros de configuracin en susistema con sus valores actuales, puede ejecutar la funcin phpinfo(), y revisar lapgina resultante. Tambin puede acceder a los valores de directivas deconfiguracin individuales en tiempo de ejecucin usando ini_get() o get_cfg_var()

    .

  • 8/7/2019 php_avanzado

    13/120

    Captulo 5. Sintaxis bsica

    Saliendo de HTMLPara interpretar un archivo, php smplemente interpreta el texto del archivo hastaque encuentra uno de los carcteres especiales que delimitan el inicio de cdigo

    PHP. El intrprete ejecuta entonces todo el cdigo que encuentra, hasta queencuentra una etiqueta de fin de cdigo, que le dice al intrprete que sigaignorando el cdigo siguiente. Este mecanismo permite embeber cdigo PHP dentrode HTML: todo lo que est fuera de las etiquetas PHP se deja tal como est,mientras que el resto se interpreta como cdigo.Hay cuatro conjuntos de etiquetas que pueden ser usadas para denotar bloques decdigo PHP. De estas cuatro, slo 2 ( y . ..) estn siempre disponibles; el resto pueden ser configuradas en elfichero de php.ini para ser o no aceptadas por el intrprete. Mientras que elformato corto de etiquetas (short-form tags) y el estilo ASP (ASP-style tags)

    pueden ser convenientes, no son portables como la versin de formato largo deetiquetas. Adems, si se pretende embeber cdigo PHP en XML o XHTML, serobligatorio el uso del formato para la compatibilidad con XML.Las etiquetas soportadas por PHP son:Ejemplo 10-1. Formas de escapar de HTML1.

    2. Esto es una abreviatura de ""

    3.

  • 8/7/2019 php_avanzado

    14/120

    echo ("muchos editores (como FrontPage) no aceptan instrucciones de procesado");

    4.

    El mtodo primero, , es el ms conveniente, ya que permite el uso dePHP en cdigo XML como XHTML.El mtodo segundo no siempre est disponible. El formato corto de etiquetas estdisponible con la funcin short_tags() (slo PHP 3), activando el parmetro delfichero de configuracin de PHP short_open_tag, o compilando PHP con la opcin--enable-short-tags del comando configure. Aunque est activa por defecto enphp.ini-dist, se desaconseja el uso del formato de etiquetas corto.El mtodo cuarto slo est disponible si se han activado las etiquetas ASP en elfichero de configuracin: asp_tags.Nota: El soporte de etiquetas ASP se aadi en la versin 3.0.4.

    Nota: No se debe usar el formato corto de etiquetas cuando se desarrollenaplicaciones o bibliotecas con intencin de redistribuirlas, o cuando se desarrollepara servidores que no estn bajo nuestro control, porque puede ser que elformato corto de etiquetas no est soportado en el servidor. Para generar cdigoportable y redistribuble, asegrate de no usar el formato corto de etiquetas.La etiqueta de fin de bloque incluir tras ella la siguiente lnea si hay algunapresente. Adems, la etiqueta de fin de bloque lleva implcito el punto y coma; nonecesitas por lo tanto aadir el punto y coma final de la ltima lnea del bloquePHP.PHP permite estructurar bloques como:

    Ejemplo 10-2. Mtodos avanzados de escape This is true. This is false. Este ejemplo realiza lo esperado, ya que cuando PHP encuentra las etiquetas ?>de fin de bloque, empieza a escribir lo que encuentra tal cual hasta que encuentraotra etiqueta de inicio de bloque. El ejemplo anterior es, por supuesto, inventado.Para escribir bloques grandes de texto generamente es ms eficiente separalos delcdigo PHP que enviar todo el texto mediante las funciones echo(), print() osimilares.Separacin de instruccionesLas separacin de instrucciones se hace de la misma manera que en C o Perl -

    terminando cada declaracin con un punto y coma.La etiqueta de fin de bloque (?>) implica el fin de la declaracin, por lo tanto losiguiente es equivalente:

  • 8/7/2019 php_avanzado

    15/120

    Comentarios

    PHP soporta el estilo de comentarios de 'C', 'C++' y de la interfaz de comandos deUnix. Por ejemplo:Los estilos de comentarios de una linea actualmente slo comentan hasta el final

    de la linea o el bloque actual de cdigo PHP, lo primero que ocurra.This is an example.

    The header above will say 'This is an example'.Hay que tener cuidado con no anidar comentarios de estilo 'C', algo que puedeocurrir al comentar bloques largos de cdigo.

    Los estilos de comentarios de una linea actualmente slo comentan hasta el finalde la linea o del bloque actual de cdigo PHP, lo primero que ocurra. Esto implicaque el cdigo HTML tras // ?> sera impreso: ?> sale del modo PHP, retornando almodo HTML, el comentario // no le influye.

  • 8/7/2019 php_avanzado

    16/120

    Captulo 6. Tipos

    IntroduccinPHP soporta ocho tipos primitivos.Cuatro tipos escalares:

    boolean integer float (nmero de punto-flotante, tambin conocido como ' double') string

    Dos tipos compuestos: array object

    Y finalmente dos tipos especiales: resource NULL

    Este manual introduce tambin algunos pseudo-tipos por razones de legibilidad: mixed number callback

    Tambin puede encontrar algunas referencias al tipo "double". Considere al tipodouble como el mismo que float, los dos nombres existen solo por razoneshistricas.El tipo de una variable usualmente no es declarado por el programador; en cambio,es decidido en tiempo de compilacin por PHP dependiendo del contexto en el quees usado la variable.Nota: Si desea chequear el tipo y valor de una cierta expresin, use var_dump().Nota: Si tan solo desea una representacin legible para humanos del tipo parapropsitos de depuracin, use gettype(). Para chequear por un cierto tipo, no use

  • 8/7/2019 php_avanzado

    17/120

    gettype(); en su lugar utilice las funciones is_tipo. Algunos ejemplos:Si quisiera forzar la conversin de una variable a cierto tipo, puede moldear lavariable, o usar la funcin settype() sobre ella.Note que una variable puede ser evaluada con valores diferentes en ciertassituaciones, dependiendo del tipo que posee en cada momento. Para msinformacin, vea la seccin sobre Manipulacin de Tipos. Asimismo, puedeencontrarse interesado en consultar las tablas de comparacin de tipos, ya que

    stas muestran ejemplos de las varias comparaciones relacionadas con tipos.BooleanosEste es el tipo ms simple. Un boolean expresa un valor de verdad. Puede serTRUE or FALSE.Nota: El tipo booleano fue introducido en PHP 4.SintaxisPara especificar un literal booleano, use alguna de las palabras clave TRUE oFALSE. Ambas son insensibles a maysculas y minsculas.Usualmente se usa algn tipo de operador que deuelve un valor boolean, y luegoste es pasado a una estructura de control.

  • 8/7/2019 php_avanzado

    18/120

    Conversin a booleanoPara convertir explcitamente un valor a boolean, use el moldeamiento (bool) o(boolean). Sin embargo, en la mayora de casos no es necesario usar elmoldeamiento, ya que un valor ser convertido automticamente si un operador,funcin o estructura de control requiere un argumento tipo boolean.Vea tambin Manipulacin de Tipos.Cuando se realizan conversiones a boolean, los siguientes valores son consideradosFALSE:

    el boolean FALSE mismo

    el integer 0 (cero) el float 0.0 (cero) el valor string vaco, y el string "0" un array con cero elementos un object con cero variables miembro (slo en PHP 4) el tipo especial NULL (incluyendo variables no definidas)

    Cualquier otro valor es considerado TRUE (incluyendo cualquier resource).Aviso

    -1 es considerado TRUE, como cualquier otro nmero diferente a cero (ya seanegativo o positivo)!

    Enteros

  • 8/7/2019 php_avanzado

    19/120

    Un integer es un nmero del conjunto Z = {..., -2, -1, 0, 1, 2, ...}.Vea tambin: Entero de longitud arbitraria / GMP, Nmeros de punto flotante, yPrecisin arbitraria / BCMathSintaxisLos enteros pueden ser especificados en notacin decimal (base-10), hexadecimal(base-16) u octal (base-8), opcionalmente precedidos por un signo (- o +).

    Si usa la notacin octal, debe preceder el nmero con un 0 (cero), para usar lanotacin hexadecimal, preceda el nmero con 0x.Ejemplo 11-1. Literales tipo entero

    Formalmente, la posible estructura para literales enteros es:decimal : [1-9][0-9]* | 0

    hexadecimal : 0[xX][0-9a-fA-F]+

    octal : 0[0-7]+

    integer : [+-]?decimal | [+-]?hexadecimal

    | [+-]?octalEl tamao de un entero es dependiente de la plataforma, aunque un valor mximode aproximadamente dos billones es el valor usual (lo que es un valor de 32 bitscon signo). PHP no soporta enteros sin signo.

    AvisoSi un dgito invlido es pasado a un entero octal (p.ej. 8 o 9), el restodel nmero es ignorado.Ejemplo 11-2. Curiosidad de valores octales

    Desbordamiento de enterosSi especifica un nmero ms all de los lmites del tipo integer, ser interpretadoen su lugar como un float. Asimismo, si realiza una operacin que resulta en unnmero ms all de los lmites del tipo integer, un float es retornado en su lugar.

  • 8/7/2019 php_avanzado

    20/120

  • 8/7/2019 php_avanzado

    21/120

    Si el flotante se encuentra ms all de los lmites del entero (usualmente +/-2.15e+9 = 2^31), el resultado es indefinido, ya que el flotante no tiene suficienteprecisin para dar un resultado entero exacto. No se producir una advertencia, nisiquiera una noticia en este caso!

    Aviso

    Nunca moldee una fraccin desconocida a integer, ya que esto enocasiones produce resultados inesperados.

    Para ms informacin, consulte la advertencia sobre precisin-flotante.Desde cadenas

    Desde otros tiposAtencin

    El comportamiento de convertir desde entero no es definido para otrostipos. Actualmente, el comportamiento es el mismo que si el valorfuera antes convertido a booleano. Sin embargo, no confe en estecomportamiente, ya que puede ser modificado sin aviso.

    Nmeros de punto flotanteLos nmeros de punto flotante (tambin conocidos como "flotantes", "dobles" o"nmeros reales") pueden ser especificados usando cualquiera de las siguientes

    sintaxis:Formalmente:LNUM [0-9]+DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)EXPONENT_DNUM ( ({LNUM} | {DNUM}) [eE][+-]? {LNUM})

    El tamao de un flotante depende de la plataforma, aunque un valor comnconsiste en un mximo de ~1.8e308 con una precisin de aproximadamente 14dgitos decimales (lo que es un valor de 64 bits en formato IEEE).

    Precisin del punto flotante

  • 8/7/2019 php_avanzado

    22/120

    Es bastante comn que algunas fracciones decimales simples como0.1 o 0.7 no puedan ser convertidas a su representacin binariainterna sin perder un poco de precisin. Esto puede llevar a resultadosconfusos: por ejemplo, floor((0.1+0.7)*10) usualmente devolver 7en lugar del esperado 8 ya que el resultado de la representacininterna es en realidad algo como 7.9999999999....

    Esto se encuentra relacionado al hecho de que es imposible expresarde forma exacta algunas fracciones en notacin decimal con unnmero finito de dgitos. Por ejemplo, 1/3 en forma decimal seconvierte en 0.3333333. . ..As que nunca confe en resultados de nmeros flotantes hasta elltimo dgito, y nunca compare nmeros de punto flotante paraconocer si son equivalentes. Si realmente necesita una mejorprecisin, es buena idea que use las funciones matemticas deprecisin arbitraria o las funciones gmp en su lugar.Conversin a flotante

    Para ms informacin sobre cundo y cmo son convertidas las cadenas aflotantes, vea la seccin titulada Conversin de cadenas a nmeros. Para valoresde otros tipos, la conversin es la misma que si el valor hubiese sido convertido aentero y luego a flotante. Vea la seccin Conversin a entero para msinformacin. A partir de PHP 5, una noticia es generada si intenta convertir unobjeto a flotante.CadenasUn valor string es una serie de caracteres. En PHP, un caracter es lo mismo que unbyte, es decir, hay exactamente 256 tipos de caracteres diferentes. Esto implicatambin que PHP no tiene soporte nativo de Unicode. Vea utf8_encode() y

    utf8_decode() para conocer sobre el soporte Unicode.Nota: El que una cadena se haga muy grande no es un problema. PHP no imponelmite prctico alguno sobre el tamao de las cadenas, as que no hay ningunarazn para preocuparse sobre las cadenas largas.SintaxisUn literal de cadena puede especificarse en tres formas diferentes.

    comillas simples comillas dobles sintaxis heredoc

    Comillas simples

    La forma ms simple de especificar una cadena sencilla es rodearla de comillassimples (el caracter ').Para especificar una comilla sencilla literal, necesita escaparla con una barrainvertida (\), como en muchos otros lenguajes. Si una barra invertida necesitaaparecer antes de una comilla sencilla o al final de la cadena, necesitar doblarla.Note que si intenta escapar cualquier otro caracter, la barra invertida ser impresatambin! De modo que, por lo general, no hay necesidad de escapar la barrainvertida misma.Nota: En PHP 3, se generar una advertencia de nivel E_NOTICE cuando estoocurra.

    Nota: A diferencia de las otras dos sintaxis, las variables y secuencias de escapepara caracteres especiales no sern expandidas cuando ocurren al interior decadenas entre comillas sencillas.

  • 8/7/2019 php_avanzado

    23/120

    Comillas doblesSi la cadena se encuentra rodeada de comillas dobles ("), PHP entiende mssecuencias de escape para caracteres especiales:Tabla 11-1. Caracteres escapados

    secuencia significado\n alimentacin de lnea (LF o 0x0A (10) en ASCII)\r retorno de carro (CR o 0x0D (13) en ASCII)\t tabulacin horizontal (HT o 0x09 (9) en ASCII)\\ barra invertida\$ signo de dlar\" comilla-doble

    \[0-7]{1,3} la secuencia de caracteres que coincide con laexpresin regular es un caracter en notacin octal

    \x[0-9A-Fa-f]{1,2}

    la secuencia de caracteres que coincide con la

    expresin regular es un caracter en notacinhexadecimal

    Nuevamente, si intenta escapar cualquier otro caracter, la barra invertida serimpresa tambin! Antes de PHP 5.1.1, la barra invertida en \{$var} no venaimprimindose.Pero la caracterstica ms importante de las cadenas entre comillas dobles es elhecho de que los nombres de variables sern expandidos. Vea procesamiento decadenas para ms detalles.HeredocOtra forma de delimitar cadenas es mediante el uso de la sintaxis heredoc

    ("

  • 8/7/2019 php_avanzado

    24/120

    Asimismo, el identificador usado debe seguir las mismas reglas que cualquier otraetiqueta en PHP: debe contener solo caracteres alfanumricos y de subrayado, ydebe iniciar con un caracter no-dgito o de subrayado.

    AvisoEs muy importante notar que la lnea con el identificador de cierre nocontenga otros caracteres, excepto quizs por un punto-y-coma (;).

    Esto quiere decir en especial que el identificador no debe usar sangra,y no debe haber espacios o tabuladores antes o despus delpunto-y-coma. Es importante tambin notar que el primer caracterantes del identificador de cierre debe ser un salto de lnea, tal y comolo defina su sistema operativo. Esto quiere decir \r en Macintosh, porejemplo.Si esta regla es rota y el identificador de cierre no es "limpio",entonces no se considera un identificador de cierre y PHP continuaren busca de uno. Si, en tal caso, no se encuentra un identificador decierre apropiado, entonces un error del analizador sintctico resultar

    con el nmero de lnea apuntando al final del script.No es permitido usar la sintaxis heredoc al inicializar miembros declase. Use otro tipo de sintaxis en su lugar.

    Ejemplo 11-3. Ejemplo invlido

    El texto heredoc se comporta tal como una cadena entre comillas dobles, sin lascomillas dobles. Esto quiere decir que no necesita escapar tales comillas en susbloques heredoc, pero aun puede usar los cdigos de escape listadosanteriormente. Las variables son expandidas, aunque debe tenerse el mismo

    cuidado cuando se expresen variables complejas al interior de un segmentoheredoc, al igual que con otras cadenas.

  • 8/7/2019 php_avanzado

    25/120

    Ejemplo 11-4. Ejemplo de uso de una cadena heredoc

    Nota: El soporte heredoc fue agregado en PHP 4.Procesamiento de variablesCuando una cadena es especificada en comillas dobles o al interior de un bloqueheredoc, las variables son interpretadas en su interior.

    Existen dos tipos de sintaxis: una simple y una compleja. La sintaxis simple es lams comn y conveniente. Esta ofrece una forma de interpretar una variable, unvalor array, o una propiedad de un object.La sintaxis compleja fue introducida en PHP 4, y puede reconocerse por las llavesque rodean la expresin.Sintaxis simpleSi un signo de dlar ($) es encontrado, el analizador sintctico tomarambiciosamente tantos lexemas como le sea posible para formar un nombre devariable vlido. Rodee el nombre de la variable de llaves si desea especificarexplcitamente el final del nombre.

  • 8/7/2019 php_avanzado

    26/120

    De forma similar, puede hacer que un ndice de un array o una propiedad de unobject sean interpretados. En el caso de los ndices de matrices, el corchetecuadrado de cierre (]) marca el final del ndice. Para las propiedades de objetos, seaplican las mismas reglas de las variables simples, aunque con las propiedades deobjetos no existe un truco como el que existe con las variables.

  • 8/7/2019 php_avanzado

    27/120

    Para cualquier cosa ms sofisticada, debera usarse la sintaxis compleja.Sintaxis compleja (llaves)Esta no es llamada compleja porque la sintaxis sea compleja, sino porque esposible incluir expresiones complejas de esta forma.De hecho, de esta forma puede incluir cualquier valor que sea parte del espacio denombres al interior de cadenas. Simplemente escriba la expresin en la mismaforma que lo hara si se encontrara por fuera de una cadena, y luego la ubica entre{ y }. Ya que no es posible escapar '{', esta sintaxis ser reconocida nicamente

    cuando el caracter $ se encuentra inmediatamente despus de {. (Use "{\$" paraobtener una secuencia literal "{$"). Algunos ejemplos para aclarar el asunto:

  • 8/7/2019 php_avanzado

    28/120

    Acceso a cadenas y modificacin por caracterLos caracteres al interior de una cadena pueden ser consultados y modificados alespecificar el desplazamiento, comenzando en cero, del caracter deseado despusde la cadena entre llaves.Nota: Para efectos de compatibilidad con versiones anteriores, aun puede usarcorchetes tipo matriz para el mismo propsito. Sin embargo, esta sintaxis esobsoleta a partir de PHP 4.

  • 8/7/2019 php_avanzado

    29/120

    Ejemplo 11-5. Algunos ejemplos de cadenas

    Funciones y operadores tilesLas cadenas pueden ser concatenadas usando el operador '.' (punto). Note que eloperador '+' (adicin) no funciona para este propsito. Por favor refirase a laseccin Operadores de cadena para ms informacin.Existen bastantes funciones tiles para la modificacin de cadenas.Vea la seccin de funciones de cadena para consultar funciones de uso general, o

    las funciones de expresiones regulares para bsquedas y reemplazos avanzados(en dos sabores: Perl y POSIX extendido).Existen tambin funciones para cadenas tipo URL, y funciones paraencriptar/descifrar cadenas (mcrypt y mhash).Finalmente, si aun no ha encontrado lo que busca, vea tambin las funciones detipo de caracter.Conversin a cadenaEs posible convertir un valor a una cadena usando el moldeamiento (string), o lafuncin strval(). La conversin a cadena se realiza automticamente para usted enel contexto de una expresin cuando se necesita una cadena. Esto ocurre cuando

    usa las funciones echo() o print(), o cuando compara el valor de una variable conuna cadena. El contenido de las secciones del manual sobre Tipos y Manipulacinde Tipos ayudan a aclarar este hecho. Vea tambin settype().Un valor boolean TRUE es convertido a la cadena "1", el valor FALSE se representacomo "" (una cadena vaca). De esta forma, usted puede convertir de ida y vueltaentre valores booleanos y de cadena.Un nmero integer o de punto flotante (float) es convertido a una cadena querepresenta el nmero con sus dgitos (incluyendo la parte del exponente para losnmeros de punto flotante).Las matrices son siempre convertidas a la cadena "Array", de modo que no puede

    volcar los contenidos de un valor array con echo() o print() para ver lo que seencuentra en su interior. Para ver un elemento, usted tendra que hacer algo comoecho $arr['foo']. Vea ms adelante algunos consejos sobre el volcado/vista del

  • 8/7/2019 php_avanzado

    30/120

    contenido completo.Los objetos son convertidos siempre a la cadena "Object". Si quisiera imprimir losvalores de variables miembro de un object para efectos de depuracin, lea lospargrafos siguientes. Si quiere conocer el nombre de clase del cual un objeto dadoes instancia, use get_class(). A partir de PHP 5, el mtodo __toString() es usado siresulta aplicable.

    Los recursos son siempre convertidos a cadenas con la estructura "Resource id #1"en donde 1 es el nmero nico del valor resource asignado por PHP durante tiempode ejecucin. Si quisiera obtener el tipo del recurso, use get_resource_type().NULL se convierte siempre a una cadena vaca.Como puede apreciar, el imprimir matrices, objetos o recursos no le ofroceinformacin til sobre los valores mismos. Consulte las funciones print_r() yvar_dump() para conocer mejores formas de imprimir valores para depuracin.Tambin puede convertir valores PHP a cadenas y almacenarlas permanentemente.Este mtodo es conocido como seriacin, y puede ser efectuado con la funcinserialize(). Tambin puede seriar valores PHP a estructuras XML, si cuenta con

    soporte WDDX en su configuracin de PHP.Conversin de cadenas a nmerosCuando una cadena es evaluada como un valor numrico, el valor resultante y sutipo son determinados como sigue.La cadena ser evaluada como un float si contiene cualquier caracter entre '.', 'e', o'E'. De otra forma, evaluar como un entero.El valor es dado por la porcin inicial de la cadena. Si la cadena comienza condatos numricos vlidos, stos sern el valor usado. De lo contrario, el valor ser 0(cero). Un signo opcional es considerado un dato numrico vlido, seguido por unoo ms dgitos (que pueden contener un punto decimal), seguidos por un exponente

    opcional. El exponente es una 'e' o 'E' seguida de uno o ms dgitos.Para ms informacin sobre esta conversin, vea la pgina del manual Unix sobrestrtod(3).Si quisiera probar cualquiera de los ejemplos presentados en esta seccin, puedecortar y pegar los ejemplos e insertar la siguiente lnea para verificar por s mismolo que est sucediendo:No espere obtener el cdigo de un caractar convirtindolo a un entero (como lo

    hara en C, por ejemplo). Use las funciones ord() y chr() para convertir entrecdigos de caracter y caracteres.Matrices

  • 8/7/2019 php_avanzado

    31/120

    Una matriz en PHP es en realidad un mapa ordenado. Un mapa es un tipo de datosque asocia valores con claves. Este tipo es optimizado en varias formas, de modoque puede usarlo como una matriz real, o una lista (vector), tabla asociativa (casoparticular de implementacin de un mapa), diccionario, coleccin, pila, cola yprobablemente ms. Ya que puede tener otra matriz PHP como valor, es realmentefcil simular rboles.

    Una explicacin sobre tales estructuras de datos se encuentra por fuera delpropsito de este manual, pero encontrar al menos un ejemplo de cada uno deellos. Para ms informacin, le referimos a literatura externa sobre este ampliotema.SintaxisEspecificacin con array()Un array puede ser creado por la construccin de lenguaje array(). sta toma uncierto nmero de parejas clave => valor separadas con coma.array( [clave =>] valor , ...

    )// clave puede ser un integer o string// valor puede ser cualquier valorUna clave puede ser un integer o un string. Si una clave es la representacin

    estndar de un integer, ser interpretada como tal (es decir, "8" ser interpretadocomo 8, mientras que "08" ser interpretado como "08"). Los valores flotantes enclave sern truncados a valores tipo integer. No existen tipos diferentes paramatrices indexadas y asociativas en PHP; slo existe un tipo de matriz, el cualpuede contener ndices tipo entero o cadena.Un valor puede ser de cualquier tipo en PHP.Si no especifica una clave para un valor dado, entonces es usado el mximo de losndices enteros, y la nueva clave ser ese valor mximo + 1. Si especifica unaclave que ya tiene un valor asignado, se valor ser sobrescrito.

  • 8/7/2019 php_avanzado

    32/120

    AvisoA partir de PHP 4.3.0, el comportamiento de generacindices descrito ha cambiado. Ahora, si agrega un elemuna matriz cuya clave mxima actual es un valor negatentonces la siguiente clave creada ser cero (0).Anteriormente, el nuevo ndice hubiera sido establecido

    clave mayor existente + 1, al igual que con los ndicespositivos.

    Al usar TRUE como clave, el valor ser evaluado al integer 1. Al usar FALSE comoclave, el valor ser evaluado al integer 0. Al usar NULL como clave, el valor serevaluado a una cadena vaca. El uso de una cadena vaca como clave crear (oreemplazar) una clave con la cadena vaca y su valor; no es lo mismo que usarcorchetes vacos.No es posible usar matrices u objetos como claves. Al hacerlo se producir unaadvertencia: Illegal offset type.Creacin/modificacin con sintaxis de corchetes cuadrados

    Es posible modificar una matriz existente al definir valores explcitamente en ella.Esto es posible al asignar valores a la matriz al mismo tiempo que se especifica laclave entre corchetes. Tambin es posible omitir la clave, agregar una pareja vacade corchetes ("[]") al nombre de la variable en ese caso.$matriz[clave] = valor;$matriz[] = valor;// clave puede ser un integer o string// valor puede ser cualquier valorSi $matriz no existe aun, sta ser creada. De modo que esta es tambin unaforma alternativa de especificar una matriz. Para modificar un cierto valor,

    simplemente asigne un nuevo valor a un elemento especificado con su clave. Sidesea remover una pareja clave/valor, necesita eliminarla mediante unset().Nota: Como se menciona anteriormente, si provee los corchetes sin ninguna claveespecificada, entonces se toma el mximo de los ndices enteros existentes, y lanueva clave ser ese valor mximo + 1. Si no existen ndices enteros aun, la claveser 0 (cero). Si especifica una clave que ya tena un valor asignado, el valor serreemplazado.

    Aviso

  • 8/7/2019 php_avanzado

    33/120

    A partir de PHP 4.3.0, el comportamiento de generacin de ndicesdescrito ha cambiado. Ahora, si agrega un elemento al final de unamatriz en la que la clave mxima actual es negativa, la siguiente clavecreada ser cero (0). Anteriormente, el nuevo ndice hubiera sidodefinido como la mayor clave + 1, al igual que ocurre con los ndicespositivos.

    Note que la clave entera mxima usada para este caso no necesita existiractualmente en la matriz. Tan solo debe haber existido en la matriz en algn puntodesde que la matriz haya sido re-indexada. El siguiente ejemplo ilustra este caso:El resultado del ejemplo seria:

  • 8/7/2019 php_avanzado

    34/120

    Array( [0] => 1 [1] => 2 [2] => 3 [3] => 4

    [4] => 5)Array()Array( [5] => 6)Array

    ( [0] => 6 [1] => 7)Funciones tilesExiste un buen nmero de funciones tiles para trabajar con matrices. Consulte laseccin funciones de matrices.Nota: La funcin unset() le permite remover la definicin de claves de una matriz.Tenga en cuenta que la matriz NO es re-indexada. Si slo usa "ndices enteroscomunes" (comenzando desde cero, incrementando en uno), puede conseguir el

    efecto de re-indexacin usando array_values().La estructura de control foreach existe especficamente para las matrices. staprovee una manera fcil de recorrer una matriz.Recomendaciones sobre matrices y cosas a evitarPorqu es incorrecto $foo[bar]?Siempre deben usarse comillas alrededor de un ndice de matriz tipo cadena literal.Por ejemplo, use $foo['bar'] y no $foo[bar]. Pero qu est mal en $foo[bar]? Esposible que haya visto la siguiente sintaxis en scripts viejos:

  • 8/7/2019 php_avanzado

    35/120

    Esto est mal, pero funciona. Entonces, porqu est mal? La razn es que este

    cdigo tiene una constante indefinida (bar) en lugar de una cadena ('bar' - note lascomillas), y puede que en el futuro PHP defina constantes que,desafortunadamente para su cdigo, tengan el mismo nombre. Funciona porquePHP automticamente convierte una cadena pura (una cadena sin comillas que nocorresponda con smbolo conocido alguno) en una cadena que contiene la cadenapura. Por ejemplo, si no se ha definido una constante llamada bar, entonces PHPreemplazar su valor por la cadena 'bar' y usar sta ltima.Nota: Esto no quiere decir que siempre haya que usar comillas en la clave. Noquerr usar comillas con claves que sean constantes o variables, ya que en tal casoPHP no podr interpretar sus valores.

  • 8/7/2019 php_avanzado

    36/120

  • 8/7/2019 php_avanzado

    37/120

    error_reporting se encuentra configurado para no mostrarlos.Tal y como se indica en la seccin de sintaxis, debe existir una expresin entre loscorchetes cuadrados ('[' y ']'). Eso quiere decir que puede escribir cosas comoesta:Este es un ejemplo del uso de un valor devuelto por una funcin como ndice dematriz. PHP tambin conoce las constantes, tal y como ha podido apreciar aquellasE_* antes.

    Note que E_ERROR es tambin un identificador vlido, asi como bar en el primerejemplo. Pero el ltimo ejemplo es equivalente a escribir:ya que E_ERROR es igual a 1, etc.Tal y como lo hemos explicado en los anteriores ejemplos, $foo[bar] aun funcionapero est mal. Funciona, porque debido a su sintaxis, se espera que bar sea una

    expresin constante. Sin embargo, en este caso no existe una constante con elnombre bar. PHP asume ahora que usted quiso decir bar literalmente, como lacadena "bar", pero que olvid escribir las comillas.Entonces porqu est mal?En algn momento en el futuro, el equipo de PHP puede querer usar otra constanteo palabra clave, o puede que usted introduzca otra constante en su aplicacin, yentonces se ve en problemas. Por ejemplo, en este momento no puede usar laspalabras empty y default de esta forma, ya que son palabras clave reservadasespeciales.Nota: Reiterando, al interior de un valor string entre comillas dobles, es vlido no

    rodear los ndices de matriz con comillas, as que "$foo[bar]" es vlido. Consultelos ejemplos anteriores para ms detalles sobre el porqu, asi como la seccinsobre procesamiento de variables en cadenas.Conversin a matrizPara cualquiera de los tipos: integer, float, string, boolean y resource, si convierteun valor a un array, obtiene una matriz con un elemento (con ndice 0), el cual esel valor escalar con el que inici.Si convierte un object a una matriz, obtiene las propiedades (variables miembro)de ese objeto como los elementos de la matriz. Las claves son los nombres de lasvariables miembro.

    Si convierte un valor NULL a matriz, obtiene una matriz vaca.ComparacinEs posible comparar matrices con array_diff() y mediante operadores de matriz.

  • 8/7/2019 php_avanzado

    38/120

    EjemplosEl tipo matriz en PHP es bastante verstil, as que aqu se presentan algunosejemplos que demuestran el poder completo de las matrices.

  • 8/7/2019 php_avanzado

    39/120

    Ejemplo 11-6. Uso de array()

  • 8/7/2019 php_avanzado

    40/120

    Ejemplo 11-7. Coleccin

    El resultado del ejemplo seria:Le gusta el rojo?Le gusta el azul?Le gusta el verde?Le gusta el amarillo?

    Modificar los valores de la matriz directamente es posible a partir de PHP 5,pasndolos por referencia. Las versiones anteriores necesitan una solucinalternativa:Ejemplo 11-8. Coleccin

    El resultado del ejemplo seria:Array( [0] => ROJO [1] => AZUL [2] => VERDE [3] => AMARILLO)

    Este ejemplo crea una matriz con base uno.

  • 8/7/2019 php_avanzado

    41/120

    Ejemplo 11-9. ndice con base 1

    El resultado del ejemplo seria:Array( [1] => 'Enero' [2] => 'Febrero' [3] => 'Marzo')

    Ejemplo 11-10. Llenado de una matriz

    Las matrices son ordenadas. Puede tambin cambiar el orden usando variasfunciones de ordenamiento. Vea la seccin sobre funciones de matrices para ms

    informacin. Puede contar el nmero de items en una matriz usando la funcincount().Ejemplo 11-11. Ordenamiento de una matriz

    Dado que el valor de una matriz puede ser cualquier cosa, tambin puede ser otramatriz. De esta forma es posible crear matrices recursivas y multi-dimensionales.

  • 8/7/2019 php_avanzado

    42/120

    Ejemplo 11-12. Matrices recursivas y multi-dimensionales

    Debe advertir que la asignacin de matrices siempre involucra la copia de valores.Tambin quiere decir que el apuntador interno de matriz usado por current() yotras funciones similares es reestablecido. Necesita usar el operador de referenciapara copiar una matriz por referencia.ObjetosInicializacin de ObjetosPara inicializar un objeto, use la sentencia new, lo que instancia el objeto a unavariable.

  • 8/7/2019 php_avanzado

    43/120

    Conversin a objetoSi un objeto es convertido a un objeto, ste no es modificado. Si un valor decualquier otro tipo es convertido a objeto, una nueva instancia de la clase stdClasses creada. Si el valor era NULL, la nueva instancia ser vaca. Las matrices son

    convertidas a objeto usando las claves de la matriz como nombres de propiedadesy con sus valores correspondientes. Para cualquier otro valor, una variablemiembro llamada scalar contendr el valor.

    RecursoUn recurso es una variable especial, que contiene una referencia a un recurso

    externo. Los recursos son creados y usados por funciones especiales. Vea elapndice para un listado de todas estas funciones y los tipos de recursocorrespondientes.Nota: El tipo recurso fue introducido en PHP 4Vea tambin get_resource_type().Conversin a un recursoDado que los tipos de recurso contienen gestores especiales a archivos abiertos,conexiones con bases de datos, reas de pintura de imgenes y cosas por el estilo,no es posible convertir cualquier valor a un recurso.Liberacin de recursos

    Gracias al sistema de conteo de referencias introducido con el Motor Zend de PHP4, se detecta automticamente cuando un recurso ya no es referenciado (tal comoen Java). Cuando este es el caso, todos los recursos que fueron usados para sterecurso se liberan por el recolector de basura. Por esta razn, rara vez se necesitaliberar la memoria manualmente mediante el uso de alguna funcin free_result.Nota: Los enlaces persistentes con bases de datos son especiales, ellos no sondestruidos por el recolector de basura. Vea tambin la seccin sobre conexionespersistentes.NULLEl valor especial NULL representa que una variable no tiene valor. NULL es el nico

    valor posible del tipo NULL.Nota: El tipo null se introdujo en PHP 4.Una variable es considerada como NULL si

  • 8/7/2019 php_avanzado

    44/120

    se ha asignado la constante NULL a la variable. no ha sido definida con valor alguno. ha sido eliminada con unset().

    SintaxisExiste un solo valor de tipo NULL, y ese es la palabra clave NULL, insensible amaysculas y minsculas.

    Vea tambin is_null() y unset().Pseudo-tipos usados en esta documentacinmixedmixed indica que un parmetro puede aceptar mltiples tipos (pero nonecesariamente todos).gettype() por ejemplo aceptar todos los tipos PHP, mientras que str_replace()aceptar cadenas y matrices.

    numbernumber indica que un parmetro puede ser integer o float.callbackAlgunas funciones como call_user_func() o usort() aceptan llamadas de retornodefinidas por el usuario como un parmetro. Las funciones tipo llamada de retornono slo pueden ser funciones simples, tambin pueden ser mtodos de objetosincluyendo mtodos estticos de clase.Una funcin de PHP es simplemente pasada usando su nombre como una cadena.Puede pasar cualquier funcin incorporada o definida por el usuario con laexcepcin de array(), echo(), empty(), eval(), exit(), isset(), list(), print() y unset()

    .Un mtodo de un objeto instanciado es pasado como una matriz que contiene unobjeto como el elemento con el ndice 0 y un nombre de mtodo como el elementocon ndice 1.Los mtodos estticos de clase pueden ser pasados tambin sin instanciar unobjeto de esa clase al pasar el nombre de clase en lugar de un objeto como elelemento con ndice 0.

  • 8/7/2019 php_avanzado

    45/120

    Ejemplo 11-13. Ejemplos de funciones tipollamada de retorno

    Manipulacin de TiposPHP no requiere (o soporta) la definicin explcita de tipos en la declaracin devariables; el tipo de una variable es determinado por el contexto en el que lavariable es usada. Lo que quiere decir que si asigna un valor de cadena a la

    variable $var, $var se convierte en una cadena. Si luego asigna un valor entero a$var, sta se convierte en entera.Un ejemplo de la conversin automtica de tipos de PHP es el operador de adicin'+'. Si cualquiera de los operandos es un flotante, entonces todos los operandosson evaluados como flotantes, y el resultado ser un flotante. De otro modo, losoperandos sern interpretados como enteros, y el resultado ser tambin unentero. Note que este NO modifica los tipos de los operandos mismos; el nicocambio est en la forma como los operandos son evaluados.

  • 8/7/2019 php_avanzado

    46/120

    Si los dos ltimos ejemplos lucen extraos, consulte Conversin de cadenas anmeros.Si desea forzar que una variable sea evaluada como un cierto tipo, consulte laseccin sobre Moldeamiento de tipos. Si desea cambiar el tipo de una variable, veasettype().Si quisiera probar cualquiera de los ejemplos en esta seccin, puede usar lafuncin var_dump().Nota: El comportamiento de una conversin automtica a matriz no se encuentradefinido en el momento.

    Ya que PHP (por razones histricas) soporta el uso de ndices en cadenas mediantedesplazamientos de posicin usando la misma sintaxis que la indexacin dematrices, el ejemplo anterior lleva a un problema: debera $a convertirse en unamatriz con un primer elemento "f", o debera "f" convertirse en el primer caracterde la cadena $a?Las versiones recientes de PHP interpretan la segunda asignacin como una

    identificacin de desplazamiento de cadena, as que $a se convierte en "f", sinembargo el resultado de esta conversin automtica debe considerarse indefinido.PHP 4 introdujo la nueva sintaxis de llaves para acceder a los caracteres de unacadena, use esta sintaxis en lugar de la que fue presentada anteriormente:Vea la seccin llamada Acceso a cadenas por caracter para ms informacin.Moldeamiento de Tipos

    El moldeamiento de tipos en PHP funciona de forma muy similar a como ocurre enC: el nombre del tipo deseado es escrito entre parntesis antes de la variable quedebe ser moldeada.Los moldeamiontos permitidos son:

    (int), (integer) - moldeamiento a entero (bool), (boolean) - moldeamiento a booleano

    (float), (double), (real) - moldeamiento a flotante (string) - moldeamiento a cadena (array) - moldeamiento a matriz

  • 8/7/2019 php_avanzado

    47/120

    (object) - moldeamiento a objetoNote que las tabulaciones y los espacios son permitidos al interior de losparntesis, as que las siguientes expresiones son funcionalmente equivalentes:Nota: En lugar de moldear una variable a cadena, puede tambin rodear la variablede comillas dobles.

    Captulo 7. Variables

    Conceptos Bsicos

    En PHP las variables se representan como un signo de dlar seguido por el nombrede la variable. El nombre de la variable es sensible a minsculas y maysculas.Los nombres de variables siguen las mismas reglas que otras etiquetas en PHP. Unnombre de variable valido tiene que empezar con una letra o una raya(underscore), seguido de cualquier nmero de letras, nmeros y rayas. Comoexpresin regular se podria expresar como:'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'Nota: En nuestro caso, una letra es a-z, A-Z, y los caracteres ASCII del 127 al 255(0x7f-0xff).

  • 8/7/2019 php_avanzado

    48/120

    En PHP3, las variables siempre se asignan por valor. Esto significa que cuando seasigna una expresin a una variable, el valor ntegro de la expresin original secopia en la variable de destino. Esto quiere decir que, por ejemplo, despus easignar el valor de una variable a otra, los cambios que se efecten a una de esasvariables 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, "seconvierte en un alias de" "apunta a") la variable original. Los cambios a la nuevavariable afectan a la original, y viceversa. Esto tambin significa que no se produceuna copia de valores; por tanto, la asignacin ocurre ms rpidamente. Decualquier forma, cualquier incremento de velocidad se notar slo en los buclescrticos cuando se asignen grandes matrices u objetos.Para asignar por referencia, simplemente se antepone un ampersandsigno "&" alcomienzo de la variable cuyo valor se est asignando (la variable fuente). Porejemplo, el siguiente trozo de cdigo produce la salida 'Mi nombre es Bob' dosveces:

    Algo importante a tener en cuenta es que slo las variables con nombre pueden serasignadas por referencia.Variables predefinidas

  • 8/7/2019 php_avanzado

    49/120

    PHP proporciona una gran cantidad de variables predefinidas a cualquier script quese ejecute. De todas formas, muchas de esas variables no pueden estarcompletamente documentadas ya que dependen de sobre qu servidor se estejecutando, la versin y configuracin de dicho servidor, y otros factores. Algunasde estas variables no estarn disponibles cuando se ejecute PHP desde la lnea decomandos.Para obtener una lista de estas variables podeis consultar la seccin

    Variables predefinidas reservadas.Aviso

    A partir de PHP 4.2.0, el valor por defecto de la directiva PHPregister_globals es off (desactivada). Este es un cambio importante enPHP. Teniendo register_globals off afecta el conjunto de variablespredefinidas disponibles en el sistema. Por ejemplo, para obtenerDOCUMENT_ROOT se usar $_SERVER['DOCUMENT_ROOT'] en vez de$DOCUMENT_ROOT $_GET['id'] de la URLhttp://www.example.com/test.php?id=3 en vez de $id $_ENV['HOME'] en vez de $HOME.

    Para ms informacin sobre este cambio, podeis consultar el apartadode configuracin sobre register_globals, el captulo sobre seguridadUsando "Register Globals" , asi como los anuncios de lanzamiento dePHP 4.1.0 y 4.2.0El uso de las variables reservadas predefinidas en PHP, como matricessuperglobales es recomendable.A partir de PHP 4.1.0, PHP ofrece un conjunto adicional de matrices predefinidas,conteniendo variables del servidor web, el entorno y entradas del usuario. Estasnuevas matrices son un poco especiales porque son automticamente globales. Poresta razn, son conocidas a menudo como "autoglobales" "superglobales". Las

    superglobales se mencionan ms abajo; sin embargo para una lista de suscontenidos y ms informacin sobre variables predefinidas en PHP, consultar laseccin Variables predefinidas reservadas. Podreis ver como las variablespredefinidas antiguas ($HTTP_*_VARS) todava existen. A partir de PHP 5.0.0, lasmatrices de tipo "long" de variables predefinidas, se pueden desactivar con ladirectiva register_long_arrays.Variables variables: Las superglobales no pueden usarse como variables variables.Si ciertas variables no son definidas en variables_order, las matrices PHPpredefinidas asociadas a estas, estarn vacias.PHP superglobales

    $GLOBALSContiene una referencia a cada variable disponible en el espectro de lasvariables del script. Las llaves de esta matriz son los nombres de lasvariables globales. $GLOBALS existe dese PHP 3.

    $_SERVERVariables definidas por el servidor web directamente relacionadas con elentorno en don el script se esta ejecutando. Anloga a la antigua matriz$HTTP_SERVER_VARS (la cual est todava disponible, aunque no se use).

    $_GETVariables proporcionadas al script por medio de HTTP GET. Anloga a la

    antigua matriz $HTTP_GET_VARS (la cual est todava disponible, aunque nose use).$_POST

  • 8/7/2019 php_avanzado

    50/120

    Variables proporcionadas al script por medio de HTTP POST. Anloga a laantigua matriz $HTTP_POST_VARS (la cual est todava disponible, aunqueno se use).

    $_COOKIEVariables proporcionadas al script por medio de HTTP cookies. Anloga a laantigua matriz $HTTP_COOKIE_VARS (la cual est todava disponible, aunque

    no se use).$_FILES

    Variables proporcionadas al script por medio de la subida de ficheros viaHTTP . Anloga a la antigua matriz $HTTP_POST_FILES (la cual est todavadisponible, aunque no se use). Vea tambin Subiendo ficheros por mtodoPOST para ms informacin.

    $_ENVVariables proporcionadas al script por medio del entorno. Anloga a laantigua matriz $HTTP_ENV_VARS (la cual est todava disponible, aunque nose use).

    $_REQUESTVariables proporcionadas al script por medio de cuaquier mecanismo deentrada del usuario y por lo tanto no se puede confiar en ellas. La presencia yel orden en que aparecen las variables en esta matriz es definido por ladirectiva de configuracin variables_order. Esta matriz no tiene un anlogoen versiones anteriores a PHP 4.1.0. Vea tambin import_request_variables().

    Nota: Cuando se utiliza la linea de comandos, argv y argc no sonincluidas aqu; estas variables se podrn encontrar en la matriz

    $_SESSION

    Variables registradas en la sesin del script. Anloga a la antigua matriz$HTTP_SESSION_VARS (la cual est todava disponible, aunque no se use).Vea tambin la seccin Funciones para el manejo de sessiones para msinformacin.

    Ambito de las variablesEl mbito de una variable es el contexto dentro del que la variable est definida. Lamayor parte de las variables PHP slo tienen un mbito simple. Este mbito simpletambin abarca los ficheros incluidos y los requeridos. Por ejemplo:Aqu, la variable $a dentro del script incluido b.inc. De todas formas, dentro de lasfunciones definidas por el usuario aparece un mbito local a la funcin. Cualquiervariables que se use dentro de una funcin est, por defecto, limitada al mbitolocal de la funcin. Por ejemplo:

  • 8/7/2019 php_avanzado

    51/120

    Este script no producir salida, ya que la orden echo utiliza una versin local de lavariable $a, a la que no se ha asignado ningn valor en su mbito. Puede queusted note que hay una pequea diferencia con el lenguaje C, en el que lasvariables globales estn disponibles automticamente dentro de la funcin a menosque sean expresamente sobreescritas por una definicin local. Esto puede causaralgunos problemas, ya que la gente puede cambiar variables globales

    inadvertidamente. En PHP, las variables globales deben ser declaradas globalesdentro de la funcin si van a ser utilizadas dentro de dicha funcin. Veamos unejemplo:El script anterior producir la salida "3". Al declarar $a y $b globales dentro de lafuncin, todas las referencias a tales variables se referirn a la versin global. Nohay 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 usandola matriz $GLOBALS. El ejemplo anterior se puede reescribir as:

  • 8/7/2019 php_avanzado

    52/120

    La matriz $GLOBALS es una matriz asociativa con el nombre de la variable globalcomo clave y los contenidos de dicha variable como el valor del elemento de lamatriz. $GLOBALS existe en cualquier mbito, esto pasa porque $GLOBALS es unasuperglobal. Aqui teneis un ejemplo que demuestra el poder de las superglobales:

  • 8/7/2019 php_avanzado

    53/120

    Ahora, cada vez que se llame a la funcin Test(), se representar el valor de $a yse incrementar.Las variables estticas tambin proporcionan una forma de manejar funcionesrecursivas. Una funcin recursiva es la que se llama a s misma. Se debe tenercuidado al escribir una funcin recursiva, ya que puede ocurrir que se llame a smisma indefinidamente. Hay que asegurarse de implementar una forma adecuadade terminar la recursin. La siguiente funcin cuenta recursivamente hasta 10,usando la variable esttica $count para saber cundo parar:

    En motor Zend 1, utilizado por PHP4, implementa los modificadores static y globalpara variables en trminos de referencias. Por ejemplo, una variable globalverdadera importada dentro del mbito de una funcin con global, crea unareferencia a la variable global. Esto puede ser causa de un comportamientoinesperado, tal y como podemos comprobar en el siguiente ejemplo:

  • 8/7/2019 php_avanzado

    54/120

    var_dump($obj);?>Al ejecutar este ejemplo obtendremos la siguiente salida: NULLobject(stdClass)(0) {}

    Un comportamiento similar se aplica a static. Referencias no son guardadasestticamente.Al ejecutar este ejemplo obtendremos la siguiente salida:Static object: NULLStatic object: NULL

    Static object: NULL

    Static object: object(stdClass)(1) { ["property"]=> int(1)

  • 8/7/2019 php_avanzado

    55/120

    }Este ejemplo demuestra que al asignar una referencia a una variable esttica, estano es recordada cuando se invoca la funcion &get_instance_ref() por segunda vez.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:Una variable variable toma el valor de una variable y lo trata como el nombre deuna variable. En el ejemplo anterior, hello, se puede usar como el nombre de unavariable utilizando dos signos de dlar. p.ej.

    En este momento se han definido y almacenado dos variables en el rbol desmbolos de PHP: $a, que contiene "hello", y $hello, que contiene "world". Es ms,esta sentencia:produce el mismo resultado que:

    Por ej. ambas producen el resultado: hello world.Para usar variables variables con matrices, hay que resolver un problema deambigedad. Si se escribe $$a[1] el intrprete necesita saber si nos referimos autilizar $a[1] como una variable, o si se pretenda utilizar $$a como variable y elndice [1] como ndice de dicha variable. La sintaxis para resolver esta ambigedades: ${$a[1]} para el primer caso y ${$a}[1] para el segundo.

    AvisoTener en cuenta que variables variables no pueden usarse conMatrices superglobales. Esto significa que no se pueden hacer cosas

    como ${$_GET}. Si buscais un mtodo para manejar la disponibilidadde superglobales y las antiguas HTTP_*_VARS, podeis intentarreferiros a ellas

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

    Name:
    Email:

  • 8/7/2019 php_avanzado

    56/120

    Dependiendo de tu configuracin y preferencias personales, existen muchasmaneras de acceder a los datos de tus formularios HTML. Algunos ejemplos:Ejemplo 12-2. Accediendo datos de un formulario simple HTML POSTUsando un formulario GET es similar excepto en el uso de variables predefinidas,

    que en este caso sern del tipo GET. GET tambin se usa con QUERY_STRING (lainformacin despues del smbolo '?' en una URL). Por ejemplohttp://www.example.com/test.php?id=3 contiene datos GET que son accesiblescon $_GET['id'].Nota: Matrices superglobales, como $_POST y$_GET, estn disponibles desde PHP4.1.0.Como hemos dicho, antes de PHP 4.2.0, el valor por defecto de register_globals eraon (activado). Y, en PHP 3 estba siempre activado. La comunidad PHP anima a noconfiar en esta directiva ya que es preferible asumir que tiene el valor off(desactivada) y programar teniendo en cuenta esto.

    Nota: La directiva de configuracin magic_quotes_gpc afecta a valores Get, Post yCookie, Si esta activada (on) el valor (It's "PHP!") sera convertidoautomaticamente a (It\'s \"PHP!\"). "Escaping" es necesario en inserciones a basesde datos.PHP tambien entiende matrices en el contexto de variables de formularios. (vea lafaq relacionada). Se puede, por ejemplo, agrupar juntas variables relacionadas usar esta caracterstica para obtener valores de una entrada "select2 mltiple. Porejemplo, vamos a mandar un formulario asi mismo y a presentar los datos cuandose reciban:Ejemplo 12-3. Variables de formulario ms complejas

  • 8/7/2019 php_avanzado

    57/120

    print_r($HTTP_POST_VARS); print 'Please try again';

    print '';} else {

    ?>

  • 8/7/2019 php_avanzado

    58/120

    setcookie("MyCookie[bar]", "Testing 2", time()+3600);?>Esto creara dos cookies separadas aunque MyCookie ser una matriz simple en elscript. Si se quiere definir una sola cookie con valores multiples, considerar primeroel uso de la funcin serialize() explode() en el valor.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 fuesendiferentes. As, para una aplicacin de carro de la compra se podra querermantener un contador e ir pasndolo. P.ej.Ejemplo 12-4. Ejemplo SetCookie Puntos en los nombres de variables de entrada

    Tpicamente, PHP no altera los nombres de las variables cuando se pasan a unscript. De todas formas, hay que notar que el punto no es un carcter vlido en elnombre de una variable PHP. Por esta razn:Lo que el intrprete ve es el nombre de una variable $varname, seguido por eloperador de concatenacin, y seguido por la prueba (es decir, una cadena sinentrecomillar 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 automticamentecualquier 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 lo necesita, no siempre resulta obvio de qu tipo es una variable dada en unmomento concreto. PHP incluye varias funciones que descubren de qu tipo es unavariable: gettype(), is_array(), is_float(), is_int(), is_object(), y is_string().

  • 8/7/2019 php_avanzado

    59/120

    Captulo 8. Constantes

    Una constante es un identificador para expresar un valor simple. Como el nombresugiere, este valor no puede variar durante la ejecucin del script. (Las constantesespeciales __FILE__ y __LINE__ son una excepcin a esto, ya que actualmente no

    lo soin). Una constante es sensible a maysculas por defecto. Por convencin, losidentificadores de constantes suelen declararse en maysculasEl nombre de una constante sigue las mismas reglas que cualquier etiqueta enPHP. Un nombre de constante vlido empieza con una letra o un caracter desubrayado, seguido por cualquier nmero de letras, nmeros, o subrayados. Sepodran expresar mediante la siguiente expresin regular:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*Nota: Para nuestros propsitos , entenderemos como letra los carcteres a-z, A-Z,y los ASCII del 127 hasta el 255 (0x7f-0xff).El alcanze de una constante es global, Es decir, es posible acceder a ellas sin

    preocuparse por el mbito de alcance.SintaxisSe puede definir una constante usando la funcin define(). Una vez definida, no

  • 8/7/2019 php_avanzado

    60/120

    puede ser modificada ni eliminada .Solo se puede definir como constantes valores escalares ( boolean, integer, float ystring ).Para obtener el valor de una constante solo es necesario especificar su nombre. Adiferencia de las variables, no se tiene que especificar el prefijo $. Tambien sepuede utilizar la funcin constant(), para obtener el valor de una constante, en el

    caso de que queramos expresarla de forma dinmica Usa la funcinget_defined_constants() parar obtener una lista de todas las constantes definidas.Nota: Las contantes y las variables (globales) se encuentran en un espacio denombres distinto. Esto implica que por ejemplo TRUE y $TRUE son diferentes.Si usas una constante todavia no definida, PHP asume que ests refirindote alnombre de la constante en si. Se lanzar un aviso si esto sucede. Usa la funcindefined() para comprobar la existencia de dicha constante.Estas son las diferencias entre constantes y variables:

    Las constantes no son precedidas por un smbolo de dolar ($) Las contantes solo pueden ser definidas usando la funcin() define , nunca

    por simple asignacin Las constantes pueden ser definidas y accedidas sin tener en cuenta las

    reglas de alcanze del mbito. Las constantes no pueden ser redefinidas o eliminadas despues de

    establecerse; y Las constantes solo puede albergar valores escalares

    Ejemplo 13-1. Definiendo constantesConstantes predefinidasPHP ofrece un largo nmero de constantes predefinidas a cualquier script enejecucin. Muchas de estas constantes, sin embargo, son creadas por diferentesextensiones, y solo estarn presentes si dichas extensiones estn disponibles, bienpor carga dinmica o porque has sido compiladas.

  • 8/7/2019 php_avanzado

    61/120

    Captulo 9. Expresiones

    Las expresiones son la piedra angular de PHP. En PHP, casi cualquier cosa queescribes es una expresin. La forma ms simple y ajustada de definir unaexpresin es "cualquier cosa que tiene un valor".Las formas ms bsicas de expresiones son las constantes y las variables. Cuandoescribes "$a = 5", ests asignando '5' a $a. '5', obviamente, tiene el valor 5 , enotras palabras '5' es una expresin con el valor 5 (en este caso, '5' es unaconstante entera).Despus de esta asignacin, se espera que el valor de $a sea 5 tambin, demanera que si escribes $b = $a, se espera tambin que se comporte igual que siescribieses $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:

  • 8/7/2019 php_avanzado

    62/120

    ?>Suponiendo que ests familiarizado con el concepto de funciones (si no lo estschale un vistazo al captulo sobre funciones), asumirs que teclear $c = foo() esesencialmente lo mismo que escribir $c = 5, y has acertado. Las funciones sonexpresiones que valen el valor que retornan. Como foo() devuelve 5, el valor de laexpresin '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 nolo sean. PHP soporta tres tipos escalares: enteros, punto flotante y cadenas (lostipos escalares son aquellos cuyos valores no pueden 'dividirse' en partes menores,no como los arrays, por ejemplo). PHP tambin soporta dos tipos compuestos (noescalares): arrays y objetos. Se puede asignar cada uno de estos tipos de valor avariables o bien retornarse de funciones, sin ningn tipo de limitacin.Hasta aqu, los usuarios de PHP/FI 2 no deberan haber notado ningn cambio. Sinembargo, 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 dosvalores involucrados, el valor de la constante entera '5', y el valor de $a que estsiendo actualizado tambin a 5. Pero la verdad es que hay un valor adicionalimplicado aqu, y es el valor de la propia asignacin. La asignacin misma seevala 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 estamanera, escribir algo como '$b = ($a = 5)' es como escribir '$a = 5; $b = 5;' (unpunto y coma marca el final de una instruccin). Como las asignaciones se evalande 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 sonarla notacin variable++ y variable--. Esto son las operaciones de incremento ydecremento. En PHP/FI 2, la instruccin '$a++' no tiene valor (no es unaexpresin), y no puedes asignarla o usarla de ningn otro modo. PHP mejora lascaractersticas del incremento/decremento hacindolos tambin expresiones, comoen C. En PHP, como en C, hay dos tipos de incremento - pre-incremento ypost-incremento. Ambos, en esencia, incrementan la variable y el efecto en lavariable es idntico. La diferencia radica en el valor de la propia expresionincremento. El preincremento , escrito '++$variable', se evala al valorincrementado (PHP incrementa la variable antes de leer su valor, de ah el nombre

    'preincremento'). El postincremento, escrito '$variable++', se evala al valororiginal de $variable antes de realizar el incremento (PHP incrementa la variabledespus de leer su valor, de ah el nombre 'postincremento').Un tipo muy corriente de expresiones son las expresiones de comparacin. Estasexpresiones se evalan a 0 o 1, significando FALSO (FALSE) o VERDADERO (TRUE),respectivamente. PHP soporta > (mayor que), >= (mayor o igual que), == (igualque), != (distinto),

  • 8/7/2019 php_avanzado

    63/120

    '$a + 3' se evala al valor de $a ms 3, y se asigna de nuevo a $a, lo que resultaen incrementar $a en 3. En PHP, como en otros lenguajes como C, puedes escribiresto de una forma ms concisa, que con el tiempo ser ms clara y tambin fcilde entender. Aadir 3 al valor actual de $a se puede escribir como '$a += 3'. Estoquiere decir exactamente "toma el valor de $a, smale 3, y asgnalo otra vez a $a".Adems de ser ms corto y claro, tambin resulta en una ejecucin ms rpida. El

    valor de '$a += 3', como el valor de una asignacin normal y corriente, es el valorasignado. Ten en cuenta que NO es 3, sino el valor combinado de $a ms 3 (se esel valor asignado a $a). Cualquier operacin binaria puede ser usada en forma deoperador-asignacin, por ejemplo '$a -= 5' (restar 5 del valor de $a), '$b *= 7'(multiplicar el valor de $b por 7), etc.Hay otra expresin que puede parecer extraa si no la has visto en otros lenguaes,el operador condicional ternario:

    Si el valor de la primera subexpresin es verdadero (distinto de cero), entonces seevala la segunda subexpresin, si no, se evala la tercera y se es el valor.El siguiente ejemplo te ayudar a comprender un poco mejor el pre y postincremento y las expresiones en general:Al principio del captulo hemos dicho que describiramos los distintos tipos deinstrucciones y, como prometimos, las expresiones pueden ser instrucciones. Sinembargo, no todas las expresiones son instrucciones. En este caso, una instruccintiene la forma 'expr' ';', es decir, una expresin seguida de un punto y coma. En'$b=$a=5;', $a=5 es una expresin vlida, pero no es una instruccin en s misma.Por otro lado '$b=$a=5:' s es una instruccin vlida.