Manual oficial de php5
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Manual oficial de php5

  • 9,826 views
Uploaded on

manual inicial de php todo lo que necesitas

manual inicial de php todo lo que necesitas

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
9,826
On Slideshare
9,826
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
20
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Manual de PHP by: Mehdi Achour Friedhelm Betz Antony Dovgal Nuno Lopes Hannes Magnusson Georg Richter Damien Seguy Jakub Vrana Y muchos otros 2010-04-09 Edited By: Philip Olson by: Coordinado por: Yago Ferrer Traductores actuales: Pedro Antonio Gil Rodríguez Francisco José Naranjo Abad Jesús Ruiz García Juan Pablo Berdejo y muchos más. Para ayudarnos a traducir ponte en contacto con: yago[arroba]php.net © 1997-2010 the PHP Documentation Group Copyright Copyright © 1997 - 2010 por el PHP Documentation Group. Este material puede ser distribuido solamente sujeto a los términos y condiciones establecidos por la licencia de Creative Commons Attribution 3.0 o superior. Una copia de la Licencia de Commons Attribution 3.0 está distribuida con este manual. La versión más reciente está disponible en » http://creativecommons.org/licenses/by/3.0/. Si está interesado en su redistribución o republicación de este documento completa o parcialmente, con modificaciones o sin, y si tiene preguntas, por favor contacte a los propietarios del Copyright en » doclicense@lists.php.net. Note que esta dirección está ligada a una lista de correo pública. Manual de PHP Prefacio PHP, acrónimo de "PHP: Hypertext Preprocessor", es un lenguaje "Open Source" interpretado de alto nivel, especialmente pensado para desarrollos web y el cual puede ser incrustado en páginas HTML. La mayoría de su sintaxis es similar a C, Java y Perl y es fácil de aprender. La meta de este lenguaje es
  • 2. permitir escribir a los creadores de páginas web, páginas dinámicas de una manera rápida y fácil, aunque se pueda hacer mucho más con PHP. Este manual contiene principalmente una referencia de funciones PHP, también contiene una referencia del lenguaje, explicaciones de algunas de las características importantes de PHP otra información suplementaria. Este manual se puede conseguir en diferentes formatos en » http://www.php.net/download-docs.php. Más información sobre como este manual es desarrollado puede encontrarse en el apéndice 'Sobre este manual'. Si está interesado en la Historia de PHP, visite el capítulo correspondiente. Authors and Contributors We highlight the currently most active people on front page of the manual, but there are many more contributors who currently help in our work or have provided a great amount of help to the project in the past. There are a lot of unnamed people who help out with user notes on manual pages, which continually get included in the references, the work of whom we are also very thankful for. All of the lists provided below are in alphabetical order. Authors and Editors The following contributors should be recognized for the impact they have made and/or continue to make by adding content to the manual: Bill Abt, Jouni Ahto, Alexander Aulbach, Daniel Beckham, Stig Bakken, Nilgün Belma Bugüner, Jesus M. Castagnetto, Ron Chmara, Sean Coates, John Coggeshall, Simone Cortesi, Peter Cowburn, Daniel Egeberg, Markus Fischer, Wez Furlong, Sara Golemon, Rui Hirokawa, Brad House, Pierre-Alain Joye, Etienne Kneuss, Moriyoshi Koizumi, Rasmus Lerdorf, Andrew Lindeman, Stanislav Malyshev, Rafael Martinez, Rick McGuire, Kalle Sommer Nielsen, Yasuo Ohgaki, Richard Quadling, Derick Rethans, Rob Richards, Sander Roobol, Egon Schmid, Thomas Schoefbeck, Sascha Schumann, Dan Scott, Masahiro Takagi, Yannick Torres, Michael Wallner, Lars Torben Wilson, Jim Winstead, Jeroen van Wolffelaar and Andrei Zmievski. The following contributors have done significant work editing the manual: Stig Bakken, Gabor Hojtsy, Hartmut Holzgraefe and Egon Schmid. User Note Maintainers The currently most active maintainers are: Daniel Brown, Nuno Lopes, Felipe Pena, Thiago Pojda and Maciek Sokolewicz. These people have also put a lot of effort into managing user notes: Mehdi Achour, Daniel Beckham, Friedhelm Betz, Victor Boivie, Jesus M. Castagnetto, Nicolas Chaillan, Ron Chmara, Sean Coates, James Cox, Vincent Gevers, Sara Golemon, Zak Greant, Szabolcs Heilig, Oliver Hinckel, Hartmut Holzgraefe, Etienne Kneuss, Rasmus Lerdorf, Matthew Li, Andrew Lindeman, Aidan Lister, Hannes Magnusson, Maxim Maletsky, Bobby Matthis, James Moore, Philip Olson, Sebastian Picklum, Derick Rethans, Sander Roobol, Damien Seguy, Jason Sheets, Tom Sommer, Jani Taskinen, Yasuo Ohgaki, Jakub Vrana, Lars Torben Wilson, Jim Winstead, Jared Wyles and Jeroen van Wolffelaar. • Prefacio
  • 3. Conceptos Básicos Introducción Table of Contents • • ¿Qué es PHP? ¿Qué se puede hacer con PHP? ¿Qué es PHP? PHP (acrónimo de PHP: Hypertext Preprocessor) es un lenguaje de código abierto muy popular especialmente adecuado para desarrollo web y que puede ser incrustado en HTML. Una respuesta corta y concisa, pero, ¿qué significa realmente? Un ejemplo nos aclarará las cosas: Example #1 Un ejemplo introductorio <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Example</title> </head> <body> <?php echo "Hola, ¡soy un script PHP!"; ?> </body> </html> En lugar de usar muchos comandos para mostar HTML (como en C o Perl), páginas PHP contienen HTML con código incluido en el mismo que hace "algo" (en este caso, mostrar "Hola ¡soy un script PHP!). El código PHP está entre medio de etiquetas de comienzo y final especiales<?php y ?> que nos permitirán entrar y salir del "modo PHP". Lo que distingue a PHP de algo lado-cliente como Javascript, es que el código es ejecutado en el servidor, generando HTML y enviándolo al cliente. El cliente recibirá los resultados de ejecutar el script, sin ninguna posibilidad de determinar qué código ha producido el resultado recibido. El servidor web puede ser incluso configurado para que procese todos los archivos HTML con PHP y entonces no hay manera que los usuarios puedan saber que tienes debajo de la manga.
  • 4. Lo mejor de usar PHP es que es extremadamente simple para el principiante, pero a su vez, ofrece muchas características avanzadas para los programadores profesionales. No sienta miedo de leer la larga lista de características de PHP, en poco tiempo podrá empezar a escribir sus primeros scripts. Aunque el desarrollo de PHP está centrado en programación de scripts en lado-servidor, se puede utilizar para muchas otras cosas. Siga leyendo y descubra más sobre PHP en la sección ¿Qué se puede hacer con PHP? o vaya directo al tutorial de introducción si solamente está interesado en programación web. ¿Qué se puede hacer con PHP? PHP puede hacer cualquier cosa que se pueda hacer con un script CGI, como procesar la información de formularios, generar páginas con contenidos dinámicos, o enviar y recibir cookies. Y esto no es todo, se puede hacer mucho más. Existen principalmente tres campos en los que se usan scripts en PHP. • • • Scripts del lado-servidor. Este es el campo más tradicional y el principal foco de trabajo. Se necesitan tres cosas para que esto funcione. El intérprete PHP (CGI módulo), un servidor web y un navegador. Es necesario hacer funcionar el servidor, con PHP instalado. El resultado del programa PHP se puede obtener a través del navegador, conectándose con el servidor web. Consultar la sección Instrucciones de instalación para más información. Scripts en la línea de comandos. Puede crear un script PHP y correrlo sin necesidad de un servidor web o navegador. Solamente necesita el intérprete PHP para usarlo de esta manera. Este tipo de uso es ideal para scripts ejecutados regularmente desde cron (en *nix o Linux) o el Planificador de tareas (en Windows). Estos scripts también pueden ser usados para tareas simples de procesamiento de texto. Consultar la sección Usos de PHP en la línea de comandos para más información. Escribir aplicaciones de interfaz gráfica. Probablemente PHP no sea el lenguaje más apropiado para escribir aplicaciones gráficas, pero si conoce bien PHP, y quisiera utilizar algunas características avanzadas en programas clientes, puede utilizar PHP-GTK para escribir dichos programas. También es posible escribir aplicaciones independientes de una plataforma. PHP-GTK es una extensión de PHP, no disponible en la distribución principal. Si está interesado en PHPGTK, puedes visitar las » páginas web del proyecto. PHP puede ser utilizado en cualquiera de los principales sistemas operativos del mercado, incluyendo Linux, muchas variantes Unix (incluyendo HP-UX, Solaris y OpenBSD), Microsoft Windows, Mac OS X, RISC OS y probablemente alguno más. PHP soporta la mayoría de servidores web de hoy en día, incluyendo Apache, Microsoft Internet Information Server, Personal Web Server, Netscape e iPlanet, Oreilly Website Pro server, Caudium, Xitami, OmniHTTPd y muchos otros. PHP tiene módulos disponibles para la mayoría de los servidores, para aquellos otros que soporten el estándar CGI, PHP puede usarse como procesador CGI. De modo que, con PHP tiene la libertad de elegir el sistema operativo y el servidor de su gusto. También tiene la posibilidad de usar programación procedimental o programación orientada a objetos. Aunque no todas las características estándar de la programación P.O.O. están implementadaS en PHP 4, muchas bibliotecas y aplicaciones grandes (incluyendo la biblioteca PEAR) están escritas usando íntegramente P.O.O. PHP 5 soluciona los puntos flacos de P.O.O en PHP 4 e introduce soporte completo para objectos. Con PHP no se encuentra limitado a resultados en HTML. Entre las habilidades de PHP se incluyen: creación de imágenes, archivos PDF e incluso películas Flash (usando libswf y Ming) sobre la marcha. Tambié puede presentar otros resultados, como XHTML y cualquier otro tipo de ficheros XML. PHP
  • 5. puede autogenerar éstos archivos y almacenarlos en el sistema de archivos en vez de presentarlos en la pantalla, creando un caché en el lado-servidor para contenido dinámico. Quizás la característica más potente y destacable de PHP es su soporte para una gran cantidad de bases de datos. Escribir un interfaz vía web para una base de datos es una tarea increíblemente simple con PHP. Las siguientes bases de datos están soportadas actualmente: • • • • • • • • • • • • • • • • • • • • • • Adabas D dBase Empress FilePro (solo lectura) Hyperwave IBM DB2 Informix Ingres InterBase FrontBase mSQL Direct MS-SQL MySQL ODBC Oracle (OCI7 y OCI8) Ovrimos PostgreSQL SQLite Solid Sybase Velocis Unix dbm También tenemos abstracción de base de datos (llamada PDO) que permite usar de forma transparente cualquier base de datos soportada por la extensión. Adicionalmente, PHP soporta ODBC (el Estándar Abierto de Conexión con Bases de Datos), asi que puede conectarse a cualquier base de datos que soporte tal estándar. PHP también cuenta con soporte para comunicarse con otros servicios usando protocolos tales como LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (en Windows) y muchos otros. También se pueden crear sockets puros e interactuar usando cualquier otro protocolo. PHP soporta WDDX para el intercambio de datos entre lenguajes de programación en web. Y hablando de interconexión, PHP puede utilizar objetos Java de forma transparente como objetos PHP Y la extensión de CORBA puede ser utilizada para acceder a objetos remotos. PHP tiene unas características muy útiles para el procesamiento de texto, desde expresiones regulares POSIX extendidas o tipo Perl hasta procesadores de documentos XML. Para procesar y acceder a documentos XML, PHP 4 soportama los estándares SAX y DOM y también Puede utilizar la extensión XSLT para transformar documentos XML. PHP 5 estandariza todas las extensiones XML en una sólida base de libxml2 y extiende las características establecer añadir SimpleXML y soporte para XMLReader. Para terminar, contamos con muchas otras extensiones muy interesantes, las funciones del motor de búsquedas mnoGoSearch, funciones para pasarelas de IRC, utilidades de compresión (gzip, bz2), conversión de calendarios, traducción .... Como puede apreciar, esta página no es suficiente para enumerar todas las características y beneficios que PHP ofrece. Consulte las secciones Instalación de PHP y Referencia de las funciones para una explicación de las extensiones mencionadas aquí.
  • 6. Un tutorial sencillo Table of Contents • • • • • • What do I need? Su primera página con PHP Algo útil Uso de Formularios Using old code with new versions of PHP ¿Y ahora qué? A continuación, nos gustaría mostrate las bases de PHP en un corto y sencillo tutorial. Este documento explica cómo crear páginas web dinámicas con PHP, aunque PHP no solamente es capaz de crear páginas web. Consulte la sección titulada ¿Qué se puede hacer con PHP? para más información. Las páginas web que usan PHP se tratan igual que páginas HTML comunes y corrientes, y se pueden crear o editar de la misma manera que normalmente crea páginas HTML. What do I need? En este manual asumimos que cuenta con un servidor que soporta PHP y que todos los archivos con la extensión .php son usados por PHP. En la mayoría de servidores, ésta es la extensión que toman los archivos PHP por defecto, pero pregunte al administrador de su servidor para estar seguro. Si su servidor soporta PHP, entonces no necesita hacer nada, solamente crear sus archivos .php y guardarlos en su directorio web y el servidor los analizará por usted. No hay necesidad de compilar nada o instalar otras herramientas. Mírelo de esta manera, los archivos PHP son tan simples como archivos de HTML con el añadido de una nueva familia de etiquetas que permiten todo tipo de cosas. La mayoría de las compañías de hospedaje de páginas web ofrecen el soporte que necesita para usar PHP, pero si por alguna razón ellos no lo hacen, considere leer la sección titulada » Recursos PHP para más información acerca de compañías de hospedaje que soportan PHP. Digamos que quiere ahorrar preciado ancho de banda y programar en local. En este caso, querrá instalar un servidor web, como » Apache, y por supuesto » PHP. Lo más seguro es que también quiera instalar una base de datos como » MySQL. Instálelos de forma independientemente o bien puede elegir una manera más sencilla. Nuestro manual contiene Instrucciones de instalación de PHP (asumiendo que tiene algún tipo de servidor web ya configurado). En el caso que tenga problemas con la instalación, sugerimos que haga sus preguntas en nuestra » lista de correo de instalación. Si elige la manera más sencilla, entonces » localice paquete preconfigurado para su sistema operativo, incluyendo MacOSX, Linux y Windows. En Linux, quizá encuentra que » rpmfind y » PBone le son de ayuda para encontrar los RPMs. Para encontrar paquetes para Debian quizá quiera visitar » apt-get.
  • 7. Su primera página con PHP Comienze por crear un archivo llamado hola.php y póngalo en el "directorio raíz" (DOCUMENT_ROOT) con el siguiente contenido: Example #1 Nuestro primer script PHP: hola.php <html> <head> <title>Ejemplo PHP</title> </head> <body> <?php echo '<p>Hola Mundo</p>'; ?> </body> </html> Utilice su navegador web para acceder al archivo en su servidor, con la URL terminando en /hola.php. Si está programando localmente este URL será algo como http://localhost/hola.php o http://127.0.0.1/hola.php pero esto depende de la configuración de su servidor web. Si todo está configurado correctamente, el fichero será analizado por PHP y el siguiente contenido aparecerá en su navegador: <html> <head> <title>Ejemplo PHP</title> </head> <body> <p>Hola mundo</p> </body> </html> Este script es extremadamente simple y no es necesario usar PHP para crear una página como esta. Lo único que muestra es: Hola mundo usando la función de PHP echo(). El fichero no debe ser ejecutable o especial de ninguna forma. El servidor reconoce que este fichero debe ser interpretado por PHP porque estamos usando la extensión ".php", el cuál está configurado para enviarlo a PHP. Piensa como si fuera un fichero HTML normal el cual tiene una serie de etiquetas especiales disponibles con las que puedes hacer muchas cosas interesantes. Si ha intentado usar este ejemplo y no produjo ningún resultado, preguntando si deseaba descargar el archivo, o mostró todo el archivo como texto, lo más seguro es que PHP no se encuentra habilitado en su servidor. Pídale a su administrador que active esta función usando el capítulo titulado Instalación en el manual. Si está trabajando localmente, lea también el capítulo dedicado a la instalación para asegurarse de que todo esté configurado apropiadamente. Asegúrese que está accediendo al fichero vía http a través del servidor para mostrar el resultado. Si está abriendo el archivo desde el sistema de archivos, entonces probablemente no estará siendo analizado por PHP. Si el problema persiste no dude en usar alguna de las múltiples opciones de » Soporte de PHP. El objetivo de este ejemplo es demostrar cómo puede usar el formato especial de las etiquetas PHP. En este ejemplo usamos <?php para indicar el inicio de la etiqueta PHP. Después indicamos la sentencia y abandonamos el modo PHP usando ?>. Puede salir de PHP y regresar cuantas veces lo desee usando este método. Para más información, puede leer la sección en el manual titulada Sintaxis básica de PHP. Note: Anotación los avances de línea Los avances de línia tienen poco sentido en HTML, igualmente sigue siendo buena idea hacer que el código HTML se vea limpio y bien, poniendo avances de línea. PHP automáticamente eliminará los avances de línea puestos inmediatamente después de cerrar ?>. Esto puede ser
  • 8. muy útil si pone muchos bloques de PHP o incluye ficheros que contienen PHP que no se supone que deban mostarar nada. Al mismo tiempo, puede resultar un poco confuso. Se puede poner un espacio después de cerrar ?> para forzar el mostrar un espacio y un avance de línea , o se puede poner un avance de línea explícitamente en el último echo o print dentro de tu bloque en PHP. Note: Anotación acerca de editores de texto Hay muchos editores de texto y Entornos Integrados de Desarrollo (IDE por sus siglas en Inglés) 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 página mencionada anteriormente, y comunique su recomendación a las personas encargadas del mantenimiento para que lo incluyan en la lista. Contar con un editor que resalte la sintaxis de PHP puede ser de mucha ayuda. Note: Anotación acerca de los procesadores de texto Los procesadores de texto como StarOffice Writer, Microsoft word y Abiword no son buenas opciones para editar archivos de PHP. Si desea usar uno de éstos programas para probar sus scripts, primero debe asegurarse de guardar el documento en texto sin formato o PHP no será capaz de leer y ejecutar el script. Note: Una nota acerca del "Bloc de Notas de Windows" Si escribe sus archivos PHP usando el "Bloc de Notas de Windows", debe asegurarse de que sus archivos sean guardados con la extensión .php (El Bloc de Notas automáticamente añade la extensión .txt a los archivos a menos que tome los siguientes pasos para prevenirlo). Cuando guarde sus archivos y el programa le pregunte qué nombre le desea 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 la opción "Todos los archivos *.*". Aquí puede escribir el nombre del archivo sin las comillas. Ahora que ha creado un pequeño script de PHP que funciona correctamente, es hora de trabajar con el script de PHP más famoso; vamos a hacer una llamada a la función phpinfo() para obtener información acerca de su sistema y configuración como las variables predefinidas disponibles, los módulos utilizados por PHP, y las diferentes opciones de configuración. Tomemos algo de tiempo para revisar esta información. Example #2 Obtener la información del sistema desde PHP <?php phpinfo(); ?> Algo útil Hagamos ahora algo que puede ser más útil. Vamos a comprobar qué clase de navegador está utilizando el usuario. Para hacerlo, vamos a consultar la información que el navegador nos envía como parte de su petición HTTP. Esta información es guardada en una variable. Las variables siempre comienzan con un signo de dólar ("$") en PHP. La variable que vamos a utilizar en esta situación es $_SERVER['HTTP_USER_AGENT']. Note: $_SERVER es una variable especial reservada por PHP que contiene toda la información del servidor web. Es conocida como Superglobal. Consulte el manual en su sección titulada Superglobales para más información. Éstas variables especiales fueron introducidas en la versión » 4.1.0 de PHP. Antes podíamos usar las arrays $HTTP_*_VARS,
  • 9. tales como $HTTP_SERVER_VARS. Aunque éstas han sido marcadas como obsoletas, tales arrays todavía existen. (También puede echar un vistazo a las notas relacionadas con el código antiguo.) To display this variable, you can simply do: Example #1 Imprimir una variable (Elemento array) <?php echo $_SERVER['HTTP_USER_AGENT']; ?> Un ejemplo del resultado de esta secuencia de comandos sería: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Hay muchos tipos de variables en PHP. En el ejemplo anterior imprimimos una array. Las arrays pueden ser muy útiles. $_SERVER es simplemente una variable que se encuentra disponible automáticamente en PHP. Puede encontrar una lista en la sección titulada Variables Reservadas del manual, o puede generar una lista completa creando un archivo como el ejemplo de la sección anterior. Puede usar más de un declaración PHP dentro de una etiqueta PHP, y crear pequeños segmentos de código que pueden hacer más que un único echo. Por ejemplo, si quisiéramos detectar el uso de Internet Explorer, haríamos algo así: Example #2 Ejemplo usando estructuras de control y functiones <?php if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) { echo 'Está usando Internet Explorer.<br />'; } ?> Un ejemplo del resultado de esta secuencia de comandos sería: Está usando Internet Explorer.<br /> A continuación introduciremos un par de conceptos nuevos. Tenemos una declaración if. Si está familiarizado con la sintaxis básica del lenguaje C, esto se vera lógico, Pero si no entiende C, u otros lenguajes de programación donde encuentra la sintaxis usada anteriormente, probablemente debería conseguir un libro que le introduzca mejor a PHP, y lea los primeros capítulos, o también puede ver la parte del manual titulada Referencia del lenguaje parte del manual. El segundo concepto que introducimos fue la función llamada strstr(). strstr() es una función integrada de PHP que busca un cadena dentro de otra cadena. En este caso anterior estamos buscando 'MSIE' (llamado aguja) dentro de $_SERVER['HTTP_USER_AGENT'] (llamado pajar). Si la cadena fue encontrada, la función devolverá la posición de la aguja relativa al inicio del pajar. De lo contrario devolverá FALSE. Si no devuelve FALSE, la declaración if se evalúa a TRUE y el código adentro de las llaves {} es ejecutado. De lo contrario, el código no será ejecutado. Tómese la libertad de crear ejemplos similares usando if, else, y otras funciones como strtoupper() y strlen(). Cada página del manual contiene ejemplos que puede usar. Si no está seguro sobre el modo de uso éstas funciones, es recomendable que lea las páginas del manual tituladas Cómo leer una definición de función y la sección relacionada a Funciones en PHP.
  • 10. Podemos continuar y demostrar cómo puede saltar adentro y afuera del modo PHP en el medio de un bloque de código: Example #3 Mezcla de los modos HTML y PHP <?php if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) { ?> <h3>strpos() debe haber devuelto no falso</h3> <p>Está usando Internet Explorer</p> <?php } else { ?> <h3>strpos() debió devolver algo diferente de falso</h3> <p>No está usando Internet Explorer</p> <?php } ?> Un ejemplo del resultado de la secuencia de comandos podría ser: <h3>strpos() debe haber devuelto falso</h3> <p>Está usando Internet Explorer</p> En vez de usar una sentencia PHP echo para demostrar algo, saltamos fuera del código PHP y escribimos solamente HTML. Este es un punto muy importante y potente que debemos observar aquí, y es que la fluidez lógica de la secuencia de comandos permanece intacta. Sólamente las partes donde hay bloques HTML serán enviadas al visor dependiendo del resultado que strstr() devuelva. En otras palabras, si la cadena MSIE fue encontrada o no. Uso de Formularios Otra de las características más importantes de PHP es que gestiona formularios HTML. El concepto básico que es importante entender es que cualquier elemento de los formularios estará disponible automáticamente en su código PHP. Por favor lea la sección del manual titulada Variables fuera de PHP para más información y ejemplos sobre cómo usar formularios HTML con PHP. Observemos un ejemplo: Example #1 A simple HTML form <form action="accion.php" method="post"> <p>Su nombre: <input type="text" name="nombre" /></p> <p>Su edad: <input type="text" name="edad" /></p> <p><input type="submit" /></p> </form> No hay nada especial en este formularo, es solamente HTML sin ninguna clase de etiquetas especiales de ningún tipo. Cuando el usario rellena éste formulario y oprime el botón Submit, una página titulada action.php es llamada. En este archivo encontrará algo así: Example #2 Printing data from our form Hola <?php echo htmlspecialchars($_POST['nombre']); ?>.
  • 11. Usted tiene <?php echo (int)$_POST['edad']; ?> años de edad. Un ejemplo del resultado de esta secuencia de comandos puede ser: Hola José. Usted tiene 22 años de edad. Aparte de las funciones htmlspecialchars() y (int), debería ser obvio de que hace el código. htmlspecialchars() se asegura que todos los caracteres que son especiales en html sean codificados adecuadamente de manera que nadie pueda inyectar etiquetas HTML o Javascript en tu página web. El campo edad, como sabemos que es un número, podemos convertirlo en un integer que automáticamente se deshará de cualquier carácter no numérico. También puede hacer lo mismo con PHP con la extensión filter Las variables $_POST['nombre'] y $_POST['edad'] son establecidas automáticamente por PHP. Anteriormente hemos usado la superglobal $_SERVER y ahora estamos apunto de introducirte la superglobal $_POST que contiene todos los datos del POST. Dese cuenta que el método de nuestro formulario es POST. Si usa el método fuera GET entoces los datos del formulario estarían en la superglobal $_GET. en lugar de POST. En su lugar también puedes usar la superglobal $_REQUEST, si no le importa el tipo de datos enviados desde el formulario. Contiene toda la información de GET, POST y COOKIE. Vea también la función import_request_variables(). You can also deal with XForms input in PHP, although you will find yourself comfortable with the well supported HTML forms for quite some time. While working with XForms is not for beginners, you might be interested in them. We also have a short introduction to handling data received from XForms in our features section. Using old code with new versions of PHP Ahora que PHP ha crecido y se ha convertido en un lenguaje popular, hay muchos más repositorios y librerias que contienen código que puede reusar. Los desarrolladores de PHP han tratado en toda medida que sea compatible con versiones anteriores, es decir, si una secuencia de comandos fue escrita para una versión antigua en principio funcionaría (idealmente) sin ningún cambio en una versión reciente de PHP. A la práctica, usualmente algunos cambios son necesarios. Dos de los cambios mas importantes que afectan el código viejo son: • • La desaparición de las antiguas arrays $HTTP_*_VARS (que usualmente son usadas como globales al interior de una función o método). Las siguientes variables superglobales que fueron introducidas en la versión » 4.1.0 de PHP. Son: $_GET, $_POST, $_COOKIE, $_SERVER, $_FILES, $_ENV, $_REQUEST, y $_SESSION. Las antiguas $HTTP_*_VARS, como $HTTP_POST_VARS, todavía existen. A partir de PHP 5.0.0, las arrays de tipo long variables predefinidas se pueden desactivar con la directiva register_long_arrays . Las variables externas ya no son registradas globalmente de forma automática, por defecto. En otras palabras, a partir de PHP » 4.2.0, la directiva PHP register_globals está off por defecto en php.ini. El método preferido para obtener acceso a éstos valores es por medio de las variables superglobales mencionadas anteriormente. Antiguas secuencias de comandos, libros y tutoriales antiguos puede que asuman que ésta directiva es está definida como on. Si es así, puede usar, por ejemplo, $id desde la URL http://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. Para más información relacionada con estos cambios, puede ver la sección sobre variables predefinidas y los enlaces que hay dentro.
  • 12. ¿Y ahora qué? Con sus nuevos conocimientos debería ser capaz de entender la mayoría del manual y de los diversos scripts de ejemplo disponibles en los archivos. Puede encontrar otros ejemplos en la sección de enlaces de php.net: » http://www.php.net/links.php. Para ver varias presentaciones que muestra más acerca de lo que puede hacer PHP, visite los diferentes sitios con material relacionado a las conferencias realizadas: » http://talks.php.net/ • • Introducción • ¿Qué es PHP? • ¿Qué se puede hacer con PHP? Un tutorial sencillo • What do I need? • Su primera página con PHP • Algo útil • Uso de Formularios • Using old code with new versions of PHP • ¿Y ahora qué? Instalación y configuración Consideraciones generales de instalación Antes de empezar la instalación, primero se necesita saber para que se quiere utilizar PHP. Exiten tres campos principales donde se puede utilizar PHP tal y como se describe en la sección: ¿Qué se puede hacer con PHP? • • • Aplicaciones web y sitios web (scripting en el lado servidor) Scripting en la línea de comandos Aplicaciones de Escritorio (GUI) Para la primera forma mencionada, que es la más común, se necesitan tres cosas: PHP, un servidor web y un navegador web. Seguramente ya dispone del navegador web y dependiendo del el sistema operativo, quizá ya tiene un servidor web (p.e.j. Apache en Linux y MacOS X; IIS en Windows). Posiblemente esté alquilando espacio web en una empresa. De esta forma, no se necesita instalar nada, solo tiene que escribir sus scripts PHP, subirlos al servidor que está alquiando y ver los resultados en su navegador. En caso de configurar el servidor y PHP por su cuenta, existen dos opciones para el método de conexión de PHP con el servidor. Para muchos tipos servidores PHP tiene un módulo de interfaz directo (también llamado SAPI). Incluídos los servidores Apache, Microsoft Internet Information Server, Netscape y
  • 13. iPlanet. Otros muchos servidores tienen soporte para ISAPI, el módulo de interfaz de Microsoft (OmniHTTPd por ejemplo). Si PHP no tiene un módulo de soporte para su servidor web, siempre puede usarlo como GCI o FastGCI. Esto significa configurar el servidor para usar el CGI ejecutable de PHP para procesar cada una de las peticiones a ficheros PHP en el servidor. Si también está interesado en usar PHP bajo la línea de comandos (p.e.j. escribir que autogeneran imágenes de forma offline, o procesar ficheros de texto dependiendo de según que argumentos se le pasa), para este tipo de scripts necesitarás que sea ejecutado en la línea de comandos. Para más información, leer la sección sobre escribir aplicaciones para la línea de comandos. En este caso, no se necesita servidor o navegador. Con PHP también se pueden escribir aplicaciones de escritorio GUI usando la extensión PHP-GTK extension. No tiene nada que ver con escribir páginas web, ya que no se muestra ningún HTML, pero gestiona ventanas y objetos con el. Para más información acerca de PHP-GTK, por favor » visita el sitio dedicado a esta extensión. PHP-GTK no está incluido en la distribución oficial de PHP. A partir de ahora, esta sección trata de la configuración de PHP para servidores web de Unix y Windows con módulos de interfaz de servidor o como ejecutables CGI. También se puede encontrar información sobre ejecutables en la línea de comandos ejecutables en las siguientes secciones. El código fuente y las distribuciones binarias para Windows pueden encontrarse en » http://www.php.net/ downloads.php. Recomendamos ejegir un » mirror que esté cerca de usted para descargar las distribuciones. Installation on Unix systems Table of Contents • • • • • • • • • • • Apache 1.3.x on Unix systems Apache 2.x on Unix systems Lighttpd 1.4 on Unix systems Caudium fhttpd related notes Sun, iPlanet and Netscape servers on Sun Solaris CGI and command line setups Notas de instalación específicas para HP-UX OpenBSD installation notes Solaris specific installation tips Notas de instalación en Debian GNU/Linux This section will guide you through the general configuration and installation of PHP on Unix systems. Be sure to investigate any sections specific to your platform or web server before you begin the process. As our manual outlines in the General Installation Considerations section, we are mainly dealing with web centric setups of PHP in this section, although we will cover setting up PHP for command line usage as well. There are several ways to install PHP for the Unix platform, either with a compile and configure process, or through various pre-packaged methods. This documentation is mainly focused around the process of compiling and configuring PHP. Many Unix like systems have some sort of package installation system.
  • 14. This can assist in setting up a standard configuration, but if you need to have a different set of features (such as a secure server, or a different database driver), you may need to build PHP and/or your web server. If you are unfamiliar with building and compiling your own software, it is worth checking to see whether somebody has already built a packaged version of PHP with the features you need. Prerequisite knowledge and software for compiling: • • • • • • Basic Unix skills (being able to operate "make" and a C compiler) An ANSI C compiler flex: Version 2.5.4 bison: Version 1.28 (preferred), 1.35, or 1.75 A web server Any module specific components (such as GD, PDF libs, etc.) The initial PHP setup and configuration process is controlled by the use of the command line options of the configure script. You could get a list of all available options along with short explanations running ./configure --help. Our manual documents the different options separately. You will find the core options in the appendix, while the different extension specific options are descibed on the reference pages. When PHP is configured, you are ready to build the module and/or executables. The command make should take care of this. If it fails and you can't figure out why, see the Problems section. Apache 1.3.x on Unix systems This section contains notes and hints specific to Apache installs of PHP on Unix platforms. We also have instructions and notes for Apache 2 on a separate page. You can select arguments to add to the configure on line 10 below from the list of core configure options and from extension specific options described at the respective places in the manual. The version numbers have been omitted here, to ensure the instructions are not incorrect. You will need to replace the 'xxx' here with the correct values from your files. Example #1 Installation Instructions (Apache Shared Module Version) for PHP 1. 2. 3. 4. 5. 6. 7. 8. 9. gunzip apache_xxx.tar.gz tar -xvf apache_xxx.tar gunzip php-xxx.tar.gz tar -xvf php-xxx.tar cd apache_xxx ./configure --prefix=/www --enable-module=so make make install cd ../php-xxx 10. Now, configure your PHP. This is where you customize your PHP with various options, like which extensions will be enabled. Do a ./configure --help for a list of available options. In our example we'll do a simple configure with Apache 1 and MySQL support. Your path to apxs may differ from our example. ./configure --with-mysql --with-apxs=/www/bin/apxs 11. make 12. make install If you decide to change your configure options after installation, you only need to repeat the last three steps. You only need to
  • 15. restart apache for the new module to take effect. A recompile of Apache is not needed. Note that unless told otherwise, 'make install' will also install PEAR, various PHP tools such as phpize, install the PHP CLI, and more. 13. Setup your php.ini file: cp php.ini-development /usr/local/lib/php.ini You may edit your .ini file to set PHP options. If you prefer your php.ini in another location, use --with-config-file-path=/some/path in step 10. If you instead choose php.ini-production, be certain to read the list of changes within, as they affect how PHP behaves. 14. Edit your httpd.conf to load the PHP module. The path on the right hand side of the LoadModule statement must point to the path of the PHP module on your system. The make install from above may have already added this for you, but be sure to check. For PHP 4: LoadModule php4_module libexec/libphp4.so For PHP 5: LoadModule php5_module libexec/libphp5.so 15. And in the AddModule section of httpd.conf, somewhere under the ClearModuleList, add this: For PHP 4: AddModule mod_php4.c For PHP 5: AddModule mod_php5.c 16. Tell Apache to parse certain extensions as PHP. For example, let's have Apache parse the .php extension as PHP. You could have any extension(s) parse as PHP by simply adding more, with each separated by a space. We'll add .phtml to demonstrate. AddType application/x-httpd-php .php .phtml It's also common to setup the .phps extension to show highlighted PHP source, this can be done with: AddType application/x-httpd-php-source .phps 17. Use your normal procedure for starting the Apache server. (You must stop and restart the server, not just cause the server to reload by using a HUP or USR1 signal.) Alternatively, to install PHP as a static object: Example #2 Installation Instructions (Static Module Installation for Apache) for PHP 1. 2. 3. 4. gunzip -c apache_1.3.x.tar.gz | tar xf cd apache_1.3.x ./configure cd ..
  • 16. 5. 6. 7. 8. 9. gunzip -c php-5.x.y.tar.gz | tar xf cd php-5.x.y ./configure --with-mysql --with-apache=../apache_1.3.x make make install 10. cd ../apache_1.3.x 11. ./configure --prefix=/www --activate-module=src/modules/php5/libphp5.a (The above line is correct! Yes, we know libphp5.a does not exist at this stage. It isn't supposed to. It will be created.) 12. make (you should now have an httpd binary which you can copy to your Apache bin dir if it is your first install then you need to "make install" as well) 13. cd ../php-5.x.y 14. cp php.ini-development /usr/local/lib/php.ini 15. You can edit /usr/local/lib/php.ini file to set PHP options. Edit your httpd.conf or srm.conf file and add: AddType application/x-httpd-php .php Note: Replace php-5 by php-4 and php5 by php4 in PHP 4. Depending on your Apache install and Unix variant, there are many possible ways to stop and restart the server. Below are some typical lines used in restarting the server, for different apache/unix installations. You should replace /path/to/ with the path to these applications on your systems. Example #3 Example commands for restarting Apache 1. Several Linux and SysV variants: /etc/rc.d/init.d/httpd restart 2. Using apachectl scripts: /path/to/apachectl stop /path/to/apachectl start 3. httpdctl and httpsdctl (Using OpenSSL), similar to apachectl: /path/to/httpsdctl stop /path/to/httpsdctl start 4. Using mod_ssl, or another SSL server, you may want to manually stop and start: /path/to/apachectl stop /path/to/apachectl startssl The locations of the apachectl and http(s)dctl binaries often vary. If your system has locate or whereis or which commands, these can assist you in finding your server control programs. Different examples of compiling PHP for apache are as follows: ./configure --with-apxs --with-pgsql This will create a libphp5.so (or libphp4.so in PHP 4) shared library that is loaded into Apache using a LoadModule line in Apache's httpd.conf file. The PostgreSQL support is embedded into this library. ./configure --with-apxs --with-pgsql=shared This will create a libphp4.so shared library for Apache, but it will also create a pgsql.so shared library that is loaded into PHP either by using the extension directive in php.ini file or by loading it explicitly in a
  • 17. script using the dl() function. ./configure --with-apache=/path/to/apache_source --with-pgsql This will create a libmodphp5.a library, a mod_php5.c and some accompanying files and copy this into the src/modules/php5 directory in the Apache source tree. Then you compile Apache using --activatemodule=src/modules/php5/libphp5.a and the Apache build system will create libphp5.a and link it statically into the httpd binary (replace php5 by php4 in PHP 4). The PostgreSQL support is included directly into this httpd binary, so the final result here is a single httpd binary that includes all of Apache and all of PHP. ./configure --with-apache=/path/to/apache_source --with-pgsql=shared Same as before, except instead of including PostgreSQL support directly into the final httpd you will get a pgsql.so shared library that you can load into PHP from either the php.ini file or directly using dl(). When choosing to build PHP in different ways, you should consider the advantages and drawbacks of each method. Building as a shared object will mean that you can compile apache separately, and don't have to recompile everything as you add to, or change, PHP. Building PHP into apache (static method) means that PHP will load and run faster. For more information, see the Apache » web page on DSO support. Note: Apache's default httpd.conf currently ships with a section that looks like this: User nobody Group "#-1" Unless you change that to "Group nogroup" or something like that ("Group daemon" is also very common) PHP will not be able to open files. Note: Make sure you specify the installed version of apxs when using --withapxs=/path/to/apxs. You must NOT use the apxs version that is in the apache sources but the one that is actually installed on your system. Apache 2.x on Unix systems This section contains notes and hints specific to Apache 2.x installs of PHP on Unix systems. Warning We do not recommend using a threaded MPM in production with Apache 2. Use the prefork MPM, which is the default MPM with Apache 2.0 and 2.2. For information on why, read the related FAQ entry on using Apache2 with a threaded MPM The » Apache Documentation is the most authoritative source of information on the Apache 2.x server. More information about installation options for Apache may be found there. The most recent version of Apache HTTP Server may be obtained from » Apache download site, and a fitting PHP version from the above mentioned places. This quick guide covers only the basics to get started with Apache 2.x and PHP. For more information read the » Apache Documentation. The version numbers have been omitted here, to ensure the instructions are not incorrect. In the examples below, 'NN' should be replaced with the specific version of Apache being used.
  • 18. There are currently two versions of Apache 2.x - there's 2.0 and 2.2. While there are various reasons for choosing each, 2.2 is the current latest version, and the one that is recommended, if that option is available to you. However, the instructions here will work for either 2.0 or 2.2. 1. Obtain the Apache HTTP server from the location listed above, and unpack it: gzip -d httpd-2_x_NN.tar.gz tar -xf httpd-2_x_NN.tar 2. Likewise, obtain and unpack the PHP source: gunzip php-NN.tar.gz tar -xf php-NN.tar 3. Build and install Apache. Consult the Apache install documentation for more details on building Apache. cd httpd-2_x_NN ./configure --enable-so make make install 4. Now you have Apache 2.x.NN available under /usr/local/apache2, configured with loadable module support and the standard MPM prefork. To test the installation use your normal procedure for starting the Apache server, e.g.: /usr/local/apache2/bin/apachectl start and stop the server to go on with the configuration for PHP: /usr/local/apache2/bin/apachectl stop 5. Now, configure and build PHP. This is where you customize PHP with various options, like which extensions will be enabled. Run ./configure --help for a list of available options. In our example we'll do a simple configure with Apache 2 and MySQL support. If you built Apache from source, as described above, the below example will match your path for apxs, but if you installed Apache some other way, you'll need to adjust the path to apxs accordingly. Note that some distros may rename apxs to apxs2. cd ../php-NN ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql make make install If you decide to change your configure options after installation, you'll need to re-run the configure, make, and make install steps. You only need to restart apache for the new module to take effect. A recompile of Apache is not needed. Note that unless told otherwise, 'make install' will also install PEAR, various PHP tools such as phpize, install the PHP CLI, and more. 6. Setup your php.ini cp php.ini-development /usr/local/lib/php.ini You may edit your .ini file to set PHP options. If you prefer having php.ini in another location, use --with-config-file-path=/some/path in step 5.
  • 19. If you instead choose php.ini-production, be certain to read the list of changes within, as they affect how PHP behaves. 7. Edit your httpd.conf to load the PHP module. The path on the right hand side of the LoadModule statement must point to the path of the PHP module on your system. The make install from above may have already added this for you, but be sure to check. LoadModule php5_module modules/libphp5.so 8. Tell Apache to parse certain extensions as PHP. For example, let's have Apache parse .php files as PHP. Instead of only using the Apache AddType directive, we want to avoid potentially dangerous uploads and created files such as exploit.php.jpg from being executed as PHP. Using this example, you could have any extension(s) parse as PHP by simply adding them. We'll add .php to demonstrate. <FilesMatch .php$> SetHandler application/x-httpd-php </FilesMatch> Or, if we wanted to allow .php, .php2, .php3, .php4, .php5, .php6, and .phtml files to be executed as PHP, but nothing else, we'd use this: <FilesMatch ".ph(p[2-6]?|tml)$"> SetHandler application/x-httpd-php </FilesMatch> And to allow .phps files to be handled by the php source filter, and displayed as syntaxhighlighted source code, use this: <FilesMatch ".phps$"> SetHandler application/x-httpd-php-source </FilesMatch> mod_rewrite may be used To allow any arbitrary .php file to be displayed as syntax-highlighted source code, without having to rename or copy it to a .phps file: RewriteEngine On RewriteRule (.*.php)s$ $1 [H=application/x-httpd-php-source] The php source filter should not be enabled on production systems, where it may expose confidential or otherwise sensitive information embedded in source code. 9. Use your normal procedure for starting the Apache server, e.g.: /usr/local/apache2/bin/apachectl start OR service httpd restart Following the steps above you will have a running Apache2 web server with support for PHP as a SAPI module. Of course there are many more configuration options available Apache and PHP. For more information type ./configure --help in the corresponding source tree. Apache may be built multithreaded by selecting the worker MPM, rather than the standard prefork MPM, when Apache is built. This is done by adding the following option to the argument passed to ./configure, in step 3 above:
  • 20. --with-mpm=worker This should not be undertaken without being aware of the consequences of this decision, and having at least a fair understanding of the implications. The Apache documentation regarding » MPM-Modules discusses MPMs in a great deal more detail. Note: The Apache MultiViews FAQ discusses using multiviews with PHP. Note: To build a multithreaded version of Apache, the target system must support threads. In this case, PHP should also be built with experimental Zend Thread Safety (ZTS). Under this configuration, not all extensions will be available. The recommended setup is to build Apache with the default prefork MPM-Module. Lighttpd 1.4 on Unix systems This section contains notes and hints specific to Lighttpd 1.4 installs of PHP on Unix systems. Please use the » Lighttpd trac to learn how to install Lighttpd properly before continuing. Fastcgi is the preferred SAPI to connect PHP and Lighttpd. Fastcgi is automagically enabled in php-cgi in PHP 5.3, but for older versions configure PHP with --enable-fastcgi. To confirm that PHP has fastcgi enabled, php -v should contain PHP 5.2.5 (cgi-fcgi) Before PHP 5.2.3, fastcgi was enabled on the php binary (there was no php-cgi). Letting Lighttpd spawn php processes To configure Lighttpd to connect to php and spawn fastcgi processes, edit lighttpd.conf. Sockets are preferred to connect to fastcgi processes on the local system. Example #1 Partial lighttpd.conf server.modules += ( "mod_fastcgi" ) fastcgi.server = ( ".php" => (( "socket" => "/tmp/php.socket", "bin-path" => "/usr/local/bin/php-cgi", "bin-environment" => ( "PHP_FCGI_CHILDREN" => "16", "PHP_FCGI_MAX_REQUESTS" => "10000" ), "min-procs" => 1, "max-procs" => 1, "idle-timeout" => 20 )) ) The bin-path directive allows lighttpd to spawn fastcgi processes dynamically. PHP will spawn children according to the PHP_FCGI_CHILDREN environment variable. The "bin-environment" directive sets the environment for the spawned processes. PHP will kill a child process after the number of requests specified by PHP_FCGI_MAX_REQUESTS is reached. The directives "min-procs" and "max-procs" should generally be avoided with PHP. PHP manages its own children and opcode caches like APC will
  • 21. only share among children managed by PHP. If "min-procs" is set to something greater than 1, the total number of php responders will be multiplied PHP_FCGI_CHILDREN (2 min-procs * 16 children gives 32 responders). Spawning with spawn-fcgi Lighttpd provides a program called spawn-fcgi to ease the process of spawning fastcgi processes easier. Spawning php-cgi It is possible to spawn processes without spawn-fcgi, though a bit of heavy-lifting is required. Setting the PHP_FCGI_CHILDREN environment var controls how many children PHP will spawn to handle incoming requests. Setting PHP_FCGI_MAX_REQUESTS will determine how long (in requests) each child will live. Here's a simple bash script to help spawn php responders. Example #2 Spawning FastCGI Responders #!/bin/sh # Location of the php-cgi binary PHP=/usr/local/bin/php-cgi # PID File location PHP_PID=/tmp/php.pid # Binding to an address #FCGI_BIND_ADDRESS=10.0.1.1:10000 # Binding to a domain socket FCGI_BIND_ADDRESS=/tmp/php.sock PHP_FCGI_CHILDREN=16 PHP_FCGI_MAX_REQUESTS=10000 env -i PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP -b $FCGI_BIND_ADDRESS & echo $! > "$PHP_PID" Connecting to remote FCGI instances Fastcgi instances can be spawned on multiple remote machines in order to scale applications. Example #3 Connecting to remote php-fastcgi instances fastcgi.server = ( ".php" => (( "host" => "10.0.0.2", "port" => 1030 ), ( "host" => "10.0.0.3", "port" => 1030 )) )
  • 22. Caudium PHP can be built as a Pike module for the » Caudium webserver. Follow the simple instructions below to install PHP for Caudium. Example #1 Caudium Installation Instructions 1. Make sure you have Caudium installed prior to attempting to install PHP 4. For PHP 4 to work correctly, you will need Pike 7.0.268 or newer. For the sake of this example we assume that Caudium is installed in /opt/caudium/server/. 2. Change directory to php-x.y.z (where x.y.z is the version number). 3. ./configure --with-caudium=/opt/caudium/server 4. make 5. make install 6. Restart Caudium if it's currently running. 7. Log into the graphical configuration interface and go to the virtual server where you want to add PHP 4 support. 8. Click Add Module and locate and then add the PHP 4 Script Support module. 9. If the documentation says that the 'PHP 4 interpreter isn't available', make sure that you restarted the server. If you did check /opt/caudium/logs/debug/default.1 for any errors related to PHP4.so. Also make sure that caudium/server/lib/[pike-version]/PHP4.so is present. 10. Configure the PHP Script Support module if needed. You can of course compile your Caudium module with support for the various extensions available in PHP 4. See the reference pages for extension specific configure options. Note: When compiling PHP 4 with MySQL support you must make sure that the normal MySQL client code is used. Otherwise there might be conflicts if your Pike already has MySQL support. You do this by specifying a MySQL install directory the --with-mysql option. fhttpd related notes To build PHP as an fhttpd module, answer "yes" to "Build as an fhttpd module?" (the --with-fhttpd=DIR option to configure) and specify the fhttpd source base directory. The default directory is /usr/local/src/fhttpd. If you are running fhttpd, building PHP as a module will give better performance, more control and remote execution capability. Note: Support for fhttpd is no longer available as of PHP 4.3.0. Sun, iPlanet and Netscape servers on Sun Solaris This section contains notes and hints specific to Sun Java System Web Server, Sun ONE Web Server, iPlanet and Netscape server installs of PHP on Sun Solaris. From PHP 4.3.3 on you can use PHP scripts with the NSAPI module to generate custom directory listings
  • 23. and error pages. Additional functions for Apache compatibility are also available. For support in current web servers read the note about subrequests. You can find more information about setting up PHP for the Netscape Enterprise Server (NES) here: » http://benoit.noss.free.fr/php/install-php4.html To build PHP with Sun JSWS/Sun ONE WS/iPlanet/Netscape web servers, enter the proper install directory for the --with-nsapi=[DIR] option. The default directory is usually /opt/netscape/suitespot/. Please also read /php-xxx-version/sapi/nsapi/nsapi-readme.txt. 1. Install the following packages from » http://www.sunfreeware.com/ or another download site: • autoconf-2.13 • automake-1.4 • bison-1_25-sol26-sparc-local • flex-2_5_4a-sol26-sparc-local • gcc-2_95_2-sol26-sparc-local • gzip-1.2.4-sol26-sparc-local • m4-1_4-sol26-sparc-local • make-3_76_1-sol26-sparc-local • mysql-3.23.24-beta (if you want mysql support) • perl-5_005_03-sol26-sparc-local • tar-1.13 (GNU tar) 2. Make sure your path includes the proper directories PATH=.:/usr/local/bin:/usr/sbin:/usr/bin:/usr/ccs/bin and make it available to your system export PATH. 3. gunzip php-x.x.x.tar.gz (if you have a .gz dist, otherwise go to 4). 4. tar xvf php-x.x.x.tar 5. Change to your extracted PHP directory: cd ../php-x.x.x 6. For the following step, make sure /opt/netscape/suitespot/ is where your netscape server is installed. Otherwise, change to the correct path and run: ./configure --with-mysql=/usr/local/mysql --with-nsapi=/opt/netscape/suitespot/ --enable-libgcc 7. Run make followed by make install. After performing the base install and reading the appropriate readme file, you may need to perform some additional configuration steps. Configuration Instructions for Sun/iPlanet/Netscape Firstly you may need to add some paths to the LD_LIBRARY_PATH environment for the server to find all the shared libs. This can best done in the start script for your web server. The start script is often located in: /path/to/server/https-servername/start. You may also need to edit the configuration files that are located in: /path/to/server/https-servername/config/. 1. Add the following line to mime.types (you can do that by the administration server): type=magnus-internal/x-httpd-php exts=php 2. Edit magnus.conf (for servers >= 6) or obj.conf (for servers < 6) and add the following, shlib will vary depending on your system, it will be something like /opt/netscape/suitespot/bin/libphp4.so. You should place the following lines after mime types init.
  • 24. Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans" shlib="/ opt/netscape/suitespot/bin/libphp4.so" Init fn="php4_init" LateInit="yes" errorString="Failed to initialize PHP!" [php_ini="/path/to/php.ini"] (PHP >= 4.3.3) The php_ini parameter is optional but with it you can place your php.ini in your web server config directory. 3. Configure the default object in obj.conf (for virtual server classes [version 6.0+] in their vserver.obj.conf): <Object name="default"> . . . .#NOTE this next line should happen after all 'ObjectType' and before all 'AddLog' lines Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...] . . </Object> (PHP >= 4.3.3) As additional parameters you can add some special php.ini-values, for example you can set a docroot="/path/to/docroot" specific to the context php4_execute is called. For boolean ini-keys please use 0/1 as value, not "On","Off",... (this will not work correctly), e.g. zlib.output_compression=1 instead of zlib.output_compression="On" 4. This is only needed if you want to configure a directory that only consists of PHP scripts (same like a cgi-bin directory): <Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object> After that you can configure a directory in the Administration server and assign it the style xhttpd-php. All files in it will get executed as PHP. This is nice to hide PHP usage by renaming files to .html. 5. Setup of authentication: PHP authentication cannot be used with any other authentication. ALL AUTHENTICATION IS PASSED TO YOUR PHP SCRIPT. To configure PHP Authentication for the entire server, add the following line to your default object: <Object name="default"> AuthTrans fn=php4_auth_trans . . . </Object> 6. To use PHP Authentication on a single directory, add the following: <Object ppath="d:pathtoauthenticateddir*"> AuthTrans fn=php4_auth_trans </Object> Note: The stacksize that PHP uses depends on the configuration of the web server. If you get crashes with very large PHP scripts, it is recommended to raise it with the Admin Server (in the section "MAGNUS EDITOR").
  • 25. CGI environment and recommended modifications in php.ini Important when writing PHP scripts is the fact that Sun JSWS/Sun ONE WS/iPlanet/Netscape is a multithreaded web server. Because of that all requests are running in the same process space (the space of the web server itself) and this space has only one environment. If you want to get CGI variables like PATH_INFO, HTTP_HOST etc. it is not the correct way to try this in the old PHP way with getenv() or a similar way (register globals to environment, $_ENV). You would only get the environment of the running web server without any valid CGI variables! Note: Why are there (invalid) CGI variables in the environment? Answer: This is because you started the web server process from the admin server which runs the startup script of the web server, you wanted to start, as a CGI script (a CGI script inside of the admin server!). This is why the environment of the started web server has some CGI environment variables in it. You can test this by starting the web server not from the administration server. Use the command line as root user and start it manually - you will see there are no CGI-like environment variables. Simply change your scripts to get CGI variables in the correct way for PHP 4.x by using the superglobal $_SERVER. If you have older scripts which use $HTTP_HOST, etc., you should turn on register_globals in php.ini and change the variable order too (important: remove "E" from it, because you do not need the environment here): variables_order = "GPCS" register_globals = On Special use for error pages or self-made directory listings (PHP >= 4.3.3) You can use PHP to generate the error pages for "404 Not Found" or similar. Add the following line to the object in obj.conf for every error page you want to overwrite: Error fn="php4_execute" code=XXX script="/path/to/script.php" [inikey=value inikey=value...] where XXX is the HTTP error code. Please delete any other Error directives which could interfere with yours. If you want to place a page for all errors that could exist, leave the code parameter out. Your script can get the HTTP status code with $_SERVER['ERROR_TYPE']. Another possibility is to generate self-made directory listings. Just create a PHP script which displays a directory listing and replace the corresponding default Service line for type="magnus-internal/directory" in obj.conf with the following: Service fn="php4_execute" type="magnus-internal/directory" script="/path/to/script.php" [inikey=value inikey=value...] For both error and directory listing pages the original URI and translated URI are in the variables $_SERVER['PATH_INFO'] and $_SERVER['PATH_TRANSLATED']. Note about nsapi_virtual() and subrequests (PHP >= 4.3.3) The NSAPI module now supports the nsapi_virtual() function (alias: virtual()) to make subrequests on the web server and insert the result in the web page. This function uses some undocumented features from the NSAPI library. On Unix the module automatically looks for the needed functions and uses them if available. If not, nsapi_virtual() is disabled. Note: But be warned: Support for nsapi_virtual() is EXPERIMENTAL!!!
  • 26. CGI and command line setups The default is to build PHP as a CGI program. This creates a command line interpreter, which can be used for CGI processing, or for non-web-related PHP scripting. If you are running a web server PHP has module support for, you should generally go for that solution for performance reasons. However, the CGI version enables users to run different PHP-enabled pages under different user-ids. Warning Al usar el modo CGI, su servidor esta expuesto a diferentes ataques. Por favor, leer la sección Seguridad con CGI para aprender como defenderse de estos ataques. As of PHP 4.3.0, some important additions have happened to PHP. A new SAPI named CLI also exists and it has the same name as the CGI binary. What is installed at {PREFIX}/bin/php depends on your configure line and this is described in detail in the manual section named Using PHP from the command line. For further details please read that section of the manual. Testing If you have built PHP as a CGI program, you may test your build by typing make test. It is always a good idea to test your build. This way you may catch a problem with PHP on your platform early instead of having to struggle with it later. Using Variables Some server supplied environment variables are not defined in the current » CGI/1.1 specification. Only the following variables are defined there: AUTH_TYPE, CONTENT_LENGTH, CONTENT_TYPE, GATEWAY_INTERFACE, PATH_INFO, PATH_TRANSLATED, QUERY_STRING, REMOTE_ADDR, REMOTE_HOST, REMOTE_IDENT, REMOTE_USER, REQUEST_METHOD, SCRIPT_NAME, SERVER_NAME, SERVER_PORT, SERVER_PROTOCOL, and SERVER_SOFTWARE. Everything else should be treated as 'vendor extensions'. Notas de instalación específicas para HP-UX Esta sección contiene notas y consejos específicos para instalar PHP sobre sistemas HP-UX. Existen dos opciones principales para instalar PHP sobre sistemas HP-UX. Ya sea compilarlo, o instalar un binario precompilado. Los paquetes oficiales precompilados se localizan aquí: » http://software.hp.com/ Hasta que esta sección del manual sea reescrita, la documentación acerca de compilar PHP (y las extensiones relacionadas) sobre sistemas HP-UX ha sido removida. Por ahora, favor de considerar la lectura de los siguientes recursos externos: » Building Apache and PHP on HP-UX 11.11
  • 27. OpenBSD installation notes This section contains notes and hints specific to installing PHP on » OpenBSD 3.6. Using Binary Packages Using binary packages to install PHP on OpenBSD is the recommended and simplest method. The core package has been separated from the various modules, and each can be installed and removed independently from the others. The files you need can be found on your OpenBSD CD or on the FTP site. The main package you need to install is php4-core-4.3.8.tgz, which contains the basic engine (plus gettext and iconv). Next, take a look at the module packages, such as php4-mysql-4.3.8.tgz or php4imap-4.3.8.tgz. You need to use the phpxs command to activate and deactivate these modules in your php.ini. Example #1 OpenBSD Package Install Example # pkg_add php4-core-4.3.8.tgz # /usr/local/sbin/phpxs -s # cp /usr/local/share/doc/php4/php.ini-recommended /var/www/conf/php.ini (add in mysql) # pkg_add php4-mysql-4.3.8.tgz # /usr/local/sbin/phpxs -a mysql (add in imap) # pkg_add php4-imap-4.3.8.tgz # /usr/local/sbin/phpxs -a imap (remove mysql as a test) # pkg_delete php4-mysql-4.3.8 # /usr/local/sbin/phpxs -r mysql (install the PEAR libraries) # pkg_add php4-pear-4.3.8.tgz Read the » packages(7) manual page for more information about binary packages on OpenBSD. Using Ports You can also compile up PHP from source using the » ports tree. However, this is only recommended for users familiar with OpenBSD. The PHP 4 port is split into two sub-directories: core and extensions. The extensions directory generates sub-packages for all of the supported PHP modules. If you find you do not want to create some of these modules, use the no_* FLAVOR. For example, to skip building the imap module, set the FLAVOR to no_imap. Common Problems • • The default install of Apache runs inside a » chroot(2) jail, which will restrict PHP scripts to accessing files under /var/www. You will therefore need to create a /var/www/tmp directory for PHP session files to be stored, or use an alternative session backend. In addition, database sockets need to be placed inside the jail or listen on the localhost interface. If you use network functions, some files from /etc such as /etc/resolv.conf and /etc/services will need to be moved into /var/www/etc. The OpenBSD PEAR package automatically installs into the correct chroot directories, so no special modification is needed there. More information on the OpenBSD Apache is available in the » OpenBSD FAQ. The OpenBSD 3.6 package for the » gd extension requires XFree86 to be installed. If you do not
  • 28. wish to use some of the font features that require X11, install the php4-gd-4.3.8-no_x11.tgz package instead. Older Releases Older releases of OpenBSD used the FLAVORS system to compile up a statically linked PHP. Since it is hard to generate binary packages using this method, it is now deprecated. You can still use the old stable ports trees if you wish, but they are unsupported by the OpenBSD team. If you have any comments about this, the current maintainer for the port is Anil Madhavapeddy (avsm at openbsd dot org). Solaris specific installation tips This section contains notes and hints specific to installing PHP on Solaris systems. Required software Solaris installs often lack C compilers and their related tools. Read this FAQ for information on why using GNU versions for some of these tools is necessary. The required software is as follows: • • • • • • • • • • • gcc (recommended, other C compilers may work) make flex bison m4 autoconf automake perl gzip tar GNU sed In addition, you will need to install (and possibly compile) any additional software specific to your configuration, such as Oracle or MySQL. Using Packages You can simplify the Solaris install process by using pkgadd to install most of your needed components. Notas de instalación en Debian GNU/Linux Esta sección contiene notas y consejos específicos para instalar PHP sobre » Debian GNU/Linux. Mientras que las instrucciones para construir PHP sobre Unix se aplican a Debian también, esta página del manual contiene información específica para otras opciones, tales como utilizar ya sea los comandos
  • 29. apt-get o aptitude. En esta página del manual estos dos comandos se pueden utilizar indistintamente. Utilizando APT Primero, nótese que otros paquetes relacionados podrían ser deseables como libapache2-mod-php5 para integración con Apache 2, y php-pear para PEAR. Segundo, antes de instalar un paquete, es sensato asegurarse de que la lista de paquetes está al día. Típicamente, esto se realiza ejecutando el comando apt-get update. Example #1 Ejemplo de Instalación en Debian con Apache 2 # apt-get install php5-common libapache2-mod-php5 php5-cli APT instalará automáticamente el módulo PHP 5 para Apache 2 junto con todas sus dependencias, y luego lo activará. Apache debería reiniciarse para que los cambios tengan efecto. Por ejemplo: Example #2 Deteniendo e iniciando Apache una vez que PHP está instalado # /etc/init.d/apache2 stop # /etc/init.d/apache2 start Un mejor control de la configuración En la sección anterior, PHP se instaló únicamente con los módulos principales. Es muy probable que se deseen módulos adicionales, tales como MySQL, cURL, GD, etc. Estos también pueden ser instalados vía el comando apt-get. Example #3 Métodos para listar paquetes relacionados con PHP 5 # apt-cache search php5 # aptitude search php5 # aptitude search php5 |grep -i mysql Los ejemplos mostrarán una gran cantidad de paquetes incluyendo varios específicos a PHP como php5cgi, php5-cli y php5-dev. Determine cuales son necesarios e instálelos como cualquier otro ya sea con apt-get o aptitude. Y ya que Debian realiza revisión de dependencias, preguntará por ellos, así que por ejemplo para instalar MySQL y cURL: Example #4 Instalar PHP con MySQL, cURL # apt-get install php5-mysql php5-curl APT agregará automáticamente las líneas apropiadas a los diferentes ficheros relacionados con php.ini como /etc/php5/apache2/php.ini, /etc/php5/conf.d/pdo.ini, etc. y dependiendo de la extensión, le agregará registros similares a extension=foo.so. De cualquier manera, reiniciar el servidor web (como es Apache) es requerido antes de que estos cambios tengan efecto. Problemas Frecuentes • • Si los scripts de PHP no se están interpretando por el servidor web, entonces es probable que PHP no haya sido agregado al fichero de configuración del servidor web, que en Debian puede ser /etc/ apache2/apache2.conf o algo semejante. Véase el manual de Debian para mayores detalles. Si una extensión fue aparentemente instalada y aún así las funciones no aparecen definidas,
  • 30. • asegurar de que el fichero ini apropiado está siendo cargado y/o que el servidor web fue reiniciado después de la instalación. Hay dos comandos básicos para instalar paquetes en Debian (y otras variantes de linux): apt-get y aptitude. Pero, explicar las sutiles diferencias entre estos comandos va más allá del alcance de este manual. Installation on Mac OS X Table of Contents • • • • Using Packages Using the bundled PHP Compiling for OS X Server Installing for Apache on MacOS X Client This section contains notes and hints specific to installing PHP on Mac OS X. There are two slightly different versions of Mac OS X, Client and Server, our manual deals with installing PHP on both systems. Note that PHP is not available for MacOS 9 and earlier versions. Using Packages There are a few pre-packaged and pre-compiled versions of PHP for Mac OS X. This can help in setting up a standard configuration, but if you need to have a different set of features (such as a secure server, or a different database driver), you may need to build PHP and/or your web server yourself. If you are unfamiliar with building and compiling your own software, it's worth checking whether somebody has already built a packaged version of PHP with the features you need. The following resources offer easy to install packages and precompiled binaries for PHP on Mac OS: • • • • MacPorts: » http://www.macports.org/ Entropy: » http://www.entropy.ch/software/macosx/php/ Fink: » http://www.finkproject.org/ Homebrew: » http://github.com/mxcl/homebrew Using the bundled PHP PHP has come standard with Macs since OS X version 10.0.0. Enabling PHP with the default web server requires uncommenting a few lines in the Apache configuration file httpd.conf whereas the CGI and/or CLI are enabled by default (easily accessible via the Terminal program). Enabling PHP using the instructions below is meant for quickly setting up a local development environment. It's highly recommended to always upgrade PHP to the newest version. Like most live
  • 31. software, newer versions are created to fix bugs and add features and PHP being is no different. See the appropriate MAC OS X installation documentation for further details. The following instructions are geared towards a beginner with details provided for getting a default setup to work. All users are encouraged to compile, or install a new packaged version. The standard installation type is using mod_php, and enabling the bundled mod_php on Mac OS X for the Apache web server (the default web server, that is accessible via System Preferences) involves the following steps: 1. Locate and open the Apache configuration file. By default, the location is as follows: /private/etc/ apache2/httpd.conf Using Finder or Spotlight to find this file may prove difficult as by default it's private and owned by the root user. Note: One way to open this is by using a Unix based text editor in the Terminal, for example nano, and because the file is owned by root we'll use the sudo command to open it (as root) so for example type the following into the Terminal Application (after, it will prompt for a password): sudo nano /private/etc/apache2/httpd.conf Noteworthy nano commands: ^w (search), ^o (save), and ^x (exit) where ^ represents the Ctrl key. Note: Versions of Mac OS X prior to 10.5 were bundled with older versions of PHP and Apache. As such, the Apache configuration file on legacy machines may be /etc/httpd/httpd.conf. 2. With a text editor, uncomment the lines (by removing the #) that look similar to the following (these two lines are often not together, locate them both in the file): # LoadModule php5_module libexec/httpd/libphp5.so # AddModule mod_php5.c Notice the location/path. When building PHP in the future, the above files should be replaced or commented out. 3. Be sure the desired extensions will parse as PHP (examples: .php .html and .inc) Due to the following statement already existing in httpd.conf (as of Mac Panther), once PHP is enabled the .php files will automatically parse as PHP. <IfModule mod_php5.c> # If php is turned on, we respect .php and .phps files. AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps # Since most users will want index.php to work we # also automatically enable index.php <IfModule mod_dir.c> DirectoryIndex index.html index.php </IfModule> </IfModule> Note: Before OS X 10.5 (Leopard), PHP 4 was bundled instead of PHP 5 in which case the above instructions will differ slightly by changing 5's to 4's. 4. Be sure the DirectoryIndex loads the desired default index file This is also set in httpd.conf. Typically index.php and index.html are used. By default index.php is enabled because it's also in the PHP check shown above. Adjust accordingly. 5. Set the php.ini location or use the default A typical default location on Mac OS X is
  • 32. /usr/local/php/php.ini and a call to phpinfo() will reveal this information. If a php.ini is not used, PHP will use all default values. See also the related FAQ on finding php.ini. 6. Locate or set the DocumentRoot This is the root directory for all the web files. Files in this directory are served from the web server so the PHP files will parse as PHP before outputting them to the browser. A typical default path is /Library/WebServer/Documents but this can be set to anything in httpd.conf. Alternatively, the default DocumentRoot for individual users is /Users/yourusername/Sites 7. Create a phpinfo() file The phpinfo() function will display information about PHP. Consider creating a file in the DocumentRoot with the following PHP code: <?php phpinfo(); ?> 8. Restart Apache, and load the PHP file created above To restart, either execute sudo apachectl graceful in the shell or stop/start the "Personal Web Server" option in the OS X System Preferences. By default, loading local files in the browser will have an URL like so: http://localhost/info.php Or using the DocumentRoot in the user directory is another option and would end up looking like: http://localhost/~yourusername/info.php The CLI (or CGI in older versions) is appropriately named php and likely exists as /usr/bin/php. Open up the terminal, read the command line section of the PHP manual, and execute php -v to check the PHP version of this PHP binary. A call to phpinfo() will also reveal this information. Compiling for OS X Server Mac OS X Server install 1. Get the latest distributions of Apache and PHP. 2. Untar them, and run the configure program on Apache like so. ./configure --exec-prefix=/usr --localstatedir=/var --mandir=/usr/share/man --libexecdir=/System/Library/Apache/Modules --iconsdir=/System/Library/Apache/Icons -includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers --enable-shared=max --enable-module=most --target=apache 3. If you want the compiler to do some optimization, you may also want to add this line: setenv OPTIM=-O2 4. Next, go to the PHP 4 source directory and configure it. ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --mandir=/usr/share/man --with-xml --with-apache=/src/apache_1.3.12
  • 33. If you have any other additions (MySQL, GD, etc.), be sure to add them here. For the --withapache string, put in the path to your apache source directory, for example /src/apache_1.3.12. 5. Type make and make install. This will add a directory to your Apache source directory under src/modules/php4. 6. Now, reconfigure Apache to build in PHP 4. ./configure --exec-prefix=/usr --localstatedir=/var --mandir=/usr/share/man --libexecdir=/System/Library/Apache/Modules --iconsdir=/System/Library/Apache/Icons -includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers --enable-shared=max --enable-module=most --target=apache --activate-module=src/modules/php4/libphp4.a You may get a message telling you that libmodphp4.a is out of date. If so, go to the src/modules/php4 directory inside your Apache source directory and run this command: ranlib libmodphp4.a. Then go back to the root of the Apache source directory and run the above configure command again. That'll bring the link table up to date. Run make and make install again. 7. Copy and rename the php.ini-development file to your bin directory from your PHP 4 source directory: cp php.ini-development /usr/local/bin/php.ini or (if your don't have a local directory) cp php.ini-development /usr/bin/php.ini. Installing for Apache on MacOS X Client The following instructions will help you install a PHP module for the Apache web server included in MacOS X using the MacOS GUI. This version includes MySQL, PostgreSQL, and iODBC database support, cURL, GD, PDFLib, LDAP, and more. These instructions are graciously provided by » Marc Liyanage. Warning Be sure you know what you're doing before advancing beyond this point! You can cause irreparable harm to your Apache installation otherwise. Note: These instructions will only work with the original Apache web server as shipped by Apple. If you re-built or upgraded your Apache, you will have to build your own PHP module. To install: 1. For Apache 1.3, download: http://www2.entropy.ch/download/entropyphp-5.2.4-1.tar.gz 2. For Apache 2, download: wget http://www2.entropy.ch/download/entropyphp-5.2.4-1-apache2.tar.gz 3. Unpack the compressed .tar.gz file, but DO NOT USE StuffIt Expander. Instead, use Apple's BOMArchiveHelper or the command line.
  • 34. 4. Double-click the installer package and follow the directions of the installer application. That's all! PHP should now be up and running. You can test it by dropping a file named test.php into your Sites folder in your home directory. Into that file, write this line: <?php phpinfo() ?>. Now open up 127.0.0.1/~your_username/test.php in your web browser. You should see a status table with information about the PHP module. Installation on Windows systems Table of Contents • • • • • • • • • • • • • • • • Windows Installer (PHP 5.1.0 and earlier) Windows Installer (PHP 5.2 and later) Manual Installation Steps ActiveScript Microsoft IIS Microsoft IIS 5.1 and IIS 6.0 Microsoft IIS 7.0 and later Apache 1.3.x en Microsoft Windows Apache 2.x on Microsoft Windows Sun, iPlanet and Netscape servers on Microsoft Windows OmniHTTPd Server Sambar Server on Microsoft Windows Xitami on Microsoft Windows Building from source Installation of extensions on Windows Command Line PHP on Microsoft Windows This section applies to Windows 98/Me and Windows NT/2000/XP/2003. PHP will not work on 16 bit platforms such as Windows 3.1 and sometimes we refer to the supported Windows platforms as Win32. Windows 95 is no longer supported as of PHP 4.3.0. Note: Windows 98/ME/NT4 is no longer supported as of PHP 5.3.0. Note: Windows 95 is no longer supported as of PHP 4.3.0. There are two main ways to install PHP for Windows: either manually or by using the installer. If you have Microsoft Visual Studio, you can also build PHP from the original source code. Once you have PHP installed on your Windows system, you may also want to load various extensions for added functionality. Warning There are several all-in-one installers over the Internet, but none of those are endorsed by PHP.net, as we believe that using one of the official windows packages from » http://www.php.net/downloads.php is the
  • 35. best choice to have your system secure and optimized. Windows Installer (PHP 5.1.0 and earlier) The Windows PHP installer is available from the downloads page at » http://www.php.net/downloads.php. This installs the CGI version of PHP and for IIS, PWS, and Xitami, it configures the web server as well. The installer does not include any extra external PHP extensions (php_*.dll) as you'll only find those in the Windows Zip Package and PECL downloads. Note: While the Windows installer is an easy way to make PHP work, it is restricted in many aspects as, for example, the automatic setup of extensions is not supported. Use of the installer isn't the preferred method for installing PHP. First, install your selected HTTP (web) server on your system, and make sure that it works. Run the executable installer and follow the instructions provided by the installation wizard. Two types of installation are supported - standard, which provides sensible defaults for all the settings it can, and advanced, which asks questions as it goes along. The installation wizard gathers enough information to set up the php.ini file, and configure certain web servers to use PHP. One of the web servers the PHP installer does not configure for is Apache, so you'll need to configure it manually. Once the installation has completed, the installer will inform you if you need to restart your system, restart the server, or just start using PHP. Warning Be aware, that this setup of PHP is not secure. If you would like to have a secure PHP setup, you'd better go on the manual way, and set every option carefully. This automatically working setup gives you an instantly working PHP installation, but it is not meant to be used on online servers. Windows Installer (PHP 5.2 and later) The Windows PHP installer for later versions of PHP is built using MSI technology using the Wix Toolkit (» http://wix.sourceforge.net/). It will install and configure PHP and all the built-in and PECL extensions, as well as configure many of the popular web servers such as IIS, Apache, and Xitami. First, install your selected HTTP (web) server on your system, and make sure that it works. Then proceed with one of the following install types. Normal Install Run the MSI installer and follow the instructions provided by the installation wizard. You will be prompted to select the Web Server you wish to configure first, along with any configuration details needed. You will then be prompted to select which features and extensions you wish to install and enable. By
  • 36. selecting "Will be installed on local hard drive" in the drop-down menu for each item you can trigger whether to install the feature or not. By selecting "Entire feature will be installed on local hard drive", you will be able to install all sub-features of the included feature ( for example by selecting this options for the feature "PDO" you will install all PDO Drivers ). Warning It is not recommended to install all extensions by default, since many other them require dependencies from outside PHP in order to function properly. Instead, use the Installation Repair Mode that can be triggered thru the 'Add/Remove Programs' control panel to enable or disable extensions and features after installation. The installer then sets up PHP to be used in Windows and the php.ini file, and configures certain web servers to use PHP. The installer will currently configure IIS, Apache, Xitami, and Sambar Server; if you are using a different web server you'll need to configure it manually. Silent Install The installer also supports a silent mode, which is helpful for Systems Administrators to deploy PHP easily. To use silent mode: msiexec.exe /i php-VERSION-win32-install.msi /q You can control the install directory by passing it as a parameter to the install. For example, to install to e:php: msiexec.exe /i php-VERSION-win32-install.msi /q INSTALLDIR=e:php You can also use the same syntax to specify the Apache Configuration Directory (APACHEDIR), the Sambar Server directory (SAMBARDIR), and the Xitami Server directory (XITAMIDIR). You can also specify what features to install. For example, to install the mysqli extension and the CGI executable: msiexec.exe /i php-VERSION-win32-install.msi /q ADDLOCAL=cgi,ext_php_mysqli The current list of Features to install is as follows: MainExecutable - php.exe executable ( no longer available as of PHP 5.2.10/5.3.0; it is now included by default ) ScriptExecutable - php-win.exe executable ext_php_* - the various extensions ( for example: ext_php_mysql for MySQL ) apache13 - Apache 1.3 module apache20 - Apache 2.0 module apache22 - Apache 2,2 module apacheCGI - Apache CGI executable iis4ISAPI - IIS ISAPI module iis4CGI - IIS CGI executable iis4FastCGI - IIS CGI executable NSAPI - Sun/iPlanet/Netscape server module netserve - NetServe Web Server CGI executable Xitami - Xitami CGI executable Sambar - Sambar Server ISAPI module CGI - php-cgi.exe executable PEAR - PEAR installer
  • 37. Manual - PHP Manual in CHM Format For more information on installing MSI installers from the command line, visit » http://msdn.microsoft.com/en-us/library/aa367988.aspx Upgrading PHP with the Install To upgrade, run the installer either graphically or from the command line as normal. The installer will read your current install options, remove your old installation, and reinstall PHP with the same options as before. It is recommended that you use this method of keeping PHP updated instead of manually replacing the files in the installation directory. Manual Installation Steps This section contains instructions for manually installing and configuring PHP on Microsoft Windows. For the instructions on how to use PHP installer to setup and configure PHP and a web server on Windows refer to Windows Installer (PHP 5.2 and later). Selecting and downloading the PHP distribution package Download the PHP zip binary distribution from » PHP for Windows: Binaries and Sources. There are several different versions of the zip package - chose the version that is suitable for the web server being used: • If PHP is used with IIS then choose PHP 5.3 VC9 Non Thread Safe or PHP 5.2 VC6 Non Thread Safe; • If PHP is used with Apache 1 or Apache 2 then choose PHP 5.3 VC6 or PHP 5.2 VC6. Note: VC9 Versions are compiled with the Visual Studio 2008 compiler and have improvements in performance and stability. The VC9 versions require you to have the » Microsoft 2008 C++ Runtime (x86) or the » Microsoft 2008 C++ Runtime (x64) installed. The PHP package structure and content Unpack the content of the zip archive into a directory of your choice, for example C:PHP. The directory and file structure extracted from the zip will look as below: Example #1 PHP 5 package structure c:php | +--dev | | | |-php5ts.lib | +--ext | | | |-php_bz2.dll | | -- php5.lib in non thread safe version -- extension DLLs for PHP
  • 38. | |-php_cpdf.dll | | | |-... | +--extras | +--pear | | |-go-pear.bat | |-... | |-php-cgi.exe | |-php-win.exe prompt | |-php.exe | |-... | |-php.ini-development | |-php.ini-production | |-php5apache2_2.dll | |-php5apache2_2_filter.dll | |-... | |-php5ts.dll version) | |-... -- empty -- initial copy of PEAR -- PEAR setup script -- CGI executable -- executes scripts without an opened command -- Command line PHP executable (CLI) -- default php.ini settings -- recommended php.ini settings -- does not exist in non thread safe version -- does not exist in non thread safe version -- core PHP DLL ( php5.dll in non thread safe Below is the list of the modules and executables included in the PHP zip distribution: • go-pear.bat - the PEAR setup script. Refer to » Installation (PEAR) for more details. • php-cgi.exe - CGI executable that can be used when running PHP on IIS via CGI or FastCGI. • php-win.exe - the PHP executable for executing PHP scripts without using a command line window (for example PHP applications that use Windows GUI). • php.exe - the PHP executable for executing PHP scripts within a command line interface (CLI). • php5apache2_2.dll - Apache 2.2.X module. • php5apache2_2_filter.dll - Apache 2.2.X filter. Changing the php.ini file After the php package content has been extracted, copy the php.ini-production into php.ini in the same folder. If necessary, it is also possible to place the php.ini into any other location of your choice but that will require additional configuration steps as described in PHP Configuration. The php.ini file tells PHP how to configure itself, and how to work with the environment that it runs in. Here are a number of settings for the php.ini file that help PHP work better with Windows. Some of these
  • 39. are optional. There are many other directives that may be relevant to your environment - refer to the list of php.ini directives for more information. Required directives: • extension_dir = <path to extension directory> - The extension_dir needs to point to the directory where PHP extensions files are stored. The path can be absolute (i.e. "C:PHPext") or relative (i.e. ".ext"). Extensions that are listed lower in the php.ini file need to be located in the extension_dir. • extension = xxxxx.dll - For each extension you wish to enable, you need a corresponding "extension=" directive that tells PHP which extensions in the extension_dir to load at startup time. • log_errors = On - PHP has an error logging facility that can be used to send errors to a file, or to a service (i.e. syslog) and works in conjunction with the error_log directive below. When running under IIS, the log_errors should be enabled, with a valid error_log. • error_log = <path to the error log file> - The error_log needs to specify the absolute, or relative path to the file where PHP errors should be logged. This file needs to be writable for the web server. The most common places for this file are in various TEMP directories, for example "C:inetpubtempphp-errors.log". • cgi.force_redirect = 0 - This directive is required for running under IIS. It is a directory security facility required by many other web servers. However, enabling it under IIS will cause the PHP engine to fail on Windows. • cgi.fix_pathinfo = 1 - This lets PHP access real path info following the CGI Spec. The IIS FastCGI implementation needs this set. • fastcgi.impersonate = 1 - FastCGI under IIS supports the ability to impersonate security tokens of the calling client. This allows IIS to define the security context that the request runs under. • fastcgi.logging = 0 - FastCGI logging should be disabled on IIS. If it is left enabled, then any messages of any class are treated by FastCGI as error conditions which will cause IIS to generate an HTTP 500 exception. Optional directives • max_execution_time = ## - This directive tells PHP the maximum amount of time that it can spend executing any given script. The default for this is 30 seconds. Increase the value of this directive if PHP application take long time to execute. • memory_limit = ###M - The amount of memory available for the PHP process, in Megabytes. The default is 128, which is fine for most PHP applications. Some of the more complex ones might need more. • display_errors = Off - This directive tells PHP whether to include any error messages in the stream that it returns to the Web server. If this is set to "On", then PHP will send whichever classes of errors that you define with the error_reporting directive back to web server as part of the error stream. For security reasons it is recommended to set it to "Off" on production servers in order not to reveal any security sensitive information that is often included in the error messages. • open_basedir = <paths to directories, separated by semicolon>, e.g. openbasedir="C:inetpubwwwroot;C:inetpubtemp". This directive specified the directory paths where PHP is allowed to perform file system operations. Any file operation outside of the specified paths will result in an error. This directive is especially useful for locking down the PHP installation in shared hosting environments to prevent PHP scripts from accessing any files outside
  • 40. of the web site's root directory. • upload_max_filesize = ###M and post_max_size = ###M - The maximum allowed size of an uploaded file and post data respectively. The values of these directives should be increased if PHP applications need to perform large uploads, such as for example photos or video files. PHP is now setup on your system. The next step is to choose a web server, and enable it to run PHP. Choose a web server from the table of contents. In addition to running PHP via a web server, PHP can run from the command line just like a .BAT script. See Command Line PHP on Microsoft Windows for further details. ActiveScript This section contains notes specific to the ActiveScript installation. ActiveScript is a Windows only SAPI that enables you to use PHP script in any ActiveScript compliant host, like Windows Script Host, ASP/ASP.NET, Windows Script Components or Microsoft Scriptlet control. As of PHP 5.0.1, ActiveScript has been moved to the » PECL repository. A DLL for this PECL extension is currently unavailable. See also the building on Windows section. Note: You should read the manual installation steps first! After installing PHP, you should download the ActiveScript DLL (php5activescript.dll) and place it in the main PHP folder (e.g. C:php). After having all the files needed, you must register the DLL on your system. To achieve this, open a Command Prompt window (located in the Start Menu). Then go to your PHP directory by typing something like cd C:php. To register the DLL just type regsvr32 php5activescript.dll. To test if ActiveScript is working, create a new file, named test.wsf (the extension is very important) and type: <job id="test"> <script language="PHPScript"> $WScript->Echo("Hello World!"); </script> </job> Save and double-click on the file. If you receive a little window saying "Hello World!" you're done. Note: In PHP 4, the engine was named 'ActivePHP', so if you are using PHP 4, you should replace 'PHPScript' with 'ActivePHP' in the above example. Note: ActiveScript doesn't use the default php.ini file. Instead, it will look only in the same directory as the .exe that caused it to load. You should create php-activescript.ini and place it in that folder, if you wish to load extensions, etc.
  • 41. Microsoft IIS This section contains PHP installation instructions specific to Microsoft Internet Information Services (IIS). • • Manually installing PHP on Microsoft IIS 5.1 and IIS 6.0 Manually installing PHP on Microsoft IIS 7.0 and later Microsoft IIS 5.1 and IIS 6.0 This section contains instructions for manually setting up Internet Information Services (IIS) 5.1 and IIS 6.0 to work with PHP on Microsoft Windows XP and Windows Server 2003. For instructions on setting up IIS 7.0 and later versions on Windows Vista, Windows Server 2008, Windows 7 and Windows Server 2008 R2 refer to Microsoft IIS 7.0 and later. Configuring IIS to process PHP requests Download and install PHP in accordance to the instructions described in manual installation steps Note: Non-thread-safe build of PHP is recommended when using IIS. The non-thread-safe builds are available at » PHP for Windows: Binaries and Sources Releases. Configure the CGI- and FastCGI-specific settings in php.ini file as shown below: Example #1 CGI and FastCGI settings in php.ini fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0 Download and install the » Microsoft FastCGI Extension for IIS 5.1 and 6.0. The extension is available for 32-bit and 64-bit platforms - select the right download package for your platform. Configure the FastCGI extension to handle PHP-specific requests by running the command shown below. Replace the value of the "-path" parameter with the absolute file path to the php-cgi.exe file. Example #2 Configuring FastCGI extension to handle PHP requests cscript %windir%system32inetsrvfcgiconfig.js -add -section:"PHP" ^ -extension:php -path:"C:PHPphp-cgi.exe" This command will create an IIS script mapping for *.php file extension, which will result in all URLs that end with .php being handled by FastCGI extension. Also, it will configure FastCGI extension to use the executable php-cgi.exe to process the PHP requests. Note: At this point the required installation and configuration steps are completed. The remaining instructions below are optional but highly recommended for achieving optimal functionality and performance of PHP on IIS.
  • 42. Impersonation and file system access It is recommended to enable FastCGI impersonation in PHP when using IIS. This is controlled by the fastcgi.impersonate directive in php.ini file. When impersonation is enabled, PHP will perform all the file system operations on behalf of the user account that has been determined by IIS authentication. This ensures that even if the same PHP process is shared across different IIS web sites, the PHP scripts in those web sites will not be able to access each others' files as long as different user accounts are used for IIS authentication on each web site. For example IIS 5.1 and IIS 6.0, in its default configuration, has anonymous authentication enabled with built-in user account IUSR_<MACHINE_NAME> used as a default identity. This means that in order for IIS to execute PHP scripts, it is necessary to grant IUSR_<MACHINE_NAME> account read permission on those scripts. If PHP applications need to perform write operations on certain files or write files into some folders then IUSR_<MACHINE_NAME> account should have write permission to those. To determine which user account is used by IIS anonymous authentication, follow these steps: 1. In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok"; 2. Expand the list of web sites under the "Web Sites" node in the tree view, right-click on a web site that is being used and select "Properties"; 3. Click the "Directory Security" tab; 4. Take note of a "User name:" field in the "Authentication Methods" dialog
  • 43. To modify the permissions settings on files and folders, use the Windows Explorer user interface or icacls command. Example #3 Configuring file access permissions icacls C:inetpubwwwrootupload /grant IUSR:(OI)(CI)(M) Set index.php as a default document in IIS The IIS default documents are used for HTTP requests that do not specify a document name. With PHP applications, index.php usually acts as a default document. To add index.php to the list of IIS default documents, follow these steps: 1. In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok"; 2. Right-click on the "Web Sites" node in the tree view and select "Properties"; 3. Click the "Documents" tab; 4. Click the "Add..." button and enter "index.php" for the "Default content page:".
  • 44. FastCGI and PHP Recycling configuration Configure IIS FastCGI extension settings for recycling of PHP processes by using the commands shown below. The FastCGI setting instanceMaxRequests controls how many requests will be processed by a single php-cgi.exe process before FastCGI extension shuts it down. The PHP environment variable PHP_FCGI_MAX_REQUESTS controls how many requests a single php-cgi.exe process will handle before it recycles itself. Make sure that the value specified for FastCGI InstanceMaxRequests setting is less than or equal to the value specified for PHP_FCGI_MAX_REQUESTS. Example #4 Configuring FastCGI and PHP recycling cscript %windir%system32inetsrvfcgiconfig.js -set -section:"PHP" ^ -InstanceMaxRequests:10000 cscript %windir%system32inetsrvfcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHP_FCGI_MAX_REQUESTS:10000 Configuring FastCGI timeout settings Increase the timeout settings for FastCGI extension if there are applications that have long running PHP scripts. The two settings that control timeouts are ActivityTimeout and RequestTimeout. Refer to »
  • 45. Configuring FastCGI Extension for IIS 6.0 for more information about those settings. Example #5 Configuring FastCGI timeout settings cscript %windir%system32inetsrvfcgiconfig.js -set -section:"PHP" ^ -ActivityTimeout:90 cscript %windir%system32inetsrvfcgiconfig.js -set -section:"PHP" ^ -RequestTimeout:90 Changing the Location of php.ini file PHP searches for php.ini file in several locations and it is possible to change the default locations of php.ini file by using PHPRC environment variable. To instruct PHP to load the configuration file from a custom location run the command shown below. The absolute path to the directory with php.ini file should be specified as a value of PHPRC environment variable. Example #6 Changing the location of php.ini file cscript %windir%system32inetsrvfcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHPRC:"C:SomeDirectory" Microsoft IIS 7.0 and later This section contains instructions for manually setting up Internet Information Services (IIS) 7.0 and later to work with PHP on Microsoft Windows Vista SP1, Windows 7, Windows Server 2008 and Windows Server 2008 R2. For instructions on setting up IIS 5.1 and IIS 6.0 on Windows XP and Windows Server 2003 refer to Microsoft IIS 5.1 and IIS 6.0. Enabling FastCGI support in IIS FastCGI module is disabled in default installation of IIS. The steps to enable it differ based on the version of Windows being used. To enable FastCGI support on Windows Vista SP1 and Windows 7: 1. In the Windows Start Menu choose "Run:", type "optionalfeatures.exe" and click "Ok"; 2. In the "Windows Features" dialog expand "Internet Information Services", "World Wide Web Services", "Application Development Features" and then enable the "CGI" checkbox; 3. Click OK and wait until the installation is complete.
  • 46. To enable FastCGI support on Windows Server 2008 and Windows Server 2008 R2: 1. In the Windows Start Menu choose "Run:", type "CompMgmtLauncher" and click "Ok"; 2. If the "Web Server (IIS)" role is not present under the "Roles" node, then add it by clicking "Add Roles"; 3. If the "Web Server (IIS)" role is present, then click "Add Role Services" and then enable the "CGI" checkbox under "Application Development" group; 4. Click "Next" and then "Install" and wait for the installation to complete.
  • 47. Configuring IIS to process PHP requests Download and install PHP in accordance to the instructions described in manual installation steps Note: Non-thread-safe build of PHP is recommended when using IIS. The non-thread-safe builds are available at » PHP for Windows: Binaries and Sources Releases. Configure the CGI- and FastCGI-specific settings in php.ini file as shown below: Example #1 CGI and FastCGI settings in php.ini fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0 Configure IIS handler mapping for PHP by using either IIS Manager user interface or a command line tool. Using IIS Manager user interface to create a handler mapping for PHP Follow these steps to create an IIS handler mapping for PHP in IIS Manager user interface: 1. In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";
  • 48. 2. In the IIS Manager user interface select the server node in the "Connections" tree view; 3. In the "Features View" page open the "Handler Mappings" feature; 4. In the "Actions" pane click "Add Module Mapping..."; 5. In the "Add Module Mapping" dialog enter the following: • Request path: *.php • Module: FastCgiModule • Executable: C:[Path to PHP installation]php-cgi.exe • Name: PHP_via_FastCGI 6. Click "Request Restrictions" button and then configure the mapping to invoke handler only if request is mapped to a file or a folder; 7. Click OK on all the dialogs to save the configuration.
  • 49. Using command line tool to create a handler mapping for PHP Use the command shown below to create an IIS FastCGI process pool which will use php-cgi.exe executable for processing PHP requests. Replace the value of the fullPath parameter with the absolute file path to the php-cgi.exe file. Example #2 Creating IIS FastCGI process pool %windir%system32inetsrvappcmd set config /section:system.webServer/fastCGI ^ /+[fullPath='c:PHPphp-cgi.exe'] Configure IIS to handle PHP specific requests by running the command shown below. Replace the value of the scriptProcessor parameter with the absolute file path to the php-cgi.exe file. Example #3 Creating handler mapping for PHP requests %windir%system32inetsrvappcmd set config /section:system.webServer/handlers ^ /+[name='PHP_via_FastCGI', path='*.php',verb='*',modules='FastCgiModule',^ scriptProcessor='c:PHPphp-cgi.exe',resourceType='Either']
  • 50. This command creates an IIS handler mapping for *.php file extension, which will result in all URLs that end with .php being handled by FastCGI module. Note: At this point the required installation and configuration steps are completed. The remaining instructions below are optional but highly recommended for achieving optimal functionality and performance of PHP on IIS. Impersonation and file system access It is recommended to enable FastCGI impersonation in PHP when using IIS. This is controlled by the fastcgi.impersonate directive in php.ini file. When impersonation is enabled, PHP will perform all the file system operations on behalf of the user account that has been determined by IIS authentication. This ensures that even if the same PHP process is shared across different IIS web sites, the PHP scripts in those web sites will not be able to access each other's files as long as different user accounts are used for IIS authentication on each web site. For example IIS 7, in its default configuration, has anonymous authentication enabled with built-in user account IUSR used as a default identity. This means that in order for IIS to execute PHP scripts, it is necessary to grant IUSR account read permission on those scripts. If PHP applications need to perform write operations on certain files or write files into some folders then IUSR account should have write permission to those. To determine what user account is used as an anonymous identity in IIS 7 use the following command. Replace the "Default Web Site" with the name of IIS web site that you use. In the output XML configuration element look for the userName attribute. Example #4 Determining the account used as IIS anonymous identity %windir%system32inetsrvappcmd.exe list config "Default Web Site" ^ /section:anonymousAuthentication <system.webServer> <security> <authentication> <anonymousAuthentication enabled="true" userName="IUSR" /> </authentication> </security> </system.webServer> Note: If userName attribute is not present in the anonymousAuthentication element, or is set to an empty string, then it means that the application pool identity is used as an anonymous identity for that web site. To modify the permissions settings on files and folders, use the Windows Explorer user interface or icacls command. Example #5 Configuring file access permissions icacls C:inetpubwwwrootupload /grant IUSR:(OI)(CI)(M) Set index.php as a default document in IIS The IIS default documents are used for HTTP requests that do not specify a document name. With PHP applications, index.php usually acts as a default document. To add index.php to the list of IIS default documents, use this command:
  • 51. Example #6 Set index.php as a default document in IIS %windir%system32inetsrvappcmd.exe set config ^ -section:system.webServer/defaultDocument /+"files.[value='index.php']" ^ /commit:apphost FastCGI and PHP Recycling configuration Configure IIS FastCGI settings for recycling of PHP processes by using the commands shown below. The FastCGI setting instanceMaxRequests controls how many requests will be processed by a single phpcgi.exe process before IIS shuts it down. The PHP environment variable PHP_FCGI_MAX_REQUESTS controls how many requests a single php-cgi.exe process will handle before it recycles itself. Make sure that the value specified for FastCGI InstanceMaxRequests setting is less than or equal to the value specified for PHP_FCGI_MAX_REQUESTS. Example #7 Configuring FastCGI and PHP recycling %windir%system32inetsrvappcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='c:phpphp-cgi.exe'].instanceMaxRequests:10000 %windir%system32inetsrvappcmd.exe set config -section:system.webServer/fastCgi ^ /+"[fullPath='C:{php_folder}php-cgi.exe'].environmentVariables.^ [name='PHP_FCGI_MAX_REQUESTS',value='10000']" FastCGI timeout settings Increase the timeout settings for FastCGI if it is expected to have long running PHP scripts. The two settings that control timeouts are activityTimeout and requestTimeout. Use the commands below to change the timeout settings. Make sure to replace the value in the fullPath parameter to contain the absolute path to the php-cgi.exe file. Example #8 Configuring FastCGI timeout settings %windir%system32inetsrvappcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:phpphp-cgi.exe',arguments=''].activityTimeout:"90" /commit:apphost %windir%system32inetsrvappcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:phpphp-cgi.exe',arguments=''].requestTimeout:"90" /commit:apphost Changing the Location of php.ini file PHP searches for php.ini file in several locations and it is possible to change the default locations of php.ini file by using PHPRC environment variable. To instruct PHP to load the configuration file from a custom location run the command shown below. The absolute path to the directory with php.ini file should be specified as a value of PHPRC environment variable. Example #9 Changing the location of php.ini file appcmd.exe set config -section:system.webServer/fastCgi ^ /+"[fullPath='C:phpphp.exe',arguments=''].environmentVariables.^ [name='PHPRC',value='C:SomeDirectory']" /commit:apphost
  • 52. Apache 1.3.x en Microsoft Windows Esta sección contiene notas y sugerencias específicas para Apache 1.3.x instaladas con PHP en sistemas Microsoft Windows. También hay instrucciones y notas para Apache 2 en una nueva página. Note: Por favor lea primero el manual de instalación Hay dos formas de configurar PHP para trabajar con Apache 1.3.x en Windows. La primera es usar CGI binary (php.exe para PHP 4 y php-cgi.exe para PHP 5), la otra es utilizar el módulo DLL de Apache. En ambos casos se necesita editar httpd.conf para configurar Apache para trabajar con PHP, y después reiniciar el servidor. Vale la pena resaltar, que el módulo SAPI ha sido desarrollado mas estable bajo Windows. Se recomienda su uso más que el binario CGI, ya que es más trasparente y seguro. Aunque pueden haber algunas variaciones en la configuración de PHP bajo Apache, estas son sencillas para ser utilizados por el recién llegado Por favor, consulte la documentación de Apache para seguir directivas de configuración. Después de modificar el archivo de configuración, recuerde que debe reiniciar el servidor, por ejemplo NET STOP APACHE seguido de NET START APACHE, si ejecuta Apache como un servicio de Windows, o si usa los atajos Note: Remember that when adding path values in the Apache configuration files on Windows, all backslashes such as c:directoryfile.ext should be converted to forward slashes: c:/directory/file.ext. A trailing slash may also be necessary for directories. Instalación como módulo de Apache Se deben agregar las siguientes líneas a su archivo de configuración Apache httpd.conf Example #1 PHP como módulo de Apache 1.3.x Se asume que PHP se instala enc:php. Ajuste la ruta de acceso si este no es el caso para PHP 4: # Adicionar al final de la sección LoadModule # No olvidar copiar este ficrero desde el directorio sapi! LoadModule php4_module "C:/php/php4apache.dll" # Adicionar al final de la sección AddModule AddModule mod_php4.c para PHP 5: # Adicionar al final de la sección LoadModule LoadModule php5_module "C:/php/php5apache.dll" # Adicionar al final de la sección AddModule AddModule mod_php5.c para ambos : # Adicionar esta línea dentro de la <IfModule Mod_mime.c> condicional brace AddType application/x-httpd-php .php
  • 53. # Para la sintaxis highlighted .phps files,, tambien adicionar AddType application/x-httpd-php-source .phps Instalación como un binario CGI Si se ha descomprimido el paquete PHP C:php como se describe en el Manual de instalación paso a paso sección, es necesario insertar estas líneas a su archivo de configuración de Apache para configurar el binario CGI: Example #2 PHP y Apache 1.3.x como CGI ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .php # Para PHP 4 Action application/x-httpd-php "/php/php.exe" # Para PHP 5 Action application/x-httpd-php "/php/php-cgi.exe" # Especifica el directorio donde php.ini esta SetEnv PHPRC C:/php Tenga en cuenta que la segunda línea en la lista anterior se puede encontrar en las versiones actuales de httpd.conf, pero se comenta. Recordar también sustituir el c:php para su ruta de acceso real a PHP. Warning Al usar el modo CGI, su servidor esta expuesto a diferentes ataques. Por favor, leer la sección Seguridad con CGI para aprender como defenderse de estos ataques. Si desea presentar archivos de código fuente PHP sintaxis highlighted, no existe la opción más conveniente con la versión de PHP como módulo. Si ha elegido configurar Apache para usar PHP como un binario CGI, tendrá que usar la highlight_file() función. Para ello se necesita crear un script PHP y agregarle el código <?php highlight_file('some_php_script.php'); ?>. Apache 2.x on Microsoft Windows This section contains notes and hints specific to Apache 2.x installs of PHP on Microsoft Windows systems. We also have instructions and notes for Apache 1.3.x users on a separate page. Note: You should read the manual installation steps first! Note: Apache 2.2 Support Users of Apache 2.2 should note that the DLL file for Apache 2.2 is named php5apache2_2.dll rather than php5apache2.dll and is available only for PHP 5.2.0 and later. See also » http://snaps.php.net/ You are strongly encouraged to consult the » Apache Documentation to get a basic understanding of the Apache 2.x Server. Also consider reading the » Windows specific notes for Apache 2.x before reading on here. Apache 2.x is designed to run on the Windows version designated as server platforms, such as Windows
  • 54. NT 4.0, Windows 2000, Windows XP, or Windows 7. While Apache 2.x works tolerably well on Windows 9x, support on these platforms is incomplete, and some things will not work correctly. There is no plan to remedy this situation. Download the most recent version of » Apache 2.x and a fitting PHP version. Follow the Manual Installation Steps and come back to go on with the integration of PHP and Apache. There are three ways to set up PHP to work with Apache 2.x on Windows. You can run PHP as a handler, as a CGI, or under FastCGI. Note: Remember that when adding path values in the Apache configuration files on Windows, all backslashes such as c:directoryfile.ext should be converted to forward slashes: c:/directory/file.ext. A trailing slash may also be necessary for directories. Installing as an Apache handler You need to insert the following lines into your Apache httpd.conf configuration file to load the PHP module for Apache 2.x: Example #1 PHP and Apache 2.x as handler # LoadModule php5_module "c:/php/php5apache2.dll" AddHandler application/x-httpd-php .php # configure the path to php.ini PHPIniDir "C:/php" Note: Remember to substitute your actual path to PHP for the C:/php/ in the above examples. Take care to use either php5apache2.dll or php5apache2_2.dll in your LoadModule directive and verify that the referenced file is in fact located at the file path that you point to in this directive. The above configuration will enable PHP handling of any file that has a .php extension, even if there are other file extensions. For example, a file named example.php.txt will be executed by the PHP handler. To ensure that only files that end in .php are executed, use the following configuration instead: <FilesMatch .php$> SetHandler application/x-httpd-php </FilesMatch> Running PHP as CGI You should consult the » Apache CGI documentation for a more complete understanding of running CGI on Apache. To run PHP as CGI, you'll need to place your php-cgi files in a directory designated as a CGI directory using the ScriptAlias directive. You will then need to insert a #! line in the PHP files, pointing to the location of your PHP binary: Example #2 PHP and Apache 2.x as CGI #!C:/php/php.exe <?php phpinfo();
  • 55. ?> Warning Al usar el modo CGI, su servidor esta expuesto a diferentes ataques. Por favor, leer la sección Seguridad con CGI para aprender como defenderse de estos ataques. Running PHP under FastCGI Running PHP under FastCGI has a number of advantages over running it as a CGI. Setting it up this way is fairly straightforward: Obtain mod_fcgid from » http://httpd.apache.org/mod_fcgid/. Win32 binaries are available for download from that site. Install the module according to the instructions that will come with it. Configure your web server as shown below, taking care to adjust any paths to reflect your how you have installed things on your particular system: Example #3 Configure Apache to run PHP as FastCGI LoadModule fcgid_module modules/mod_fcgid.so # Where is your php.ini file? FcgidInitialEnv PHPRC "c:/php" AddHandler fcgid-script .php FcgidWrapper "c:/php/php-cgi.exe" .php Files with a .php extension will now be executed by the PHP FastCGI wrapper. Sun, iPlanet and Netscape servers on Microsoft Windows This section contains notes and hints specific to Sun Java System Web Server, Sun ONE Web Server, iPlanet and Netscape server installs of PHP on Windows. From PHP 4.3.3 on you can use PHP scripts with the NSAPI module to generate custom directory listings and error pages. Additional functions for Apache compatibility are also available. For support in current web servers read the note about subrequests. CGI setup on Sun, iPlanet and Netscape servers To install PHP as a CGI handler, do the following: • • Copy php4ts.dll to your systemroot (the directory where you installed Windows) Make a file association from the command line. Type the following two lines: assoc .php=PHPScript ftype PHPScript=c:phpphp.exe %1 %* • In the Netscape Enterprise Administration Server create a dummy shellcgi directory and remove it just after (this step creates 5 important lines in obj.conf and allow the web server to handle
  • 56. • • shellcgi scripts). In the Netscape Enterprise Administration Server create a new mime type (Category: type, Content-Type: magnus-internal/shellcgi, File Suffix:php). Do it for each web server instance you want PHP to run More details about setting up PHP as a CGI executable can be found here: » http://benoit.noss.free.fr/php/ install-php.html NSAPI setup on Sun, iPlanet and Netscape servers To install PHP with NSAPI, do the following: • • Copy php4ts.dll to your systemroot (the directory where you installed Windows) Make a file association from the command line. Type the following two lines: assoc .php=PHPScript ftype PHPScript=c:phpphp.exe %1 %* • • In the Netscape Enterprise Administration Server create a new mime type (Category: type, Content-Type: magnus-internal/x-httpd-php, File Suffix: php). Edit magnus.conf (for servers >= 6) or obj.conf (for servers < 6) and add the following: You should place the lines after mime types init. Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans" shlib="c:/php/sapi/php4nsapi.dll" Init fn="php4_init" LateInit="yes" errorString="Failed to initialise PHP!" [php_ini="c:/path/to/php.ini"] (PHP >= 4.3.3) The php_ini parameter is optional but with it you can place your php.ini in your web server configuration directory. • Configure the default object in obj.conf (for virtual server classes [Sun Web Server 6.0+] in their vserver.obj.conf): In the <Object name="default"> section, place this line necessarily after all 'ObjectType' and before all 'AddLog' lines: Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...] (PHP >= 4.3.3) As additional parameters you can add some special php.ini-values, for example you can set a docroot="/path/to/docroot" specific to the context php4_execute is called. For boolean ini-keys please use 0/1 as value, not "On","Off",... (this will not work correctly), e.g. zlib.output_compression=1 instead of zlib.output_compression="On" • This is only needed if you want to configure a directory that only consists of PHP scripts (same like a cgi-bin directory): <Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object> After that you can configure a directory in the Administration server and assign it the style xhttpd-php. All files in it will get executed as PHP. This is nice to hide PHP usage by renaming files to .html. • • Restart your web service and apply changes Do it for each web server instance you want PHP to run
  • 57. Note: More details about setting up PHP as an NSAPI filter can be found here: » http://benoit.noss.free.fr/php/install-php4.html Note: The stacksize that PHP uses depends on the configuration of the web server. If you get crashes with very large PHP scripts, it is recommended to raise it with the Admin Server (in the section "MAGNUS EDITOR"). CGI environment and recommended modifications in php.ini Important when writing PHP scripts is the fact that Sun JSWS/Sun ONE WS/iPlanet/Netscape is a multithreaded web server. Because of that all requests are running in the same process space (the space of the web server itself) and this space has only one environment. If you want to get CGI variables like PATH_INFO, HTTP_HOST etc. it is not the correct way to try this in the old PHP way with getenv() or a similar way (register globals to environment, $_ENV). You would only get the environment of the running web server without any valid CGI variables! Note: Why are there (invalid) CGI variables in the environment? Answer: This is because you started the web server process from the admin server which runs the startup script of the web server, you wanted to start, as a CGI script (a CGI script inside of the admin server!). This is why the environment of the started web server has some CGI environment variables in it. You can test this by starting the web server not from the administration server. Use the command line as root user and start it manually - you will see there are no CGI-like environment variables. Simply change your scripts to get CGI variables in the correct way for PHP 4.x by using the superglobal $_SERVER. If you have older scripts which use $HTTP_HOST, etc., you should turn on register_globals in php.ini and change the variable order too (important: remove "E" from it, because you do not need the environment here): variables_order = "GPCS" register_globals = On Special use for error pages or self-made directory listings (PHP >= 4.3.3) You can use PHP to generate the error pages for "404 Not Found" or similar. Add the following line to the object in obj.conf for every error page you want to overwrite: Error fn="php4_execute" code=XXX script="/path/to/script.php" [inikey=value inikey=value...] where XXX is the HTTP error code. Please delete any other Error directives which could interfere with yours. If you want to place a page for all errors that could exist, leave the code parameter out. Your script can get the HTTP status code with $_SERVER['ERROR_TYPE']. Another possibility is to generate self-made directory listings. Just create a PHP script which displays a directory listing and replace the corresponding default Service line for type="magnus-internal/directory" in obj.conf with the following: Service fn="php4_execute" type="magnus-internal/directory" script="/path/to/script.php" [inikey=value inikey=value...] For both error and directory listing pages the original URI and translated URI are in the variables $_SERVER['PATH_INFO'] and $_SERVER['PATH_TRANSLATED'].
  • 58. Note about nsapi_virtual() and subrequests (PHP >= 4.3.3) The NSAPI module now supports the nsapi_virtual() function (alias: virtual()) to make subrequests on the web server and insert the result in the web page. The problem is, that this function uses some undocumented features from the NSAPI library. Under Unix this is not a problem, because the module automatically looks for the needed functions and uses them if available. If not, nsapi_virtual() is disabled. Under Windows limitations in the DLL handling need the use of a automatic detection of the most recent ns-httpdXX.dll file. This is tested for servers till version 6.1. If a newer version of the Sun server is used, the detection fails and nsapi_virtual() is disabled. If this is the case, try the following: Add the following parameter to php4_init in magnus.conf/obj.conf: Init fn=php4_init ... server_lib="ns-httpdXX.dll" where XX is the correct DLL version number. To get it, look in the server-root for the correct DLL name. The DLL with the biggest filesize is the right one. You can check the status by using the phpinfo() function. Note: But be warned: Support for nsapi_virtual() is EXPERIMENTAL!!! OmniHTTPd Server This section contains notes and hints specific to » OmniHTTPd on Windows. Note: You should read the manual installation steps first! Warning Al usar el modo CGI, su servidor esta expuesto a diferentes ataques. Por favor, leer la sección Seguridad con CGI para aprender como defenderse de estos ataques. You need to complete the following steps to make PHP work with OmniHTTPd. This is a CGI executable setup. SAPI is supported by OmniHTTPd, but some tests have shown that it is not so stable to use PHP as an ISAPI module. Note: Important for CGI users Read the faq on cgi.force_redirect for important details. This directive needs to be set to 0. 1. Install OmniHTTPd server. 2. Right click on the blue OmniHTTPd icon in the system tray and select Properties 3. Click on Web Server Global Settings 4. On the 'External' tab, enter: virtual = .php | actual = c:phpphp.exe (use php-cgi.exe if installing PHP 5), and use the Add button. 5. On the Mime tab, enter: virtual = wwwserver/stdcgi | actual = .php, and use the Add button.
  • 59. 6. Click OK Repeat steps 2 - 6 for each extension you want to associate with PHP. Note: Some OmniHTTPd packages come with built in PHP support. You can choose at setup time to do a custom setup, and uncheck the PHP component. We recommend you to use the latest PHP binaries. Some OmniHTTPd servers come with PHP 4 beta distributions, so you should choose not to set up the built in support, but install your own. If the server is already on your machine, use the Replace button in Step 4 and 5 to set the new, correct information. Sambar Server on Microsoft Windows This section contains notes and hints specific to the » Sambar Server for Windows. Note: You should read the manual installation steps first! This list describes how to set up the ISAPI module to work with the Sambar server on Windows. • Find the file called mappings.ini (in the config directory) in the Sambar install directory. • Open mappings.ini and add the following line under [ISAPI]: Example #1 ISAPI configuration of Sambar #for PHP 4 *.php = c:phpphp4isapi.dll #for PHP 5 *.php = c:phpphp5isapi.dll (This line assumes that PHP was installed in c:php.) • Now restart the Sambar server for the changes to take effect. Note: If you intend to use PHP to communicate with resources which are held on a different computer on your network, then you will need to alter the account used by the Sambar Server Service. The default account used for the Sambar Server Service is LocalSystem which will not have access to remote resources. The account can be amended by using the Services option from within the Windows Control Panel Administation Tools. Xitami on Microsoft Windows This section contains notes and hints specific to » Xitami on Windows. Note: You should read the manual installation steps first! This list describes how to set up the PHP CGI binary to work with Xitami on Windows.
  • 60. Note: Important for CGI users Read the faq on cgi.force_redirect for important details. This directive needs to be set to 0. If you want to use $_SERVER['PHP_SELF'] you have to enable the cgi.fix_pathinfo directive. Warning Al usar el modo CGI, su servidor esta expuesto a diferentes ataques. Por favor, leer la sección Seguridad con CGI para aprender como defenderse de estos ataques. • Make sure the web server is running, and point your browser to xitamis admin console (usually http://127.0.0.1/admin), and click on Configuration. • Navigate to the Filters, and put the extension which PHP should parse (i.e. .php) into the field File extensions (.xxx). • In Filter command or script put the path and name of your PHP CGI executable i.e. C:phpphp.exe for PHP 4, or C:phpphp-cgi.exe for PHP 5. • Press the 'Save' icon. • Restart the server to reflect changes. Building from source This chapter teaches how to compile PHP from sources on windows, using Microsoft's tools. To compile PHP with cygwin, please refer to Installation on Unix systems. This documentation will give you a basic understanding of how to compile PHP on Windows. This guide takes advanges of the many improvements made to the build system available in PHP 5.3.0 and greater. Getting started Before we can compile PHP we will need a compiler and some of the many libraries that PHP depends on. The only supported compilers on Windows is MSVC (Microsoft Visual C++). Versions 6 and greater is supported, however for better performance Visual C++ 2008 or greater is recommeded. This documentation will use Visual C++ 2008 and PHP 5.3.x as a base. Visual C++ exists in two editions, a commercial edition (Visual Studio) and in an "Express" edition, which is freely available from Microsoft. Installing using Visual Studio When installing Visual Studio, you will be prompted to choose which components you wish to use, in here you must check the "Visual C++" component. If you plan on compiling x64 versions of PHP, you must select the x64 compilers component below "Visual C++". If you already installed Visual Studio, then plugin your DVD and select "Add/Remove components", and follow the procedure above for installing the compiler.
  • 61. Installing using Visual C++ Express Visual C++ Express is available for free from Microsoft at: » http://www.microsoft.com/express/download/. Before installing, the installation wizard will ask you to install additional components such as SQL Server, Silverlight and so on, none of these are required for compiling PHP. Installing the Windows Platform SDK Before PHP can be compiled, we need the Windows Platform SDK. By default Visual C++ comes with the Windows Platform SDK version 6.0A, this can however not be used due to incompatibility with previous versions of the SDK. So the Windows Platform SDK 2008, which is version 6.1 is required. The SDK is freely available from Microsoft at: » http://www.microsoft.com/downloads/details.aspx? FamilyID=e6e1c3df-a74f-4207-8586-711ebe331cdc. When downloading the SDK, choose the web install, as you will only need selected components. When the download is done and the setup is prompting you to select which components you require, then select the C++ compilers (remember to tick the x64 compilers, if you want to compile the 64bit version of PHP). You don't need any other tools such as CrystalReports, Mobile Development tools or anything, just the C++ libraries, headers and compilers. Directory structure Now we need to set a directory structure for where the PHP sources will be located, aswell as the default required libraries for compiling PHP. Below structure is simple and easy usable, its however not required to have it exactly like this, but its easy to overlook. Example #1 Source and toolchain directory structure C:. +---php | +---src | +---win32build versions | | +---bin | | +---include | | +---lib | +---win64build versions (optional) | +---bin | +---include | +---lib <- Here will the PHP sources be located <- Toolchain and libraries for x86 (32 bit) <<<<- Toolchain Header files Library files Toolchain and libraries for x64 (64 bit) <- Toolchain <- Header files <- Library files Getting the PHP source There are serveral ways to get the PHP sources, either from the source tarballs or directly from the PHP SVN repository. This documentation will simply assume either option is choosen and the sources either have been exracted/checked out to the "C:phpsrc" directory from the above directory structure. Getting the PHP toolchain To compile PHP, we need a toolchain of different programs for compiling and linking default extensions. These are all available in a single zip file from the PHP on Windows repository: »
  • 62. http://pecl2.php.net/downloads/php-windows-builds/php-libs/binary-tools.zip. Extract this zip file so it complies with the directory structure for the "C:phpwin32build" directory. If you are planning to compile 64bit versions of PHP, you need to do the same with the "C:phpwin64build" directory. This is alright as the tools are platform independent. Getting the libraries required for PHP PHP is a glue language, and depends on many libraries in order to function. By default PHP requires a set of libraries for compiling the core (Engine, CLI SAPI and the standard library). These are available from PHP.net, organized in compiler versions and machine architectures. A standard PHP build requires the following mandatory libraries: • • • • ICU iconv (libiconv) libxml2 zlib If you plan to compile a standard versions of PHP. Meaning compiling all default enabled extension by running configure without any arguments, You will also need the following additional libraries for GD: • • • FreeType libpng libjpeg All these libraries are packed and published to the following URL: » http://pecl2.php.net/downloads/phpwindows-builds/php-libs/. On the above location, libraries are organized by which compiler that were used to compile them and on which platform architecture. Below explains the different shot name variants for each compiler. • • • VC6 - Visual C++ 6.0 VC8 - Visual C++ 2005 VC9 - Visual C++ 2008 When you have downloaded the mandatory libraries, and/or any additional libraries you may require, then exact them respectedly to the directory structure set in "C:phpwinXXbuild", so headers are located in the include directory and library files in the libs directory. Setting up the environment Before we can compile PHP, we must alter the PATH environment variable so the configure script can pickup the toolchain in the "C:phpwinXXbuildbin" directories. To do this, open the Start menu and right click on "Computer" and select "Properties". Select the "Advanced" tab, and hit the button saying "Environment variables". In the global variables section, find the PATH variable and select "Edit". Append the following to its current value: ;C:phpwin32buildbin and for 64bit support: ;C:phpwin32buildbin;C:phpwin64buildbin. Now you must create the following directory structure on the drive that you are using to compile on: Example #2 bison.simple directory structure C:.
  • 63. +---usr | +---local | +---share Now copy the "C:phpwin32buildbinbison.simple" file into the "C:usrlocalshare" directory. Compiling Now PHP is ready to be compiled, open the Start menu, choose "Programs" and find "Microsoft Visual Studio" (or "Microsoft Visual C++"), select the tools folder and open "Visual Studio 2008 Command Prompt". This will open a console window saying "Setting up environment for XXX", where XXX may be either x86 or x64. If you wish to compile the 64bit version of PHP, you must execute the following: Example #3 Setting up the x64 build environment cd bin vcvarsx86_amd64 Now cd to the "C:phpsrc" directory and execute the buildconf script like so: Example #4 Running buildconf buildconf Now run 'configure --help' This means that the configure script was generated with success. Now we need to run the generated configure script to generate the Makefiles for the compiler. Simply run configure like so: Example #5 Running configure configure ... ... ... As buildconf advertised, then configure --help can be used to see available commands for configure. If you have multiple cores available then enable multi processing, which optimizes and makes the compilation faster. Multi processing can be enabled using the --enable-one-shot option for configure like so: Example #6 Enabling multi processing in configure configure --enable-one-shot ... ... ... If you wish to do a minimal build, then you need to disable all default enabled extensions using the --disable-all option. When disabling all extensions and SAPIs, you must select atleast one before you can compile a PHP binary. Below example will disable all extensions, enable the CLI SAPI and enable multi processing: If you need to export debugging symbols and doing a debug build, you also need to enable the following two options: --enable-debug and --enable-debug-pack. Example #7 Configuring a minimal build of PHP with multi processing
  • 64. configure --disable-all --enable-cli --enable-one-shot ... ... ... If you need to compile an NTS (NOT Thread Safe) build of PHP, you need to pass the --disable-zts option to configure. By default PHP is compiled with Thread Safety. Now we are ready actually perform the compile, this is done by executing nmake, like so: Example #8 Executing nmake nmake ... ... ... Testing the build When the build process is complete, the PHP binary, along with all the compiled extensions will be located in a sub directory to the sources directory. Depending on the build type, it will be located in one of the following directories: • • • • Debug - Debug, NOT Thread Safe Debug_TS - Debug, Thread Safe Release - Release, NOT Thread Safe Release_TS - Release, Thread Safe If you are compiling the 64bit version of PHP, these directories will be located inside another directory called x64 from the root of the sources. To test the compiled binary, then cd to its directory and execute the following: Example #9 Testing the compiled PHP binary C:phpsrcRelease_TS> php -v PHP 5.3.X (cli) (built: XXX XX XXXX XX:XX:XX) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies Installation of extensions on Windows After installing PHP and a web server on Windows, you will probably want to install some extensions for added functionality. You can choose which extensions you would like to load when PHP starts by modifying your php.ini. You can also load a module dynamically in your script using dl(). The DLLs for PHP extensions are prefixed with php_. Many extensions are built into the Windows version of PHP. This means additional DLL files, and the extension directive, are not used to load these extensions. The Windows PHP Extensions table lists extensions that require, or used to require, additional PHP DLL files. Here's a list of built in extensions: In PHP 4 (updated PHP 4.3.11): BCMath, Caledar, COM, Ctype, FTP, MySQL, ODBC, Overload,
  • 65. PCRE, Session, Tokenizer, WDDX, XML and Zlib In PHP 5 (updated PHP 5.0.4), the following changes exist. Built in: DOM, LibXML, Iconv, SimpleXML, SPL and SQLite. And the following are no longer built in: MySQL and Overload. The default location PHP searches for extensions is C:php4extensions in PHP 4 and C:php5 in PHP 5. To change this setting to reflect your setup of PHP edit your php.ini file: • You will need to change the extension_dir setting to point to the directory where your extensions lives, or where you have placed your php_*.dll files. For example: extension_dir = C:phpextensions • Enable the extension(s) in php.ini you want to use by uncommenting the extension=php_*.dll lines in php.ini. This is done by deleting the leading ; from the extension you want to load. Example #1 Enable Bzip2 extension for PHP-Windows // change the following line from ... ;extension=php_bz2.dll // ... to extension=php_bz2.dll • Some of the extensions need extra DLLs to work. Couple of them can be found in the distribution package, in the C:phpdlls folder in PHP 4 or in the main folder in PHP 5, but some, for example Oracle (php_oci8.dll) require DLLs which are not bundled with the distribution package. If you are installing PHP 4, copy the bundled DLLs from C:phpdlls folder to the main C:php folder. Don't forget to include C:php in the system PATH (this process is explained in a separate FAQ entry). • Some of these DLLs are not bundled with the PHP distribution. See each extensions documentation page for details. Also, read the manual section titled Installation of PECL extensions for details on PECL. An increasingly large number of PHP extensions are found in PECL, and these extensions require a separate download. Note: If you are running a server module version of PHP remember to restart your web server to reflect your changes to php.ini. The following table describes some of the extensions available and required additional dlls. PHP Extensions Extension Description Notes php_bz2.dll bzip2 compression functions None php_calendar.dll Calendar conversion functions Built in since PHP 4.0.3 php_crack.dll Crack functions None php_ctype.dll ctype family functions Built in since PHP 4.3.0 php_curl.dll CURL, Client URL library functions Requires: libeay32.dll, ssleay32.dll (bundled)
  • 66. Extension Description Notes php_dba.dll DBA: DataBase (dbm-style) Abstraction layer functions None php_dbase.dll dBase functions None php_dbx.dll dbx functions php_domxml.dll DOM XML functions PHP <= 4.2.0 requires: libxml2.dll (bundled) PHP >= 4.3.0 requires: iconv.dll (bundled) php_dotnet.dll .NET functions PHP <= 4.1.1 php_exif.dll EXIF functions php_mbstring.dll. And, php_exif.dll must be loaded after php_mbstring.dll in php.ini. php_fbsql.dll FrontBase functions PHP <= 4.2.0 php_fdf.dll FDF: Forms Data Format functions. Requires: fdftk.dll (bundled) php_filepro.dll filePro functions Read-only access php_ftp.dll FTP functions Built-in since PHP 4.0.3 php_gd.dll GD library image functions Removed in PHP 4.3.2. Also note that truecolor functions are not available in GD1, instead, use php_gd2.dll. php_gd2.dll GD library image functions GD2 php_gettext.dll Gettext functions PHP <= 4.2.0 requires gnu_gettext.dll (bundled), PHP >= 4.2.3 requires libintl-1.dll, iconv.dll (bundled). php_hyperwave.d HyperWave functions ll None php_iconv.dll ICONV characterset conversion Requires: iconv-1.3.dll (bundled), PHP >=4.2.1 iconv.dll php_ifx.dll Informix functions Requires: Informix libraries php_iisfunc.dll IIS management functions None php_imap.dll IMAP POP3 and NNTP functions None php_ingres.dll Ingres functions Requires: Ingres libraries php_interbase.dll InterBase functions Requires: gds32.dll (bundled)
  • 67. Extension Description Notes php_java.dll Java functions PHP <= 4.0.6 requires: jvm.dll (bundled) php_ldap.dll LDAP functions PHP <= 4.2.0 requires libsasl.dll (bundled), PHP >= 4.3.0 requires libeay32.dll, ssleay32.dll (bundled) php_mbstring.dll Multi-Byte String functions None php_mcrypt.dll Mcrypt Encryption functions Requires: libmcrypt.dll php_mhash.dll Mhash functions PHP >= 4.3.0 requires: libmhash.dll (bundled) php_mime_magi Mimetype functions c.dll Requires: magic.mime (bundled) php_ming.dll Ming functions for Flash None php_msql.dll mSQL functions Requires: msql.dll (bundled) php_mssql.dll MSSQL functions Requires: ntwdblib.dll (bundled) php_mysql.dll MySQL functions PHP >= 5.0.0, requires libmysql.dll (bundled) php_mysqli.dll MySQLi functions PHP >= 5.0.0, requires libmysql.dll (libmysqli.dll in PHP <= 5.0.2) (bundled) php_oci8.dll Oracle 8 functions Requires: Oracle 8.1+ client libraries php_openssl.dll OpenSSL functions Requires: libeay32.dll (bundled) php_overload.dll Object overloading functions Built in since PHP 4.3.0 php_pdf.dll PDF functions None php_pgsql.dll PostgreSQL functions None php_printer.dll Printer functions None php_shmop.dll Shared Memory functions None php_snmp.dll SNMP get and walk functions NT only! php_soap.dll SOAP functions PHP >= 5.0.0 php_sockets.dll Socket functions None php_sybase_ct.dl Sybase functions l Requires: Sybase client libraries
  • 68. Extension php_tidy.dll Description Tidy functions Notes PHP >= 5.0.0 php_tokenizer.dll Tokenizer functions Built in since PHP 4.3.0 php_w32api.dll W32api functions None php_xmlrpc.dll XML-RPC functions PHP >= 4.2.1 requires: iconv.dll (bundled) php_xslt.dll XSLT functions PHP <= 4.2.0 requires sablot.dll, expat.dll (bundled). PHP >= 4.2.1 requires sablot.dll, expat.dll, iconv.dll (bundled). php_yaz.dll YAZ functions Requires: yaz.dll (bundled) php_zip.dll Zip File functions Read only access php_zlib.dll ZLib compression functions Built in since PHP 4.3.0 Command Line PHP on Microsoft Windows This section contains notes and hints specific to getting PHP running from the command line for Windows. Note: You should read the manual installation steps first! Getting PHP to run from the command line can be performed without making any changes to Windows. C:PHP5php.exe -f "C:PHP Scriptsscript.php" -- -arg1 -arg2 -arg3 But there are some easy steps that can be followed to make this simpler. Some of these steps should already have been taken, but are repeated here to be able to provide a complete step-by-step sequence. • Add the location of the PHP executable (php.exe, php-win.exe or php-cli.exe depending upon your PHP version and display preferences) to the PATH environment variable. Read more about how to add your PHP directory to PATH in the corresponding FAQ entry. • Add the .PHP extension to the PATHEXT environment variable. This can be done at the same time as amending the PATH environment variable. Follow the same steps as described in the FAQ but amend the PATHEXT environment variable rather than the PATH environment variable. Note: The position in which you place the .PHP will determine which script or program is executed when there are matching filenames. For example, placing .PHP before .BAT will cause your script to run, rather than the batch file, if there is a batch file with the same name. • Associate the .PHP extension with a file type. This is done by running the following command: assoc .php=phpfile
  • 69. • Associate the phpfile file type with the appropriate PHP executable. This is done by running the following command: ftype phpfile="C:PHP5php.exe" -f "%1" -- %~2 Following these steps will allow PHP scripts to be run from any directory without the need to type the PHP executable or the .PHP extension and all parameters will be supplied to the script for processing. The example below details some of the registry changes that can be made manually. Example #1 Registry changes Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINESOFTWAREClasses.php] @="phpfile" "Content Type"="application/php" [HKEY_LOCAL_MACHINESOFTWAREClassesphpfile] @="PHP Script" "EditFlags"=dword:00000000 "BrowserFlags"=dword:00000008 "AlwaysShowExt"="" [HKEY_LOCAL_MACHINESOFTWAREClassesphpfileDefaultIcon] @="C:PHP5php-win.exe0" [HKEY_LOCAL_MACHINESOFTWAREClassesphpfileshell] @="Open" [HKEY_LOCAL_MACHINESOFTWAREClassesphpfileshellOpen] @="&Open" [HKEY_LOCAL_MACHINESOFTWAREClassesphpfileshellOpencommand] @=""C:PHP5php.exe" -f "%1" -- %~2" With these changes the same command can be written as: "C:PHP Scriptsscript" -arg1 -arg2 -arg3 or, if your "C:PHP Scripts" path is in the PATH environment variable: script -arg1 -arg2 -arg3 Note: There is a small problem if you intend to use this technique and use your PHP scripts as a command line filter, like the example below: dir | "C:PHP Scriptsscript" -arg1 -arg2 -arg3 or dir | script -arg1 -arg2 -arg3 You may find that the script simply hangs and nothing is output. To get this operational, you need to make another registry change. Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionpoliciesExpl orer] "InheritConsoleHandles"=dword:00000001
  • 70. Further information regarding this issue can be found in this » Microsoft Knowledgebase Article : 321788. Installation of PECL extensions Table of Contents • • • • • • Introduction to PECL Installations Downloading PECL extensions Installing a PHP extension on Windows Compiling shared PECL extensions with the pecl command Compiling shared PECL extensions with phpize Compiling PECL extensions statically into PHP Introduction to PECL Installations » PECL is a repository of PHP extensions that are made available to you via the » PEAR packaging system. This section of the manual is intended to demonstrate how to obtain and install PECL extensions. These instructions assume /your/phpsrcdir/ is the path to the PHP source distribution, and that extname is the name of the PECL extension. Adjust accordingly. These instructions also assume a familiarity with the » pear command. The information in the PEAR manual for the pear command also applies to the pecl command. To be useful, a shared extension must be built, installed, and loaded. The methods described below provide you with various instructions on how to build and install the extensions, but they do not automatically load them. Extensions can be loaded by adding an extension directive. To this php.ini file, or through the use of the dl() function. When building PHP modules, it's important to have known-good versions of the required tools (autoconf, automake, libtool, etc.) See the » Anonymous SVN Instructions for details on the required tools, and required versions. Downloading PECL extensions There are several options for downloading PECL extensions, such as: • • The pecl install extname command downloads the extensions code automatically, so in this case there is no need for a separate download. » http://pecl.php.net/ The PECL web site contains information about the different extensions that are offered by the PHP Development Team. The information available here includes: ChangeLog, release notes, requirements and other similar details.
  • 71. • • pecl download extname PECL extensions that have releases listed on the PECL web site are available for download and installation using the » pecl command. Specific revisions may also be specified. SVN Most PECL extensions also reside in SVN. A web-based view may be seen at » http://svn.php.net/viewvc/pecl/. To download straight from SVN, the following sequence of commands may be used: $ svn checkout http://svn.php.net/repository/pecl/extname/trunk extname • Windows downloads At this time the PHP project does not compile Windows binaries for PECL extensions. However, to compile PHP under Windows see the chapter titled building PHP for Windows. Installing a PHP extension on Windows On Windows, you have two ways to load a PHP extension: either compile it into PHP, or load the DLL. Loading a pre-compiled extension is the easiest and preferred way. To load an extension, you need to have it available as a ".dll" file on your system. All the extensions are automatically and periodically compiled by the PHP Group (see next section for the download). To compile an extension into PHP, please refer to building from source documentation. To compile a standalone extension (aka a DLL file), please refer to building from source documentation. If the DLL file is available neither with your PHP distribution nor in PECL, you may have to compile it before you can start using the extension. Where to find an extension? PHP extensions are usually called "php_*.dll" (where the star represents the name of the extension) and they are located under the "PHPext" ("PHPextensions" in PHP4) folder. PHP ships with the extensions most useful to the majority of developers. They are called "core" extensions. However, if you need functionality not provided by any core extension, you may still be able to find one in PECL. The PHP Extension Community Library (PECL) is a repository for PHP Extensions, providing a directory of all known extensions and hosting facilities for downloading and development of PHP extensions. If you have developed an extension for your own uses, you might want to think about hosting it on PECL so that others with the same needs can benefit from your time. A nice side effect is that you give them a good chance to give you feedback, (hopefully) thanks, bug reports and even fixes/patches. Before you submit your extension for hosting on PECL, please read http://pecl.php.net/package-new.php. Which extension to download? Many times, you will find several versions of each DLL:
  • 72. • • • • • Different version numbers (at least the first two numbers should match) Different thread safety settings Different processor architecture (x86, x64, ...) Different debugging settings etc. You should keep in mind that your extension settings should match all the settings of the PHP executable you are using. The following PHP script will tell you all about your PHP settings: Example #1 phpinfo() call <?php phpinfo(); ?> Or from the command line, run: drive:pathtophpexecutablephp.exe -i Loading an extension The most common way to load a PHP extension is to include it in your php.ini configuration file. Please note that many extensions are already present in your php.ini and that you only need to remove the semicolon to activate them. ;extension=php_extname.dll extension=php_extname.dll However, some web servers are confusing because they do not use the php.ini located alongside your PHP executable. To find out where your actual php.ini resides, look for its path in phpinfo(): Configuration File (php.ini) Path Loaded Configuration File C:WINDOWS C:Program FilesPHP5.2php.ini After activating an extension, save php.ini, restart the web server and check phpinfo() again. The new extension should now have its own section. Resolving problems If the extension does not appear in phpinfo(), you should check your logs to learn where the problem comes from. If you are using PHP from the command line (CLI), the extension loading error can be read directly on screen. If you are using PHP with a web server, the location and format of the logs vary depending on your software. Please read your web server documentation to locate the logs, as it does not have anything to do with PHP itself. Common problems are the location of the DLL, the value of the " extension_dir" setting inside php.ini and compile-time setting mismatches. If the problem lies in a compile-time setting mismatch, you probably didn't download the right DLL. Try
  • 73. downloading again the extension with the right settings. Again, phpinfo() can be of great help. Compiling shared PECL extensions with the pecl command PECL makes it easy to create shared PHP extensions. Using the » pecl command, do the following: $ pecl install extname This will download the source for extname, compile, and install extname.so into your extension_dir. extname.so may then be loaded via php.ini By default, the pecl command will not install packages that are marked with the alpha or beta state. If no stable packages are available, you may install a beta package using the following command: $ pecl install extname-beta You may also install a specific version using this variant: $ pecl install extname-0.1 Note: After enabling the extension in php.ini, restarting the web service is required for the changes to be picked up. Compiling shared PECL extensions with phpize Sometimes, using the pecl installer is not an option. This could be because you're behind a firewall, or it could be because the extension you want to install is not available as a PECL compatible package, such as unreleased extensions from SVN. If you need to build such an extension, you can use the lower-level build tools to perform the build manually. The phpize command is used to prepare the build environment for a PHP extension. In the following sample, the sources for an extension are in a directory named extname: $ $ $ $ # cd extname phpize ./configure make make install A successful install will have created extname.so and put it into the PHP extensions directory. You'll need to and adjust php.ini and add an extension=extname.so line before you can use the extension. If the system is missing the phpize command, and precompiled packages (like RPM's) are used, be sure to also install the appropriate devel version of the PHP package as they often include the phpize command along with the appropriate header files to build PHP and its extensions.
  • 74. Execute phpize --help to display additional usage information. Compiling PECL extensions statically into PHP You might find that you need to build a PECL extension statically into your PHP binary. To do this, you'll need to place the extension source under the php-src/ext/ directory and tell the PHP build system to regenerate its configure script. $ $ $ $ cd /your/phpsrcdir/ext pecl download extname gzip -d < extname.tgz | tar -xvf mv extname-x.x.x extname This will result in the following directory: /your/phpsrcdir/ext/extname From here, force PHP to rebuild the configure script, and then build PHP as normal: $ cd /your/phpsrcdir $ rm configure $ ./buildconf --force $ ./configure --help $ ./configure --with-extname --enable-someotherext --with-foobar $ make $ make install Note: To run the 'buildconf' script you need autoconf 2.13 and automake 1.4+ (newer versions of autoconf may work, but are not supported). Whether --enable-extname or --with-extname is used depends on the extension. Typically an extension that does not require external libraries uses --enable. To be sure, run the following after buildconf: $ ./configure --help | grep extname Problems? Table of Contents • • • Read the FAQ Other problems Bug reports
  • 75. Read the FAQ Some problems are more common than others. The most common ones are listed in the PHP FAQ, part of this manual. Other problems If you are still stuck, someone on the PHP installation mailing list may be able to help you. You should check out the archive first, in case someone already answered someone else who had the same problem as you. The archives are available from the support page on » http://www.php.net/support.php. To subscribe to the PHP installation mailing list, send an empty mail to » php-install-subscribe@lists.php.net. The mailing list address is » php-install@lists.php.net. If you want to get help on the mailing list, please try to be precise and give the necessary details about your environment (which operating system, what PHP version, what web server, if you are running PHP as CGI or a server module, safe mode, etc.), and preferably enough code to make others able to reproduce and test your problem. Bug reports If you think you have found a bug in PHP, please report it. The PHP developers probably don't know about it, and unless you report it, chances are it won't be fixed. You can report bugs using the bugtracking system at » http://bugs.php.net/. Please do not send bug reports in mailing list or personal letters. The bug system is also suitable to submit feature requests. Read the » How to report a bug document before submitting any bug reports! Runtime Configuration Table of Contents • • • • The configuration file .user.ini files Where a configuration setting may be set How to change configuration settings
  • 76. The configuration file The configuration file (php.ini) is read when PHP starts up. For the server module versions of PHP, this happens only once when the web server is started. For the CGI and CLI version, it happens on every invocation. php.ini is searched in these locations (in order): • SAPI module specific location (PHPIniDir directive in Apache 2, -c command line option in CGI and CLI, php_ini parameter in NSAPI, PHP_INI_PATH environment variable in THTTPD) • The PHPRC environment variable. Before PHP 5.2.0 this was checked after the registry key mentioned below. • As of PHP 5.2.0, the location of the php.ini file can be set for different versions of PHP. The following registry keys are examined in order: [HKEY_LOCAL_MACHINESOFTWAREPHPx.y.z], [HKEY_LOCAL_MACHINESOFTWARE PHPx.y] and [HKEY_LOCAL_MACHINESOFTWAREPHPx], where x, y and z mean the PHP major, minor and release versions. If there is a value for IniFilePath in these keys, then the first one found will be used as the location of the php.ini (Windows only). • [HKEY_LOCAL_MACHINESOFTWAREPHP], value of IniFilePath (Windows only). • Current working directory (except CLI) • The web server's directory (for SAPI modules), or directory of PHP (otherwise in Windows) • Windows directory (C:windows or C:winnt) (for Windows), or --with-config-file-path compile time option If php-SAPI.ini exists (where SAPI is used SAPI, so the filename is e.g. php-cli.ini or php-apache.ini), it's used instead of php.ini. SAPI name can be determined by php_sapi_name(). Note: The Apache web server changes the directory to root at startup causing PHP to attempt to read php.ini from the root filesystem if it exists. The php.ini directives handled by extensions are documented respectively on the pages of the extensions themselves. The list of the core directives is available in the appendix. Probably not all PHP directives are documented in the manual though. For a complete list of directives available in your PHP version, please read your well commented php.ini file. Alternatively, you may find the » the latest php.ini from SVN helpful too. Example #1 php.ini example ; 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 = off track_errors = yes ; you can enclose strings in double-quotes include_path = ".:/usr/local/lib/php" ; backslashes are treated the same as any other character include_path = ".;c:phplib"
  • 77. Since PHP 5.1.0, it is possible to refer to existing .ini variables from within .ini files. Example: open_basedir = ${open_basedir} ":/new/dir". .user.ini files Since PHP 5.3.0, PHP includes support for .htaccess-style INI files on a per-directory basis. These files are processed only by the CGI/FastCGI SAPI. This functionality obsoletes the PECL htscanner extension. If you are using Apache, use .htaccess files for the same effect. In addition to the main php.ini file, PHP scans for INI files in each directory, starting with the directory of the requested PHP file, and working its way up to the current document root (as set in $_SERVER['DOCUMENT_ROOT']). Only INI settings with the modes PHP_INI_PERDIR and PHP_INI_USER will be recognized in .user.ini-style INI files. Two new INI directives, user_ini.filename and user_ini.cache_ttl control the use of user INI files. user_ini.filename sets the name of the file PHP looks for in each directory; if set to an empty string, PHP doesn't scan at all. The default is .user.ini. user_ini.cache_ttl controls how often user INI files are re-read. The default is 300 seconds (5 minutes). Where a configuration setting may be set These modes determine when and where a PHP directive may or may not be set, and each directive within the manual refers to one of these modes. For example, some settings may be set within a PHP script using ini_set(), whereas others may require php.ini or httpd.conf. For example, the output_buffering setting is PHP_INI_PERDIR therefore it may not be set using ini_set(). However, the display_errors directive is PHP_INI_ALL therefore it may be set anywhere, including with ini_set(). Mode PHP_INI_USER Value 1 Definition of PHP_INI_* modes Meaning Entry can be set in user scripts (like with ini_set()) or in the Windows registry PHP_INI_PERDIR 6 Entry can be set in php.ini, .htaccess or httpd.conf PHP_INI_SYSTEM 4 Entry can be set in php.ini or httpd.conf PHP_INI_ALL Entry can be set anywhere 7
  • 78. How to change configuration settings Running PHP as an Apache module When using PHP as an Apache module, you can also change the configuration settings using directives in Apache configuration files (e.g. httpd.conf) and .htaccess files. You will need "AllowOverride Options" or "AllowOverride All" privileges to do so. There are several Apache directives that allow you to change the PHP configuration from within the Apache configuration files. For a listing of which directives are PHP_INI_ALL, PHP_INI_PERDIR, or PHP_INI_SYSTEM, have a look at the List of php.ini directives appendix. php_value name value Sets the value of the specified directive. Can be used only with PHP_INI_ALL and PHP_INI_PERDIR type directives. To clear a previously set value use none as the value. Note: Don't use php_value to set boolean values. php_flag (see below) should be used instead. php_flag name on|off Used to set a boolean configuration directive. Can be used only with PHP_INI_ALL and PHP_INI_PERDIR type directives. php_admin_value name value Sets the value of the specified directive. This can not be used in .htaccess files. Any directive type set with php_admin_value can not be overridden by .htaccess or ini_set(). To clear a previously set value use none as the value. php_admin_flag name on|off Used to set a boolean configuration directive. This can not be used in .htaccess files. Any directive type set with php_admin_flag can not be overridden by .htaccess or ini_set(). Example #1 Apache configuration example <IfModule mod_php5.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag safe_mode on </IfModule> <IfModule mod_php4.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag safe_mode on </IfModule> Caution PHP constants do not exist outside of PHP. For example, in httpd.conf you can not use PHP constants such as E_ALL or E_NOTICE to set the error_reporting directive as they will have no meaning and will evaluate to 0. Use the associated bitmask values instead. These constants can be used in php.ini
  • 79. Changing PHP configuration via the Windows registry When running PHP on Windows, the configuration values can be modified on a per-directory basis using the Windows registry. The configuration values are stored in the registry key HKLMSOFTWAREPHPPer Directory Values, in the sub-keys corresponding to the path names. For example, configuration values for the directory c:inetpubwwwroot would be stored in the key HKLMSOFTWAREPHPPer Directory Valuescinetpubwwwroot. The settings for the directory would be active for any script running from this directory or any subdirectory of it. The values under the key should have the name of the PHP configuration directive and the string value. PHP constants in the values are not parsed. However, only configuration values changeable in PHP_INI_USER can be set this way, PHP_INI_PERDIR values can not. Other interfaces to PHP Regardless of how you run PHP, you can change certain values at runtime of your scripts through ini_set(). See the documentation on the ini_set() page for more information. If you are interested in a complete list of configuration settings on your system with their current values, you can execute the phpinfo() function, and review the resulting page. You can also access the values of individual configuration directives at runtime using ini_get() or get_cfg_var(). • • • • Consideraciones generales de instalación Installation on Unix systems • Apache 1.3.x on Unix systems • Apache 2.x on Unix systems • Lighttpd 1.4 on Unix systems • Caudium • fhttpd related notes • Sun, iPlanet and Netscape servers on Sun Solaris • CGI and command line setups • Notas de instalación específicas para HP-UX • OpenBSD installation notes • Solaris specific installation tips • Notas de instalación en Debian GNU/Linux Installation on Mac OS X • Using Packages • Using the bundled PHP • Compiling for OS X Server • Installing for Apache on MacOS X Client Installation on Windows systems • Windows Installer (PHP 5.1.0 and earlier) • Windows Installer (PHP 5.2 and later) • Manual Installation Steps • ActiveScript • Microsoft IIS • Microsoft IIS 5.1 and IIS 6.0 • Microsoft IIS 7.0 and later • Apache 1.3.x en Microsoft Windows • Apache 2.x on Microsoft Windows • Sun, iPlanet and Netscape servers on Microsoft Windows • OmniHTTPd Server • Sambar Server on Microsoft Windows
  • 80. Xitami on Microsoft Windows • Building from source • Installation of extensions on Windows • Command Line PHP on Microsoft Windows Installation of PECL extensions • Introduction to PECL Installations • Downloading PECL extensions • Installing a PHP extension on Windows • Compiling shared PECL extensions with the pecl command • Compiling shared PECL extensions with phpize • Compiling PECL extensions statically into PHP Problems? • Read the FAQ • Other problems • Bug reports Runtime Configuration • The configuration file • .user.ini files • Where a configuration setting may be set • How to change configuration settings • • • • Referencia del lenguaje Sintaxis básica Table of Contents • • • Saliendo de HTML Instrución separador Comentarios Saliendo de HTML Cuando PHP interpreta un fichero, buscar por las etiquetas de apertura y fin de bloque, que dicen a PHP donde empezar y finalizar la interpretación del código. Este mecanismo permite a PHP ser incrustado en todo tipo de documentos, todo lo que esté fuera de las etiquetas de PHP será ignorado por el interpretador. La mayoría de veces se encontrará con PHP incrustado en documentos HTML, como se muestra en este ejemplo. <p>Este texto va a ser ignorado.</p> <?php echo 'Mientras que esto va a ser interpretado.'; ?> <p>Esto también será ignorado.</p> También se pueden usar estructuras más avanzadas:
  • 81. Example #1 Escapar de HTML avanzado <?php if ($expression) { ?> <strong>This is true.</strong> <?php } else { ?> <strong>This is false.</strong> <?php } ?> Esto funciona como se espera, porque cuando PHP llega a las etiquetas de cerrado ?>, simplemente muestra todo lo que encuentra (excepto inmediatamente después de salto de línea - vea separador de instrución ) hasta que llega a una etiqueta de apertura. El ejemplo anterior es solo de muestra, por su puesto, pero para mostrar largos bloques de texto, salir del modo de interpretación de PHP es generalmente más eficiente que enviar todo el texto a través de echo() o print(). Existen cuatro tipos de pares de etiquetas de apertura y de fin de bloque que se pueden usar en PHP. Dos de estas, <?php ?> y <script language="php"> </script>, siempre están disponibles. Las otras dos son etiquetas cortas y etiquetas estilo ASP y se pueden activar o desactivar desde el fichero de configuración php.ini Aunque para algunas personas las etiquetas cortas y etiquetas estilo ASP las encuentran más convenientes, son menos portables y generalmente no recomendadas. Note: Observe también que si se está incrustando PHP con XML o XHTML necesitará usar las etiquetas <?php ?> para seguir los estándares. Example #2 Etiquetas de apertura y de fin de bloque de PHP 1. <?php echo 'si se quiere mostrar documentos XHTML o XML, debe hace rse así'; ?> 2. <script language="php"> echo 'algunos editores (como FrontPage) no les gusta las instruciones de proceso'; </script> 3. <? echo 'esta es la forma más simple, una instrución de procesado SGML'; ?> <?= expression ?> Esto es una forma corta para "<? echo expression ?>" 4. <% echo 'Quizá use de forma opcional etiquetas de estilo ASP'; %> <%= $variable; # Esto es una forma corta para "<% echo . . ." %> Las etiquetas vistas en los ejemplos uno y dos están siempre disponibles, el ejemplo uno es el más común y recomendado de los dos. Las etiquetas cortas (ejemplo tres) están solo disponibles cuando se activan mediante la directiva short_open_tag en el fichero de configuración php.ini o si PHP se configuró con la opción --enable-shorttags. Las etiquetas de estilo ASP (ejemplo cuatro) están solo disponibles cuando se activan mediante la directiva asp_tags en el fichero de configuración php.ini.
  • 82. Note: El uso de etiquetas cortas debe ser evitado cuando se desarrollan aplicaciones o librerias que están pensadas para su redistribución, o extender en servidores PHP que no están bajo su control, porque quizá las etiquetas cortas no están soportadas en un servidor determinado. Por portabilidad, redistribución de código, asegúrese no usar etiquetas cortas. Instrución separador Como en C o Perl, PHP requiere que las instruciones terminen en punto y coma al final de cada declaración. La etiqueta de fin de bloque de PHP automáticamente implica un punto y coma. No se tiene que usar punto y comoa para cerrar la última línea de código de PHP. La etiqueta de fin de bloque incluirá de inmediato salto de línea si no está presente. <?php echo 'Esto es una prueba'; ?> <?php echo 'Esto es una prueba' ?> <?php echo 'Hemos omitido la última etiqueta de cerrado'; Note: Note: La etiqueta de fin de bloque es opcional al final del archivo y es útil omitirlo cuando se utilizan sentencias include() o require(), para que no se produzcan espacios en blanco al final de los archivos cuando se quieren mandar cabeceras de http. También sirve cuando se captura la salida con output buffering y no se desean espacios innecesarios al final de partes generadas por archivos incluídos. Comentarios PHP Soporta comentarios 'C', 'C++' y Unix estilo de consola (estilo Perl). Por ejemplo: <?php echo 'Esto es una prueba'; // Esto es un comentario estilo c++ de una sola línea /* Esto es un comentario multi-línea si! otra lína de comentarios */ echo 'Esto es otro test'; echo 'Un test final'; # Esto es un comentario estilo consola de un a sola línea ?> Los comentarios de estilo "una sola línea" solo comentan hasta el final de la línea o del bloque actual de código PHP, lo primero que suceda. Esto implica que el código HTML después de // ... ?> o # ... ?> Imprimirá ?> para salir del modo PHP y volver a HTML, y // or # no influyen. Si la directiva de configuración asp_tags está activada, actúa igual que // %> y # %>. Sin embargo, la etiqueta </script> no rompe el modo PHP en un comentario de una sola línea. <h1>This is an <?php # echo 'simple';?> example.</h1> <p>The header above will say 'This is an example'.</p>
  • 83. Los comentarios del estilo 'C' finalizan al primer */ que se encuentre. Asegúrese que no utiliza muchos comentarios del estilo 'C'. Es muy fácil cometer errores cuando trata de comentar un gran bloque de código. <?php /* echo 'Esto es una prueba'; /* Este comentario puede causar un prob lema*/ */ ?> Tipos Table of Contents • • • • • • • • • • • Introducción Booleanos Integers Números de punto flotante Strings Arrays Objects Resources NULL Pseudo-types and variables used in this documentation Type Juggling Introducción PHP soporta ocho tipos primitivos. Cuatro tipos escalares: • • • • boolean integer float (número de punto flotante, también conocido como double ) string Dos tipos compuestos: • • array object Y finalmente dos tipos especiales: • resource
  • 84. • NULL Este manual introduce también algunos pseudo-tipos por razones de legibilidad: • • • mixed number callback Y la pseudo-variable $.... Puede que algunas referencias al tipo "double" aun existan en el manual. Considere al tipo double como el mismo que float; los dos nombres existen sólo por razones históricas. El tipo de una variable usualmente no es declarado por el programador; en cambio, es decidido en tiempo de ejecución por PHP dependiendo del contexto en el que es usado la variable. Note: Si desea chequear el tipo y valor de una expresión, use la función var_dump(). Para obtener una representación legible para humanos del tipo para propósitos de depuración, use la función gettype(). Para chequear por un cierto tipo, no use gettype(), si no las funciones is_tipo. Algunos ejemplos: <?php $un_bool = TRUE; // un valor booleano $un_str = "foo"; // una cadena $un_str2 = 'foo'; // una cadena $un_int = 12; // un entero echo gettype($un_bool); // imprime: boolean echo gettype($un_str); // imprime: string // Si este valor es un entero, incrementarlo en cuatro if (is_int($un_int)) { $un_int += 4; } // Si $bool es una cadena, imprimirla // (no imprime nada) if (is_string($un_bool)) { echo "Cadena: $un_bool"; } ?> Para forzar la conversión de una variable a cierto tipo, puede moldear la variable o usar la función settype() sobre ella. Note que una variable puede ser evaluada con valores diferentes en ciertas situaciones, dependiendo del tipo que posee en cada momento. Para más información, vea la sección sobre Manipulación de Tipos. Las tablas de comparación de tipos pueden resultar útiles también, ya que muestran ejemplos de varias comparaciones relacionadas con tipos. Booleanos Este es el tipo más simple. Un boolean expresa un valor de verdad. Puede ser TRUE or FALSE.
  • 85. Note: El tipo boolean fue introducido en PHP 4. Sintaxis Para especificar un literal boolean , use alguna de las palabras clave TRUE o FALSE. Ambas son insensibles a mayúsculas y minúsculas. <?php $foo = True; // asigna el valor TRUE a $foo ?> Usualmente se usa algún tipo de operador que devuelve un valor boolean , y luego éste es pasado a una estructura de control. <?php // == es un operador que prueba por // igualdad y devuelve un booleano if ($accion == "mostrar_version") { echo "La versión es 1.23"; } // esto no es necesario... if ($mostrar_separadores == TRUE) { echo "<hr>n"; } // ...porque se puede escribir simplemente: if ($mostrar_separadores) { echo "<hr>n"; } ?> Conversión a booleano Para convertir explícitamente un valor a boolean , use el moldeamiento (bool) o (boolean). Sin embargo, en la mayoría de casos no es necesario usar el moldeamiento, ya que un valor será convertido automáticamente si un operador, función o estructura de control requiere un argumento tipo boolean . Vea también Manipulación de Tipos. Cuando se realizan conversiones a boolean , los siguientes valores son considerados FALSE: • • • • • • • • el boolean FALSE mismo el integer 0 (cero) el float 0.0 (cero) el valor string vacío, y el string "0" un array con cero elementos un object con cero variables miembro (sólo en PHP 4) el tipo especial NULL (incluyendo variables no definidas) objetos SimpleXML creados desde etiquetas vacías Cualquier otro valor es considerado TRUE (incluyendo cualquier resource). Warning
  • 86. ¡-1 es considerado TRUE, como cualquier otro número diferente a cero (ya sea negativo o positivo)! <?php var_dump((bool) var_dump((bool) var_dump((bool) var_dump((bool) var_dump((bool) var_dump((bool) var_dump((bool) var_dump((bool) ?> ""); 1); -2); "foo"); 2.3e5); array(12)); array()); "false"); // // // // // // // // bool(false) bool(true) bool(true) bool(true) bool(true) bool(true) bool(false) bool(true) Integers An integer is a number of the set Z = {..., -2, -1, 0, 1, 2, ...}. See also: • • • Arbitrary length integer / GMP Floating point numbers Arbitrary precision / BCMath Syntax Integer s can be specified in decimal (base 10), hexadecimal (base 16), or octal (base 8) notation, optionally preceded by a sign (- or +). To use octal notation, precede the number with a 0 (zero). To use hexadecimal notation precede the number with 0x. Example #1 Integer literals <?php $a = 1234; $a = -123; $a = 0123; $a = 0x1A; ?> // // // // decimal number a negative number octal number (equivalent to 83 decimal) hexadecimal number (equivalent to 26 decimal) Formally, the structure for integer literals is: decimal : [1-9][0-9]* | 0 hexadecimal : 0[xX][0-9a-fA-F]+ octal : 0[0-7]+ integer : [+-]?decimal | [+-]?hexadecimal | [+-]?octal
  • 87. The size of an integer is platform-dependent, although a maximum value of about two billion is the usual value (that's 32 bits signed). 64-bit platforms usually have a maximum value of about 9E18. PHP does not support unsigned integer s. Integer size can be determined using the constant PHP_INT_SIZE, and maximum value using the constant PHP_INT_MAX since PHP 4.4.0 and PHP 5.0.5. Warning If an invalid digit is given in an octal integer (i.e. 8 or 9), the rest of the number is ignored. Example #2 Octal weirdness <?php var_dump(01090); // 010 octal = 8 decimal ?> Integer overflow If PHP encounters a number beyond the bounds of the integer type, it will be interpreted as a float instead. Also, an operation which results in a number beyond the bounds of the integer type will return a float instead. Example #3 Integer overflow on a 32-bit system <?php $large_number = 2147483647; var_dump($large_number); // int(2147483647) $large_number = 2147483648; var_dump($large_number); // float(2147483648) $million = 1000000; $large_number = 50000 * $million; var_dump($large_number); ?> // float(50000000000) Example #4 Integer overflow on a 64-bit system <?php $large_number = 9223372036854775807; var_dump($large_number); 7) // int(922337203685477580 $large_number = 9223372036854775808; var_dump($large_number); +18) // float(9.2233720368548E $million = 1000000; $large_number = 50000000000000 * $million; var_dump($large_number); ?> Warning // float(5.0E+19) Unfortunately, there was a bug in PHP which caused this to not always work correctly when negative numbers were involved. For example, the result of -50000 * $million is -429496728. However, when both operands were positive, there was no problem.
  • 88. This was fixed in PHP 4.1.0. There is no integer division operator in PHP. 1/2 yields the float 0.5. The value can be casted to an integer to round it downwards, or the round() function provides finer control over rounding. <?php var_dump(25/7); // float(3.5714285714286) var_dump((int) (25/7)); // int(3) var_dump(round(25/7)); // float(4) ?> Converting to integer To explicitly convert a value to integer , use either the (int) or (integer) casts. However, in most cases the cast is not needed, since a value will be automatically converted if an operator, function or control structure requires an integer argument. A value can also be converted to integer with the intval() function. See also: type-juggling. From booleans FALSE will yield 0 (zero), and TRUE will yield 1 (one). From floating point numbers When converting from float to integer , the number will be rounded towards zero. If the float is beyond the boundaries of integer (usually +/- 2.15e+9 = 2^31 on 32-bit platforms and +/9.22e+18 = 2^63 on 64-bit platforms), the result is undefined, since the float doesn't have enough precision to give an exact integer result. No warning, not even a notice will be issued when this happens! Warning Never cast an unknown fraction to integer , as this can sometimes lead to unexpected results. <?php echo (int) ( (0.1+0.7) * 10 ); // echoes 7! ?> See also the warning about float precision. From strings See String conversion to numbers From other types Caution The behaviour of converting to integer is undefined for other types. Do not rely on any observed behaviour, as it can change without notice.
  • 89. Números de punto flotante Los números de punto flotante (también conocidos como "flotantes", "dobles" o "números reales") pueden ser especificados usando cualquiera de las siguientes sintaxis: <?php $a = 1.234; $b = 1.2e3; $c = 7E-10; ?> Formalmente: LNUM [0-9]+ DNUM ([0-9]*[.]{LNUM}) | ({LNUM}[.][0-9]*) EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM}) El tamaño de un flotante depende de la plataforma, aunque un valor común consiste en un máximo de ~1.8e308 con una precisión de aproximadamente 14 dígitos decimales (lo que es un valor de 64 bits en formato IEEE). Warning Precisión del punto flotante Es bastante común que algunas fracciones decimales simples como 0.1 o 0.7 no puedan ser convertidas a su representación binaria interna sin perder un poco de precisión. Esto puede llevar a resultados confusos: por ejemplo, floor((0.1+0.7)*10) usualmente devolverá 7 en lugar del esperado 8 ya que el resultado de la representación interna es en realidad algo como 7.9. Esto se debe a que es imposible expresar de forma exacta algunas fracciones en notación decimal con un número finito de dígitos. Por ejemplo, 1/3 en forma decimal se convierte en 0.3. Así que nunca confíe en resultados de números flotantes hasta el último dígito, y nunca compare números de punto flotante para conocer si son equivalentes. Si realmente necesita una mejor precisión, las funciones matemáticas de precisión arbitraria y las funciones gmp están disponibles. Conversión a flotante Para más información sobre las conversiones de string a float , vea Conversión de cadenas a números. Para valores de otros tipos, la conversión es la misma que si el valor hubiese sido convertido a integer y luego a float . Vea Conversión a entero para más información. A partir de PHP 5, una noticia es generada si intenta convertir un objeto a float .
  • 90. Strings A string is series of characters, therefore, a character is the same as a byte. That is, there are exactly 256 different characters possible. This also implies that PHP has no native support of Unicode. See utf8_encode() and utf8_decode() for some basic Unicode functionality. Note: It is no problem for a string to become very large. PHP imposes no boundary on the size of a string ; the only limit is the available memory of the computer on which PHP is running. Syntax A string literal can be specified in four different ways: • • • • single quoted double quoted heredoc syntax nowdoc syntax (since PHP 5.3.0) Single quoted The simplest way to specify a string is to enclose it in single quotes (the character '). To specify a literal single quote, escape it with a backslash (). To specify a literal backslash before a single quote, or at the end of the string , double it (). Note that attempting to escape any other character will print the backslash too. Note: Unlike the two other syntaxes, variables and escape sequences for special characters will not be expanded when they occur in single quoted string s. <?php echo 'this is a simple string'; echo 'You can also have embedded newlines in strings this way as it is okay to do'; // Outputs: Arnold once said: "I'll be back" echo 'Arnold once said: "I'll be back"'; // Outputs: You deleted C:*.*? echo 'You deleted C:*.*?'; // Outputs: You deleted C:*.*? echo 'You deleted C:*.*?'; // Outputs: This will not expand: n a newline echo 'This will not expand: n a newline'; // Outputs: Variables do not $expand $either echo 'Variables do not $expand $either'; ?>
  • 91. Double quoted If the string is enclosed in double-quotes ("), PHP will interpret more escape sequences for special characters: Escaped characters Meaning Sequence n linefeed (LF or 0x0A (10) in ASCII) r carriage return (CR or 0x0D (13) in ASCII) t horizontal tab (HT or 0x09 (9) in ASCII) v vertical tab (VT or 0x0B (11) in ASCII) (since PHP 5.2.5) f form feed (FF or 0x0C (12) in ASCII) (since PHP 5.2.5) backslash $ dollar sign " double-quote [0-7]{1,3} the sequence of characters matching the regular expression is a character in octal notation x[0-9A-Fa-f] {1,2} the sequence of characters matching the regular expression is a character in hexadecimal notation As in single quoted string s, escaping any other character will result in the backslash being printed too. Before PHP 5.1.1, the backslash in {$var} had not been printed. The most important feature of double-quoted string s is the fact that variable names will be expanded. See string parsing for details. Heredoc A third way to delimit string s is the heredoc syntax: <<<. After this operator, an identifier is provided, then a newline. The string itself follows, and then the same identifier again to close the quotation. The closing identifier must begin in the first column of the line. Also, the identifier must follow the same naming rules as any other label in PHP: it must contain only alphanumeric characters and underscores, and must start with a non-digit character or underscore. Warning It is very important to note that the line with the closing identifier must contain no other characters, except possibly a semicolon (;). That means especially that the identifier may not be indented, and there may not be any spaces or tabs before or after the semicolon. It's also important to realize that the first character before the closing identifier must be a newline as defined by the local operating system. This is n on UNIX systems, including Mac OS X. The closing delimiter (possibly followed by a semicolon) must also be followed by a newline.
  • 92. If this rule is broken and the closing identifier is not "clean", it will not be considered a closing identifier, and PHP will continue looking for one. If a proper closing identifier is not found before the end of the current file, a parse error will result at the last line. Heredocs can not be used for initializing class properties. Since PHP 5.3, this limitation is valid only for heredocs containing variables. Example #1 Invalid example <?php class foo { public $bar = <<<EOT bar EOT; } ?> Heredoc text behaves just like a double-quoted string , without the double quotes. This means that quotes in a heredoc do not need to be escaped, but the escape codes listed above can still be used. Variables are expanded, but the same care must be taken when expressing complex variables inside a heredoc as with string s. Example #2 Heredoc string quoting example <?php $str = <<<EOD Example of string spanning multiple lines using heredoc syntax. EOD; /* More complex example, with variables. */ class foo { var $foo; var $bar; function foo() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); } } $foo = new foo(); $name = 'MyName'; echo <<<EOT My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should print a capital 'A': x41 EOT; ?> El resultado del ejemplo sería:
  • 93. My name is "MyName". I am printing some Foo. Now, I am printing some Bar2. This should print a capital 'A': A It is also possible to use the Heredoc syntax to pass data to function arguments: Example #3 Heredoc in arguments example <?php var_dump(array(<<<EOD foobar! EOD )); ?> As of PHP 5.3.0, its possible to initialize static variables and class properties/constants using the Heredoc syntax: Example #4 Using Heredoc to initialize static values <?php // Static variables function foo() { static $bar = <<<LABEL Nothing in here... LABEL; } // Class properties/constants class foo { const BAR = <<<FOOBAR Constant example FOOBAR; public $baz = <<<FOOBAR Property example FOOBAR; } ?> PHP 5.3.0 also introduces the possibility for Heredoc's to use double quotes in declarings: Example #5 Using double quotes in Heredoc <?php echo <<<"FOOBAR" Hello World! FOOBAR; ?> Note: Heredoc support was added in PHP 4.
  • 94. Nowdoc Nowdocs are to single-quoted strings what heredocs are to double-quoted strings. A nowdoc is specified similarly to a heredoc, but no parsing is done inside a nowdoc. The construct is ideal for embedding PHP code or other large blocks of text without the need for escaping. It shares some features in common with the SGML <![CDATA[ ]]> construct, in that it declares a block of text which is not for parsing. A nowdoc is identified with the same <<< sequence used for heredocs, but the identifier which follows is enclosed in single quotes, e.g. <<<'EOT'. All the rules for heredoc identifiers also apply to nowdoc identifiers, especially those regarding the appearance of the closing identifier. Example #6 Nowdoc string quoting example <?php $str = <<<'EOD' Example of string spanning multiple lines using nowdoc syntax. EOD; /* More complex example, with variables. */ class foo { public $foo; public $bar; function foo() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); } } $foo = new foo(); $name = 'MyName'; echo <<<'EOT' My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should not print a capital 'A': x41 EOT; ?> El resultado del ejemplo sería: My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should not print a capital 'A': x41 Note: Unlike heredocs, nowdocs can be used in any static data context. The typical example is initializing class properties or constants: Example #7 Static data example <?php class foo {
  • 95. public $bar = <<<'EOT' bar EOT; } ?> Note: Nowdoc support was added in PHP 5.3.0. Variable parsing When a string is specified in double quotes or with heredoc, variables are parsed within it. There are two types of syntax: a simple one and a complex one. The simple syntax is the most common and convenient. It provides a way to embed a variable, an array value, or an object property in a string with a minimum of effort. The complex syntax was introduced in PHP 4, and can be recognised by the curly braces surrounding the expression. Simple syntax If a dollar sign ($) is encountered, the parser will greedily take as many tokens as possible to form a valid variable name. Enclose the variable name in curly braces to explicitly specify the end of the name. <?php $beer = 'Heineken'; echo "$beer's taste is great"; // works; "'" is an invalid character f or variable names echo "He drank some $beers"; // won't work; 's' is a valid character for variable names but the variable is "$beer" echo "He drank some ${beer}s"; // works echo "He drank some {$beer}s"; // works ?> Similarly, an array index or an object property can be parsed. With array indices, the closing square bracket (]) marks the end of the index. The same rules apply to object properties as to simple variables. <?php // These examples are specific to using arrays inside of strings. // When outside of a string, always quote array string keys and do not use // {braces}. // Show all errors error_reporting(E_ALL); $fruits = array('strawberry' => 'red', 'banana' => 'yellow'); // Works, but note that this works differently outside a string echo "A banana is $fruits[banana]."; // Works echo "A banana is {$fruits['banana']}.";
  • 96. // Works, but PHP looks for a constant named banana first, as describe d below. echo "A banana is {$fruits[banana]}."; // Won't work, use braces. This results in a parse error. echo "A banana is $fruits['banana']."; // Works echo "A banana is " . $fruits['banana'] . "."; // Works echo "This square is $square->width meters broad."; // Won't work. For a solution, see the complex syntax. echo "This square is $square->width00 centimeters broad."; ?> For anything more complex, you should use the complex syntax. Complex (curly) syntax This isn't called complex because the syntax is complex, but because it allows for the use of complex expressions. In fact, any value in the namespace can be included in a string with this syntax. Simply write the expression the same way as it would appear outside the string , and then wrap it in { and }. Since { can not be escaped, this syntax will only be recognised when the $ immediately follows the {. Use {$ to get a literal {$. Some examples to make it clear: <?php // Show all errors error_reporting(E_ALL); $great = 'fantastic'; // Won't work, outputs: This is { fantastic} echo "This is { $great}"; // Works, outputs: This is fantastic echo "This is {$great}"; echo "This is ${great}"; // Works echo "This square is {$square->width}00 centimeters broad."; // Works echo "This works: {$arr[4][3]}"; // This is wrong for the same reason as $foo[bar] is wrong outside a string. // In other words, it will still work, but only because PHP first look s for a // constant named foo; an error of level E_NOTICE (undefined constant) will be // thrown.
  • 97. echo "This is wrong: {$arr[foo][3]}"; // Works. When using multi-dimensional arrays, always use braces aroun d arrays // when inside of strings echo "This works: {$arr['foo'][3]}"; // Works. echo "This works: " . $arr['foo'][3]; echo "This works too: {$obj->values[3]->name}"; echo "This is the value of the var named $name: {${$name}}"; echo "This is the value of the var named by the return value of getNam e(): {${getName()}}"; echo "This is the value of the var named by the return value of $object->getName(): {${$object->getName()}}"; ?> It is also possible to access class properties using variables within strings using this syntax. <?php class foo { var $bar = 'I am bar.'; } $foo $bar $baz echo echo ?> = new foo(); = 'bar'; = array('foo', 'bar', 'baz', 'quux'); "{$foo->$bar}n"; "{$foo->$baz[1]}n"; El resultado del ejemplo sería: I am bar. I am bar. Note: Functions, method calls, static class variables, and class constants inside {$} work since PHP 5. However, the value accessed will be interpreted as the name of a variable in the scope in which the string is defined. Using single curly braces ({}) will not work for accessing the return values of functions or methods or the values of class constants or static class variables. <?php // Show all errors. error_reporting(E_ALL); class beers { const softdrink = 'rootbeer'; public static $ale = 'ipa'; } $rootbeer = 'A & W';
  • 98. $ipa = 'Alexander Keith's'; // This works; outputs: I'd like an A & W echo "I'd like an {${beers::softdrink}}n"; // This works too; outputs: I'd like an Alexander Keith's echo "I'd like an {${beers::$ale}}n"; ?> String access and modification by character Characters within string s may be accessed and modified by specifying the zero-based offset of the desired character after the string using square array brackets, as in $str[42]. Think of a string as an array of characters for this purpose. The functions substr() and substr_replace() can be used when you want to extract or replace more than 1 character. Note: String s may also be accessed using braces, as in $str{42}, for the same purpose. However, this syntax is deprecated as of PHP 5.3.0. Use square brackets instead, such as $str[42]. Warning Writing to an out of range offset pads the string with spaces. Non-integer types are converted to integer. Illegal offset type emits E_NOTICE. Negative offset emits E_NOTICE in write but reads empty string. Only the first character of an assigned string is used. Assigning empty string assigns NUL byte. Example #8 Some string examples <?php // Get the first character of a string $str = 'This is a test.'; $first = $str[0]; // Get the third character of a string $third = $str[2]; // Get the last character of a string. $str = 'This is still a test.'; $last = $str[strlen($str)-1]; // Modify the last character of a string $str = 'Look at the sea'; $str[strlen($str)-1] = 'e'; ?> Note: Accessing variables of other types using [] or {} silently returns NULL. Useful functions and operators String s may be concatenated using the '.' (dot) operator. Note that the '+' (addition) operator will not work for this. See String operators for more information. There are a number of useful functions for string manipulation.
  • 99. See the string functions section for general functions, and the regular expression functions or the Perlcompatible regular expression functions for advanced find & replace functionality. There are also functions for URL strings, and functions to encrypt/decrypt strings (mcrypt and mhash). Finally, see also the character type functions. Converting to string A value can be converted to a string using the (string) cast or the strval() function. String conversion is automatically done in the scope of an expression where a string is needed. This happens when using the echo() or print() functions, or when a variable is compared to a string . The sections on Types and Type Juggling will make the following clearer. See also the settype() function. A boolean TRUE value is converted to the string "1". Boolean FALSE is converted to "" (the empty string). This allows conversion back and forth between boolean and string values. An integer or float is converted to a string representing the number textually (including the exponent part for float s). Floating point numbers can be converted using exponential notation (4.1E+6). Note: The decimal point character is defined in the script's locale (category LC_NUMERIC). See the setlocale() function. Array s are always converted to the string "Array"; because of this, echo() and print() can not by themselves show the contents of an array . To view a single element, use a construction such as echo $arr['foo']. See below for tips on viewing the entire contents. Object s in PHP 4 are always converted to the string "Object". To print the values of object properties for debugging reasons, read the paragraphs below. To get an object's class name, use the get_class() function. As of PHP 5, the __toString method is used when applicable. Resource s are always converted to string s with the structure "Resource id #1", where 1 is the unique number assigned to the resource by PHP at runtime. Do not rely upon this structure; it is subject to change. To get a resource 's type, use the get_resource_type() function. NULL is always converted to an empty string. As stated above, directly converting an array , object , or resource to a string does not provide any useful information about the value beyond its type. See the functions print_r() and var_dump() for more effective means of inspecting the contents of these types. Most PHP values can also be converted to string s for permanent storage. This method is called serialization, and is performed by the serialize() function. If the PHP engine was built with WDDX support, PHP values can also be serialized as well-formed XML text. String conversion to numbers When a string is evaluated in a numeric context, the resulting value and type are determined as follows. If the string does not contain any of the characters '.', 'e', or 'E' and the numeric value fits into integer type limits (as defined by PHP_INT_MAX), the string will be evaluated as an integer . In all other cases it will be evaluated as a float . The value is given by the initial portion of the string . If the string starts with valid numeric data, this will
  • 100. be the value used. Otherwise, the value will be 0 (zero). Valid numeric data is an optional sign, followed by one or more digits (optionally containing a decimal point), followed by an optional exponent. The exponent is an 'e' or 'E' followed by one or more digits. <?php $foo = $foo = $foo = $foo = $foo = $foo = $foo = $foo = ?> 1 + "10.5"; 1 + "-1.3e3"; 1 + "bob-1.3e3"; 1 + "bob3"; 1 + "10 Small Pigs"; 4 + "10.2 Little Piggies"; "10.0 pigs " + 1; "10.0 pigs " + 1.0; // // // // // // // // $foo $foo $foo $foo $foo $foo $foo $foo is is is is is is is is float (11.5) float (-1299) integer (1) integer (1) integer (11) float (14.2) float (11) float (11) For more information on this conversion, see the Unix manual page for strtod(3). To test any of the examples in this section, cut and paste the examples and insert the following line to see what's going on: <?php echo "$foo==$foo; type is " . gettype ($foo) . "<br />n"; ?> Do not expect to get the code of one character by converting it to integer, as is done in C. Use the ord() and chr() functions to convert between ASCII codes and characters. Arrays Un array (matriz) en PHP es en realidad un mapa ordenado. Un mapa es un tipo de datos que asocia valores con claves. Este tipo es optimizado para varios usos diferentes; puede ser usado como una matriz real, una lista (vector), tabla asociativa (caso particular de implementación de un mapa), diccionario, colección, pila, cola y probablemente más. Ya que los valores de un array pueden ser otros array s, también es posible crear árboles y array s multidimensionales. Una explicación sobre tales estructuras de datos se encuentra por fuera del propósito de este manual, pero encontrará al menos un ejemplo de cada uno de ellos. Para más información, consulte la extensa literatura que existe sobre este amplio tema. Sintaxis Especificación con array() Un valor array puede ser creado por la construcción de lenguaje array(). Ésta toma un cierto número de parejas clave => valor separadas con coma. array( key => value , ... ) // key puede ser un integer o string // value puede ser cualquier valor
  • 101. <?php $arr = array("foo" => "bar", 12 => true); echo $arr["foo"]; // bar echo $arr[12]; // 1 ?> Un key puede ser un integer o bien un string . Si una clave es la representación estándar de un integer , será interpretada como tal (es decir, "8" será interpretado como 8, mientras que "08" será interpretado como "08"). Los valores float en key serán truncados a valores tipo integer . Los tipos de arrays indexados y asociativos son el mismo tipo en PHP, el cual pueden contener índices tipo integer o string . Un valor puede ser de cualquier tipo en PHP. Note: Intentar acceder a un array cuya key no está defina es lo mismo que acceder a cualquier otra variable no definida: Se producirá un error de nivel E_NOTICE, y el resultado será NULL. <?php $arr = array("somearray" => array(6 => 5, 13 => 9, "a" => 42)); echo $arr["somearray"][6]; echo $arr["somearray"][13]; echo $arr["somearray"]["a"]; ?> // 5 // 9 // 42 Si no especifica una key para un valor dado, entonces es usado el máximo de los índices integer , y la nueva key será ese valor máximo más 1. Si se especifica una key que ya tiene un valor asignado, ése valor será sobrescrito. <?php // Este array es lo mismo que... array(5 => 43, 32, 56, "b" => 12); // ...este array array(5 => 43, 6 => 32, 7 => 56, "b" => 12); ?> Warning Antes de PHP 4.3.0, agregar un elemento a un array cuya key máxima actual es un valor negativo creaba una nueva key como se ha descrito anteriormente. A partir de PHP 4.3.0, la nueva key será 0. Al usar TRUE como key, el valor será evaluado al integer 1. Al usar FALSE como key, el valor será evaluado al integer 0. Al usar NULL como key, el valor será evaluado a una cadena vacía. El uso de una cadena vacía como key creará (o reemplazará) una key con la cadena vacía y su valor; no es lo mismo que usar corchetes vacíos. Array s y objetos no pueden ser usados como keys. Al hacerlo se producirá una advertencia: Illegal offset type. Creación/modificación con sintaxis de corchetes cuadrados Es posible modificar un array existente al definir valores explícitamente en el. Esto es posible al asignar valores al array al mismo tiempo que se especifica la key entre corchetes.
  • 102. También es posible omitir la key, lo que resulta en una pareja de corchetes vacíos ([]). $arr[key] = value; $arr[] = value; // key puede ser un integer o un // value puede ser cualquier valor string Si $arr no existe aun, será creada, así que ésta es también una forma alternativa de crear un array . Para modificar un cierto valor, simplemente asigne un nuevo valor a un elemento usando su key. Para remover una pareja key/valor, use la función unset() sobre ella. <?php $arr = array(5 => 1, 12 => 2); $arr[] = 56; // Esto es igual que $arr[13] = 56; // en este punto del script $arr["x"] = 42; // Esto agrega un nuevo elemento a la // array con la key "x" unset($arr[5]); // Esto elimina el elemento del array unset($arr); ?> // Esto elimina el array completamente Note: Como se menciona anteriormente, si no se especifica una key, entonces se toma el máximo de los índices integer existentes, y la nueva key será ese valor máximo más 1. Si no existen índices integer aun, la clave será 0 (cero). Note que el entero máximo usado en la key para este caso no necesita existir actualmente en el array . Tan solo debe haber existido en el array en algún punto desde que el array haya sido re-indexado. El siguiente ejemplo ilustra este caso: <?php // Crea un array simple. $array = array(1, 2, 3, 4, 5); print_r($array); // Ahora eliminar cada ítem, pero dejar el array mismo intacto : foreach ($array as $i => $value) { unset($array[$i]); } print_r($array); // Agregar un ítem (note que la nueva key es 5, en lugar de 0) . $array[] = 6; print_r($array); // Re-indexar: $array = array_values($array); $array[] = 7; print_r($array); ?> El resultado del ejemplo sería: Array
  • 103. ( [0] [1] [2] [3] [4] => => => => => 1 2 3 4 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 ) Funciones útiles Existe un buen número de funciones útiles para trabajar con array. Consulte la sección funciones de arrays. Note: La función unset() le permite eliminar keys de un array. Tenga en cuenta que el array no es re-indexado. Si desea el comportamiento real de "eliminar y desplazar", el array puede ser re-indexado usando la función array_values(). <?php $a = array(1 => 'one', 2 => 'two', 3 => 'three'); unset($a[2]); /* producirá un array que hubiera sido definida como $a = array(1 => 'one', 3 => 'three'); y NO $a = array(1 => 'one', 2 =>'three'); */ $b = array_values($a); // Ahora $b es array(0 => 'one', 1 =>'three') ?> La estructura de control foreach existe específicamente para array s. Ésta provee una manera fácil de recorrer un array . Recomendaciones sobre arrays y cosas a evitar ¿Porqué es incorrecto $foo[bar]? Siempre deben usarse comillas alrededor de un índice de array tipo cadena literal. Por ejemplo, $foo['bar'] es correcto, mientras que $foo[bar] no lo es. ¿Pero porqué? Es común encontrar este tipo de sintaxis en scripts viejos: <?php $foo[bar] = 'enemy'; echo $foo[bar]; // etc
  • 104. ?> Esto está mal, pero funciona. La razón es que este código tiene una constante indefinida (bar) en lugar de un valor string ('bar' - note las comillas). Puede que en el futuro PHP defina constantes que, desafortunadamente para tal tipo de código, tengan el mismo nombre. Funciona porque PHP automáticamente convierte una cadena pura (un string sin comillas que no corresponda con símbolo conocido alguno) en un string que contiene la cadena pura. Por ejemplo, si no se ha definido una constante llamada bar, entonces PHP reemplazará su valor por la cadena 'bar' y usará ésta última. Note: Esto no quiere decir que siempre haya que usar comillas en la clave. No use comillas con claves que sean constantes o variables, ya que en tal caso PHP no podrá interpretar sus valores. <?php error_reporting(E_ALL); ini_set('display_errors', true); ini_set('html_errors', false); // Array simple: $array = array(1, 2); $count = count($array); for ($i = 0; $i < $count; $i++) { echo "nRevisando $i: n"; echo "Mal: " . $array['$i'] . "n"; echo "Bien: " . $array[$i] . "n"; echo "Mal: {$array['$i']}n"; echo "Bien: {$array[$i]}n"; } ?> El resultado del ejemplo sería: Revisando 0: Notice: Undefined index: Mal: Bien: 1 Notice: Undefined index: Mal: Bien: 1 Revisando 1: Notice: Undefined index: Mal: Bien: 2 Notice: Undefined index: Mal: Bien: 2 $i in /path/to/script.html on line 9 $i in /path/to/script.html on line 11 $i in /path/to/script.html on line 9 $i in /path/to/script.html on line 11 Más ejemplos para demostrar este comportamiento: <?php // Mostrar todos los errores error_reporting(E_ALL); $arr = array('fruit' => 'apple', 'veggie' => 'carrot'); // Correcto print $arr['fruit']; // apple print $arr['veggie']; // carrot // Incorrecto. Esto funciona pero también genera un error de PHP de
  • 105. // nivel E_NOTICE ya que no hay definida una constante llamada fruit // // Notice: Use of undefined constant fruit - assumed 'fruit' in... print $arr[fruit]; // apple // Esto define una constante para demostrar lo que pasa. El valor 'veg gie' // es asignado a una constante llamada fruit. define('fruit', 'veggie'); // Note la diferencia ahora print $arr['fruit']; // apple print $arr[fruit]; // carrot // Lo siguiente está bien ya que se encuentra al interior de una caden a. Las constantes no son procesadas al // interior de cadenas, así que no se produce un error E_NOTICE aquí print "Hello $arr[fruit]"; // Hello apple // Con una excepción, los corchetes que rodean las matrices al // interior de cadenas permiten el uso de constantes print "Hello {$arr[fruit]}"; // Hello carrot print "Hello {$arr['fruit']}"; // Hello apple // Esto no funciona, resulta en un error de intérprete como: // Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_N UM_STRING' // Esto por supuesto se aplica también al uso de superglobales en cade nas print "Hello $arr['fruit']"; print "Hello $_GET['foo']"; // La concatenación es otra opción print "Hello " . $arr['fruit']; // Hello apple ?> Cuando se habilita error_reporting para mostrar errores de nivel E_NOTICE (como por ejemplo definiendo el valor E_ALL), este tipo de usos serán inmediatamente visibles. Por omisión, error_reporting se encuentra configurado para no mostrarlos. Tal y como se indica en la sección de sintaxis, lo que existe entre los corchetes cuadrados ('[' y ']') debe ser una expresión. Esto quiere decir que código como el siguiente funciona: <?php echo $arr[somefunc($bar)]; ?> Este es un ejemplo del uso de un valor devuelto por una función como índice del array. PHP también conoce las constantes: <?php $error_descriptions[E_ERROR] = "Un error fatal ha ocurrido"; $error_descriptions[E_WARNING] = "PHP produjo una advertencia"; $error_descriptions[E_NOTICE] = "Esta es una noticia informal"; ?>
  • 106. Note que E_ERROR es también un identificador válido, asi como bar en el primer ejemplo. Pero el último ejemplo es equivalente a escribir: <?php $error_descriptions[1] = "Un error fatal ha ocurrido"; $error_descriptions[2] = "PHP produjo una advertencia"; $error_descriptions[8] = "Esta es una noticia informal"; ?> ya que E_ERROR es igual a 1, etc. ¿Entonces porqué está mal? En algún momento en el futuro, puede que el equipo de PHP quiera usar otra constante o palabra clave, o una constante proveniente de otro código puede interferir. Por ejemplo, en este momento no puede usar las palabras empty y default de esta forma, ya que son palabras clave reservadas. Note: Reiterando, al interior de un valor string entre comillas dobles, es válido no rodear los índices de matriz con comillas, así que "$foo[bar]" es válido. Consulte los ejemplos anteriores para más detalles sobre el porqué, así como la sección sobre procesamiento de variables en cadenas. Conversión a array Para cualquiera de los tipos: integer , float , string , boolean y resource , convertir un valor a un array resulta en un array con un solo elemento, con índice 0, y el valor del escalar que fue convertido. En otras palabras, (array)$scalarValue es exactamente lo mismo que array($scalarValue). Si convierte un object a un array , el resultado es un array cuyos elementos son las propiedados del object . Las keys son los nombres de las variables miembro, con algunas excepciones notables: las variables privadas tienen el nombre de la clase al comienzo del nombre de la variable; las variables protegidas tienen un caracter '*' al comienzo del nombre de la variable. Estos valores adicionados al inicio tienen bytes nulos a los lados. Esto puede resultar en algunos comportamientos inesperados: <?php class A { private $A; // } Este campo se convertirá en '0A0A' class B extends A { private $A; // Este campo se convertirá en '0B0A' public $AA; // Este campo se convertirá en 'AA' } var_dump((array) new B()); ?> En el ejemplo anterior parecerá que se tienen dos claves llamadas 'AA', aunque en realidad una de ellas se llama '0A0A'. Si convierte un valor NULL a array , obtiene un array vacío.
  • 107. Comparación Es posible comparar arrays con la función array_diff() y mediante operadores de arrays. Ejemplos El tipo matriz en PHP es bastante versátil. Aquí hay algunos ejempos: <?php // Esto: $a = array( 'color' 'taste' 'shape' 'name' 4 ); => 'red', => 'sweet', => 'round', => 'apple', // la clave será 0 $b = array('a', 'b', 'c'); // . . .es completamente equivalente a $a = array(); $a['color'] = 'red'; $a['taste'] = 'sweet'; $a['shape'] = 'round'; $a['name'] = 'apple'; $a[] = 4; // la clave será 0 $b = $b[] $b[] $b[] array(); = 'a'; = 'b'; = 'c'; // Después de que se ejecute el código, $a será el array // array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round', // 'name' => 'apple', 0 => 4), y $b será el array // array(0 => 'a', 1 => 'b', 2 => 'c'), o simplemente array('a', 'b', 'c'). ?> Example #1 Uso de array() <?php // Array como mapa de propiedades $map = array( 'version' => 4, 'OS' => 'Linux', 'lang' => 'english', 'short_tags' => true ); // Keys estrictamente numéricas $array = array( 7, 8, 0, 156,
  • 108. -10 ); // esto es lo mismo que array(0 => 7, 1 => 8, ...) $switching = array( 5 3 'a' 10, // key = 0 => 6, => 7, => 4, 11, // key = 6 (el índice entero máximo er a 5) '8' => 2, // key = 8 (integer!) '02' => 77, // key = '02' 0 => 12 // el valor 10 será reemplazado por 12 ); // array vacío $empty = array(); ?> Example #2 Colección <?php $colors = array('rojo', 'azul', 'verde', 'amarillo'); foreach ($colors as $color) { echo "¿Le gusta el $color?n"; } ?> El resultado del ejemplo sería: ¿Le ¿Le ¿Le ¿Le gusta gusta gusta gusta el el el el rojo? azul? verde? amarillo? Modificar los valores del array directamente es posible a partir de PHP 5, pasándolos por referencia. Las versiones anteriores necesitan una solución alternativa: Example #3 Colección <?php // PHP 5 foreach ($colors as &$color) { $color = strtoupper($color); } unset($color); /* se asegura de que escrituras subsiguientes a $color no modifiquen el último elemento del arrays */ // Alternativa para versiones anteriores foreach ($colors as $key => $color) { $colors[$key] = strtoupper($color); } print_r($colors);
  • 109. ?> El resultado del ejemplo sería: Array ( [0] [1] [2] [3] ) => => => => ROJO AZUL VERDE AMARILLO Este ejemplo crea un array con base uno. Example #4 Índice con base 1 <?php $firstquarter = array(1 => 'Enero', 'Febrero', 'Marzo'); print_r($firstquarter); ?> El resultado del ejemplo sería: Array ( [1] => 'Enero' [2] => 'Febrero' [3] => 'Marzo' ) Example #5 Llenado de un array <?php // llenar un array con todos los ítems de un directorio $handle = opendir('.'); while (false !== ($file = readdir($handle))) { $files[] = $file; } closedir($handle); ?> Array s son ordenadas. El orden puede ser modificado usando varias funciones de ordenado. Vea la sección sobre funciones de arrays para más información. La función count() puede ser usada para contar el número de elementos en un array . Example #6 Ordenado de un array <?php sort($files); print_r($files); ?> Dado que el valor de un array puede ser cualquier cosa, también puede ser otro array . De esta forma es posible crear array s recursivas y multi-dimensionales. Example #7 Arrays recursivos y multi-dimensionales <?php
  • 110. $fruits = array ( "fruits" => array ( "a" => "orange", "b" => "banana", "c" => "apple" ), "numbers" => array ( 1, 2, 3, 4, 5, 6 ), "holes" => array ( "first", 5 => "second", "third" ) ); // Algunos ejemplos que hacen referencia a los valores del array anter ior echo $fruits["holes"][5]; // prints "second" echo $fruits["fruits"]["a"]; // prints "orange" unset($fruits["holes"][0]); // remove "first" // Crear una nueva array multi-dimensional $juices["apple"]["green"] = "good"; ?> La asignación de array s siempre involucra la copia de valores. Use el operador de referencia para copiar un array por referencia. <?php $arr1 = array(2, 3); $arr2 = $arr1; $arr2[] = 4; // $arr2 ha cambiado, // $arr1 sigue siendo array(2, 3) $arr3 = &$arr1; $arr3[] = 4; // ahora $arr1 y $arr3 son iguales ?> Objects Object Initialization To create a new object , use the new statement to instantiate a class: <?php class foo { function do_foo() {
  • 111. echo "Doing foo."; } } $bar = new foo; $bar->do_foo(); ?> For a full discussion, see the Classes and Objects chapter. Converting to object If an object is converted to an object , it is not modified. If a value of any other type is converted to an object , a new instance of the stdClass built-in class is created. If the value was NULL, the new instance will be empty. Array s convert to an object with properties named by keys, and corresponding values. For any other value, a member variable named scalar will contain the value. <?php $obj = (object) 'ciao'; echo $obj->scalar; // outputs 'ciao' ?> Resources A resource is a special variable, holding a reference to an external resource. Resources are created and used by special functions. See the appendix for a listing of all these functions and the corresponding resource types. Note: The resource type was introduced in PHP 4 See also the get_resource_type() function. Converting to resource As resource variables hold special handlers to opened files, database connections, image canvas areas and the like, converting to a resource makes no sense. Freeing resources Thanks to the reference-counting system introduced with PHP 4's Zend Engine, a resource with no more references to it is detected automatically, and it is freed by the garbage collector. For this reason, it is rarely necessary to free the memory manually. Note: Persistent database links are an exception to this rule. They are not destroyed by the garbage collector. See the persistent connections section for more information.
  • 112. NULL The special NULL value represents a variable with no value. NULL is the only possible value of type NULL . Note: The null type was introduced in PHP 4. A variable is considered to be null if: • it has been assigned the constant NULL. • it has not been set to any value yet. • it has been unset(). Syntax There is only one value of type null , and that is the case-insensitive keyword NULL. <?php $var = NULL; ?> See also the functions is_null() and unset(). Casting to NULL Casting a variable to null will remove the variable and unset its value. Pseudo-types and variables used in this documentation mixed mixed indicates that a parameter may accept multiple (but not necessarily all) types. gettype() for example will accept all PHP types, while str_replace() will accept string s and array s. number number indicates that a parameter can be either integer or float . callback Some functions like call_user_func() or usort() accept user-defined callback functions as a parameter. Callback functions can not only be simple functions, but also object methods, including static class methods.
  • 113. A PHP function is passed by its name as a string . Any built-in or user-defined function can be used, except language constructs such as: array(), echo(), empty(), eval(), exit(), isset(), list(), print() or unset(). A method of an instantiated object is passed as an array containing an object at index 0 and the method name at index 1. Static class methods can also be passed without instantiating an object of that class by passing the class name instead of an object at index 0. Apart from common user-defined function, create_function() can also be used to create an anonymous callback function. As of PHP 5.3.0 it is possible to also pass a closure to a callback parameter. Example #1 Callback function examples <?php // An example callback function function my_callback_function() { echo 'hello world!'; } // An example callback method class MyClass { static function myCallbackMethod() { echo 'Hello World!'; } } // Type 1: Simple callback call_user_func('my_callback_function'); // Type 2: Static class method call call_user_func(array('MyClass', 'myCallbackMethod')); // Type 3: Object method call $obj = new MyClass(); call_user_func(array($obj, 'myCallbackMethod')); // Type 4: Static class method call (As of PHP 5.2.3) call_user_func('MyClass::myCallbackMethod'); // Type 5: Relative static class method call (As of PHP 5.3.0) class A { public static function who() { echo "An"; } } class B extends A { public static function who() { echo "Bn"; } } call_user_func(array('B', 'parent::who')); // A ?>
  • 114. Example #2 Callback example using a Closure <?php // Our closure $double = function($a) { return $a * 2; }; // This is our range of numbers $numbers = range(1, 5); // Use the closure as a callback here to // double the size of each element in our // range $new_numbers = array_map($double, $numbers); print implode(' ', $new_numbers); ?> El resultado del ejemplo sería: 2 4 6 8 10 Note: In PHP4, it was necessary to use a reference to create a callback that points to the actual object , and not a copy of it. For more details, see References Explained. Note: Las funciones de retorno de llamada que se registran con funciones como call_user_func() y call_user_func_array() no se llamarán si se produce una excepción en la función de retorno previa. void void as a return type means that the return value is useless. void in a parameter list means that the function doesn't accept any parameters. ... $... in function prototypes means and so on. This variable name is used when a function can take an endless number of arguments. Type Juggling PHP does not require (or support) explicit type definition in variable declaration; a variable's type is determined by the context in which the variable is used. That is to say, if a string value is assigned to variable $var, $var becomes a string . If an integer value is then assigned to $var, it becomes an integer . An example of PHP's automatic type conversion is the addition operator '+'. If either operand is a float , then both operands are evaluated as float s, and the result will be a float . Otherwise, the operands will be interpreted as integer s, and the result will also be an integer . Note that this does not change the types of the operands themselves; the only change is in how the operands are evaluated and what the type of the
  • 115. expression itself is. <?php $foo = "0"; // $foo is string (ASCII 48) $foo += 2; // $foo is now an integer (2) $foo = $foo + 1.3; // $foo is now a float (3.3) $foo = 5 + "10 Little Piggies"; // $foo is integer (15) $foo = 5 + "10 Small Pigs"; // $foo is integer (15) ?> If the last two examples above seem odd, see String conversion to numbers. To force a variable to be evaluated as a certain type, see the section on Type casting. To change the type of a variable, see the settype() function. To test any of the examples in this section, use the var_dump() function. Note: The behaviour of an automatic conversion to array is currently undefined. Also, because PHP supports indexing into string s via offsets using the same syntax as array indexing, the following example holds true for all PHP versions: <?php $a = 'car'; // $a is a string $a[0] = 'b'; // $a is still a string echo $a; // bar ?> See the section titled String access by character for more information. Type Casting Type casting in PHP works much as it does in C: the name of the desired type is written in parentheses before the variable which is to be cast. <?php $foo = 10; // $foo is an integer $bar = (boolean) $foo; // $bar is a boolean ?> The casts allowed are: • • • • • • • (int), (integer) - cast to integer (bool), (boolean) - cast to boolean (float), (double), (real) - cast to float (string) - cast to string (array) - cast to array (object) - cast to object (unset) - cast to NULL (PHP 5) (binary) casting and b prefix forward support was added in PHP 5.2.1 Note that tabs and spaces are allowed inside the parentheses, so the following are functionally equivalent: <?php $foo = (int) $bar; $foo = ( int ) $bar; ?>
  • 116. Casting literal string s and variables to binary string s: <?php $binary = (binary) $string; $binary = b"binary string"; ?> Note: Instead of casting a variable to a string , it is also possible to enclose the variable in double quotes. <?php $foo = 10; // $foo is an integer $str = "$foo"; // $str is a string $fst = (string) $foo; // $fst is also a string // This prints out that "they are the same" if ($fst === $str) { echo "they are the same"; } ?> It may not be obvious exactly what will happen when casting between certain types. For more information, see these sections: • • • • • • • • • Converting to boolean Converting to integer Converting to float Converting to string Converting to array Converting to object Converting to resource Converting to NULL The type comparison tables Variables Table of Contents • • • • • Conceptos básicos Variables Predefinidas Ámbito de las variables Variables variables Variables Desde Fuentes Externas Conceptos básicos En PHP las variables se representan con un signo de dólar seguido por el nombre de la variable. El
  • 117. nombre de la variable es sensible a minúsculas y mayúsculas. Los nombres de variables siguen las mismas reglas que otras etiquetas en PHP. Un nombre de variable válido tiene que empezar con una letra o un carácter de subrayado (underscore), seguido de cualquier número de letras, números y caracteres de subrayado. Como expresión regular se podría expresar como: '[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*' Note: Para los propósitos de este manual, una letra es a-z, A-Z, y los bytes del 127 al 255 (0x7f-0xff). Note: $this es una variable especial que no puede ser asignada. Tip Vea también Userland Naming Guide. Para más información sobre funciones relacionadas con variables, vea la Referencia de Funciones de Variables. <?php $var = 'Roberto'; $Var = 'Juan'; echo "$var, $Var"; $4site = 'aun no'; $_4site = 'aun no'; do $täyte = 'mansikka'; ?> // imprime "Roberto, Juan" // inválido; comienza con un número // válido; comienza con un carácter de subraya // válido; 'ä' es ASCII (Extendido) 228 De forma predeterminada, las variables siempre se asignan por valor. Esto significa que cuando se asigna una expresión a una variable, el valor completo de la expresión original se copia en la variable de destino. Esto quiere decir que, por ejemplo, después e asignar el valor de una variable a otra, los cambios que se efectúen a una de esas variables no afectará a la otra. Para más información sobre este tipo de asignación, vea Expresiones. PHP también 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" ó "apunta a") la variable original. Los cambios a la nueva variable afectan a la original, y viceversa. Para asignar por referencia, simplemente se antepone un signo ampersand (&) al comienzo de la variable cuyo valor se está asignando (la variable fuente). Por ejemplo, el siguiente segmento de código produce la salida 'Mi nombre es Bob' dos veces: <?php $foo = 'Bob'; // Asigna el valor 'Bob' a $foo $bar = &$foo; // Referenciar $foo vía $bar. $bar = "Mi nombre es $bar"; // Modificat $bar... echo $foo; // $foo también se modifica. echo $bar; ?> Algo importante a tener en cuenta es que sólo las variables con nombre pueden ser asignadas por referencia. <?php $foo = 25; $bar = &$foo; // Esta es una asignación válida.
  • 118. $bar = &(24 * 7); // Inválida; referencia una expresión sin nombre. function test() { return 25; } $bar = &test(); ?> // Inválido. No es necesario inicializar variables en PHP, sin embargo, es una muy buena práctica. Las variables no inicializadas tienen un valor predeterminado de acuerdo a su tipo dependiendo del contexto en el que son usadas - las booleanas se asumen como FALSE, los enteros y flotantes como cero, las cadenas (p.ej. usadas en echo()) se establecen como una cadena vacía y las matrices se convierten en un array vacía. Example #1 Valores predeterminados en variables sin inicializar <?php // Una variable no definida Y no referenciada (sin contexto de uso); i mprime // NULL var_dump($variable_indefinida); // Uso booleano; imprime 'false' (Vea operadores ternarios para más // información sobre esta sintaxis) echo($booleano_indefinido ? "truen" : "falsen"); // Uso de una cadena; imprime 'string(3) "abc"' $cadena_indefinida .= 'abc'; var_dump($cadena_indefinida); // Uso de un entero; imprime 'int(25)' $int_indefinido += 25; // 0 + 25 => 25 var_dump($int_indefinido); // Uso de flotante/doble; imprime 'float(1.25)' $flotante_indefinido += 1.25; var_dump($flotante_indefinido); // Uso de array; imprime array(1) { [3]=> string(3) "def" } $array_indefinida[3] = "def"; // array() + array(3 => "def") => array( 3 => "def") var_dump($array_indefinida); // Uso de objetos; crea un nuevo objeto stdClass (vea http://www.php.n et/manual/en/reserved.classes.php) // Imprime: object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" } $objeto_indefinido->foo = 'bar'; var_dump($objeto_indefinido); ?> Depender del valor predeterminado de una variable sin inicializar es problemático al incluír un archivo en otro que use el mismo nombre de variable. También es un importante riesgo de seguridad cuando la opción register_globals se encuentra habilitada. Un error de nivel E_NOTICE es emitido cuendo se trabaja con variables sin inicializar, con la excepción del caso en el que se anexan elementos a un array no inicializada. La construcción del lenguaje isset() puede ser usada para detectar si una variable ya ha sido inicializada.
  • 119. Variables Predefinidas PHP proporciona una gran cantidad de variables predefinidas a cualquier script que se ejecute. Muchas de éstas, sin embargo, no pueden ser completamente documentadas ya que dependen del servidor que esté corriendo, la versión y configuración de dicho servidor, y otros factores. Algunas de estas variables no estarán disponibles cuando se ejecute PHP desde la línea de comandos. Para obtener una lista de estas variables, por favor vea la sección sobre Variables Predefinidas Reservadas. Warning A partir de PHP 4.2.0, el valor predeterminado de la directiva PHP register_globals es off (desactivada). Este es un cambio importante en PHP. Teniendo register_globals off afecta el conjunto de variables predefinidas disponibles en el sistema. Por ejemplo, para obtener DOCUMENT_ROOT se usará $_SERVER['DOCUMENT_ROOT'] en vez de $DOCUMENT_ROOT ó $_GET['id'] de la URL http://www.example.com/test.php?id=3 en lugar de $id ó $_ENV['HOME'] en lugar de $HOME. Para más información sobre este cambio, puede consultar el apartado de configuración sobre register_globals, el capítulo sobre seguridad Usando "Register Globals" , asi como los anuncios de lanzamiento de PHP » 4.1.0 y » 4.2.0 El uso de las variables reservadas predefinidas en PHP, como las matrices superglobales es recomendable. A partir de PHP 4.1.0, PHP ofrece un conjunto adicional de matrices predefinidas que contienen variables del servidor web, el entorno y entradas del usuario. Estas nuevas matrices son un poco especiales porque son automáticamente globales. Por esta razón, son conocidas a menudo como "superglobales". Las superglobales se mencionan más abajo; sin embargo para una lista de sus contenidos y más información sobre variables predefinidas en PHP, por favor consulte la sección Variables predefinidas reservadas. Asimismo, podrá notar cómo las antiguas variables predefinidas ($HTTP_*_VARS) todavía existen. A partir de PHP 5.0.0, las arrays de tipo long variables predefinidas se pueden desactivar con la directiva register_long_arrays . Note: Variables variables Las superglobales no pueden ser usadas como variables variables al interior de funciones o métodos de clase. Note: Aun cuando las superglobales y HTTP_*_VARS pueden existir al mismo tiempo; estas variables no son idénticas, así que modificar una no cambia la otra. Si ciertas variables no son definidas en variables_order, las matrices PHP predefinidas asociadas a estas, estarán vacías. Ámbito de las variables El ámbito de una variable es el contexto dentro del que la variable está definida. La mayor parte de las variables PHP sólo tienen un ámbito simple. Este ámbito simple también abarca los ficheros incluídos y los requeridos. Por ejemplo:
  • 120. <?php $a = 1; include 'b.inc'; ?> Aquí, la variable $a estará disponible al interior del script incluído b.inc. Sin embargo, al interior de las funciones definidas por el usuario se introduce un ámbito local a la función. Cualquier variable usada dentro de una función está, por omisión, limitada al ámbito local de la función. Por ejemplo: <?php $a = 1; /* ámbito global */ function test() { echo $a; /* referencia a una variable del ámbito local */ } test(); ?> Este script no producirá salida, ya que la sentencia echo utiliza una versión local de la variable $a, a la que no se ha asignado ningún valor en su ámbito. Puede que usted note que hay una pequeña diferencia con el lenguaje C, en el que las variables globales están disponibles automáticamente dentro de la función a menos que sean expresamente sobreescritas por una definición 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 función si van a ser utilizadas dentro de dicha función. La palabra clave global En primer lugar, un ejemplo de uso de global: Example #1 Uso de global <?php $a = 1; $b = 2; function Suma() { global $a, $b; $b = $a + $b; } Suma(); echo $b; ?> El script anterior producirá la salida "3". Al declarar $a y $b globales dentro de la función, todas las referencias a tales variables se referirán a la versión global. No hay límite al número de variables globales que se pueden manipular dentro de una función. Un segundo método para acceder a las variables desde un ámbito global es usando el array $GLOBALS. El ejemplo anterior se puede reescribir así:
  • 121. Example #2 Uso de $GLOBALS en lugar de global <?php $a = 1; $b = 2; function Suma() { $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b']; } Suma(); 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. $GLOBALS existe en cualquier ámbito, esto ocurre ya que $GLOBALS es una superglobal. Aquí hay un ejemplo que demuestra el poder de las superglobales: Example #3 Ejemplo que demuestra las superglobales y el ámbito <?php function test_global() { // La mayoría de variables predefinidas no son "super" y requieren // 'global' para estar disponibles al ámbito local de las funcione s. global $HTTP_POST_VARS; echo $HTTP_POST_VARS['name']; // Las superglobales están disponibles en cualquier ámbito y no // requieren 'global'. Las superglobales están disponibles desde // PHP 4.1.0, y ahora HTTP_POST_VARS se considera obsoleta. echo $_POST['name']; } ?> Uso de variables estáticas Otra característica importante del ámbito de las variables es la variable estática. Una variable estática existe sólo en el ámbito local de la función, pero no pierde su valor cuando la ejecución del programa abandona este ámbito. Consideremos el siguiente ejemplo: Example #4 Ejemplo que demuestra la necesidad de variables estáticas <?php function test() { $a = 0; echo $a; $a++; } ?>
  • 122. Esta función tiene poca utilidad ya que cada vez que es llamada asigna a $a el valor 0 e imprime un "0". La sentencia $a++, que incrementa la variable, no sirve para nada, ya que en cuanto la función finaliza, la variable $a desaparece. Para hacer una función útil para contar, que no pierda la pista del valor actual del conteo, la variable $a debe declararse como estática: Example #5 Ejemplo del uso de variables estáticas <?php function test() { static $a = 0; echo $a; $a++; } ?> Ahora, $a se inicializa únicamente en la primera llamada a la función, y cada vez que la función test() es llamada, imprimirá el valor de $a y lo incrementa. Las variables estáticas también proporcionan una forma de manejar funciones recursivas. Una función recursiva es la que se llama a sí misma. Se debe tener cuidado al escribir una función recursiva, ya que puede ocurrir que se llame a sí misma indefinidamente. Hay que asegurarse de implementar una forma adecuada de terminar la recursión. La siguiente función cuenta recursivamente hasta 10, usando la variable estática $count para saber cuándo parar: Example #6 Variables estáticas con funciones recursivas <?php function test() { static $count = 0; $count++; echo $count; if ($count < 10) { test(); } $count--; } ?> Note: Las variables estáticas pueden ser declarados como se ha visto en los ejemplos anteriores. Al tratar de asignar valores a estas variables que sean el resultado de expresiones, causará un error de análisis sintáctico. Example #7 Declaración de variables estáticas <?php function foo(){ static $int = 0; static $int = 1+2; presión) static $int = sqrt(121); también) $int++; // correcto // incorrecto (ya que es una ex // incorrecto (es una expresión
  • 123. echo $int; } ?> Note: Las declaraciones estáticas son resueltas en tiempo de compilación. Referencias con variables globales y estáticas El motor Zend 1, utilizado por PHP 4, implementa los modificadores static y global para variables en términos de referencias. Por ejemplo, una variable global verdadera importada dentro del ámbito de una función con global crea una referencia a la variable global. Esto puede ser causa de un comportamiento inesperado, tal y como podemos comprobar en el siguiente ejemplo: <?php function prueba_referencia_global() { global $obj; $obj = &new stdclass; } function prueba_no_referencia_global() { global $obj; $obj = new stdclass; } prueba_referencia_global(); var_dump($obj); prueba_no_referencia_global(); var_dump($obj); ?> El resultado del ejemplo sería: NULL object(stdClass)(0) { } Un comportamiento similar se aplica a static. Las referencias no son almacenadas estáticamente. <?php function &obtener_instancia_ref() { static $obj; echo 'Objeto estático: '; var_dump($obj); if (!isset($obj)) { // Asignar una referencia a la variable estática $obj = &new stdclass; } $obj->property++; return $obj; } function &obtener_instancia_no_ref() {
  • 124. static $obj; echo 'Objeto estático: '; var_dump($obj); if (!isset($obj)) { // Asignar el objeto a la variable estática $obj = new stdclass; } $obj->property++; return $obj; } $obj1 = obtener_instancia_ref(); $aun_obj1 = obtener_instancia_ref(); echo "n"; $obj2 = obtener_instancia_no_ref(); $aun_obj2 = obtener_instancia_no_ref(); ?> El resultado del ejemplo sería: Objeto estático: NULL Objeto estático: NULL Objeto estático: NULL Objeto estático: object(stdClass)(1) { ["property"]=> int(1) } Este ejemplo demuestra que al asignar una referencia a una variable estática, esta no es recordada cuando se invoca la funcion &obtener_instancia_ref() por segunda vez. Variables variables A veces es conveniente tener nombres de variables variables. Dicho de otro modo, son nombres de variables que se pueden definir y usar dinámicamente. Una variable normal se establece con una sentencia como: <?php $a = 'hola'; ?> Una variable variable toma el valor de una variable y lo trata como el nombre de una variable. En el ejemplo anterior, hola, se puede usar como el nombre de una variable utilizando dos signos de dólar. Es decir: <?php $$a = 'mundo'; ?>
  • 125. En este momento se han definido y almacenado dos variables en el árbol de símbolos de PHP: $a, que contiene "hola", y $hola, que contiene "mundo". Es más, esta sentencia: <?php echo "$a ${$a}"; ?> produce el mismo resultado que: <?php echo "$a $hola"; ?> esto quiere decir que ambas producen el resultado: hola mundo. Para usar variables variables con matrices, hay que resolver un problema de ambigüedad. Si se escribe $ $a[1] el intérprete necesita saber si nos referimos a utilizar $a[1] como una variable, o si se pretendía utilizar $$a como variable y el índice [1] como índice de dicha variable. La sintaxis para resolver esta ambigüedad es: ${$a[1]} para el primer caso y ${$a}[1] para el segundo. También se puede acceder a las propiedades de la clase usando el nombre de la variable de la propiedad. El nombre de la propiedad será resuelto según donde se hizo la llamada. Por ejemplo, en esta expresión $foo->$bar, de forma local en la clase se buscará por $bar y su valor será usado como el nombre de la propiedad de $foo. Esto también es cierto si $bar es un acceso a un array. Example #1 Ejemplo de variable función <?php class foo { var $bar = 'I am bar.'; } $foo $bar $baz echo echo ?> = new foo(); = 'bar'; = array('foo', 'bar', 'baz', 'quux'); $foo->$bar . "n"; $foo->$baz[1] . "n"; El resultado del ejemplo sería: I am bar. I am bar. Warning Por favor tenga en cuenta que las variables variables no pueden usarse con las Matrices superglobales de PHP al interior de funciones o métodos de clase. La variable $this es también una variable especial que no puede ser referenciada dinámicamente. Variables Desde Fuentes Externas
  • 126. Formularios HTML (GET y POST) Cuando se envía un formulario a un script PHP, las variables de dicho formulario pasan a estar automáticamente disponibles en el script gracias a PHP. Por ejemplo, consideremos el siguiente formulario: Example #1 Variables de formulario simples <form action="foo.php" method="post"> Nombre: <input type="text" name="username" /><br /> Email: <input type="text" name="email" /><br /> <input type="submit" name="submit" value="¡Enviarme!" /> </form> Dependiendo de su configuración y preferencias personales, existen muchas maneras de acceder a los datos de formularios HTML. Algunos ejemplos: Example #2 Acceso a datos de un formulario simple HTML POST <?php // Disponible desde PHP 4.1.0 echo $_POST['username']; echo $_REQUEST['username']; import_request_variables('p', 'p_'); echo $p_username; // Desde PHP 5.0.0, las variables predefinidas largas se pueden // desactivar con la directiva register_long_arrays. echo $HTTP_POST_VARS['username']; // Disponible si la directiva de PHP register_globals = on. A partir de // PHP 4.2.0 el valor predeterminado de register_globals = off. // Usar o depender de este método no es recomendable. echo $username; ?> Usar un formulario GET es similar excepto en el uso de variables predefinidas, que en este caso serán del tipo GET. GET también se usa con QUERY_STRING (la información despues del símbolo '?' en una URL). Por ejemplo http://www.example.com/test.php?id=3 contiene datos GET que son accesibles con $_GET['id']. Vea también $_REQUEST e import_request_variables(). Note: Las matrices superglobales, como $_POST y $_GET, están disponibles desde PHP 4.1.0. Note: Puntos y espacios en nombres de variable son convertidos a subguiones. Por ejemplo <input name="a.b" /> resulta $_REQUEST["a_b"]. Como hemos dicho, antes de PHP 4.2.0, el valor por omisión de register_globals era on (activado). La comunidad PHP recomienda no confiar en esta directiva ya que es preferible asumir que tiene el valor off (desactivada) y programar teniendo en cuenta esto. Note: La directiva de configuración magic_quotes_gpc afecta a valores Get, Post y Cookie. Si está activada (on), el valor (It's "PHP!") será convertido automáticamente a (It's "PHP!"). El escape de caracteres es necesario en inserciones a bases de datos. Vea también addslashes(), stripslashes() y magic_quotes_sybase.
  • 127. PHP también entiende matrices en el contexto de variables de formularios (vea la faq relacionada). Se puede, por ejemplo, agrupar juntas variables relacionadas o usar esta característica para obtener valores de una entrada "select" múltiple. Por ejemplo, vamos a mandar un formulario a sí mismo y a presentar los datos cuando se reciban: Example #3 Variables de formulario más complejas <?php if ($_POST) { echo '<pre>'; echo htmlspecialchars(print_r($_POST, true)); echo '</pre>'; } ?> <form action="" method="post"> Nombre: <input type="text" name="personal[nombre]" /><br /> Email: <input type="text" name="personal[email]" /><br /> Cerveza: <br /> <select multiple name="cerveza[]"> <option value="warthog">Warthog</option> <option value="guinness">Guinness</option> <option value="stuttgarter">Stuttgarter Schwabenbräu</option> </select><br /> <input type="submit" value="¡enviarme!" /> </form> Nombres de variables tipo IMAGE SUBMIT Cuando se envía un formulario, es posible usar una imagen en vez del botón estándar "submit": <input type="image" src="image.gif" name="sub" /> Cuando el usuario hace click en cualquier parte de la imagen, el formulario que la acompaña se transmitirá al servidor con dos variables adicionales, sub_x y sub_y. Éstas contienen las coordenadas del clic del usuario dentro de la imagen. Los más experimentados puede notar que los nombres de variable enviados por el navegador contienen un guión en vez de un subrayado (guión bajo), pero PHP convierte el guión en subrayado automáticamente. Cookies HTTP PHP soporta cookies de HTTP de forma transparente tal y como están definidas en las » Especificaciones de Netscape. 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 función setcookie(). Las cookies son parte de la cabecera HTTP, así que se debe llamar a la función SetCookie antes de que se envíe cualquier salida al navegador. Es la misma restricción que para la función header(). Los datos de una cookie están disponibles en el array con datos de cookies apropiada, tal como $_COOKIE, $HTTP_COOKIE_VARS y también en $_REQUEST. Vea la función setcookie() para más detalles y ejemplos. Si se quieren asignar múltiples valores a una sola cookie, basta con asignarlo como un array. Por ejemplo: <?php setcookie("MiCookie[foo]", 'Prueba 1', time()+3600); setcookie("MiCookie[bar]", 'Prueba 2', time()+3600);
  • 128. ?> Esto creará dos cookies separadas aunque MyCookie será un array simple en el script. Si se quiere definir una sola cookie con valores múltiples, considere el uso de la función serialize() o explode() primero en el valor. Nótese que una cookie reemplazará a una cookie anterior que tuviese el mismo nombre en el navegador a menos que la ruta o el dominio fuesen diferentes. Así, para una aplicación de carrito de compras se podría querer mantener un contador e ir pasándolo. Es decir: Example #4 Un ejemplo de setcookie() <?php if (isset($_COOKIE['conteo'])) { $conteo = $_COOKIE['conteo'] + 1; } else { $conteo = 1; } setcookie('conteo', $conteo, time()+3600); setcookie("Carrito[$conteo]", $item, time()+3600); ?> Puntos en los nombres de variables de entrada Típicamente, PHP no altera los nombres de las variables cuando se pasan a un script. Sin embargo, hay que notar que el punto no es un carácter válido en el nombre de una variable PHP. Para conocer la razón, considere el siguiente ejemplo: <?php $varname.ext; /* nombre de variable inválido */ ?> Lo que el intérprete vé es el nombre de una variable $varname, seguido por el operador de concatenación, y seguido por la cadena pura (es decir, una cadena sin entrecomillar que no coincide con ninguna palabra clave o reservada conocida) 'ext'. Obviamente, no se pretendía que fuese éste el resultado. Por esta razón, es importante hacer notar que PHP reemplazará automáticamente cualquier punto en los nombres de variables de entrada por guiones bajos (subrayados). Determinación de los tipos de variables Dado que PHP determina los tipos de las variables y los convierte (generalmente) según lo 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: gettype(), is_array(), is_float(), is_int(), is_object(), y is_string(). Vea también el capítulo sobre Tipos.
  • 129. Constantes Table of Contents • • Sintaxis Constantes predefinidas Una constante es un identificador (nombre) para expresar un valor simple. Como el nombre sugiere, este valor no puede variar durante la ejecucción del script. (A excepción de las constantes predefinidas, que en realidad no son constantes). Una constante es sensible a mayúsculas por defecto. Por convención, los identificadores de contantes siempre suelen declararse en mayúsculas. El nombre de una constante sigue las mismas reglas que cualquier otra etiqueta de PHP. Un nombre de constante válido empieza por una letra o subguión, seguido por cualquier número o letras, números o subguiones. Usando una regular expression, se representaría de la siguiente manera: [a-zA-Z_x7f-xff][azA-Z0-9_x7f-xff]* Tip Vea también Userland Naming Guide. Example #5 Nombres de constantes correctos e incorrectos <?php // Nombre de constantes correctos define("FOO", "something"); define("FOO2", "something else"); define("FOO_BAR", "something more"); // Nombres de constantes incorrectos define("2FOO", "something"); // Esto es válido, pero debería ser evitado: // Ya que quizá algún día PHP crea una constante mágica // con el mismo nombre y en ese caso provocaría un error en tu script define("__FOO__", "something"); ?> Note: Para nuestros propósitos, entenderemos como letra los carácteres a-z, A-Z, y los ASCII del 127 hasta el 255 (0x7f-0xff). Igual que las superglobals, el acceso a una constante es global. Se puede acceder a constnates desde cualquier sitio del script sin importar desde donde. Para más información en el acceso, lea el manual en la sección acceso a variables. Sintaxis Se puede definir una constante usando la función define() o también declarándola fuera de la clase con const desde PHP 5.3.0. Una vez que la constante está definida, no puede ser cambiada o redifinida en
  • 130. ningún momento. Solo se puede definir como constantes valores escalares ( boolean , integer , float y string ). Se puede definir resource en constantes, pero debería ser evitado, porque puede causar resultados inesperados. Para obtener el valor de una constante solo es necesarios especificar su nombre. A diferencia de las variables, no se debe prefijar una constante con el signo $. También se puede usar la función constant() para leer el valor de una constante si se desea obtener el valor de una constante de forma dinámica. Use get_defined_constants() para obtener una lista de todas las constantes definidas. Note: Las contantes y las variables (globales) se encuentran en un espacio de nombres distinto. Esto implica que por ejemplo TRUE y $TRUE son diferentes. Si se usa una constante que todavía no está definida, PHP asume que se está refiriendo al nombre de la constante en si, igual que si fuera una string (CONSTANT vs "CONSTANT"). Cuando esto suceda, se mostrará un error de nivel E_NOTICE. Ver también la sección en el manual de porqué $foo[bar] es incorrecto (a no ser que primero define() bar como constante). Si simplemente quiere comprobar si una constante está definida, use la función defined(). Estas son las diferencias entre constantes y variables: • • • • • Las constantes no llevan el signo dólar ($), como prefijo. Las constantes solo pueden ser definidas usando la función define(), y no por simple asignación. Las constantes pueden ser definidas y accedidas desde cualquier sitio sin importar las reglas de acceso de variables. Las constantes no pueden ser redefinidas o eliminadas una vez se han definido. Y Las constantes solo deberían contener valores escalares. Example #1 Definiendo constantes <?php define("CONSTANT", "Hola mundo."); echo CONSTANT; // muestra "Hola mundo." echo Constant; // muestra "Constant" y provoca un error. ?> Example #2 Definiendo constantes usando el keyword const <?php // Funciona desde PHP 5.3.0 const CONSTANT = 'Hola Mundo'; echo CONSTANT; ?> Note: A diferencia de definir constantes usando define(), las constantes definidas con la palabra clave const deben declararse en el nivel superior del entorno de la aplicación porque se definen en tiempo de ejecución. Esto significa que no pueden declararse dentro de funciones, loops o declaraciones if. Vea también Constantes de clase.
  • 131. Constantes predefinidas PHP ofrece un largo número de constantes predefindias a cualquier script en ejecucción. Muchas de estas constantes, sin embargo, son creadas por diferentes extensiones, y solo estarán presentes si dichas extensiones están disponibles, bien por carga dinámica o porque han sido compiladas. Hay siete constantes predefinidas que cambian dependiendo de donde son usadas. Por ejemplo el valor de __LINE__ depende en la línea que se use en el script. Estas constantes especiales son sensibles a mayúsculas y son las siguientes: Varias constantes PHP "mágicas" Descripción Nombre __LINE__ Línea actual en el fichero. __FILE__ Ruta completa y nombre del fichero. Si se usa dentro de un include, devolverá el nombre del fichero del include. Desde PHP 4.0.2, __FILE__ siempre contiene la ruta absoluta con symlinks resueltos, en otras versiones contenía la ruta relativa en según que circunstancias. __DIR__ Directorio del fichero. Si se utiliza dentro de un include, devolverá el directorio del fichero include. Esta constante es igual que dirname(__FILE__). El nombre del directorio no lleva la barra inicial a no ser que esté en el directorio root. (Fue añadida en PHP 5.3.0) Nombre de la función. (Añadida en PHP 4.3.0) Desde PHP 5 esta constante devuelve __FUNCTION__ el nombre de la función donde fue declarada (sensible a mayúsculas). En PHP 4 su valor siempre es en minúsculas. __CLASS__ Nombre de la clase. (Añadida en PHP 4.3.0) Desde PHP 5 esta constante devuelve el nombre de la clase donde fue declarada (sensible a mayúsculas). En PHP 4 su valor siempre es en minúsculas. __METHOD__ Nombre del método de la clase. (Añadida en PHP 5.0.0.) Nombre del método devuelto donde fue declarada. (sensible a mayúsculas). Nombre del espacio de nombres actual (sensible a mayúsculas). Esta constante se __NAMESPACE_ define en tiempo de compilación (Añadida en PHP 5.3.0) The name of the current _ namespace (case-sensitive). Ver también get_class(), get_object_vars(), file_exists() and function_exists(). Expressions Expressions are the most important building stones of PHP. In PHP, almost anything you write is an expression. The simplest yet most accurate way to define an expression is "anything that has a value". The most basic forms of expressions are constants and variables. When you type "$a = 5", you're
  • 132. assigning '5' into $a. '5', obviously, has the value 5, or in other words '5' is an expression with the value of 5 (in this case, '5' is an integer constant). After this assignment, you'd expect $a's value to be 5 as well, so if you wrote $b = $a, you'd expect it to behave just as if you wrote $b = 5. In other words, $a is an expression with the value of 5 as well. If everything works right, this is exactly what will happen. Slightly more complex examples for expressions are functions. For instance, consider the following function: <?php function foo () { return 5; } ?> Assuming you're familiar with the concept of functions (if you're not, take a look at the chapter about functions), you'd assume that typing $c = foo() is essentially just like writing $c = 5, and you're right. Functions are expressions with the value of their return value. Since foo() returns 5, the value of the expression 'foo()' is 5. Usually functions don't just return a static value but compute something. Of course, values in PHP don't have to be integers, and very often they aren't. PHP supports four scalar value types: integer values, floating point values ( float ), string values and boolean values (scalar values are values that you can't 'break' into smaller pieces, unlike arrays, for instance). PHP also supports two composite (non-scalar) types: arrays and objects. Each of these value types can be assigned into variables or returned from functions. PHP takes expressions much further, in the same way many other languages do. PHP is an expressionoriented language, in the sense that almost everything is an expression. Consider the example we've already dealt with, '$a = 5'. It's easy to see that there are two values involved here, the value of the integer constant '5', and the value of $a which is being updated to 5 as well. But the truth is that there's one additional value involved here, and that's the value of the assignment itself. The assignment itself evaluates to the assigned value, in this case 5. In practice, it means that '$a = 5', regardless of what it does, is an expression with the value 5. Thus, writing something like '$b = ($a = 5)' is like writing '$a = 5; $b = 5;' (a semicolon marks the end of a statement). Since assignments are parsed in a right to left order, you can also write '$b = $a = 5'. Another good example of expression orientation is pre- and post-increment and decrement. Users of PHP and many other languages may be familiar with the notation of variable++ and variable--. These are increment and decrement operators. In PHP/FI 2, the statement '$a++' has no value (is not an expression), and thus you can't assign it or use it in any way. PHP enhances the increment/decrement capabilities by making these expressions as well, like in C. In PHP, like in C, there are two types of increment - preincrement and post-increment. Both pre-increment and post-increment essentially increment the variable, and the effect on the variable is identical. The difference is with the value of the increment expression. Pre-increment, which is written '++$variable', evaluates to the incremented value (PHP increments the variable before reading its value, thus the name 'pre-increment'). Post-increment, which is written '$variable++' evaluates to the original value of $variable, before it was incremented (PHP increments the variable after reading its value, thus the name 'post-increment'). A very common type of expressions are comparison expressions. These expressions evaluate to either FALSE or TRUE. PHP supports > (bigger than), >= (bigger than or equal to), == (equal), != (not equal), < (smaller than) and <= (smaller than or equal to). The language also supports a set of strict equivalence operators: === (equal to and same type) and !== (not equal to or not same type). These expressions are most commonly used inside conditional execution, such as if statements. The last example of expressions we'll deal with here is combined operator-assignment expressions. You
  • 133. already know that if you want to increment $a by 1, you can simply write '$a++' or '++$a'. But what if you want to add more than one to it, for instance 3? You could write '$a++' multiple times, but this is obviously not a very efficient or comfortable way. A much more common practice is to write '$a = $a + 3'. '$a + 3' evaluates to the value of $a plus 3, and is assigned back into $a, which results in incrementing $a by 3. In PHP, as in several other languages like C, you can write this in a shorter way, which with time would become clearer and quicker to understand as well. Adding 3 to the current value of $a can be written '$a += 3'. This means exactly "take the value of $a, add 3 to it, and assign it back into $a". In addition to being shorter and clearer, this also results in faster execution. The value of '$a += 3', like the value of a regular assignment, is the assigned value. Notice that it is NOT 3, but the combined value of $a plus 3 (this is the value that's assigned into $a). Any two-place operator can be used in this operatorassignment mode, for example '$a -= 5' (subtract 5 from the value of $a), '$b *= 7' (multiply the value of $b by 7), etc. There is one more expression that may seem odd if you haven't seen it in other languages, the ternary conditional operator: <?php $first ? $second : $third ?> If the value of the first subexpression is TRUE (non-zero), then the second subexpression is evaluated, and that is the result of the conditional expression. Otherwise, the third subexpression is evaluated, and that is the value. The following example should help you understand pre- and post-increment and expressions in general a bit better: <?php function double($i) { return $i*2; } $b = $a = 5; /* assign the value five into the variable $a and $b */ $c = $a++; /* post-increment, assign original value of $a (5) to $c */ $e = $d = ++$b; /* pre-increment, assign the incremented value of $b (6) to $d and $e */ /* at this point, both $d and $e are equal to 6 */ $f = double($d++); $g = double(++$e); $h = $g += 10; e /* assign twice the value of $d before the increment, 2*6 = 12 to $f */ /* assign twice the value of $e after the increment, 2*7 = 14 to $g */ /* first, $g is incremented by 10 and ends with th value of 24. the value of the assignment (24) i s then assigned into $h, and $h ends with the val ue of 24 as well. */ ?> Some expressions can be considered as statements. In this case, a statement has the form of 'expr ;' that is, an expression followed by a semicolon. In '$b = $a = 5;', '$a = 5' is a valid expression, but it's not a
  • 134. statement by itself. '$b = $a = 5;' however is a valid statement. One last thing worth mentioning is the truth value of expressions. In many events, mainly in conditional execution and loops, you're not interested in the specific value of the expression, but only care about whether it means TRUE or FALSE. The constants TRUE and FALSE (case-insensitive) are the two possible boolean values. When necessary, an expression is automatically converted to boolean. See the section about type-casting for details about how. PHP provides a full and powerful implementation of expressions, and documenting it entirely goes beyond the scope of this manual. The above examples should give you a good idea about what expressions are and how you can construct useful expressions. Throughout the rest of this manual we'll write expr to indicate any valid PHP expression. Operadores Table of Contents • • • • • • • • • • • • Precedencia de Operadores Operadores de Aritmética Operadores de Asignación Operadores Bit a Bit Operadores de Comparación Operadores de Control de Errores Operadores de ejecución Operadores de Incremento/Decremento Operadores de Lógica Operadores de Cadena Operadores de Matrices Operadores de Tipo Un operador es algo a lo que usted entrega uno o más valores (o expresiones, en jerga de programación) y produce otro valor (de modo que la construcción misma se convierte en una expresión). Así que puede pensar sobre las funciones o construcciones que devuelven un valor (como print) como operadores, y en aquellas que no devuelven nada (como echo) como cualquier otra cosa. Existen tres tipos de operadores. En primer lugar se encuentra el operador unario, el cual opera sobre un único valor, por ejemplo ! (el operador de negación) o ++ (el operador de incremento). El segundo grupo se conoce como operadores binarios; este grupo contiene la mayoría de operadores que soporta PHP, y una lista se encuentra disponible más adelante en la sección Precedencia de Operadores. El tercer grupo consiste del operador ternario: ?:. Éste debe ser usado para seleccionar entre dos expresiones, en base a una tercera, en lugar de seleccionar dos sentencias o rutas de ejecución. Rodear las expresiones ternarias con paréntesis es una muy buena idea. Precedencia de Operadores La precedencia de un operador indica qué tan "cerca" se agrupan dos expresiones. Por ejemplo, en la
  • 135. expresión 1 + 5 * 3, la respuesta es 16 y no 18, ya que el operador de multiplicación ("*") tiene una mayor precedencia que el operador de adición ("+"). Los paréntesis pueden ser usados para marcar la precedencia, si resulta necesario. Por ejemplo: (1 + 5) * 3 evalúa a 18. Si la precedencia de los operadores es la misma, se utiliza una asociación de izquierda a derecha. La siguiente tabla lista la precedencia de los operadores, con aquellos de mayor precedencia listados al comienzo de la tabla. Los operadores en la misma línea tienen la misma precedencia, en cuyo caso su asociatividad decide el orden para evaluarlos. Precedencia de Operadores Asociatividad Operadores Información Adicional no-asociativo clone new clone y new izquierda [ array() no-asociativos ++ -right incremento/decremento ~ - (int) (float) (string) (array) (object) (bool) @ tipos no-asociativos instanceof tipos derecha ! lógicos izquierda */% aritmética izquierda +-. aritmética and cadena izquierda << >> manejo de bits no-asociativos < <= > >= <> comparación no-asociativos == != === !== comparación izquierda & manejo de bits and referencias izquierda ^ manejo de bits izquierda | manejo de bits izquierda && lógicos izquierda || lógicos izquierda ?: ternario derecha = += -= *= /= .= %= &= |= ^= <<= >>= => asignación izquierda and lógicos izquierda xor lógicos
  • 136. Asociatividad Operadores Información Adicional izquierda or lógicos izquierda , varios usos La asociatividad de izquierda quiere decir que la expresión es evaluada desde la izquierda a la derecha, la asociatividad de derecha quiere decir lo contrario. Example #1 Asociatividad <?php $a = 3 * 3 % 5; // (3 * 3) % 5 = 4 $a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2 $a = 1; $b = 2; $a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5 ?> Use paréntesis para incrementar la legibilidad del código. Note: Aunque = tiene una menor precedencia que la mayoría de los demás operadores, PHP aun permite expresiones similares a la siguiente: if (!$a = foo()), en cuyo caso el valor de retorno de foo() va a dar a $a. Operadores de Aritmética ¿Recuerda la aritmética básica del colegio? Éstos operadores funcionan tal como aquéllos. Ejemplo Nombre Operadores de Aritmética Resultado -$a Negación El opuesto de $a. $a + $b Adición Suma de $a y $b. $a - $b Substracción Diferencia entre $a y $b. $a * $b Multiplicación Producto de $a y $b. $a / $b División $a % $b Módulo Cociente de $a y $b. Resto de $a dividido por $b. El operador de división ("/") devuelve un valor flotante a menos que los dos operandos sean enteros (o cadenas que son convertidas a enteros) y los números sean divisibles sin residuos, en cuyo caso se devuelve un valor entero. Los operandos del módulo son convertidos a enteros (removiendo la parte decimal) antes de ser procesados.
  • 137. Note: El resto de $a % $b es negativo para valores negativos de $a. Vea también la página del manual sobre Funciones mateméticas. Operadores de Asignación El operador básico de asignación es "=". A primera vista, usted podría pensar en él como "es igual a". No lo haga. Lo que quiere decir en realidad es que el operando de la izquierda recibe el valor de la expresión a la derecha (es decir, "se define a"). El valor de una expresión de asignación es el valor que se asigna. Es decir, el valor de "$a = 3" es 3. Esto le permite hacer una que otra cosa curiosa: <?php $a = ($b = 4) + 5; // $a es igual a 9 ahora, y $b ha sido definido a 4 . ?> En arrays , para asignar el valor a una clave determinada se realiza utilizando el operador "=>". La precedencia de este operador es la misma que otros operadores de asignación. En conjunto con el operador básico de asignación, existen "operadores combinados" para todos los operadores de aritmética binaria, unión de matrices y de cadenas, que le permiten usar un valor en una expresión y luego definir su valor como el resultado de esa expresión. Por ejemplo: <?php $a = 3; $a += 5; // define $a como 8, como si hubiésemos dicho: $a = $a + 5; $b = "¡Hola "; $b .= "a todos!"; // define $b como "¡Hola a todos!", tal como $b = $b . "a todos!"; ?> Note que la asignación copia la variable original en la nueva (asignación por valor), de modo que cualquier cambio a una no afecta a la otra. Esto puede resultar de importancia si necesita copiar algo como una matriz de gran tamaño al interior de un ciclo reducido. También es soportada la asignación por referencia, usando la sintaxis $var = &$otra_var;. 'Asignación por referencia' quiere decir que ambas variables terminan apuntando a los mismos datos y que nada es realmente copiado. Para aprender más sobre las referencias, por favor refiérase a las Referencias explicadas. A partir de PHP 5 los objetos son asignados por referencia a menos que explícitamente se diga lo contrario con la nueva palabra clave clone. Operadores Bit a Bit Los operadores bit a bit le permiten activar o desactivar bits individuales de un entero.
  • 138. Operadores Bit a Bit Ejemplo Nombre Resultado $a & $b Y Los bits que están activos tanto en $a como en $b son activados. $a | $b O Los bits que están activos ya sea en $a o en $b son activados. $a ^ $b O exclusivo (Xor) Los bits que estén activos en $a o $b, pero no en ambos, son activados. ~ $a No Los bits que estén activos en $a son desactivados, y vice-versa. $a << $b Desplazamiento a izquierda Desplaza los bits de $a, $a pasos a la izquierda (cada paso quiere decir "multiplicar por dos") $a >> $b Desplazamiento a derecha Desplaza los bits de $a, $b pasos a la derecha (cada paso quiere decir "dividir por dos") Bit shifting in PHP is arithmetic. Bits shifted off either end are discarded. Left shifts have zeros shifted in on the right while the sign bit is shifted out on the left, meaning the sign of an operand is not preserved. Right shifts have copies of the sign bit shifted in on the left, meaning the sign of an operand is preserved. Use parentheses to ensure the desired precedence. For example, $a & $b == true evaluates the equivalency then the bitwise and; while ($a & $b) == true evaluates the bitwise and then the equivalency. Be aware of data type conversions. If both the left-hand and right-hand parameters are strings, the bitwise operator will operate on the characters' ASCII values. PHP's error_reporting ini setting uses bitwise values, providing a real-world demonstration of turning bits off. To show all errors, except for notices, the php.ini file instructions say to use: E_ALL & ~E_NOTICE This works by starting with E_ALL: 00000000000000000111011111111111 Then taking the value of E_NOTICE... 00000000000000000000000000001000 ... and inverting it via ~: 11111111111111111111111111110111 Finally, it uses AND (&) to find the bits turned on in both values: 00000000000000000111011111110111 Another way to accomplish that is using XOR (^) to find bits that are on in only one value or the other: E_ALL ^ E_NOTICE error_reporting can also be used to demonstrate turning bits on. The way to show just errors and recoverable errors is: E_ERROR | E_RECOVERABLE_ERROR This process combines E_ERROR 00000000000000000000000000000001
  • 139. and 00000000000000000001000000000000 using the OR (|) operator to get the bits turned on in either value: 00000000000000000001000000000001 Example #1 Bitwise AND, OR and XOR operations on integers <?php /* * Ignore the top section, * it is just formatting to make output clearer. */ $format = '(%1$2d = %1$04b) = (%2$2d = %2$04b)' . ' %3$s (%4$2d = %4$04b)' . "n"; echo <<<EOH --------result --------EOH; --------value --------- -- --------op test -- --------- /* * Here are the examples. */ $values = array(0, 1, 2, 4, 8); $test = 1 + 4; echo "n Bitwise AND n"; foreach ($values as $value) { $result = $value & $test; printf($format, $result, $value, '&', $test); } echo "n Bitwise Inclusive OR n"; foreach ($values as $value) { $result = $value | $test; printf($format, $result, $value, '|', $test); } echo "n Bitwise Exclusive OR (XOR) n"; foreach ($values as $value) { $result = $value ^ $test; printf($format, $result, $value, '^', $test); } ?> El resultado del ejemplo sería: --------result --------Bitwise AND --------value --------- -- --------op test -- ---------
  • 140. ( ( ( ( ( 0 1 0 4 0 = = = = = 0000) 0001) 0000) 0100) 0000) = = = = = ( ( ( ( ( 0 1 2 4 8 = = = = = 0000) 0001) 0010) 0100) 1000) & & & & & ( ( ( ( ( 5 5 5 5 5 = = = = = 0101) 0101) 0101) 0101) 0101) Bitwise Inclusive OR ( 5 = 0101) = ( 0 = 0000) ( 5 = 0101) = ( 1 = 0001) ( 7 = 0111) = ( 2 = 0010) ( 5 = 0101) = ( 4 = 0100) (13 = 1101) = ( 8 = 1000) | | | | | ( ( ( ( ( 5 5 5 5 5 = = = = = 0101) 0101) 0101) 0101) 0101) Bitwise Exclusive OR (XOR) ( 5 = 0101) = ( 0 = 0000) ^ ( 4 = 0100) = ( 1 = 0001) ^ ( 7 = 0111) = ( 2 = 0010) ^ ( 1 = 0001) = ( 4 = 0100) ^ (13 = 1101) = ( 8 = 1000) ^ ( ( ( ( ( 5 5 5 5 5 = = = = = 0101) 0101) 0101) 0101) 0101) Example #2 Bitwise XOR operations on strings <?php echo 12 ^ 9; // Outputs '5' echo "12" ^ "9"; // Outputs the Backspace character (ascii 8) // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8 echo "hallo" ^ "hello"; // Outputs the ascii values #0 #4 #0 #0 #0 // 'a' ^ 'e' = #4 echo 2 ^ "3"; // Outputs 1 // 2 ^ ((int)"3") == 1 echo "2" ^ 3; // Outputs 1 // ((int)"2") ^ 3 == 1 ?> Example #3 Bit shifting on integers <?php /* * Here are the examples. */ echo "n--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---n"; $val = 4; $places = 1; $res = $val >> $places; p($res, $val, '>>', $places, 'copy of sign bit shifted into left side' ); $val = 4; $places = 2; $res = $val >> $places; p($res, $val, '>>', $places); $val = 4;
  • 141. $places = 3; $res = $val >> $places; p($res, $val, '>>', $places, 'bits shift out right side'); $val = 4; $places = 4; $res = $val >> $places; p($res, $val, '>>', $places, 'same result as above; can not shift beyo nd 0'); echo "n--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---n"; $val = -4; $places = 1; $res = $val >> $places; p($res, $val, '>>', $places, 'copy of sign bit shifted into left side' ); $val = -4; $places = 2; $res = $val >> $places; p($res, $val, '>>', $places, 'bits shift out right side'); $val = -4; $places = 3; $res = $val >> $places; p($res, $val, '>>', $places, 'same result as above; can not shift beyo nd -1'); echo "n--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---n"; $val = 4; $places = 1; $res = $val << $places; p($res, $val, '<<', $places, 'zeros fill in right side'); $val = 4; $places = (PHP_INT_SIZE * 8) - 4; $res = $val << $places; p($res, $val, '<<', $places); $val = 4; $places = (PHP_INT_SIZE * 8) - 3; $res = $val << $places; p($res, $val, '<<', $places, 'sign bits get shifted out'); $val = 4; $places = (PHP_INT_SIZE * 8) - 2; $res = $val << $places; p($res, $val, '<<', $places, 'bits shift out left side'); echo "n--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---n";
  • 142. $val = -4; $places = 1; $res = $val << $places; p($res, $val, '<<', $places, 'zeros fill in right side'); $val = -4; $places = (PHP_INT_SIZE * 8) - 3; $res = $val << $places; p($res, $val, '<<', $places); $val = -4; $places = (PHP_INT_SIZE * 8) - 2; $res = $val << $places; p($res, $val, '<<', $places, 'bits shift out left side, including sign bit'); /* * Ignore this bottom section, * it is just formatting to make output clearer. */ function p($res, $val, $op, $places, $note = '') { $format = '%0' . (PHP_INT_SIZE * 8) . "bn"; printf("Expression: %d = %d %s %dn", $res, $val, $op, $places); echo " Decimal:n"; printf(" val=%dn", $val); printf(" res=%dn", $res); echo " Binary:n"; printf(' val=' . $format, $val); printf(' res=' . $format, $res); if ($note) { echo " NOTE: $noten"; } echo "n"; } ?> El resultado del ejemplo en equipos de 32 bits sería: --- BIT SHIFT RIGHT ON POSITIVE INTEGERS --Expression: 2 = 4 >> 1 Decimal: val=4 res=2 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000010 NOTE: copy of sign bit shifted into left side Expression: 1 = 4 >> 2 Decimal:
  • 143. val=4 res=1 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000001 Expression: 0 = 4 >> 3 Decimal: val=4 res=0 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000000 NOTE: bits shift out right side Expression: 0 = 4 >> 4 Decimal: val=4 res=0 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000000 NOTE: same result as above; can not shift beyond 0 --- BIT SHIFT RIGHT ON NEGATIVE INTEGERS --Expression: -2 = -4 >> 1 Decimal: val=-4 res=-2 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111110 NOTE: copy of sign bit shifted into left side Expression: -1 = -4 >> 2 Decimal: val=-4 res=-1 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111111 NOTE: bits shift out right side Expression: -1 = -4 >> 3 Decimal: val=-4 res=-1 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111111 NOTE: same result as above; can not shift beyond -1 --- BIT SHIFT LEFT ON POSITIVE INTEGERS --Expression: 8 = 4 << 1 Decimal: val=4 res=8 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000001000 NOTE: zeros fill in right side Expression: 1073741824 = 4 << 28 Decimal: val=4
  • 144. res=1073741824 Binary: val=00000000000000000000000000000100 res=01000000000000000000000000000000 Expression: -2147483648 = 4 << 29 Decimal: val=4 res=-2147483648 Binary: val=00000000000000000000000000000100 res=10000000000000000000000000000000 NOTE: sign bits get shifted out Expression: 0 = 4 << 30 Decimal: val=4 res=0 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000000 NOTE: bits shift out left side --- BIT SHIFT LEFT ON NEGATIVE INTEGERS --Expression: -8 = -4 << 1 Decimal: val=-4 res=-8 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111000 NOTE: zeros fill in right side Expression: -2147483648 = -4 << 29 Decimal: val=-4 res=-2147483648 Binary: val=11111111111111111111111111111100 res=10000000000000000000000000000000 Expression: 0 = -4 << 30 Decimal: val=-4 res=0 Binary: val=11111111111111111111111111111100 res=00000000000000000000000000000000 NOTE: bits shift out left side, including sign bit El resultado del ejemplo en equipos de 64 bits sería: --- BIT SHIFT RIGHT ON POSITIVE INTEGERS --Expression: 2 = 4 >> 1 Decimal: val=4 res=2 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000010 NOTE: copy of sign bit shifted into left side Expression: 1 = 4 >> 2 Decimal:
  • 145. val=4 res=1 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000001 Expression: 0 = 4 >> 3 Decimal: val=4 res=0 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: bits shift out right side Expression: 0 = 4 >> 4 Decimal: val=4 res=0 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: same result as above; can not shift beyond 0 --- BIT SHIFT RIGHT ON NEGATIVE INTEGERS --Expression: -2 = -4 >> 1 Decimal: val=-4 res=-2 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111110 NOTE: copy of sign bit shifted into left side Expression: -1 = -4 >> 2 Decimal: val=-4 res=-1 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 NOTE: bits shift out right side Expression: -1 = -4 >> 3 Decimal: val=-4 res=-1 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 NOTE: same result as above; can not shift beyond -1 --- BIT SHIFT LEFT ON POSITIVE INTEGERS --Expression: 8 = 4 << 1 Decimal: val=4 res=8 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000001000 NOTE: zeros fill in right side Expression: 4611686018427387904 = 4 << 60 Decimal: val=4
  • 146. res=4611686018427387904 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0100000000000000000000000000000000000000000000000000000000000000 Expression: -9223372036854775808 = 4 << 61 Decimal: val=4 res=-9223372036854775808 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=1000000000000000000000000000000000000000000000000000000000000000 NOTE: sign bits get shifted out Expression: 0 = 4 << 62 Decimal: val=4 res=0 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: bits shift out left side --- BIT SHIFT LEFT ON NEGATIVE INTEGERS --Expression: -8 = -4 << 1 Decimal: val=-4 res=-8 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111000 NOTE: zeros fill in right side Expression: -9223372036854775808 = -4 << 61 Decimal: val=-4 res=-9223372036854775808 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1000000000000000000000000000000000000000000000000000000000000000 Expression: 0 = -4 << 62 Decimal: val=-4 res=0 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: bits shift out left side, including sign bit Warning No realice desplazamientos a derecha para más de 32 bits en sistemas de 32 bits. No realice desplazamientos a izquierda en caso de que resulte en un número de más de 32 bits. See also pack(), unpack(), gmp_and(), gmp_or(), gmp_xor(), gmp_testbit(), gmp_clrbit()
  • 147. Operadores de Comparación Los operadores de comparación, como su nombre indica, le permiten comparar dos valores. Puede que también se encuentre interesado en consultar las tablas de comparación de tipos, ya que éstas muestran ejemplos de varios tipos de comparaciones relacionadas con tipos. Ejemplo $a == $b Nombre Igual Operadores de Comparación Resultado TRUE si $a es igual a $b. $a === $b Idéntico TRUE si $a es igual a $b, y son del mismo tipo. (A partir de PHP 4) $a != $b Diferente TRUE si $a no es igual a $b. $a <> $b Diferente TRUE si $a no es igual a $b. $a !== $b No idénticos TRUE si $a no es igual a $b, o si no son del mismo tipo. (A partir de PHP 4) $a < $b Menor que TRUE si $a es escrictamente menor que $b. $a > $b Mayor que TRUE si $a es estrictamente mayor que $b. $a <= $b Menor o igual que TRUE si $a es menor o igual que $b. $a >= $b Mayor o igual que TRUE si $a es mayor o igual que $b. Si se compara un número con una cadena o la comparación implica cadenas numéricas, entonces cada cadeba es convertida a número y la conversión se realiza numéricamente. Estas reglas también se aplican a la sentencia switch. El tipo de conversión no tiene lugar cuando la comparación es === o !=== ya que se trata de comparar el tipo así como el valor. <?php var_dump(0 == "a"); // 0 == 0 -> true var_dump("1" == "01"); // 1 == 1 -> true var_dump("10" == "1e1"); // 10 == 10 -> true var_dump(100 == "1e2"); // 100 == 100 -> true switch ("a") { case 0: echo "0"; break; case "a": // nunca se ejecuta ya que "a" ya ha coincidido con 0 echo "a"; break; } ?> Para varios tipos, la comparación se realiza de acuerdo con la siguient tabla (en orden). Comparación con Varios Tipos
  • 148. Tipo del Operando 1 Tipo del Operando 2 Resultado null o string string Convertir NULL a "", comparación numérica o de léxico bool o null cualquiera Convertir a bool , FALSE < TRUE object object Las clases internas pueden definir su propia comparación, clases diferentes son incomparables, la misma clase - comparan propiedades en la misma forma que las matrices (PHP 4), PHP 5 tiene su propia explicación string , resource o number string , resource o number Traducir las cadenas y recursos a números, matemática usual array array Una matriz con menos elementos es menor, si una clave del operando 1 no se encuentra en el operando 2 entonces las matrices son incomparables, de otra forma - comparar valor por valor (vea el siguiente ejemplo) array cualquiera array es siempre mayor object cualquiera object es siempre mayor Example #1 Transcripción de la comparación de matrices estándar <?php // Las matrices son comparadas de esta forma con los operadores de com paración estándar function comparacion_matrices_estandar($op1, $op2) { if (count($op1) < count($op2)) { return -1; // $op1 < $op2 } elseif (count($op1) > count($op2)) { return 1; // $op1 > $op2 } foreach ($op1 as $clave => $val) { if (!array_key_exists($clave, $op2)) { return null; // incomparable } elseif ($val < $op2[$clave]) { return -1; } elseif ($val > $op2[$clave]) { return 1; } } return 0; // $op1 == $op2 } ?> Vea también strcasecmp(), strcmp(), Operadores de matriz, y la sección del manual sobre Tipos. Warning
  • 149. Comparación de números con coma flotante Debido a la forma en que los float s son representados internamente, no se debería comprobar la igualdad de dos float s. Ver la documentación de float para más información. Operador Ternario Otro operador condicional es el operador "?:" (o ternario). Example #2 Asignación de un valor predeterminado <?php // Ejemplo de uso de: el Operador Ternario $accion = (empty($_POST['accion'])) ? 'predeterminada' : $_POST['accio n']; // La línea anterior es idéntica a esta sentencia if/else if (empty($_POST['accion'])) { $accion = 'predeterminada'; } else { $accion = $_POST['accion']; } ?> La expresión (expr1) ? (expr2) : (expr3) evalúa a expr2 si expr1 evalúa a TRUE, y expr3 si expr1 evalúa a FALSE. Desde PHP 5.3, es posible dejar en blanco la parte media del operador ternario. La expresión expr1 ?: expr3 devuelve expr1 si expr1 evalúa a TRUE, y expr3 de lo contrario. Note: Por favor note que el operador ternario es una sentencia, y que no evalúa a una variable, sino al resultado de una sentencia. Es importante saber esto si se desea devolver una variable por referencia. La sentencia return $var == 42 ? $a : $b; en una función con retorno-porreferencia no funcionará por lo que se ha mencionado y una advertencia es generada en versiones posteriores de PHP. Note: Es recomendable que evite "apilar" las expresiones ternarias. El comportamiente de PHP cuando se usa más de un operador ternario al interior de una sentencia no es obvio: Example #3 Comportamiento Ternario No-Obvio <?php // a primera vista, lo siguiente parece imprimir 'true' echo (true?'true':false?'t':'f'); // // de // sin embargo, la salida real de la línea anterior es 't' esto se debe a que las expresiones ternarias son evaluadas izquierda a derecha // la siguiente es una versión más obvia del código presentado anteriormente
  • 150. echo ((true ? 'true' : false) ? 't' : 'f'); // aquí puede ver que la primera expresión es evaluada como 't rue', la cual // en su lugar evalúa a (bool)true, devolviendo por lo tanto l a rama de // verdad de la segunda expresión ternaria. ?> Operadores de Control de Errores PHP ofrece soporte para un operador de control de errores: el signo de arroba (@). Cuando es colocado al comienzo de una expresión en PHP, cualquier mensaje de error que pudiera generarse a causa de esa expresión será ignorado. Si la característica track_errors está habilitada, cualquier mensaje de error generado por la expresión será almacenado en la variable $php_errormsg. La variable será sobrescrita en cada instancia de error, así que realice sus chequeos de forma temprana si quiere usarla. <?php /* Error intencional de archivo */ $mi_archivo = @file ('archivo_que_no_existe') or die ("La apertura de archivo ha fallado: el error fue '$php_errorm sg'"); // esto funciona con cualquier expresión, no solo con funciones: $valor = @$cache[$llave]; // no producirá una anotación si el índice $llave no existe. ?> Note: El operador @ trabaja sólo sobre expresiones. Una simple regla de oro es: si usted puede tomar el valor de algo, entonces puede usar el operador @ sobre ese algo. Por ejemplo, puede usarlo al inicio de variables, llamadas a funciones y sencencias include(), constantes, y así sucesivamente. No puede usarlo sobre definiciones de función o clase, ni sobre estructuras condicionales como if y foreach, y así sucesivamente. Vea también error_reporting() y la sección del manual sobre funciones de Gestión de Errores y Registros. Warning En la actualidad, el operador de prefijo "@" para control de errores deshabilitará incluso el reporte de errores en casos de fallos críticos que terminarán la ejecución del script. Entre otras cosas, esto quiere decir que si usa "@" para eliminar los errores de una cierta función, y ésta no se encuentra disponible o ha sido escrita de forma incorrecta, el script se detendrá en ese punto sin dar indicación alguna del motivo.
  • 151. Operadores de ejecución PHP soporta un operador de ejecución: las comillas invertidas (``). ¡Note que no se trata de comillas sencillas! PHP intentará ejecutar el contenido entre las comillas como si se tratara de un comando del intérprete de comandos; su salida será devuelta (es decir, no será simplemente volcada como salida; puede ser asignada a una variable). El uso del operador de comillas invertidas es idéntico al de shell_exec(). <?php $salida = `ls -al`; echo "<pre>$salida</pre>"; ?> Note: El operador de comillas invertidas es deshabilitado cuando se encuentra activo safe mode o cuando se deshabilita shell_exec(). Vea también la sección del manual sobre funciones de Ejecución de Programas, popen() proc_open(), y Uso de PHP desde la línea de comandos. Operadores de Incremento/Decremento PHP ofrece soporte de operadores de pre- y post-incremento y decremento, estilo-C. Note: Los operadores de incremento/decremento no afectan a los valores booleanos. Decrementar valores NULL tampoco tiene efecto, aunque incrementarlos resulta en 1. Ejemplo Nombre Operadores de Incremento/decremento Efecto ++$a Pre-incremento Incrementa $a en uno, y luego devuelve $a. $a++ Post-incremento Devuelve $a, y luego incrementa $a en uno. --$a Pre-decremento $a-- Post-decremento Devuelve $a, luego decrementa $a en uno. Decrementa $a en uno, luego devuelve $a. Aquí hay un script sencillo de ejemplo: <?php echo "<h3>Postincremento</h3>"; $a = 5; echo "Debe ser 5: " . $a++ . "<br />n"; echo "Debe ser 6: " . $a . "<br />n"; echo $a = echo echo "<h3>Preincremento</h3>"; 5; "Debe ser 6: " . ++$a . "<br />n"; "Debe ser 6: " . $a . "<br />n"; echo "<h3>Postdecremento</h3>"; $a = 5;
  • 152. echo "Debe ser 5: " . $a-- . "<br />n"; echo "Debe ser 4: " . $a . "<br />n"; echo $a = echo echo ?> "<h3>Predecremento</h3>"; 5; "Debe ser 4: " . --$a . "<br />n"; "Debe ser 4: " . $a . "<br />n"; PHP sigue la convención de Perl cuando trabaja con operaciones aritméticas sobre variables de caracter, y no la convención de C. Por ejemplo, en Perl 'Z'+1 se convierte en 'AA', mientras que en C 'Z'+1 se convierte en '[' ( ord('Z') == 90, ord('[') == 91). Note que las variables de caracter pueden ser incrementadas pero no decrementadas, y aun así solo son soportados los caracteres ASCII planos (a-z y A-Z). Example #1 Operaciones Aritméticas sobre Variables de Caracter <?php $i = 'W'; for ($n=0; $n<6; $n++) { echo ++$i . "n"; } ?> El resultado del ejemplo sería: X Y Z AA AB AC Incrementar o decrementar valores booleanos no tiene efecto. Operadores de Lógica Ejemplo Nombre Operadores de Lógica Resultado $a and $b Y TRUE si tanto $a como $b son TRUE. $a or $b TRUE si cualquiera de $a o $b es TRUE. O $a xor $b O exclusivo (Xor) TRUE si $a o $b es TRUE, pero no ambos. ! $a No TRUE si $a no es TRUE. $a && $b Y TRUE si tanto $a como $b son TRUE. $a || $b TRUE si cualquiera de $a o $b es TRUE. O
  • 153. Ejemplo Nombre Resultado La razón para tener las dos variaciones diferentes de los operadores "and" y "or" es que ellos operan con precedencias diferentes. (Vea Precedencia de Operadores.) Example #1 Ilustración de los operadores lógicos <?php // -------------------// foo() nunca será llamada ya que esos operadores trabajan en modo co rto-circuito $a $b $c $d = = = = (false (true (false (true && foo()); || foo()); and foo()); or foo()); // -------------------// "||" tiene una precedencia mayor que "or" // El resultado de la expresión (false || true) es asignado a $e // Actua como: ($e = (false || true)) $e = false || true; // La constante false es asignada a $f y luego true es ignorado // Actua como: (($e = false) or true) $f = false or true; var_dump($e, $f); // -------------------// "&&" tiene una precedencia mayor que "and" // El resultado de la expresión (true && false) es asignado a $g // Actua como: ($g = (true && false)) $g = true && false; // La constante true es asiganda a $h y luego false es ignorado // Actua como: (($h = true) and false) $h = true and false; var_dump($g, $h); ?> El resultado del ejemplo sería algo similar a: bool(true) bool(false) bool(false) bool(true)
  • 154. Operadores de Cadena Existen dos operadores para datos tipo string . El primero es el operador de concatenación ('.'), el cual devuelve el resultado de concatenar sus argumentas a lado derecho e izquierdo. El segundo es el operador de asignación sobre concatenación ('.='), el cual adiciona el argumento del lado derecho al argumento en el lado izquierdo. Por favor consulte Operadores de Asignación para más información. <?php $a = "¡Hola "; $b = $a . "Mundo!"; // ahora $b contiene "¡Hola Mundo!" $a = "¡Hola "; $a .= "Mundo!"; ?> // ahora $a contiene "¡Hola Mundo!" Vea también las secciones del manual sobre el tipo String y las funciones de Cadenas. Operadores de Matrices Ejemplo Nombre Operadores de Matrices Resultado $a + $b Unión Unión de $a y $b. $a == $b Igualdad TRUE si $a y $b tienen las mismas parejas llave/valor. $a === $b Identidad TRUE si $a y $b tienen las mismas parejas llave/valor en el mismo orden y de los mismos tipos. $a != $b No-igualdad TRUE si $a no es igual a $b. $a <> $b No-igualdad TRUE si $a no es igual a $b. $a !== $b No-identidad TRUE si $a no es idéntico a $b. El operador + adiciona elementos de las claves restantes de la matriz del lado derecho a aquella al lado izquierdo, al mismo tiempo que cualquier llave duplicada NO es sobrescrita. <?php $a = array("a" => "manzana", "b" => "banano"); $b = array("a" => "pera", "b" => "fresa", "c" => "cereza"); $c = $a + $b; // Unión de $a y $b echo "Unión de $a y $b: n"; var_dump($c); $c = $b + $a; // Unión de $b y $a echo "Unión de $b y $a: n"; var_dump($c); ?>
  • 155. Cuando sea ejecutado, este script producirá la siguiente salida: Unión de $a array(3) { ["a"]=> string(7) ["b"]=> string(6) ["c"]=> string(6) } Unión de $b array(3) { ["a"]=> string(4) ["b"]=> string(5) ["c"]=> string(6) } y $b: "manzana" "banano" "cereza" y $a: "pera" "fresa" "cereza" Los elementos de las matrices son considerados equivalentes en la comparación si éstos tienen la misma clave y valor. Example #1 Comparación de matrices <?php $a = array("manzana", "banano"); $b = array(1 => "banano", "0" => "manzana"); var_dump($a == $b); // bool(true) var_dump($a === $b); // bool(false) ?> Vea también las secciones del manual sobre el tipo Array y funciones de Matrices. Operadores de Tipo instanceof es usado para determinar si una variable PHP es una instancia de objeto de cierta clase: Example #1 Uso de instanceof con clases <?php class MiClase { } class NoMiClase { } $a = new MiClase; var_dump($a instanceof MiClase); var_dump($a instanceof NoMiClase);
  • 156. ?> El resultado del ejemplo sería: bool(true) bool(false) instanceof puede ser usado también para determinar si una variable es una instancia de objeto de una clase que hereda de una clase padre: Example #2 Uso de instanceof con clases heredadas <?php class ClasePadre { } class MiClase extends ClasePadre { } $a = new MiClase; var_dump($a instanceof MiClase); var_dump($a instanceof ClasePadre); ?> El resultado del ejemplo sería: bool(true) bool(true) Para chequear si un objeto no es una instancia de una clase, el operador lógico not puede ser usado. Example #3 Uso de instanceof para chequear si un objeto no es instancia de una clase <?php class MiClase { } $a = new MiClase; var_dump(!($a instanceof stdClass)); ?> El resultado del ejemplo sería: bool(true) Por último, instanceof puede ser usado también para determinar si una variable es una instancia de objeto de una clase que implementa una interfaz: Example #4 Uso de instanceof para una clase <?php interface MiInterfaz
  • 157. { } class MiClase implements MiInterfaz { } $a = new MiClase; var_dump($a instanceof MiClase); var_dump($a instanceof MiInterfaz); ?> El resultado del ejemplo sería: bool(true) bool(true) Aunque instanceof es usado por lo general con un nombre de clase literal, también puede usarse con otro objeto o una variable tipo cadena: Example #5 Uso de instanceof con otras variables <?php interface MiInterfaz { } class MiClase implements MiInterfaz { } $a $b $c $d = = = = new MiClase; new MiClase; 'MiClase'; 'NoMiClase'; var_dump($a instanceof $b); // $b es un objeto de la clase MiClase var_dump($a instanceof $c); // $c es una cadena 'MiClase' var_dump($a instanceof $d); // $d es una cadena 'NoMiClase' ?> El resultado del ejemplo sería: bool(true) bool(true) bool(false) Hay algunas trampas comunes de las que hay que tener cuidado. En versiones anteriores a PHP 5.1.0, instanceof llamaría __autoload() si el nombre de clase no existía. Adicionalmente, si la clase no estaba cargada, ocurriría un error fatal. Esto puede ser evitado usando una referencia dinámica de clase, o una variable tipo cadena que contenga el nombre de clase: Example #6 Evitar búsquedas de nombres de clase y errores fatales con instanceof en PHP 5.0 <?php
  • 158. $d = 'NoMiClase'; var_dump($a instanceof $d); // no acurre un error fatal aquí ?> El resultado del ejemplo sería: bool(false) El operador instanceof fue introducido en PHP 5. Anteriormente is_a() era usado, pero desde entonces is_a() ha sido marcada como función obsoleta, prefiriéndose el uso de instanceof. Note que a partir de PHP 5.3.0, is_a() ya no es considerada una función obsoleta. Vea también get_class() e is_a(). Estructuras de Control Table of Contents • • • • • • • • • • • • • • • • • • • Introducción if else elseif/else if Alternative syntax for control structures while do-while for foreach break continue switch declare return require include require_once include_once goto Introducción Todo script PHP está construido en base a una serie de sentencias. Una sentencia puede ser una asignación, una llamada de función, un ciclo, una sentencia condicional o incluso una sentencia que no hace nada (una sentencia vacía). Las sentencias generalmente finalizan con un punto-y-coma. Adicionalmente, las sentencias pueden agruparse en un conjunto de sentencias, encapsulándolas entre corchetes. Un grupo de sentencias es una sentencia por sí misma también. Los diferentes tipos de sentencias son descritos en este capítulo.
  • 159. if The if construct is one of the most important features of many languages, PHP included. It allows for conditional execution of code fragments. PHP features an if structure that is similar to that of C: if (expr) statement As described in the section about expressions, expression is evaluated to its Boolean value. If expression evaluates to TRUE, PHP will execute statement, and if it evaluates to FALSE - it'll ignore it. More information about what values evaluate to FALSE can be found in the 'Converting to boolean' section. The following example would display a is bigger than b if $a is bigger than $b: <?php if ($a > $b) echo "a is bigger than b"; ?> Often you'd want to have more than one statement to be executed conditionally. Of course, there's no need to wrap each statement with an if clause. Instead, you can group several statements into a statement group. For example, this code would display a is bigger than b if $a is bigger than $b, and would then assign the value of $a into $b: <?php if ($a > $b) { echo "a is bigger than b"; $b = $a; } ?> If statements can be nested infinitely within other if statements, which provides you with complete flexibility for conditional execution of the various parts of your program. else Often you'd want to execute a statement if a certain condition is met, and a different statement if the condition is not met. This is what else is for. else extends an if statement to execute a statement in case the expression in the if statement evaluates to FALSE. For example, the following code would display a is greater than b if $a is greater than $b, and a is NOT greater than b otherwise: <?php if ($a > $b) { echo "a is greater than b"; } else { echo "a is NOT greater than b"; } ?> The else statement is only executed if the if expression evaluated to FALSE, and if there were any elseif expressions - only if they evaluated to FALSE as well (see elseif).
  • 160. elseif/else if elseif, as its name suggests, is a combination of if and else. Like else, it extends an if statement to execute a different statement in case the original if expression evaluates to FALSE. However, unlike else, it will execute that alternative expression only if the elseif conditional expression evaluates to TRUE. For example, the following code would display a is bigger than b, a equal to b or a is smaller than b: <?php if ($a > $b) { echo "a is bigger than b"; } elseif ($a == $b) { echo "a is equal to b"; } else { echo "a is smaller than b"; } ?> There may be several elseifs within the same if statement. The first elseif expression (if any) that evaluates to TRUE would be executed. In PHP, you can also write 'else if' (in two words) and the behavior would be identical to the one of 'elseif' (in a single word). The syntactic meaning is slightly different (if you're familiar with C, this is the same behavior) but the bottom line is that both would result in exactly the same behavior. The elseif statement is only executed if the preceding if expression and any preceding elseif expressions evaluated to FALSE, and the current elseif expression evaluated to TRUE. Note: Note that elseif and else if will only be considered exactly the same when using curly brackets as in the above example. When using a colon to define your if/elseif conditions, you must not separate else if into two words, or PHP will fail with a parse error. <?php /* Incorrect Method: */ if($a > $b): echo $a." is greater than ".$b; else if($a == $b): // Will not compile. echo "The above line causes a parse error."; endif; /* Correct Method: */ if($a > $b): echo $a." is greater than ".$b; elseif($a == $b): // Note the combination of the words. echo $a." equals ".$b; else: echo $a." is neither greater than or equal to ".$b; endif; ?>
  • 161. Alternative syntax for control structures PHP offers an alternative syntax for some of its control structures; namely, if, while, for, foreach, and switch. In each case, the basic form of the alternate syntax is to change the opening brace to a colon (:) and the closing brace to endif;, endwhile;, endfor;, endforeach;, or endswitch;, respectively. <?php if ($a == 5): ?> A is equal to 5 <?php endif; ?> In the above example, the HTML block "A is equal to 5" is nested within an if statement written in the alternative syntax. The HTML block would be displayed only if $a is equal to 5. The alternative syntax applies to else and elseif as well. The following is an if structure with elseif and else in the alternative format: <?php if ($a == 5): echo "a equals 5"; echo "..."; elseif ($a == 6): echo "a equals 6"; echo "!!!"; else: echo "a is neither 5 nor 6"; endif; ?> Note: Mixing syntaxes in the same control block is not supported. See also while, for, and if for further examples. while while loops are the simplest type of loop in PHP. They behave just like their C counterparts. The basic form of a while statement is: while (expr) statement The meaning of a while statement is simple. It tells PHP to execute the nested statement(s) repeatedly, as long as the while expression evaluates to TRUE. The value of the expression is checked each time at the beginning of the loop, so even if this value changes during the execution of the nested statement(s), execution will not stop until the end of the iteration (each time PHP runs the statements in the loop is one iteration). Sometimes, if the while expression evaluates to FALSE from the very beginning, the nested statement(s) won't even be run once. Like with the if statement, you can group multiple statements within the same while loop by surrounding a group of statements with curly braces, or by using the alternate syntax: while (expr): statement
  • 162. ... endwhile; The following examples are identical, and both print the numbers 1 through 10: <?php /* example 1 */ $i = 1; while ($i <= 10) { echo $i++; /* the printed value would be $i before the increment (post-increment) */ } /* example 2 */ $i = 1; while ($i <= 10): echo $i; $i++; endwhile; ?> do-while do-while loops are very similar to while loops, except the truth expression is checked at the end of each iteration instead of in the beginning. The main difference from regular while loops is that the first iteration of a do-while loop is guaranteed to run (the truth expression is only checked at the end of the iteration), whereas it may not necessarily run with a regular while loop (the truth expression is checked at the beginning of each iteration, if it evaluates to FALSE right from the beginning, the loop execution would end immediately). There is just one syntax for do-while loops: <?php $i = 0; do { echo $i; } while ($i > 0); ?> The above loop would run one time exactly, since after the first iteration, when truth expression is checked, it evaluates to FALSE ($i is not bigger than 0) and the loop execution ends. Advanced C users may be familiar with a different usage of the do-while loop, to allow stopping execution in the middle of code blocks, by encapsulating them with do-while (0), and using the break statement. The following code fragment demonstrates this: <?php do { if ($i < 5) { echo "i is not big enough"; break; }
  • 163. $i *= $factor; if ($i < $minimum_limit) { break; } echo "i is ok"; /* process i */ } while (0); ?> Don't worry if you don't understand this right away or at all. You can code scripts and even powerful scripts without using this 'feature'. Since PHP 5.3.0, it is possible to use goto operator instead of this hack. for for loops are the most complex loops in PHP. They behave like their C counterparts. The syntax of a for loop is: for (expr1; expr2; expr3) statement The first expression (expr1) is evaluated (executed) once unconditionally at the beginning of the loop. In the beginning of each iteration, expr2 is evaluated. If it evaluates to TRUE, the loop continues and the nested statement(s) are executed. If it evaluates to FALSE, the execution of the loop ends. At the end of each iteration, expr3 is evaluated (executed). Each of the expressions can be empty or contain multiple expressions separated by commas. In expr2, all expressions separated by a comma are evaluated but the result is taken from the last part. expr2 being empty means the loop should be run indefinitely (PHP implicitly considers it as TRUE, like C). This may not be as useless as you might think, since often you'd want to end the loop using a conditional break statement instead of using the for truth expression. Consider the following examples. All of them display the numbers 1 through 10: <?php /* example 1 */ for ($i = 1; $i <= 10; $i++) { echo $i; } /* example 2 */ for ($i = 1; ; $i++) { if ($i > 10) { break; } echo $i; }
  • 164. /* example 3 */ $i = 1; for (; ; ) { if ($i > 10) { break; } echo $i; $i++; } /* example 4 */ for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++); ?> Of course, the first example appears to be the nicest one (or perhaps the fourth), but you may find that being able to use empty expressions in for loops comes in handy in many occasions. PHP also supports the alternate "colon syntax" for for loops. for (expr1; expr2; expr3): statement ... endfor; Its a common thing to many users to iterate though arrays like in the example below. <?php /* * This is an array with some data we want to modify * when running through the for loop. */ $people = Array( Array('name' => 'Kalle', 'salt' => 856412), Array('name' => 'Pierre', 'salt' => 215863) ); for($i = 0; $i < sizeof($people); ++$i) { $people[$i]['salt'] = rand(000000, 999999); } ?> The problem lies in the second for expression. This code can be slow because it has to calculate the size of the array on each iteration. Since the size never change, it can be optimized easily using an intermediate variable to store the size and use in the loop instead of sizeof. The example below illustrates this: <?php $people = Array( Array('name' => 'Kalle', 'salt' => 856412), Array('name' => 'Pierre', 'salt' => 215863) ); for($i = 0, $size = sizeof($people); $i < $size; ++$i)
  • 165. { $people[$i]['salt'] = rand(000000, 999999); } ?> foreach PHP 4 introduced a foreach construct, much like Perl and some other l