Copyright © 1997 - 2013 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 o sin modificaciones, y si tiene alguna pregunta, por favor contacte con los propietarios del Copyright en » doc-license@lists.php.net. Observe que esta dirección está ligada a una lista de correo pública.
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 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.
Nosotros destacamos a las personas actualmente más activas al frente del manual, pero hay muchos más contribuyentes que nos ayudan en nuestro trabajo o han brindado una gran cantidad de ayuda al proyecto en el pasado. Hay muchísima gente anónima que ayudó con notas de usuarios en las páginas del manual, que continuamente son incluidos en las referencias, labor de la que también estamos muy agradecidos. Todas las listas a continuación están en orden alfabético.
Los siguientes contribuyentes deberían ser reconocidos por el impacto de lo que han hecho y/o continúan haciendo añadiendo contenido al 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, Justin Martin, Rafael Martinez, Rick McGuire, Moacir de Oliveira Miranda Júnior, 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 y Andrei Zmievski.
Los siguientes contribuyentes han hecho un importante trabajo editando el manual: Stig Bakken, Gabor Hojtsy, Hartmut Holzgraefe y Egon Schmid.
Los mantenedores actualmente más activos son: Daniel Brown, Nuno Lopes, Felipe Pena, Thiago Pojda y Maciek Sokolewicz.
Estas personas también pusieron mucho esfuerzo en la administración de las notas de usuarios: 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 y Jeroen van Wolffelaar.
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:
Ejemplo #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.
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.
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.
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, IIS, y muchos otros. Esto incluye cualquier servidor web que pueda utilizar el binario PHP de FastCGI, como lighttpd y nginx. PHP funciona ya sea como un módulo, o como un procesador de CGI.
De modo que, con PHP tiene la libertad de elegir el sistema operativo y el servidor web de su gusto. Además, tiene la posibilidad de utilizar programación por procedimientos, programación orientada a objetos (POO), o una mezcla de ambas.
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én puede presentar otros resultados, como XHTML y cualquier otro tipo de ficheros XML. PHP 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.
Una de las características más potentes y destacables de PHP es su soporte para una gran cantidad de bases de datos. Escribir una página web con acceso habilitado a una base de datos es increiblemente simple utilizando una de las extensiones específicas (por ejemplo, para mysql), o utilizar una capa de abstracción como PDO, o conectarse a cualquier base de datos que soporte el estándar de Conexión Abierta a Bases de Datos por medio de la extensión ODBC. Otras bases de datos podrían utilizar cURL o sockets, como lo hace CouchDB.
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 de PHP.
PHP tiene útiles características de procesamiento de texto, las cuales incluyen las Expresiones Regulares Compatibles de Perl (PCRE), muchas extensiones, y herramientas para el acceso y análisis de documentos XML. PHP estandardiza todas las extensiones XML sobre el fundamento sólido de libxml2, y extiende este conjunto de características añadiendo soporte para SimpleXML, XMLReader y XMLWriter.
Existen otras extensiones interesantes, las cuales están categorizadas alfabéticamente y por categoría. Hay extensiones adicionales PECL que podrían estar documentadas o no dentro del manual de PHP, tal como » XDebug.
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í.
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.
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). Si tuviera 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 pre-configurado 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.
Comienze por crear un archivo llamado hola.php y póngalo en el "directorio raíz" (DOCUMENT_ROOT) con el siguiente contenido:
Ejemplo #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 sentencia 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.
Nota: sobre 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 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.
Nota: 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.
Nota: 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.
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.
Ejemplo #2 Obtener la información del sistema desde PHP
<?php phpinfo(); ?>
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'].
Nota:
$_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, 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.)
Para mostrar esta variable, se puede simplemente hacer:
Ejemplo #1 Imprimir una variable (Elemento array)
<?php
echo $_SERVER['HTTP_USER_AGENT'];
?>
Un ejemplo del resultado de esta secuencia de comandos sería:
Hay muchos tipos de variables en PHP. En el ejemplo anterior imprimimos un array. Los 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í:
Ejemplo #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.
Podemos continuar y demostrar cómo puede saltar adentro y afuera del modo PHP en el medio de un bloque de código:
Ejemplo #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.
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:
Ejemplo #1 Un formulario HTML simple
<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 usuario rellena éste formulario y oprime el botón Submit, una página titulada accion.php es llamada. En este archivo encontrará algo así:
Ejemplo #2 Imprimir información desde nuestro formulario
Hola <?php echo htmlspecialchars($_POST['nombre']); ?>.
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 lo 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().
En PHP, también puede tratar entradas desde formularios XForms; aunque probablemente en un comienzo se sienta a gusto con los formularios de HTML, que están ampliamente respaldados. A pesar de que los XForms no son trabajo de principiantes, es posible que tenga interés en ellos. Si es el caso, en la sección características de la documentación puede encontrarse una pequeña introducción a la manipulación de datos recibidos desde XForms.
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:
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/
Antes de empezar con la instalación, primero necesita saber para qué quiere utilizar PHP. Existen tres campos principales donde se puede utilizar PHP tal y como se describe en la sección: ¿Qué se puede hacer con PHP?
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 disponga del navegador web y, dependiendo de la configuración del sistema operativo, quizá ya tenga un servidor web (p.ej. Apache en Linux y MacOS X; IIS en Windows). También puede alquilar espacio web en una empresa. De esta forma, no se necesita instalar nada, solo tiene que escribir los scripts de PHP, subirlos al servidor que alquile y ver los resultados en su navegador.
En caso de configurar el servidor y PHP por su cuenta, existen dos opciones para el modo de conectar PHP con el servidor. Para muchos servidores, PHP tiene un módulo de interfaz directo (también llamado SAPI). Entre estos servidores se incluyen Apache, Microsoft Internet Information Server, Netscape y iPlanet. Muchos otros servidores tienen soporte para ISAPI, el módulo de interfaz de Microsoft (OmniHTTPd por ejemplo). Si PHP no tiene soporte para el módulo de su servidor web, siempre puede usarlo como procesador CGI o FastCGI. Esto significa configurar el servidor para usar el CGI ejecutable de PHP para procesar cada una de las peticiones a ficheros PHP en el servidor.
Si también está interesado en usar PHP bajo la línea de comandos (p.ej. escribir scripts que autogeneran imágenes de forma offline, o procesar ficheros de texto dependiendo de los argumentos que se les pasen), siempre necesitará el ejecutable de línea de comandos. Para más información, lea la sección sobre escribir aplicaciones PHP desde la línea de comandos. En este caso, no se necesita ningún servidor o navegador.
Con PHP también se pueden escribir aplicaciones GUI de escritorio usando la extensión PHP-GTK. Este enfoque no tiene nada que ver con escribir páginas web, ya que no se muestra nada de HTML, pero gestiona ventanas y objetos dentro de ellas. Para más información acerca de PHP-GTK, por favor » visite el sitio dedicado a esta extensión. PHP-GTK no está incluido en la distribución oficial de PHP.
De aquí en adelante, esta sección trata de la configuración de PHP para servidores web sobre Unix y Windows con interfaces de módulo de servidor y ejecutables CGI. También se puede encontrar información sobre ejecutables de línea de comandos en las siguientes secciones.
El código fuente de PHP y las distribuciones binarias para Windows pueden encontrarse en » http://www.php.net/downloads.php. Recomendamos elegir un » sitio alternativo cercano para descargar las distribuciones.
Esta sección le guiará a través de la configuración general e instalación de PHP sobre sistemas Unix. Asegúrese de investigar cualquier sección específica a su plataforma o servidor web antes de comenzar el proceso.
Tal como el manual lo esboza en la sección Consideraciones generales de instalación, se está tratando principalmente con configuraciones de PHP centradas en web en esta sección, aunque también se cubrirá el preparar PHP para usarse en línea de comando.
Existen varias maneras de instalar PHP para la plataforma Unix, ya sea con un proceso de compilar y configurar, o a través de varios métodos pre-empaquetados. Esta documentación está enfocada principalmente alrededor del proceso de compilar y configurar PHP. Muchos sistemas estilo Unix tienen algún tipo de sistema de instalación de paquetes. Esto puede ayudar en preparar una configuración standard, pero si se requiere tener un conjunto diferente de características (tales como un servidor seguro, o un manejador diferente de base de datos), podría ser necesario construir PHP y/o el servidor web. Si no se está familiarizado con la construcción y el compilado de su propio software, vale la pena revisar para ver si alguien ya ha construido una versión empaquetada de PHP con las características que se necesitan.
Conocimientos y software necesarios para compilar:
Cuando compile directamente de una fuente Git o después de realizar modificaciones usted necesita también:
El proceso inicial de preparación y configuración de PHP es controlado por el uso de las opciones de línea de comando del script configure. Es posible obtener una lista de todas las opciones disponibles junto con una descripción corta ejecutando ./configure --help. El manual documenta las diferentes opciones por separado. Se encontrarán las opciones principales en el apéndice, mientras que las diferentes opciones específicas de las extensiones se describen en las páginas de referencia.
Cuando PHP está configurado, se está listo para compilar el módulo y/o ejecutables. El comando make debería hacerse cargo de esto. Si falla y no se puede encontrar el porque, véase la sección de problemas.
Esta sección contiene notas y consejos específicos a instalaciones Apache de PHP sobre plataformas Unix. También se tienen instrucciones y notas para Apache 2 en una página por separado.
Se pueden seleccionar argumentos para agregar a configure en la línea 10 debajo de la lista de opciones principales de configure y de opciones específicas a extensiones descritas en sus respectivos lugares en el manual. Los números de versión han sido omitidos aquí, para asegurar que las instrucciones no sean incorrectas. Se necesita reemplazar las 'xxx' aquí con los valores correctos de los ficheros.
Ejemplo #1 Instrucciones de instalación (Versión de módulo compartido de Apache) para PHP
1. gunzip apache_xxx.tar.gz
2. tar -xvf apache_xxx.tar
3. gunzip php-xxx.tar.gz
4. tar -xvf php-xxx.tar
5. cd apache_xxx
6. ./configure --prefix=/www --enable-module=so
7. make
8. make install
9. cd ../php-xxx
10. Ahora, se configura PHP. Aquí es donde se personaliza PHP
con varias opciones, como cuales extensiones se habilitarán. Realizar un
./configure --help para obtener una lista de opciones disponibles. En el ejemplo
se realiza un configure simple con soporte para Apache 1 y MySQL. La
ruta de acceso a apxs puede diferir del ejemplo.
./configure --with-mysql --with-apxs=/www/bin/apxs
11. make
12. make install
Si se decide cambiar las opciones de configure después de la instalación,
solamente se necesita repetir los últimos tres pasos. Sólo hace falta
reiniciar apache para que el nuevo módulo tenga efecto. Una recompilación de
Apache no es necesaria.
Nótese que a menos que se mencione lo contrario, 'make install' también instalará PEAR,
varias herramientas de PHP tales como phpize, instalará la línea de comando (CLI) de PHP, y más.
13. Preparar el fichero php.ini:
cp php.ini-development /usr/local/lib/php.ini
Se puede editar el fichero .ini para fijar las opciones de PHP. Si se prefiere
php.ini en otra ubicación, utilice --with-config-file-path=/some/path en
el paso 10.
Si en vez de ello se elige php.ini-production, asegurarse de leer la lista
de cambios en el interior, ya que éstos afectan como se comporta PHP.
14. Editar httpd.conf para cargar el módulo de PHP. La ruta de acceso al lado derecho
de el enunciado LoadModule debe apuntar a la ruta del módulo de PHP
en su sistema. El make install anterior podría haber agregado esto ya
por usted, pero asegúrese de revisarlo.
LoadModule php5_module libexec/libphp5.so
15. Y en la sección AddModule de httpd.conf, en algún lugar por debajo de
ClearModuleList, agregar esto:
AddModule mod_php5.c
16. Indicar a Apache que procese ciertas extensiones como PHP. Por ejemplo,
hacer que Apache procese la extensión .php como PHP. Se podría
hacer que cualquier extensión o extensiones sean procesadas como PHP simplemente añadiendo más, con
cada una separada por un espacio. Se agregará .phtml para demostrarlo.
AddType application/x-httpd-php .php .phtml
También es común configurar la extensión .phps para mostrar fuentes resaltadas de PHP,
ésto puede hacerse con:
AddType application/x-httpd-php-source .phps
17. Utilice el procedimiento normal para iniciar el servidor Apache. (Se debe
detener y reiniciar el servidor, no sólo causar que el servidor recargue utilizando
una señal HUP o USR1.)
Alternativamente, para instalar PHP como un objeto estático:
Ejemplo #2 Instrucciones de instalación (Instalación de módulo estático para Apache) para PHP
1. gunzip -c apache_1.3.x.tar.gz | tar xf -
2. cd apache_1.3.x
3. ./configure
4. cd ..
5. gunzip -c php-5.x.y.tar.gz | tar xf -
6. cd php-5.x.y
7. ./configure --with-mysql --with-apache=../apache_1.3.x
8. make
9. make install
10. cd ../apache_1.3.x
11. ./configure --prefix=/www --activate-module=src/modules/php5/libphp5.a
(¡La línea anterior es correcta! Sí, ya se sabe que libphp5.a aún no existe en esta
etapa. No se supone que deba. Será creado.)
12. make
(ahora se debe tener un binario httpd que puede ser copiado al directorio bin de Apache si
esta es la primera instalación entonces se necesita dar "make install" también)
13. cd ../php-5.x.y
14. cp php.ini-development /usr/local/lib/php.ini
15. Se puede editar el fichero /usr/local/lib/php.ini para fijar las opciones de PHP.
Editar el fichero httpd.conf o srm.conf y añadir:
AddType application/x-httpd-php .php
Dependiendo de la instalación de Apache y la variante de Unix, hay muchas maneras posibles de detener y reiniciar el servidor. Abajo hay algunas líneas típicas utilizadas para reiniciar el servidor, para diferentes instalaciones apache/unix. Se debe reemplazar /path/to/ con la trayectoria a estas aplicaciones en el sistema.
Ejemplo #3 Comandos de ejemplo para reiniciar Apache
1. Diferentes variantes de Linux y SysV: /etc/rc.d/init.d/httpd restart 2. Utilizando scripts apachectl: /path/to/apachectl stop /path/to/apachectl start 3. httpdctl y httpsdctl (Utilizando OpenSSL), similar a apachectl: /path/to/httpsdctl stop /path/to/httpsdctl start 4. Usando mod_ssl, u otro servidor SSL, que se quiera detener e iniciar manualmente: /path/to/apachectl stop /path/to/apachectl startssl
Las ubicaciones de los binarios apachectl y http(s)dctl varían frecuentemente. Si el sistema tiene los comandos locate o whereis o which, éstos pueden ayudar en encontrar los programas de control del servidor.
Distintos ejemplos de compilaciones de PHP para apache son como sigue:
./configure --with-apxs --with-pgsql
Esto creará una librería compartida libphp5.so que se carga en Apache utilizando una línea LoadModule en el fichero de Apache httpd.conf. El soporte para PostgreSQL está incluido dentro de esta librería.
./configure --with-apxs --with-pgsql=shared
Esto creará una librería compartida libphp5.so para Apache, pero también creará una librería compartida pgsql.so que se carga en PHP ya sea usando la directiva de extensión en el fichero php.ini o cargándola explícitamente en un script utilizando la función dl().
./configure --with-apache=/path/to/apache_source --with-pgsql
Esto creará una librería libmodphp5.a, un mod_php5.c y algunos ficheros acompañantes y cópiese estos dentro del directorio src/modules/php5 en el árbol de fuentes de Apache. Entonces se compila Apache utilizando --activate-module=src/modules/php5/libphp5.a y el sistema de compilación de Apache creará libphp5.a y lo enlazará estáticamente dentro del binario httpd. El soporte para PostgreSQL se incluye directamente dentro de este binario httpd, así que el resultado final aquí es un binario httpd sencillo que incluye todo Apache y todo PHP.
./configure --with-apache=/path/to/apache_source --with-pgsql=shared
Igual que en el anterior, excepto que en vez de incluir soporte para PostgreSQL directamente en el httpd final se obtiene una librería compartida pgsql.so que puede cargarse dentro de PHP desde ya sea el fichero php.ini o directamente utilizando dl().
Cuando se elige compilar PHP de diferentes maneras, se deben considerar las ventajas y desventajas de cada método. Compilar como objeto compartido significará que se puede compilar apache por separado, y no se tiene que recompilar todo cuando se agrega o se cambia algo en PHP. Compilar PHP dentro de apache (método estático) significa que PHP cargará y ejecutará más rápido. Para más información, ver la » página web de Apache sobre soporte DSO.
Nota:
El httpd.conf por omisión de Apache actualmente se distribuye con una sección que se parece a esto:
A menos que se cambie esto a "Group nogroup" o algo como esto ("Group daemon" es también muy común) PHP no será capaz de abrir ficheros.User nobody Group "#-1"
Nota:
Asegúrese de que se especifica la versión instalada de apxs cuando se utiliza --with-apxs=/path/to/apxs . NO se debe utilizar la versión de apxs que está en las fuentes de apache, si no la que en realidad está instalada en el sistema.
Esta sección contiene notas y consejos específicos a las instalaciones de Apache 2.x de PHP sobre sistemas Unix.
No se recomienda utilizar un MPM threaded en producción con Apache 2. Use MPM prefork, que es el MPM por defecto en Apache 2.0 y 2.2. Para información sobre cómo, lea la correspondiente entrada de la FAQ sobre utilizar Apache2 con un MPM threaded
La » Documentación de Apache es la fuente de información más autorizada acerca del servidor Apache 2.x. Ahí se puede encontrar más información acerca de las opciones de instalación.
La versión más reciente de Apache HTTP Server puede obtenerse del » Sitio de descargas de Apache, y una versión apropiada de PHP de los lugares anteriormente mencionados. Esta guía rápida solamente cubre lo básico para comenzar con Apache 2.x y PHP. Para obtener más información lea la » Documentación de Apache. Los números de versión han sido omitidos aquí, para asegurar que las instrucciones no sean incorrectas. En los ejemplos siguientes, 'NN' deberá ser reemplazado con la versión específica de Apache que se está utilizando.
Existen actualmente dos versiones de Apache 2.x - está la 2.0 y la 2.2. Mientras que existen varias razones para elegir cada una, la 2.2 es actualmente la versión más reciente, y la que se recomienda, si es que esa opción está disponible. Sin embargo, las instrucciones aquí funcionarán ya sea para 2.0 ó 2.2.
Obténgase el servidor HTTP Apache de la ubicación listada con anterioridad, y desempáquese:
gzip -d httpd-2_x_NN.tar.gz tar -xf httpd-2_x_NN.tar
De la misma manera, obtener y desempacar las fuentes de PHP:
gunzip php-NN.tar.gz tar -xf php-NN.tar
Compilar e instalar Apache. Consúltese la documentación de instalación de Apache para mayores detalles sobre la compilación de Apache.
cd httpd-2_x_NN ./configure --enable-so make make install
Ahora se tiene Apache 2.x.NN disponible debajo de /usr/local/apache2, configurado con soporte para módulos cargables y con el MPM (Módulo de multiproceso) prefork estándar. Para probar la instalación úsese el procedimiento para iniciar el servidor Apache, por ej.:
/usr/local/apache2/bin/apachectl start
/usr/local/apache2/bin/apachectl stop
Ahora, configure y compile PHP. Aquí es donde se personaliza PHP con varias opciones, como qué extensiones se han de habilitar. Ejecute ./configure --help para obtener una lista de opciones disponibles. En el ejemplo se realiza un simple configure con soporte para Apache 2 y MySQL.
Si se compila Apache a partir de los fuentes, tal como se describe anteriormente, el siguiente ejemplo coincidirá con la trayectoria para apxs, pero si se ha instalado Apache de alguna otra manera, será necesario ajustar la trayectoria a apxs apropiadamente. Nótese que algunas distribuciones pueden renombrar apxs cómo apxs2.
cd ../php-NN ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql make make install
Si se decide a cambiar las opciones de configuración después de la instalación, se deben volver a ejecutar los pasos configure, make, y make install. Solamente se necesita reiniciar apache para que el nuevo módulo tenga efecto. Una recompilación de Apache no es necesaria.
Nótese que a menos que se indique lo contrario, 'make install' también instalará PEAR, varias herramientas de PHP tales como phpize, instalará la interfaz de línea de comando (CLI) de PHP, y más.
Configurar php.ini
cp php.ini-development /usr/local/lib/php.ini
Se puede editar el fichero .ini para fijar las opciones de PHP. Si se prefiere tener php.ini en otra ubicación, utilice --with-config-file-path=/alguna/trayectoria en el paso 5.
Si en vez de eso se elige php.ini-production, asegúrese de leer la lista de cambios al interior, ya que afectan como se comporta PHP.
Edítese httpd.conf para cargar el módulo PHP. La trayectoria a la derecha de la sentencia LoadModule debe apuntar a la trayectoria del módulo PHP en el sistema. El make install anterior podría ya haber agregado esto automáticamente, pero asegúrese de revisar.
LoadModule php5_module modules/libphp5.so
Indicar a Apache que procese ciertas extensiones como PHP. Por ejemplo, hágase que Apache procese ficheros .php como PHP. En vez de solamente utilizar la directiva de Apache AddType, se desea evitar subidas de ficheros potencialmente peligrosas y que ficheros creados tal como exploit.php.jpg sean ejecutados como PHP. Utilizando este ejemplo, se puede hacer que cualquier extensión o extensiones sean procesadas como PHP simplemente añadiéndolas. Se agregará .php para demostrarlo.
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
O, si se deseara permitir que ficheros .php, .php2, .php3, .php4, .php5, .php6, y .phtml fuesen ejecutados como PHP, pero nada más, se utilizaría esto:
<FilesMatch "\.ph(p[2-6]?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
Y para permitir que ficheros .phps sean manejados por el filtro de fuentes de php, y desplegado como código fuente con sintaxis resaltada, se utiliza esto:
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
mod_rewrite puede ser utilizado para permitir que cualquier fichero .php arbitrario sea desplegado como código fuente con sintaxis resaltada, sin tener que renombrarlo o copiarlo a un fichero .phps:
RewriteEngine On RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]
El filtro de código fuente php no debe habilitarse en sistemas de producción, donde podría exponer información confidencial o de alguna otra manera sensible incluida en código fuente.
Utilícese el procedimiento normal para iniciar el servidor Apache, por ej.:
/usr/local/apache2/bin/apachectl start
O
service httpd restart
Siguiendo los pasos anteriores se tendrá corriendo un servidor web Apache2 con soporte para PHP como un módulo SAPI. Por supuesto existen muchas opciones más de configuración disponibles para Apache y PHP. Para más información teclee ./configure --help en el árbol de fuentes correspondiente.
Apache se puede compilar con soporte multihilos seleccionando el worker MPM, en vez del prefork MPM standard, cuando Apache se compila. Esto se realiza agregando la siguiente opción al argumento pasado a ./configure, en el paso 3 anterior:
Esto no debe llevarse a cabo sin ser consciente de las consecuencias de esta decisión, y tener al menos un ligero entendimiento acerca de las implicaciones. La documentación de Apache al respecto de » MPM-Modules discute los MPM en forma mucho más detallada.
Nota:
Las Preguntas frecuentes de Apache MultiViews discute acerca del uso de multiviews con PHP.
Nota:
Para compilar una versión multihilo de Apache, el sistema destino debe soportar hilos. En este caso, PHP también debe compilarse con la opción Zend Thread Safety (ZTS) experimental. Bajo esta configuración, no todas las extensiones se encontrarán disponibles. La configuración recomendada es compilar Apache con el MPM-module prefork por omisión.
Esta sección contiene anotaciones y consejos específicos para la instalación de PHP en Lighttpd 1.4 para sistemas Unix.
Por favor, antes de continuar consulte el » sistema de seguimiento de Lighttpd para saber cómo instalar Lighttpd apropiadamente.
La SAPI recomendada para conectar PHP a Lighttpd es Fastcig. Esta SAPI viene habilitada por omisión en php-cgi PHP 5.3. En versiones anteriores debe configurarse PHP con --enable-fastcgi. Para verificar que PHP tiene fastcgi habilitado, php -v debe contener PHP 5.2.5 (cgi-fcgi) En versiones anteriores a PHP 5.2.3, fastcgi estaba habilitado en el binario de php (no había php-cgi).
Para configurar Lighttpd para que se conecte a php y lance procesos fastcgi, debe editar lighttpd.conf. Se recomienda utilizar sockets para conectar fastcgi a los procesos del sistema local.
Ejemplo #1 Extracto de 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
))
)
La directiva bin-path permite a lighttpd lanzar procesos fastcgi dinámicamente. PHP creará nuevos procesos hijos según se especifique en la variable de entorno PHP_FCGI_CHILDREN. La directiva "bin-environment" establece el entorno de los nuevos procesos. Cada vez que se alcance un determinado número de peticiones, determinado por PHP_FCGI_MAX_REQUEST, se matará un proceso. Las directivas "min-procs" y "max-procs" deben, por norma general, evitarse con PHP. PHP gestiona sus propios hijos, de forma que cachés como APC sólo estarán disponibles para los procesos gestionados por PHP. Si se establece "min-procs" a un número superior a 1, el número total de procesos oyentes en php se multiplicará por PHP_FCGI_CHILDREN (2 min-procs * 16 hijos produce 32 oyentes).
Lighttpd contiene el programa spawn-fcgi que facilita lanzar procesos fastcgi.
Pese a que es más laborioso, es posible lanzar procesos sin spawn-fcgi. La variable de entorno PHP_FCGI_CHILDREN controla cuántos procesos hijo de PHP se lanzarán para manejar las peticiones entrantes. PHP_FCGI_MAX_REQUESTS determinará el tiempo de vida (en peticiones) de cada proceso hijo. Aquí se muestra un script en bash que asiste en la creación de procesos php.
Ejemplo #2 Lanzando oyentes FastCGI
#!/bin/sh
# Ubicación del binario php-cgi
PHP=/usr/local/bin/php-cgi
# Ubicación del fichero PID
PHP_PID=/tmp/php.pid
# Enlazando a una dirección
#FCGI_BIND_ADDRESS=10.0.1.1:10000
# Enlazando a un socket de dominio
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"
Para poder tener aplicaciones escalables, pueden lanzarse instancias de fastcgi en múltiples equipos remotos.
Ejemplo #3 Conexión a instancias de php-fastcgi remotas
fastcgi.server = ( ".php" =>
(( "host" => "10.0.0.2", "port" => 1030 ),
( "host" => "10.0.0.3", "port" => 1030 ))
)
Esta sección contiene notas y consejos específicos al servidor web Sun Java System, servidor web Sun ONE, instalaciones de servidores iPlanet y Netscape de PHP sobre Sun Solaris.
A partir de PHP 4.3.3 en adelante se pueden utilizar scripts PHP con el módulo NSAPI para generar listados de directorio y páginas de errores personalizados. Funciones adicionales para compatibilidad con Apache también se encuentran disponibles. Para soporte en servidores web actuales, léase la nota sobre subpeticiones.
Se puede encontrar más información acerca de configurar PHP para Netscape Enterprise Server (NES) aquí: » http://benoit.noss.free.fr/php/install-php4.html
Para construir PHP con los servidores web Sun JSWS/Sun ONE WS/iPlanet/Netscape, introduzca el directorio de instalación apropiado para la opción --with-nsapi=[DIR]. El directorio por omisión es comúnmente /opt/netscape/suitespot/. Por favor también léase /php-xxx-version/sapi/nsapi/nsapi-readme.txt.
Instalar los siguientes paquetes de » http://www.sunfreeware.com/ o algún otro sitio de descargas:
export PATH.
gunzip php-x.x.x.tar.gz (si se tiene una distribución .gz,
de lo contrario ir a 4).
tar xvf php-x.x.x.tar
cd ../php-x.x.x
Para el siguiente paso, asegurar que /opt/netscape/suitespot/ sea donde el servidor netscape está instalado. De no ser así, cambiar a la ruta de acceso correcta y ejecutar:
./configure --with-mysql=/usr/local/mysql \ --with-nsapi=/opt/netscape/suitespot/ \ --enable-libgcc
Después de realizar la instalación base y de leer el fichero readme apropiado, es posible que sea necesario realizar algunos pasos adicionales de configuración.
Primeramente quizás sea necesario agregar algunas rutas de acceso al entorno LD_LIBRARY_PATH para que el servidor encuentre todas las librerías compartidas. Esto puede hacerse de mejor manera en el script de arranque del servidor web. El script de arranque se encuentra comúnmente localizado en: /ruta/al/servidor/https-servername/start. Quizás también sea necesario editar los ficheros de configuración que están ubicados en: /ruta/al/servidor/https-servername/config/.
Agregar la siguiente línea a mime.types (se puede hacer esto por medio del servidor de administración):
type=magnus-internal/x-httpd-php exts=php
Editar magnus.conf (para servidores >= 6) u obj.conf (para servidores < 6) y agregar lo siguiente, shlib variará dependiendo del sistema, será algo así como /opt/netscape/suitespot/bin/libphp4.so. Se deben colocar las siguientes líneas después de mime types init.
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"]
Configurar el objeto por omisión en obj.conf (para clases de servidor virtual [versión 6.0+] en su vserver.obj.conf):
<Object name="default"> . . . .#NOTA esta siguiente línea debería ocurrir después de todos las líneas 'ObjectType' y antes de todas las líneas 'AddLog' Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...] . . </Object>
Esto es sólo necesario si se quiere configurar un directorio que solamente consiste de scripts de PHP (igual que un directorio cgi-bin):
<Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object>
Configuración de la autenticación: La autenticación PHP no puede ser utilizada con ninguna otra autenticación. TODA AUTENTICACION LE ES PASADA AL SCRIPT DE PHP. Para configurar la autenticación de PHP para el servidor entero, agregar la línea siguiente al objeto por omisión:
<Object name="default"> AuthTrans fn=php4_auth_trans . . . </Object>
Para utilizar autenticación de PHP en sólo un directorio, agregar lo siguiente:
<Object ppath="d:\ruta\al\directorio\auntenticado\*"> AuthTrans fn=php4_auth_trans </Object>
Nota:
El tamaño de la pila que utiliza PHP depende de la configuración del servidor web. Si se tienen fallas generales con scripts de PHP muy grandes, se recomienda elevarlo con el servidor de administración (en la sección "MAGNUS EDITOR").
Importante cuando se escriben scripts de PHP, es el hecho de que Sun JSWS/Sun ONE WS/iPlanet/Netscape es un servidor web multihilos. Por ello todas las peticiones se corren en el mismo espacio de proceso (el espacio del servidor web mismo) y este espacio tiene solamente un ambiente. Si se quiere tener variables CGI como PATH_INFO, HTTP_HOST etc. la manera correcta no es intentar esto al viejo estilo de PHP con getenv() o una manera similar (registrar globales al ambiente, $_ENV). Solamente se obtendrá el ambiente del servidor web que se está ejecutando. ¡Sin ninguna variable CGI válida!
Nota:
¿Por qué hay variables CGI (inválidas) en el ambiente?
Respuesta: Esto es por que se inició el proceso del servidor web desde el servidor de administración que ejecuta el script de arranque del servidor web, que se quería iniciar, como un script de CGI (¡Un script de CGI dentro del servidor de administración!). Esto es el porque el ambiente de el servidor web iniciado tiene algunas variables de CGI en él. Se puede probar esto iniciando el servidor web, no desde el servidor de administración. Utilizar la línea de comando como usuario root e iniciarlo manualmente - se verá que no hay variables de ambiente a la CGI.
Simplemente cámbiense los scripts para obtener las variables CGI de la manera correcta para PHP 4.x utilizando la superglobal $_SERVER. Si se tienen scripts más antiguos que usan $HTTP_HOST, etc., se debe activar register_globals en php.ini y cambiar el orden de las variables también (importante: quitar "E" de ésta, porque no se necesita el entorno aquí):
variables_order = "GPCS" register_globals = On
Se puede utilizar PHP para generar páginas de errores para "404 Not Found" o similares. Agregar la siguiente línea al objeto en obj.conf por cada página de error que se quiera sobreescribir:
Error fn="php4_execute" code=XXX script="/path/to/script.php" [inikey=value inikey=value...]
Otra posibilidad es generar listados de directorio personalizados. Solamente creando un script PHP que despliegue un listado de directorio y reemplazando la línea por omisión correspondiente Service por type="magnus-internal/directory" en obj.conf con lo siguiente:
Service fn="php4_execute" type="magnus-internal/directory" script="/path/to/script.php" [inikey=value inikey=value...]
El módulo NSAPI ahora soporta la función nsapi_virtual() (alias: virtual()) para realizar subpeticiones en el servidor web e insertar el resultado en la página web. Esta función utiliza algunas características no documentadas de la librería NSAPI. En Unix el módulo automáticamente busca las funciones necesarias y las utiliza si están disponibles. Si no, se deshabilita nsapi_virtual().
Nota:
Pero se advierte: El soporte para nsapi_virtual() es ¡¡¡EXPERIMENTAL!!!
Por defecto, PHP se construye como un programa CLI y CGI, que puede ser utilizado para el procesamiento de CGI. Si está ejecutando un servidor web PHP tiene soporte para los módulos, por lo general debe irse por esta solución por razones de rendimiento. Sin embargo, la versión CGI permite a los usuarios ejecutar diferentes páginas con PHP bajo diferentes identificadores de usuarios.
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 has construido PHP como un programa CGI, puede probar su construcción escribiendo make test. Siempre es una buena idea probar su construcción. De esta manera usted puede encontrar un problema al principio con PHP en la plataforma, en lugar de tener que luchar con él más adelante.
Algunos servidores suministrando variables de entorno no se definen en las actuales » CGI/1.1 specification. Sólo las siguientes variables no se definen: 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. Todo lo demás debe ser tratado como "extensiones de proveedor".
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
Esta sección contiene notas y consejos específicos a la instalación de PHP sobre » OpenBSD 3.6.
Utilizar paquetes binarios para instalar PHP sobre OpenBSD es el método más simple y recomendado. El paquete principal ha sido separado de los distintos módulos, y cada uno puede ser instalado removido independientemente de los otros. Los ficheros que se necesitan pueden ser encontrados en el CD de OpenBSD o en el sitio FTP.
El paquete principal que se necesita instalar es php4-core-4.3.8.tgz, que contiene el motor básico (además de gettext e iconv). Seguido, tómese un vistazo a los paquetes de módulos, tales como php4-mysql-4.3.8.tgz o php4-imap-4.3.8.tgz. Se necesita emplear el comando phpxs para activar y desactivar estos módulos en el fichero php.ini.
Ejemplo #1 Ejemplo de instalación de paquete de OpenBSD
# 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 (agregar mysql) # pkg_add php4-mysql-4.3.8.tgz # /usr/local/sbin/phpxs -a mysql (agregar imap) # pkg_add php4-imap-4.3.8.tgz # /usr/local/sbin/phpxs -a imap (quitar mysql a manera de prueba) # pkg_delete php4-mysql-4.3.8 # /usr/local/sbin/phpxs -r mysql (instalar las librerías de PEAR) # pkg_add php4-pear-4.3.8.tgz
Leer la página del manual » packages(7) para mas información sobre paquetes binarios en OpenBSD.
También se puede compilar PHP a partir de fuentes utilizando el » árbol de portes. Sin embargo, esto sólo se recomienda para usuarios familiarizados con OpenBSD. El porte de PHP 4 está dividido en dos subdirectorios: core y extensions. El directorio extensions genera subpaquetes para todos los módulos soportados de PHP. Si se encuentra que no se desea crear alguno de estos módulos, utilice el sabor o FLAVOR no_*. Por ejemplo, para evitar compilar el módulo imap, fijar el sabor o FLAVOR a no_imap.
Ediciones antiguas de OpenBSD utilizaban el sistema FLAVORS para compilar un PHP enlazado estáticamente. Dado que es difícil generar paquetes binarios utilizando este método, ahora es depreciado. Aún es posible utilizar los viejos árboles estables de ports si así se desea, pero carecen de soporte por parte del equipo de OpenBSD. Si se tiene algún comentario al respecto, el responsable actual del port es Anil Madhavapeddy (avsm arroba openbsd punto org).
Esta sección contiene notas y sugerencias específicas para la instalación de PHP en sistemas Solaris.
La instalacion Solaris carece con frecuencia de los compiladores de C y sus herramientas relacionadas. Lea las preguntas frecuentes para obtener información sobre porqué usar versiones GNU de algunas de estas herramientas.
Para descomprimir la distribución PHP se necesita
Para compilar PHP se necesita
Para compilar extensiones adicionales o hackear el código PHP puede que se necesite también
Se puede simplificar el procesao de intalación de Solaris mediante el uso de pkgadd para instalar la mayoría de sus componentes necesarios. El Sistema de Empaquetado de Imagen (IPS) para Solaris 11 Express contiene también la mayoría de los componentes requeridos para la instalación usando el comando pkg.
Esta sección contiene notas y consejos específicos para instalar PHP sobre » Debian GNU/Linux.
No se ofrece soporte de builds no oficiales de terceros. Cualquier bug debe ser informado al equipo de Debian a no ser que puedan reproducirse usando los últimos builds de nuestra » zona de descargas.
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 apt-get o aptitude. En esta página del manual estos dos comandos se pueden utilizar indistintamente.
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.
Ejemplo #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:
Ejemplo #2 Deteniendo e iniciando Apache una vez que PHP está instalado
# /etc/init.d/apache2 stop # /etc/init.d/apache2 start
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.
Ejemplo #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 php5-cgi, 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:
Ejemplo #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.
Esta sección contiene notas y sugerencias específicas para la instalación de PHP en Mac OS X. PHP se incluye con Mac, y la compilación es similar a la guía de instalación Unix .
Hay algunas versiones pre-empaquetados y pre-compilados de PHP para Mac OS X. Esto puede ayudar en la creación de una configuración estándar, pero si usted necesita tener un conjunto diferente de características (como un servidor seguro, o un controlador de base de datos diferente), es posible que necesite construir PHP y/o un servidor web. Si no está familiarizado con la construcción y compilación de el software, vale la pena revisar si alguien ya ha construido una versión de PHP con las características que necesita.
Los siguientes recursos ofrecen paquetes facil de instalar y binarios precompilados para PHP en Mac OS:
PHP está incluido en los Macs desde la versión OS X 10.0.0. Habilitar PHP con el servidor web por defecto requiere descomentar unas cuantas líneas en el fichero de configuración de Apache httpd.conf donde CGI y/o CLI están activados por defecto (son fácilmente accesibles a través del programa Terminal).
Siguiendo las instrucciones que se ofrecen a continuación se podrá habilitar PHP de una forma rápida para un entorno de desarrollo local. Es muy recomendable tener siempre actualizado PHP a la última versión. Como casi todo el software vivo, y PHP no es una excepción, se crean nuevas versiones para resolver errores y añadir nuevas funcionalidades. Consulte la documentación de instalación de Mac OS X adecuada para más detalles. Las siguientes instrucciones para obtener una configuración están orientadas a los principiantes que deseen obtener una configuración totalmente operativa. Se anima a todos los usuarios a compilar o instalar una nueva versión ya empaquetada.
La instalación típica es mediante mod_php. Para habilitar el paquete mod_php que viene en el Mac OS X para el servidor web Apache (el servidor web por defecto, al que se puede acceder mediante las Preferencias del Sistema) se requiere efectuar los siguientes pasos:
Nota: Una forma de abrir el fichero es usando un editor de texto basado en UNIX en el Terminal, como por ejemplo nano. Debido a que el fichero pertenece al usuario root se debe emplear el comando sudo para abrirlo (como si fueramos el usuario root). Por ejemplo, teclée lo siguiente en el Terminal (tras lo cual le preguntará por la contraseña): sudo nano /private/etc/apache2/httpd.conf Comandos de nano a tener en cuenta: ^w (buscar), ^o (guardar), and ^x (salir) donde ^ representa la tecla Ctrl.
Nota: Las versiones de Mac OS X anteriores a 10.5 tienen incorporadas versiones antiguas de PHP y Apache. Por ello, es posible que el fichero de configuracion de Apache se encuentre en dichos equipos en /etc/httpd/httpd.conf.
En el editor de texto, descomente las líneas (eliminando el símbolo #) que sean similares a las que se muestran a continuación (a menudo estas líneas se encuentran separadas, asi que tendrá que localizar ambas en el fichero):
# LoadModule php5_module libexec/httpd/libphp5.so # AddModule mod_php5.c
Asegúrese que las extensiones que desee puedan ser interpretadas como PHP (por ejemplo: .php .html y .inc)
Como las siguientes sentencias ya existían en el httpd.conf (desde el Max Panther), una vez se habilite PHP los ficheros .php automáticamente seran interpretados como 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>
Nota:
Con anterioridad a OS X 10.5 (Leopard) se empaquetaba PHP 4 en lugar de PHP 5, en cuyo caso las instrucciones anteriores pueden ser ligeramente diferentes cambiando los 5 por los 4.
La función phpinfo() muestra información sobre PHP. Considere la creación de un fichero en el DocumentRoot que contenga el siguiente código PHP:
<?php phpinfo(); ?>
Para reiniciar, ejecute sudo apachectl graceful en el shell o desactive/active la opción "Compartir Web" en las Preferencias del Sistema. Por defecto, cargar ficheros locales en el navegador tiene una URL parecida a: http://localhost/info.php. Usar DocumentRoot en el directorio del usuario es otra opción, y la URL sería parecida a: http://localhost/~yourusername/info.php
CLI (o CGI en versiones antiguas) también es llamado de forma correcta php y posiblemente existe como /usr/bin/php. Abra el Terminal, lea la sección de línea de comando del manual de PHP, y ejecute php -v para comprobar la versión de PHP del binario PHP. Una llamada a phpinfo() también le mostrará esta información.
Esta sección se aplica a Windows 98/Me y Windows NT/2000/XP/2003. PHP no funciona en plataformas de 16 bits, como Windows 3.1 y, a veces nos referimos a las plataformas soportadas por Windows como Win32.
Nota:
Windows 98/Me/NT4 ya no se admite a partir de PHP 5.3.0.
Nota:
Windows 95 ya no se admite a partir de PHP 4.3.0.
Hay dos maneras principales de instalar PHP para Windows: de forma manual o mediante el instalador.
Si tiene un entorno de desarrollo como Microsoft Visual Studio, también puede construir PHP desde el código fuente original.
Una vez que haya instalado PHP en su sistema Windows, también puede querer cargar varias extensiones para mayor funcionalidad.
Hay varios instaladores todo-en-uno a través de Internet, pero ninguno de esos son avalados por la PHP.net, ya que creemos que usando uno de los paquetes oficiales de Windows de » http://www.php.net/downloads.php es la mejor opción para que el sistema este seguro y optimizado.
El instalador de Windows de PHP está disponible en la página de descargas en » http://www.php.net/downloads.php. Esta instala la CGI version de PHP y para IIS, PWS, y Xitami, se configura el servidor web también. El instalador no incluye ninguna extensión externas de PHP adicionales (php_*.dll) ya que sólo se encontrará los del paquetes de Windows Zip y descarga de PECL
Nota:
Si bien el instalador de Windows es una manera fácil de trabajar con PHP, es restringido en muchos aspectos como, por ejemplo, la configuración automática de extensiones no es soportada. El uso de la instalación no es un método preferido para la instalación de PHP.
En primer lugar, hay que instalar el servidor web seleccionado HTTP en el sistema, y asegurarse de que funcione.
Ejecute el ejecutable instalador y siga las instrucciones proporcionadas por el asistente de instalación. Dos tipos de instalación son soportadas - estándar, que proporciona los parámetros por defecto para todos las configuraciones que puede, y avanzado, que hace preguntas a medida que avanza.
El asistente de instalación recopila información suficiente para configurar el fichero php.ini y configurar ciertos servidores web para utilizar PHP. Uno de los servidores web que el programa de instalación de PHP no configura es Apache, por lo que tendrás que configurarlo manualmente.
Una vez que haya terminado la instalación, el instalador le informará si se es necesario reiniciar el sistema, reiniciar el servidor, o simplemente empezar a usar PHP.
Tenga en cuenta que esta configuración de PHP no es segura. Si a usted le gustaría tener una segura instalación de PHP, es mejor que vayas en el modo manual, y establecer todos los opción con cuidado. Esta configuración automática disminuiye el trabajo de instalación de PHP, pero no es destinado a ser usado en los servidores en línea.
Para crear el instalador de las últimas versiones de PHP en Windows se ha usado la tecnología MSI en conjunto con Wix Toolkit (» http://wix.sourceforge.net/). Esta aplicación se encarga de instalar y configurar tanto PHP, como las extensiones base y PECL. Además, también permite configurar muchos de los servidores web más extendidos, como IIS, Apache, o Xitami.
En primer lugar, se debe instalar el servidor HTTP (web) deseado, y asegurarse de que funciona. Una vez realizado, puede optarse por alguno de los siguientes métodos de instalación.
Ejecute el instalador MSI y siga las instrucciones que le indica el asistente de instalación. En primer lugar, se le solicitará que seleccione el Servidor Web que desea configurar, junto con algunos detalles de configuración adicionales.
Posteriormente, se le pedirá que indique qué funcionalidades y extensiones desea instalar y habilitar. Podrá indicar si desea instalar o no cada element seleccionando "Instalar en el disco local" ("Will be installed on local hard drive") en el menú desplegable que acompaña a cada uno de ellos. Al marcar "Instalar todas las funcionalidades en el disco local" ("Entire feature will be installed on local hard drive"), podrá instalar todas las subcategorías del elemento seleccionado (por ejemplo, al marcar esta opción en "PDO", se instalarán todos los Drivers PDO).
Se recomienda no instalar todas las extensiones de forma predeterminada, ya que muchas de ellas tienen dependencias con bibliotecas externas a PHP. En lugar de eso, utilize el Modo de Reparación de Instalación (Installation Repair Mode) desde el panel de control de "Agregar o quitar programas". Desde aquí podrá habilitar o deshabilitar a posteriori cualquier extensiones o componente.
Finalmente, el instalador inicializa tanto el fichero php.ini como al propio PHP para funcionar en Windows. También podrá configura algunos servidores web para que utilicen PHP. Actualmente es capaz de configurar IIS, Apache, Xitami y Sambar; si utiliza otro servidor web, deberá configurarlo a mano.
El instalador también permite ser ejecutado en modo silencioso, muy útil para Administradores de Sistemas que desean implantar PHP fácilmente. Para usar el modo silencioso:
msiexec.exe /i php-VERSION-win32-install.msi /q
Puede especificar el directorio de instalación como parámetro al instalador. Por ejemplo, para instalarlo en e:\php:
msiexec.exe /i php-VERSION-win32-install.msi /q INSTALLDIR=e:\php
Puede, del mismo modo, especificar qué componentes instalar. Por ejemplo, para instalar la extensión mysqli y el ejecutable CGI:
msiexec.exe /i php-VERSION-win32-install.msi /q ADDLOCAL=cgi,ext_php_mysqli
La lista actual de componentes para instalar es la siguiente:
MainExecutable - ejecutable php.exe executable ( desde PHP 5.2.10/5.3.0 no está disponible; se incluye por omisión) ScriptExecutable - ejecutable php-win.exe ext_php_* - varias extensiones ( por ejemplo: ext_php_mysql para MySQL ) apache13 - módulo de Apache 1.3 apache20 - módulo de Apache 2.0 apache22 - módulo de Apache 2.2 apacheCGI - Ejecutable CGI de Apache iis4ISAPI - módulo ISAPI de IIS iis4CGI - ejecutable CGI de IIS iis4FastCGI - ejecutable CGI de IIS NSAPI - módulo de servidores Sun/iPlanet/Netscape netserve - ejecutable CGI de Servidores Web NetServe Xitami - ejecutable CGI de Xitami Sambar - módulo ISAPI del Servidor Sambar CGI - ejecutable php-cgi.exe PEAR - instalador PEAR Manual - manual de PHP en formato CHM
Si desea más información sobre instalaciones MSI desde la línea de comandos, consulte » http://msdn.microsoft.com/en-us/library/aa367988.aspx
Para actualizar, debe ejecutar el instalador indistintamente desde la línea de comandos o del entorno gráfico. El instalador comprobará sus opciones de instalación actuales, eliminará la instalación antigua, y reinstalará PHP con las mismas opciones que ya tenía. Se recomienda utilizar este método para mantener PHP actualizado, en lugar de sobrescribir a mano cada fichero del directorio de instalación.
Esta sección contiene instrucciones para instalar y configurar manualmente PHP en Windows de Microsoft. Para las instrucciones sobre cómo utilizar el instalador de PHP para instalar y configurar PHP y un servidor web en Windows, consulte Windows Installer (PHP 5.2 y posteriores).
Descarga la distribución binaria de PHP zip » PHP para Windows: Binarios y Fuentes . Hay varias versiones diferentes del paquete zip - Seleccione por la versión que sea adecuado para el servidor web utilizado:
Si se utiliza PHP con IIS a continuación elija PHP 5.3 VC9 Non Thread Safe o PHP 5.2 VC6 Non Thread Safe;
Si PHP se utiliza con IIS7 o superior y PHP 5.3+, a continuación los archivos binarios VC9 de PHP que se deben utilizar.
Si se utiliza PHP con Apache 1 o Apache 2 a continuación elija PHP 5.3 VC6 o PHP 5.2 VC6.
Nota:
Versiones VC9 se compilan con el compilador de Visual Studio 2008 y tiene mejoras en el rendimiento y estabilidad. Las versiones VC9 requieren que tenga la » Microsoft 2008 C++ Runtime (x86) o la » Microsoft 2008 C++ Runtime (x64) instalado.
Descomprimir el contenido del archivo zip en un directorio de su elección, por ejemplo C:\PHP\. La estructura de directorios y archivos extraídos de del zip se verá de la siguiente manera:
Ejemplo #1 PHP 5 paquete de estructura
c:\php | +--dev | | | |-php5ts.lib -- php5.lib in non thread safe version | +--ext -- extension DLLs for PHP | | | |-php_bz2.dll | | | |-php_cpdf.dll | | | |-... | +--extras -- empty | +--pear -- initial copy of PEAR | | |-go-pear.bat -- PEAR setup script | |-... | |-php-cgi.exe -- CGI executable | |-php-win.exe -- executes scripts without an opened command prompt | |-php.exe -- Command line PHP executable (CLI) | |-... | |-php.ini-development -- default php.ini settings | |-php.ini-production -- recommended php.ini settings | |-php5apache2_2.dll -- does not exist in non thread safe version | |-php5apache2_2_filter.dll -- does not exist in non thread safe version | |-... | |-php5ts.dll -- core PHP DLL ( php5.dll in non thread safe version) | |-...
A continuación se muestra la lista de los módulos y archivos ejecutables incluidos en la distribución del archivo zip de PHP:
go-pear.bat - el script de configuración de PEAR. Consulte » Instalación (PEAR) para más detalles.
php-cgi.exe - ejecutable CGI que se puede utilizar cuando se ejecuta PHP en IIS a través de CGI o FastCGI.
php-win.exe - el ejecutable para la ejecución de scripts en PHP sin necesidad de utilizar una ventana de línea de comandos de PHP (Por ejemplo, las aplicaciones PHP que utilizan Windows GUI).
php.exe - el ejecutable para la ejecución de scripts PHP dentro de una interfaz de línea de comandos (CLI) de PHP.
php5apache2_2.dll - Apache 2.2.X module.
php5apache2_2_filter.dll - Apache 2.2.X filter.
Después de que el contenido del paquete de PHP se ha extraído, copie el php.ini-production en php.ini en la misma carpeta. Si es necesario, también es posible colocar el php.ini en cualquier otro lugar. Pero se requieren pasos adicionales de configuración como se describe en Configuración de PHP.
El fichero php.ini le dice a PHP cómo se configura, y cómo trabajar con el ambiente que se ejecuta. Aquí hay una serie de ajustes para el fichero php.ini PHP que ayudan a trabajar mejor con Windows. Algunos de estos son opcionales. Hay muchas otras directivas que puedan ser relevantes para su ambiente - dirijase lista de directivas php.ini para más información.
Las directivas:
extension_dir = <path to extension directory> - La extension_dir necesidades para indicar el directorio donde las extensiones de PHP se almacenan los ficheros. La ruta puede ser absoluta (i.e. "C:\PHP\ext") o (i.e. ".\ext"). Extensiones que se enumeran más baja en el php.ini ficheros que se encuentra en el extension_dir .
extension = xxxxx.dll - Para cada extensión que desee habilitar, necesita un correspondiente "extension=" directiva que le dice a PHP que las extensiones en el extension_dir para cargar en tiempo de inicio.
log_errors = On - PHP tiene un error de registro de instalación que se puede utilizar para enviar los errores a un fichero, o de un servicio (i.e. syslog) y trabaja en conjunto con el error_log Directiva a continuación. Cuando se ejecuta bajo IIS, la log_errors debe estar habilitado, con una validez error_log .
error_log = <path to the error log file> - El error_log tiene que especificar la ruta de acceso absoluta, o en relación con el archivo donde los errores de PHP debe estar registrado. Este archivo debe tener permisos de escritura para el servidor web. Los lugares más comunes para este archivo en varios directorios TEMP, por ejemplo "C:\inetpub\temp\php-errors.log".
cgi.force_redirect = 0 - La presente Directiva se requiere para ejecutar en IIS. Se trata de una protección de la instalación de la guía necesaria por muchos otros servidores web. Sin embargo, lo que permite que en IIS hacer que el motor de PHP a un error en Windows.
cgi.fix_pathinfo = 1 - Esto le permite acceder a PHP al real path después de la especificación CGI. IIS FastCGI implementa las necesidades de este conjunto.
fastcgi.impersonate = 1 - FastCGI bajo IIS admite la posibilidad de hacerse pasar por tokens de seguridad del cliente que llama. Esto permite que IIS defina el contexto de seguridad que solicita ejecutar.
fastcgi.logging = 0 - FastCGI debe estar deshabilitado en IIS. Si se deja habilitada, los mensajes de cualquier clase son tratados por FastCGI como las condiciones de error que hará que IIS genere una excepción HTTP 500.
Directivas opcionales
max_execution_time = ## - Esta directiva le dice a PHP, el importe máximo de tiempo que puede ejecutar cualquier script determinado. El defecto es 30 segundos. Aumentar el valor de esta directiva, si la aplicación PHP tomar mucho tiempo para ejecutarse.
memory_limit = ###M - La cantidad de memoria disponible para el proceso de PHP, en Megabytes. El valor por defecto es 128, lo cual está bien para la mayoría de las aplicaciones PHP. Algunos de los más complejos puede ser que necesite más.
display_errors = Off - Esta directiva le dice a PHP si se incluyen los mensajes de error en el corriente que devuelve al servidor web. Si se establece en "On", entonces PHP enviará lo que las clases de errores que se define con la error_reporting directiva de nuevo al servidor web como parte de la secuencia de error. Por razones de seguridad, se recomienda "Off" en los servidores de producción con el fin de no revelar ninguna información sensible de la seguridad que a menudo se incluyen en los mensajes de error.
open_basedir = <paths a directorios, separados por semicolon>, por ejemplo, openbasedir="C:\inetpub\wwwroot;C:\inetpub\temp". Esta directiva especifica las rutas de directorio en donde PHP se le permite realizar las operaciones del sistema de archivos. Cualquier operación de fichero fuera de las rutas especificadas se producirá un error. Esta directiva es especialmente útil para bloquear la instalación de PHP en entornos de alojamiento compartido para evitar que scripts PHP de acceso a los archivos fuera del directorio raíz del sitio web.
upload_max_filesize = ###M and post_max_size = ###M - El tamaño máximo permitido de un archivo subido y los datos posteriores, respectivamente. Los valores de estas directivas serán aumenta si las aplicaciones PHP necesita realizar grandes cargas, como por ejemplo fotos o archivos de vídeo.
PHP esta ahora configurado en el sistema. El siguiente paso es elegir un servidor web, a fin de que pueda ejecutar PHP. Elegir un servidor web de la tabla de contenido.
Además de ejecutar PHP a través de un servidor web, PHP puede ejecutar desde la línea de comandos como un script .BAT. Ver PHP línea de comandos de Microsoft Windows para más detalles.
Esta sección contiene instrucciones específicas de la instalación de PHP en Microsoft Internet Information Services (IIS).
Esta sección contiene instrucciones para configurar en forma manual Internet Information Services (IIS) 5.1 y IIS 6.0 para trabajar con PHP en Microsoft Windows XP y Windows Server 2003. Para obtener instrucciones sobre la configuración de IIS 7.0 y versiones posteriores de Windows Vista , Windows Server 2008, Windows 7 y Windows Server 2008 R2 referirse a Microsoft IIS 7.0 y posteriores.
Descarga e instala PHP de acuerdo a las instrucciones descritas en manual detallado de instalación
Nota:
Non-thread-safe build de PHP se recomienda cuando se utiliza IIS. Non-thread-safe builds están disponibles en » PHP para Windows: Binarios y Fuentes.
Configure el CGI- y configure FastCGI-specific en el archivo php.ini como se muestra a continuación:
Ejemplo #1 Configuración CGI y FastCGI en php.ini
fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0
Descargue e instale » Microsoft FastCGI extensión para IIS 5.1 y 6.0. La extensión está disponible para 32-bit y plataformas de 64-bit - seleccionar el paquete de descarga adecuada para la plataforma.
Configure la extensión FastCGI para manejar las solicitudes específicas de PHP ejecutando el comando que se muestra a continuación. Vuelva a colocar el valor de el parámetro "-path" con la ruta absoluta del fichero en el fichero php-cgi.exe.
Ejemplo #2 Configuración de la extensión FastCGI para manejar las solicitudes de PHP
cscript %windir%\system32\inetsrv\fcgiconfig.js -add -section:"PHP" ^ -extension:php -path:"C:\PHP\php-cgi.exe"
Este comando creará un script de mapeo IIS para el fichero de extensión *.php , lo que resultará en todas las URLs que terminan con .php siendo manejado por la extensión FastCGI. Asimismo, se configurará la extensión FastCGI a usar en el ejecutable php-cgi.exe para procesar las solicitudes de PHP.
Nota:
En este punto la necesidad de instalación y configuración de los pasos se han completado. El resto de instrucciones a continuación son opcionales, pero altamente recomendable para lograr una funcionalidad óptima y el rendimiento de PHP en IIS.
Se recomienda habilitar la suplantación FastCGI en PHP cuando este utilizando IIS. Esto es controlado por la directiva fastcgi.impersonate en el fichero php.ini. Cuando suplantación está activado, PHP realizará todas las operaciones de ficheros de sistema en favor de la cuenta de usuario que se ha determinado por la autentificación de IIS. Esta asegura que, incluso si el mismo proceso PHP se comparte entre diferentes sitios web IIS, los scripts PHP en estos sitios web no podrá acceder a los otros fichero ' siempre y cuando use cuentas de usuario diferentes utilizado para la autenticación IIS en cada sitio web.
Por ejemplo IIS 5.1 and IIS 6.0, en su configuración predeterminada, se ha habilitado la autenticación anónima con una función de cuenta de usuario IUSR_<MACHINE_NAME> utilizado como una identidad por defecto. Esto significa que para que IIS puede ejecutar scripts PHP, es necesario concedera la cuenta IIUSR_<MACHINE_NAME> permiso de lectura en estos scripts. Si las aplicaciones PHP necesitan realizar operaciones de escritura sobre determinados ficheros o escribir ficheros en algunas carpetas a continuación la cuenta IUSR_<MACHINE_NAME> debe tener permiso para escribir en ellos.
Para determinar qué cuenta de usuario es utilizado por IIS autenticación anónima, siga estos pasos:
En el menú Inicio de Windows seleccione "Run:", type "inetmgr" y haga clic en "Ok";
Expanda la lista de sitios web en el nodo "Web Sites" en la vista de árbol, haga clic derecho en el sitio web que se está utilizando y seleccionar "Properties";
Haga clic en "Directory Security" tab;
Tome nota de un "User name:" campo en el cuadro de dialogo "Authentication Methods"
Para modificar la configuración de permisos en ficheros y carpetas, utilice la interfaz de usuario de el Explorador de Windows o el comando icacls.
Ejemplo #3 Configuración del fichero de los permisos de acceso
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
Los documentos por defecto de IIS se utilizan para las solicitudes HTTP que no especifican un nombre de documento. Con las aplicaciones PHP, index.php suele actuar como un documento predeterminado. Para añadir index.php a la lista de documentos predeterminados IIS, siga estos pasos:
En el menú Inicio de Windows seleccione "Run:", teclee "inetmgr" y haga clic en "Ok";
Haga clic derecho en el nodo ""Web Sites" de la vista de árbol y seleccione "Properties";
Haga clic en "Documents" tab;
Haga clic en el botón "Add..." y enter en "index.php" para el " Contenido de la página por defecto :".
Configurar la extensión IIS FastCGI para el reciclaje de procesos PHP utilizando los comandos de abajo. Los controles de configuración de FastCGI instanceMaxRequests número de solicitudes que serán procesadas por un solo proceso php-cgi.exe antes de el cierre de la extensión FastCGI. La variable PHP de entorno PHP_FCGI_MAX_REQUESTS controla cuántas peticiones de un único proceso php-cgi.exe se encargará antes de que se recicle así mismo. Asegúrese de que el valor especificado por la configuración FastCGI InstanceMaxRequests es menor o igual al valor especificado para PHP_FCGI_MAX_REQUESTS.
Ejemplo #4 Configuración FastCGI y reciclaje PHP
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -InstanceMaxRequests:10000 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHP_FCGI_MAX_REQUESTS:10000
Aumentar la configuración de tiempo de espera para la extensión FastCGI si hay aplicaciones que llevan mucho tiempo ejecutar scripts PHP. Los dos valores a ajsutar de los controles de tiempos de espera son ActivityTimeout y RequestTimeout. Véase » Configuración de Extensión FastCGI para IIS 6.0 para más información sobre los ajustes.
Ejemplo #5 Configuración de los ajustes de tiempo de espera FastCGI
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -ActivityTimeout:90 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -RequestTimeout:90
PHP busca para el fichero php.ini en varios lugares y es posible cambiar las ubicaciones predeterminadas de el fichero php.ini utilizando la variable de entorno PHPRC. Las instrucciones PHP para cargar el fichero de configuración desde una ubicación personalizada, ejecute el comando que se muestra a continuación. La ruta de acceso absoluta al directorio con el fichero php.ini debe ser especifica con un valor de variable de entorno PHPRC.
Ejemplo #6 Cambiar la ubicación del fichero php.ini
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHPRC:"C:\Some\Directory\"
Esta sección contiene instrucciones para configurar en forma manual Internet Information Services (IIS) 7.0 y posteriores para trabajar con PHP en Microsoft Windows Vista SP1, Windows 7, Windows Server 2008 and Windows Server 2008 R2. Para obtener instrucciones sobre la configuración de IIS 5.1 and IIS 6.0 on Windows XP and Windows Server 2003 refiérase a Microsoft IIS 5.1 and IIS 6.0.
Módulo FastCGI está deshabilitado en la instalación por defecto de IIS. Los pasos para que pueda variar según la versión de Windows se está utilizando.
Para activar el soporte FastCGI en Windows Vista SP1 y Windows 7:
En el menu de inicio de Windows seleccione "Run:", teclee "optionalfeatures.exe" y click "Ok";
En el "Windows Features" cuadro de diálogo "Internet Information Services", "World Wide Web Services", " Caracteristicas Desarrollo de aplicaciones " y luego permitir que el "CGI" checkbox;
Haga clic en Aceptar y espere hasta que se complete la instalación
Para activar el soporte FastCGI en Windows Server 2008 y Windows Server 2008 R2:
En el menú Inicio de Windows elegir "Run:", teclee "CompMgmtLauncher" y click "Ok";
En el "Web Server (IIS)" El rol no está presente en el marco del "Roles" nodo, a continuación, añadir haciendo clic en "Adicionar Roles";
Si la "Web Server (IIS)" role esta presente, entonces haga click "Add Role Services" y luego permitir que el "CGI" casilla de verificación en grupo "Desarrollo de Aplicaciones" ;
Click "Next" y luego "Install" ay espere a que la instalación se complete.
Descargue e instale PHP de acuerdo a las instrucciones descritas en manual installation steps
Nota:
No construir thread-safe de PHP se recomienda cuando IIS utilizando. El no-thread-safe crea están disponibles en » PHP para Windows: binarios y fuentes.
Configure el CGI y la configuración específica de FastCGI php.ini fichero como se muestra a continuación:
Ejemplo #1 CGI y FastCGI en la configuración php.ini
fastcgi.impersonate = 1
fastcgi.logging = 0
cgi.fix_pathinfo=1
cgi.force_redirect = 0
Configurar la asignación de IIS controlador para PHP utilizando la interfaz de usuario Administrador de IIS o una herramienta de línea de comandos.
Siga estos pasos para crear una asignación de controlador de IIS para PHP en la interfaz de usuario Administrador de IIS:
En el menú Inicio de Windows elegir "Run:", escriba "inetmgr" y click "Ok";
En la interfaz de usuario de IIS Manager, seleccione el nodo de servidor en el "Connections" vista de árbol;
En el "Características" Página de abrir el "Handler Mappings" feature;
En el "Actions" haga click en panel "Add Module Mapping...";
En el "Add Module Mapping" diálogo entre lo siguiente:
Haga Click en "Solicitar Restricciones" botón y luego configurar la asignación de invocar controlador sólo si la solicitud se asigna a un archivo o una carpeta;
Haga clic en Aceptar en todos los cuadros de diálogo para guardar la configuración.
Utilice el comando mostrado a continuación para crear un grupo de IIS FastCGI proceso que utilizará php-cgi.exe ejecutable para la tramitación de solicitudes de PHP. Vuelva a colocar el valor del parámetro fullPath con la ruta absoluta al fichero php-cgi.exe.
Ejemplo #2 >Creación del proceso del grupo IIS FastCGI
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI ^
/+[fullPath='c:\PHP\php-cgi.exe']
Configurar IIS PHP para manejar las peticiones concretas de la ejecución del comando que se muestra a continuación. Vuelva a colocar el valor del parámetro scriptProcessor con la ruta de acceso absoluta al fichero php-cgi.exe.
Ejemplo #3 Creación de mapas manejador de peticiones PHP
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers ^
/+[name='PHP_via_FastCGI', path='*.php',verb='*',modules='FastCgiModule',^
scriptProcessor='c:\PHP\php-cgi.exe',resourceType='Either']
Este comando crea una asignación de controlador de IIS para la extensión de archivo *.php, lo que resultará en todas las direcciones URL que terminan con. Php siendo manejado por el módulo FastCGI.
Nota:
En este punto la necesidad de instalación y configuración de los pasos se han completado. Las instrucciones a continuación son opcionales, pero altamente recomendable para lograr una funcionalidad óptima y el rendimiento de PHP en IIS.
Se recomienda habilitar la suplantación en PHP FastCGI cuando IIS utilizando. Esta está controlado por la directiva fastcgi.impersonate en el fichero php.ini. Cuando está habilitada la suplantación, PHP realizará todas las operaciones del sistema de ficheros en nombre de la cuenta de usuario que ha sido determinado por la autentificación de IIS. Esto asegura que, aunque el proceso mismo PHP es compartido a través de diferentes sitios web IIS, los scripts PHP en los sitios web no será capaz de acceder a los demás ficheros, siempre y cuando las cuentas de usuario se utilizan para la autenticación de IIS en cada sitio web.
Por ejemplo IIS 7, en su configuración por defecto, se ha habilitado la autenticación anónima con incorporada IUSR cuenta de usuario utilizada como una identidad por defecto. Esto significa que para que IIS ejecutar scripts PHP, es necesario conceder a la cuenta IUSR permiso de lectura en estos scripts. Si las aplicaciones PHP necesidad de realizar operaciones de escritura de ciertos ficheros o escribir ficheros en una carpetas entonces cuenta IUSR debe tener permiso para escribir en ellos.
Para determinar qué cuenta de usuario se utiliza como una identidad anónima en IIS 7 utilice el siguiente comando. Vuelva a colocar el "Sitio Web predeterminado" con el nombre del sitio Web de IIS que utiliza. En la producción configuración XML aspecto de elemento para el atributo userName.
Ejemplo #4 La determinación de la cuenta utilizada como IIS identidad anónima
%windir%\system32\inetsrv\appcmd.exe list config "Default Web Site" ^
/section:anonymousAuthentication
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="true" userName="IUSR" />
</authentication>
</security>
</system.webServer>
Nota:
Si el atributo userName no está presente en el elemento anonymousAuthentication, o si se establece una cadena vacía, entonces significa que la identidad del grupo de aplicaciones se utiliza como un identidad anónima para ese sitio web.
Para modificar la configuración de permisos de archivos y carpetas, utilice la interfaz de usuario del Explorador de Windows o comando icacls.
Ejemplo #5 Configuración de archivo de los permisos de acceso
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
Los documentos por defecto de IIS se utilizan para las solicitudes HTTP que no se especifica un nombre de documento. Con las aplicaciones PHP,index.php por lo general actúa como un documento predeterminado. Para añadir index.php a la lista de los documentos por defecto de IIS, utilice este comando:
Ejemplo #6 Establecer index.php como un documento predeterminado en IIS
%windir%\system32\inetsrv\appcmd.exe set config ^
-section:system.webServer/defaultDocument /+"files.[value='index.php']" ^
/commit:apphost
Configurar la configuración de IIS FastCGI PHP para el reciclaje de los procesos mediante los comandos de abajo. La configuración FastCGI instanceMaxRequests controla cuántas peticiones se procesado por un solo peoceso php-cgi.exe antes de IIS se cierra. La variable de entorno PHP PHP_FCGI_MAX_REQUESTS controla el número pide una sola proceso php-cgi.exe se encargará antes de que se recicla sí misma. Asegúrese de que el valor especificado para la configuración FastCGI InstanceMaxRequests es menor o igual al valor especificado para PHP_FCGI_MAX_REQUESTS.
Ejemplo #7 Configuración de PHP FastCGI y el reciclaje
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/[fullPath='c:\php\php-cgi.exe'].instanceMaxRequests:10000
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/+"[fullPath='C:\{php_folder}\php-cgi.exe'].environmentVariables.^
[name='PHP_FCGI_MAX_REQUESTS',value='10000']"
Aumentar el tiempo de espera para la configuración de FastCGI si se espera tener a largo ejecutar scripts PHP. Los dos valores que los tiempos de espera de control activityTimeout y requestTimeout. Utilice los comandos siguientes para cambiar la configuración de tiempo de espera. Asegúrese de sustituir el valor en el parámetro a fullPath contendrá la ruta absoluta a el fichero php-cgi.exe.
Ejemplo #8 Configuración de los ajustes de tiempo de espera FastCGI
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/[fullPath='C:\php\php-cgi.exe',arguments=''].activityTimeout:"90" /commit:apphost
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/[fullPath='C:\php\php-cgi.exe',arguments=''].requestTimeout:"90" /commit:apphost
PHP busca el fichero php.ini en varios lugares y es posible cambiar las ubicaciones predeterminadas del fichero php.ini utilizando variable de entorno PHPRC. Encomendar a PHP para cargar el archivo de configuración desde una ubicación personalizada, ejecute el comando se muestra a continuación. La ruta de acceso absoluta al directorio con el fichero php.ini debe ser especifica como un valor de variable de entorno PHPRC.
Ejemplo #9 Cambiar la ubicación del fichero php.ini
appcmd.exe set config -section:system.webServer/fastCgi ^
/+"[fullPath='C:\php\php.exe',arguments=''].environmentVariables.^
[name='PHPRC',value='C:\Some\Directory\']" /commit:apphost
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.
Nota:
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 principiante. 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
Nota: Recuerde que cuando agrega rutas como valores en los archivos de configuración de Apache en Windows, todas las barras invertidas tal como c:\directory\file.ext deberían ser convertidas en barras comunes: c:/directory/file.ext. Una barra común al final será necesaria para directorios.
Se deben agregar las siguientes líneas a su archivo de configuración Apache httpd.conf
Ejemplo #1 PHP como módulo de Apache 1.3.x
Se asume que PHP está instalado en c:\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 # Para la sintaxis highlighted .phps files, tambien adicionar AddType application/x-httpd-php-source .phps
Si se ha descomprimido el paquete PHP C:\php\ como se describe en la sección Manual de instalación paso a paso, es necesario insertar estas líneas a su archivo de configuración de Apache para configurar el binario CGI:
Ejemplo #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
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 función highlight_file(). Para ello se necesita crear un script PHP y agregarle el código <?php highlight_file('some_php_script.php'); ?>.
Esta sección contiene notas y sugerencias específicas de Apache 2.x instaladas con PHP en sistemas Microsoft Windows. También hay instrucciones y notas para usuarios de Apache 1.3.x en una nueva página..
Nota:
Por favor lea primero el manual de instalación
Nota: Soporte Apache 2.2
Los usuarios de Apache 2.2 deben tener en cuenta que el archivo DLL para Apache 2.2 es llamado php5apache2_2.dll a cambio de php5apache2.dll y sólo está disponible para PHP 5.2.0 y posteriores. Ver también » http://snaps.php.net/
Se le recomienda consultar la » Documentación de Apache Para obtener un conocimiento básico del servidor Apache 2.x. Tambien considere leer las » notas especificas de Windows para Apache 2.x antes de seguir leyendo aquí.
Apache 2.x está diseñado para ejecutarse en las versiones de Windows designado como servidor de plataforma, tales como Windows NT 4.0, Windows 2000, Windows XP o Windows 7. Aunque Apache 2.x funciona bastante bien en Windows 9x, el soporte en estas plataformas es incompleta, y algunas cosas no funcionan correctamente. No existe un plan para remediar esta situación.
Descargue la versión más reciente de » Apache 2.x y un accesorio de la versión de PHP. Siga los pasos del Manual de Instalación y regrese a continuar con la integración de PHP y Apache.
Hay tres formas de configurar PHP para trabajar con Apache 2.x en Windows. Puede ejecutar PHP como un controlador, como CGI o bajo FastCGI.
Nota: Recuerde que cuando agrega rutas como valores en los archivos de configuración de Apache en Windows, todas las barras invertidas tal como c:\directory\file.ext deberían ser convertidas en barras comunes: c:/directory/file.ext. Una barra común al final será necesaria para directorios.
Es necesario insertar las siguientes líneas en Apache httpd.conf archivo de configuración para cargar el módulo PHP para Apache 2.x:
Ejemplo #1 PHP and Apache 2.x como controlador
# LoadModule php5_module "c:/php/php5apache2.dll" AddHandler application/x-httpd-php .php # Configurar la ruta de php.ini PHPIniDir "C:/php"
Nota: Recuerda sustituir la ruta de acceso actual a PHP para el C:/php/ en los ejemplos anteriores. Tenga cuidado en utilizar ya sea php5apache2.dll o php5apache2_2.dll en la directiva LoadModule y verificar que el fichero de referencia se encuentra localizado en la ruta de fichero que se señala en la presente directiva.
La configuración anterior permite habilitar PHP como controlador de cualquier fichero que tiene una extensión .php, aunque existen otras extensiones de fichero. Por ejemplo, un fichero llamadoexample.php.txt será ejecutado por el controlador de PHP. Para garantizar que sólo los ficheros queterminen en .php son ejecutados, se utiliza la siguiente configuración en su lugar:
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
Se debe consultar la» Documentación de Apache CGI para una comprensión más completa de ejecutar CGI en Apache
Para ejecutar PHP como CGI, tendrás que colocar los ficheros php-cgi en un directorio designado como directorio CGI usando la directiva ScriptAlias.
A continuación, se nesesita insertar una #! línea en los ficheros PHP, apuntando a la ubicación del binario de PHP:
Ejemplo #2 PHP y Apache 2.x como CGI
#!C:/php/php.exe <?php phpinfo(); ?>
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.
Ejecutar PHP bajo FastCGI tiene una serie de ventajas con respecto a ejecutarlo como un CGI. Si lo establece de esta manera es bastante sencillo:
Obtener mod_fcgid de » http://httpd.apache.org/mod_fcgid/. Los binarios de Win32 están disponibles para la descargar en ese sitio. Instalar el módulo de acuerdo con las instrucciones que vienen con él.
Configurar el servidor web como se muestra abajo, teniendo cuidado de ajustar cualquier ruta que refleje como se tiene instalado las cosas en el sistema:
Ejemplo #3 Configurar Apache para ejecutar PHP como FastCGI
LoadModule fcgid_module modules/mod_fcgid.so # Donde está el fichero php.ini? FcgidInitialEnv PHPRC "c:/php" AddHandler fcgid-script .php FcgidWrapper "c:/php/php-cgi.exe" .php
Esta sección contiene anotaciones y consejos específicos de servidores Sun Java System Web Server, Sun ONE Web Server, iPlanet y Netscape en sistemas Windows.
Desde PHP 4.3.3 pueden usarse scripts PHP con el módulo NSAPI para generar listados de directorios y páginas de error personalizadas. También hay funciones adicionales para la compatibilidad con Apache. Para tener soporte con los servidores web actuales consulte las anotaciones sobre subpeticiones.
Para instalar PHP como un manejador CGI, haga lo siguiente:
Realice la asociación de ficheros en la línea de comandos. Introduzca las siguientes líneas:
assoc .php=PHPScript ftype PHPScript=c:\php\php.exe %1 %*
Se pueden encontrar más detalles sobre cómo configurar PHP como ejecutable CGI en » http://benoit.noss.free.fr/php/install-php.html
Para instalar PHP con NSAPI, haga lo siguiente:
Haga la asociación de ficheros en la línea de comandos. Introduzca las siguientes líneas:
assoc .php=PHPScript ftype PHPScript=c:\php\php.exe %1 %*
Edite magnus.conf (para servidores >= 6) o obj.conf (para servidores < 6) e introduzca lo siguiente: Debe ubicar estas líneas tras 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"]
Configure el objeto por omisión en obj.conf (para clases de servidores virtuales [Sun Web Server 6.0+] en su fichero vserver.obj.conf): En la sección <Object name="default">, añada esta línea tras los 'ObjectType' y antes de las líneas 'AddLog':
Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...]
Esto sólo es necesario si se desea configurar un directorio que consista únicamente en scripts PHP (como en los directorios cgi-bin):
<Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object>
Nota:
Puede consultar más detalles sobre cómo configurar PHP como filtro NSAPI aquí: » http://benoit.noss.free.fr/php/install-php4.html
Nota:
El tamaño de pila de PHP depende de la configuración del servidor web. Si la ejecución de scripts extensos de PHP se detiene, se recomienda que lo propague con Admin Server (en la sección "MAGNUS EDITOR").
Al escribir scripts PHP es importante tener en cuenta que Sun JSWS/Sun ONE WS/iPlanet/Netscape es un servidor web multihebra, ya que todas las peticiones se ejecutan en el espacio del mismo proceso (el espacio del propio servidor web) y este espacio sólo contiene un entorno de ejecución. Si se desea conocer variables CGI como PATH_INFO, HTTP_HOST, etc. no se debe hacer de la forma convencional con getenv() o similares (register globals del entorno, $_ENV). Sólo se obtendrá el entorno del servidor web en ejecución sin ninguna variable CGI válida.
Nota:
¿Pero por qué hay variables CGI (inválidas) en el entorno?
Respuesta: Se debe a que se inició el proceso del servidor web desde el servidor de administración que lanza el script de inicio del servidor web como un script CGI (¡un script CGI dentro del servidor de administración!). Ésta es la razón por la que el entorno del servidor web contiene algunas variables de entorno CGI. Puede comprobarlo iniciando el servidor web de otra forma. Acceda al terminal como administrador y arránquelo a mano - verá que ya no hay variables de entorno CGI.
Deben actualizarse los scripts, para que consulten variables CGI de la forma correcta para PHP 4.X, usando la superglobal $_SERVER. Si se tuvieran scripts antiguos que usaran $HTTP_HOST, etc., debería habilitarse register_globals en php.ini, así como cambiar la variable de orden (importante: elimine la "E", ya que aquí no se necesitan variables de entorno):
variables_order = "GPCS" register_globals = On
Se puede utilizar PHP para generar páginas de error para "404 Not Found" o similar. Debe añadirse la siguiente línea al objeto en obj.conf para cada página de error que se desee redefinir:
Error fn="php4_execute" code=XXX script="/path/to/script.php" [inikey=value inikey=value...]
Otra posibilidad es generar listados de directorios personalizados. Debe crearse un script PHP que liste el contenido de un directorio y reemplace la línea del servicio correspondiente para type="magnus-internal/directory" en obj.conf por lo siguiente:
Service fn="php4_execute" type="magnus-internal/directory" script="/path/to/script.php" [inikey=value inikey=value...]
El módulo NSAPI ahora soporta la función nsapi_virtual() (alias: virtual()) para hacer subpeticiones al sevidor web e insertar el resultado en la página web. El problema es que esta función utiliza algunas funcionalidades no documentadas de la biblioteca NSAPI.
En Unix esto no es un problema, porque el módulo automáticamente busca las funciones necesarias y las usa si estuvieran disponibles. Si no, nsapi_virtual() queda deshabilitado.
En Windows, las limitaciones del manejo de DLL necesitan emplear detección automática del fichero ns-httpdXX.dll más reciente. Se ha probado hasta en servidores versión 6.1. Si se utiliza una versión más reciente del servidor Sun, la detección falla y nsapi_virtual() se deshabilita.
Si este fuera el caso, debe probarse lo siguiente: Añada el siguiente parámetro a php4_init en magnus.conf/obj.conf:
Init fn=php4_init ... server_lib="ns-httpdXX.dll"
Puede comprobar el estado usando la función phpinfo().
Nota:
Pero tenga en cuenta: El soporte para nsapi_virtual() es EXPERIMENTAL.
Esta sección contiene notas y consejos específicos a el » Servidor Sambar para Windows.
Nota:
Debe leer primero los pasos del manual de instalación.
Esta lista describe cómo configurar el módulo ISAPI para trabajar con el servidor Sambar en Windows.
Busque el archivo llamado mappings.ini (en el directorio de configuración) en el directorio de instalación de Sambar.
Abra mappings.ini y adicione la siguiente línea de abajo [ISAPI]:
Ejemplo #1 Configuracion de Sambar ISAPI
#for PHP 4
*.php = c:\php\php4isapi.dll
#for PHP 5
*.php = c:\php\php5isapi.dll
Ahora reinicie el servidor Sambar para que los cambios surtan efecto.
Nota:
Si va a usar PHP para comunicarse con los recursos que se celebran en un equipo diferente en la red, entonces usted tendrá que modificar la cuenta utilizada por los servicios de el servidor Sambar. La cuenta por defecto utilizado por el Servicio del servidor Sambar es LocalSystem que no tendrán acceso a recursos remotos. La cuenta puede ser modificada mediante el uso de la opción de servicios de Windows en el Panel de control de las herramientas de administración.
Esta sección contiene notas y sugerencias específicas para » Xitami en Windows.
Nota:
Debe leer primero los pasos del Manual de instalación.
Esta lista describe cómo configurar el PHP CGI binary para trabajar con Xitami en Windows.
Nota: Importante para los usuarios de CGI
Leer las preguntas frecuentes en cgi.force_redirect para más detalles importantes. Esta directiva se debe establecer a0. Si desea utilizar $_SERVER['PHP_SELF'] tienes que habilitar la directiva cgi.fix_pathinfo.
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.
Asegúrese de que el servidor web está funcionando, y apunte el navegador a la consola de administración xitamis (por lo general http://127.0.0.1/admin), Y haga clic en Configuración.
Navegue a los filtros, y ponga la extensión PHP que debe analizar (es decir, .php) en el campo de las extensiones del fichero(.xxx).
En el comando del filtro o script coloque la ruta y el nombre de el ejecutable PHP CGI es decir, C:\php\php.exe para PHP 4, o C:\php\php-cgi.exe para PHP 5.
Pulse el icono "Guardar".
Reinicie el servidor para reflejar los cambios.
En este capítulo se enseña a compilar PHP a partir de fuentes en Windows, usando Microsoft's tools. Para compilar PHP con cygwin, por favor vaya a Instalación sobre sistemas Unix.
Consulte la documentación del Wiki en: » http://wiki.php.net/internals/windows/stepbystepbuild
Después de instalar PHP y un servidor web en Windows, es probable que desee instalar algunas extensiones para mayor funcionalidad. Puede elegir cuales extensiones desea cargar cuando PHP inicia modificando php.ini. También puede cargar un módulo dinámicamente en el script con dll().
Los DLL para las extensiones PHP tienen el prefijo php_.
Algunas extensiones son construidas dentro de la versión de Windows de PHP. Esto significa que los ficheros DLL adicionales, y la extensión directiva, no se utiliza para cargar estas extensiones. En la tabla de Windows las extensiones PHP son enumeradas las extensiones que se requieren, se utilizan, ficheros PHP DLL adicionales. Aquí hay una lista de extensiones construidas:
En PHP 4 (actualización de PHP 4.3.11): BCMath, Caledar, COM, Ctype, FTP, MySQL, ODBC, Overload, PCRE, Session, Tokenizer, WDDX, XML y Zlib
En PHP 5 (actualización de PHP 5.0.4), existen los siguientes cambios. Contruidos en: DOM, LibXML, Iconv, SimpleXML, SPL y SQLite. Y a continuación se enumeran los no construidos en: MySQL y Overload.
La ubicación predeterminada de las búsquedas PHP para las extensiones es C:\php4\extensions en PHP 4 y C:\php5 en PHP 5. Para cambiar estos parámetros reflejando la configuración de PHP, edite el fichero php.ini:
Tendrá que cambiar los parámetros de la extension_dir para apuntar al directorio donde está la extensión, o donde tenga localizado el fichero php_*.dll. Por ejemplo:
extension_dir = C:\php\extensions
Habilite la extensión(s) en php.ini que desea utilizar descomentando las siguientes líneas extension=php_*.dll en php.ini. Esto se hace mediante el borrado de la cabecera, desde la extensión que desea cargar.
Ejemplo #1 Habilitar la extensión Bzip2 para PHP-Windows
// cambiar la siguiente línea de ... ;extension=php_bz2.dll // ... to extension=php_bz2.dll
Algunas de las extensiones de archivos necesita DLL extras para trabajar. Un par de ellos se puede encontrar en el paquete de distribución, en la carpeta C:\php\dlls\ en PHP 4 o en la carpeta principal en PHP 5, pero algunos, por ejemplo Oracle requieren (php_oci8.dll) ficheros DLL que no se incluyen con el paquete de distribución. Si va a instalar PHP 4, copie el paquete DLL de la carpeta C:\php\dlls a la carpeta principal C:\php. No se olvide de incluir en el sistema C:\php PATH (Este proceso se explica por separado en Preguntas Frecuentes de entrada).
Algunos de estos DLLs no se incluye con la distribución de PHP. Consulta cada página de documentación de las extensiones para más detalles. Además, lea el manual sección titulada Instalación de extensiones PECL para más detalles sobre PECL. Un gran número de extensiones de PHP se encuentran en PECL, y estas extensiones requieren una descarga independiente .
Nota: Si está ejecutando un servidor de la versión de PHP como módulo recuerde reiniciar su servidor web para reflejar los cambios a php.ini.
En la tabla siguiente se describen algunas de las extensiones disponibles y las dlls adicionales.
| Extensión | Descripción | Notas |
|---|---|---|
| php_bz2.dll | Funciones de compresión bzip2 | Nada |
| php_calendar.dll | Funciones de conversión Calendario | Construido a partir de PHP 4.0.3 |
| php_crack.dll | Funciones Crack | Nada |
| php_ctype.dll | Funciones familiares ctype | Construido a partir de PHP 4.3.0 |
| php_curl.dll | Funciones de la libreria cliente URL CURL | Requiere: libeay32.dll, ssleay32.dll(incluido) |
| php_dba.dll | DBA: Funciones de Capa de abstracción de la Base de datos (dbm-style) | Nada |
| php_dbase.dll | Funciones dBase | Nada |
| php_dbx.dll | Funciones dbx | |
| php_domxml.dll | Funciones de domxml para PHP 4 | PHP <= 4.2.0 Requiere: libxml2.dll (incluido) PHP >= 4.3.0 Requiere: iconv.dll (incluido) |
| php_dotnet.dll | Funciones .NET | PHP <= 4.1.1 |
| php_exif.dll | FuncionesEXIF | php_mbstring.dll. y, php_exif.dll se debe cargar después de php_mbstring.dll en php.ini. |
| php_fbsql.dll | Funciones FrontBase | PHP <= 4.2.0 |
| php_fdf.dll | FDF: Formato de datos de formularios de funciones. | Requiere: fdftk.dll (incluido) |
| php_filepro.dll | Funciones filePro | Acceso de sólo lectura |
| php_ftp.dll | Funciones FTP | Incorporado desde PHP 4.0.3 |
| php_gd.dll | Funciones de libreria de imagen GD | Eliminada en PHP 4.3.2. También tenga en cuenta que las funciones de color verdadero no están disponibles en GD1, utilice en su lugar php_gd2.dll. |
| php_gd2.dll | Funciones de libreria de imagen GD | GD2 |
| php_gettext.dll | Funciones Gettext | PHP <= 4.2.0 requiere gnu_gettext.dll (incluido), PHP >= 4.2.3 requiere libintl-1.dll, iconv.dll (incluido). |
| php_hyperwave.dll | Funciones HyperWave | Nada |
| php_iconv.dll | Conversión de caracteres ICONV | Requiere: iconv-1.3.dll (incluido), PHP >=4.2.1 iconv.dll |
| php_ifx.dll | Funciones Informix | Requiere: Librerias Informix |
| php_iisfunc.dll | Funciones de administracion IIS | Nada |
| php_imap.dll | POP3 y Funciones NNTP IMAP | Nada |
| php_ingres.dll | Funciones Ingres | Requiere: Librerias Ingres |
| php_interbase.dll | Funciones InterBase | Requiere: gds32.dll (incluido) |
| php_java.dll | Funciones Java | PHP <= 4.0.6 requiere: jvm.dll (incluido) |
| php_ldap.dll | Funciones LDAP | PHP <= 4.2.0 requiere libsasl.dll (incluido), PHP >= 4.3.0 requiere libeay32.dll, ssleay32.dll (incluido) |
| php_mbstring.dll | Funciones Multi-Byte String | Nada |
| php_mcrypt.dll | Funciones Mcrypt Encryption | Requiere: libmcrypt.dll |
| php_mhash.dll | Funciones Mhash | PHP >= 4.3.0 requiere: libmhash.dll (incluido) |
| php_mime_magic.dll | Funciones Mimetype | Requiere: magic.mime (incluido) |
| php_ming.dll | Funciones para Flash Ming | Nada |
| php_msql.dll | Funciones mSQL | Requiere: msql.dll (incluido) |
| php_mssql.dll | Funciones MSSQL | Requiere: ntwdblib.dll (incluido) |
| php_mysql.dll | Funciones MySQL | PHP >= 5.0.0, requiere libmysql.dll (incluido) |
| php_mysqli.dll | Funciones MySQLi | PHP >= 5.0.0, requiere libmysql.dll (libmysqli.dll en PHP <= 5.0.2) (incluido) |
| php_oci8.dll | Funciones Oracle 8 | Requiere: Librerias cliente Oracle 8.1+ |
| php_openssl.dll | Funciones OpenSSL | Requiere: libeay32.dll (incluido) |
| php_overload.dll | Funciones de sobrecarga de objetos de PHP 4 | Incluido desde PHP 4.3.0, eliminado a partir de PHP 5.0.0 |
| php_pdf.dll | Funciones PDF | Nada |
| php_pgsql.dll | Funciones PostgreSQL | Nada |
| php_printer.dll | Funciones Printer | Nada |
| php_shmop.dll | Funciones Shared Memory | Nada |
| php_snmp.dll | Funciones SNMP | Solo NT ! |
| php_soap.dll | Funciones SOAP | PHP >= 5.0.0 |
| php_sockets.dll | Funciones Socket | Nada |
| php_sybase_ct.dll | Funciones Sybase | Requiere: librerias cliente Sybase |
| php_tidy.dll | Funciones Tidy | PHP >= 5.0.0 |
| php_tokenizer.dll | Funciones Tokenizer | Construido a partir de PHP 4.3.0 |
| php_w32api.dll | Funciones W32api | Nada |
| php_xmlrpc.dll | Funciones XML-RPC | PHP >= 4.2.1 requiere: iconv.dll (incluido) |
| php_xslt.dll | Funciones XSLT | PHP <= 4.2.0 requiere sablot.dll, expat.dll (incluido). PHP >= 4.2.1 requiere sablot.dll, expat.dll, iconv.dll (incluido). |
| php_yaz.dll | Funciones YAZ | Requiere: yaz.dll (incluido) |
| php_zip.dll | Ficheros Zip incluido | Acceso de sólo lectura |
| php_zlib.dll | Funciones de compresión ZLib | Construido a partir de PHP 4.3.0 |
Esta sección contiene notas y sugerencias específicas para conseguir ejecutar PHP en la línea de comandos para Windows.
Nota:
Usted debe leer primero el manual de instalación
Cómo ejecutar PHP desde la línea de comandos sin hacer ningún cambio a Windows.
C:\PHP5\php.exe -f "C:\PHP Scripts\script.php" -- -arg1 -arg2 -arg3
Pero hay algunos pasos sencillos que puede seguir para hacer esto simple. Algunas de estas medidas ya se deberían haber tomado, pero se repiten aquí para ser capaz de proporcionar una completa secuencia paso a paso.
Nota:
PATH y PATHEXT son variables de sistema preexistentes importantes en Windows, por lo que se ha de asegurarse de no sobrescribir dichas variables, solamente agregarle algo.
Añada la ubicación del ejecutable de PHP (php.exe, php-win.exe o php-cli.exe dependiendo de su versión de PHP y las preferencias de presentación) a la variable de entorno PATH. Lea más acerca de cómo añadir el directorio de PHP PATH en la entrada correspondiente de preguntas frecuentes.
Añada la extensión .PHP de la variable de entorno PATHEXT. Esto se puede hacer al mismo tiempo, con la modificación de la variable de entorno PATH. Siga los mismos pasos como se describe en las Preguntas frecuentes pero habría que modificar la variable de entorno PATHEXTen lugar de la variable de entornoPATH.
Nota:
La posición en que se coloca el .PHP determina qué secuencia de comandos o programa se ejecuta cuando hay nombre de archivos coincidentes. Por ejemplo, colocar .PHP antes de .BAT hará que el script se ejecute, en lugar de el archivo por lotes, si hay un fichero por lotes con el mismo nombre.
Asociar la extensión .PHP con un tipo de fichero. Esta se hace ejecutando el siguiente comando:
assoc .php=phpfile
Asociar el tipo de fichero phpfile con el adecuado ejecutable PHP. Esto se hace ejecutando el siguiente comando:
ftype phpfile="C:\PHP5\php.exe" -f "%1" -- %~2
Si sigue estos pasos permitirá ejecutar scripts PHP desde cualquier directorio sin necesidad de escribir el ejecutable PHP o la extensión .PHP y todos los parámetros, será enviada a el script para el procesamiento.
En el ejemplo a continuación se detallan algunos de los cambios de registro que se puede hacer manualmente.
Ejemplo #1 Registro de cambios
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.php] @="phpfile" "Content Type"="application/php" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile] @="PHP Script" "EditFlags"=dword:00000000 "BrowserFlags"=dword:00000008 "AlwaysShowExt"="" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\DefaultIcon] @="C:\\PHP5\\php-win.exe,0" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell] @="Open" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open] @="&Open" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open\command] @="\"C:\\PHP5\\php.exe\" -f \"%1\" -- %~2"
Con estos cambios el mismo comando se puede escribir como:
"C:\PHP Scripts\script" -arg1 -arg2 -arg3
script -arg1 -arg2 -arg3
Nota:
Hay un pequeño problema si tiene intención de utilizar esta técnica y usar scripts PHP como filtro de línea de comandos, como el ejemplo a continuación:
odir | "C:\PHP Scripts\script" -arg1 -arg2 -arg3Es posible que el script simplemente se cuelga y no salga nada. Para hacer esto operacional, es necesario hacer otro cambio en el registro.dir | script -arg1 -arg2 -arg3Información adicional sobre este tema se pueden encontrar en el » artículo de Microsoft: 321788Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer] "InheritConsoleHandles"=dword:00000001
PHP instalará en la nube. A la nube de PHP!
FPM (FastCGI Process Manager) es una implementación alternativa al PHP FastCGI con algunas características adicionales (la mayoría) útiles para sitios web con mucho tráfico.
Estas características incluyen:
Manejo avanzado para detener/arrancar procesos de forma grácil;
Posibilidad de iniciar hilos de procesos con diferentes uid/gid/chroot/environment, escuchar en diferentes puertos y usar distintos php.ini (remplazando); safe_mode
Registro stdout y stderr;
Reinicio de emergencia en caso de destrucción accidental del caché opcode;
Soporte acelerado de subidas;
"slowlog" - scripts de registro de procesos (no sólo sus nombres, sin sus backtraces también, usando ptrace y similares para leer procesos execute_data remotos) que son inusualmente lentos;
fastcgi_finish_request() - Función especial para detener y descargar todos los datos mientras continua haciendo algún proceso más largo (conversión de vídeos, procesamiento de estadísticas, etc.);
Creación dinámico/estático de hilos;
Información básica del status SAPI (similar al mod_status de Apache);
Basado en archivos de configuración php.ini
Para habilitar FPM en la compilación de PHP, debe añadirse --enable-fpm a la línea de configuración-
Hay otras opciones de configuración específicas de FPM (todas ellas optativas):
--with-fpm-user - usuario de FPM (por omisión - nobody).
--with-fpm-group - grupo de FPM (por omisión - nobody).
FPM usa la sintaxis de php.ini para su archivo de configuración - php-fpm.conf.
pid
string
Ruta al archivo PID. Valor por defecto: none.
error_log
string
Ruta al archivo de registro de errores. Default value: #INSTALL_PREFIX#/log/php-fpm.log.
log_level
string
Nivel de registro de errores. Posibles valores: alert, error, warning, notice, debug. Valor por defecto: notice.
emergency_restart_threshold
int
Si este número de procesos termina con SIGSEGV o SIGBUS dentro del intervalo de tiempo establecido por emergency_restart_interval entonces FPM se reiniciará. Un valor de 0 corresponde a 'Off'. Valor por defecto: 0 (Off).
emergency_restart_interval
mixed
Intervalo de tiempo usado por emergency_restart_interval para determinar cuando un reinicio agraciado será realizado. Esto puede ser útil trabajar sobre corrupciones accidentales in en acelerador de memoria compartida. Unidades disponibles:: s(segundos), m(inutos), h(oras), o d(ías). Unidad por defecto: segundos. Valor por defecto: 0 (Off).
process_control_timeout
mixed
Límite de tiempo que un hilo de proceso espera por una señal maestra. Unidades disponibles: s(egundos), m(inutos), h(oras), o d(ías) Unidad por defecto: segundos. Valor por defecto: 0.
daemonize
boolean
Envía a FPM al background. Establezca a 'no' para mantener FPM en foreground para depuración. Valor por defecto: yes.
Con FPM usted puede correr varios grupos de procesos con diferentes ajustes. Estos son los parámetros que pueden ser ajustados por grupo.
listen
string
La dirección sobre la cual desea aceptar peticiones FastCGI. Las sintaxis válidas son: 'ip.add.re.ss:port', 'port', '/path/to/unix/socket'. Estas opciones son obligatorias por cada grupo.
listen.backlog
int
Establece listen(2) backlog. Un valor de '-1' significa ilimitado. Valor por defecto: -1.
listen.allowed_clients
string
Lista de direcciones ipv4 de clientes FastCGI que tienen permiso para conectarse. El equivalente a la variable de entorno FCGI_WEB_SERVER_ADDRS en el PHP FastCGI (5.2.2+) original. Tiene sentido solamente con un socket tcp escuchando. Cada dirección debe ser separada por coma. Si este valor es dejado en blanco, las conexiones serán aceptas desde cualquier dirección ip. Valor por defecto: any.
listen.owner
string
Establece permisos para sockets unix, si uno es usado. En Linux, los permisos de lectura/escritura deben ser puestos a fin de permitir conexiones desde un servidor web. Muchos sistemas derivados de BSD permiten conexiones sin considerar los permisos. Valor por defecto: usuario y grupo son establecidos según el usuario ejecutor, permisos puestos a 0666.
listen.group
string
Ver listen.owner.
listen.mode
string
Ver listen.owner.
user
string
Usuario Unix de procesos FPM. Esta opción es obligatoria.
group
string
Grupo Unix group of FPM processes. Si no es establecido, el grupo del usuario por defecto sera usado.
pm
string
Seleccione cómo el manejador de procesos controlará el número de hilos de procesos. Valores posibles: static, ondemand, dynamic. Esta opción es obligatoria.
static - el número de hilos de proceso es fijo (pm.max_children).
ondemand - el proceso se lanza en demanda (cuando se solicita, al contrario que dynamic, donde pm.start_servers son iniciados cuando el servicio está iniciado.
dynamic - el número de hilos de proceso será basado dinámicamente basado en las siguientes directivas: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.
pm.max_children
int
El número de hilos de procesos a ser creados cuando pm es puesto a static y el máximo número de hilos de proceso a ser creados cuando pm es puesto a dynamic. Esta opción es obligatoria.
Esta opción establece el límite sobre el número de peticiones simultaneas que serán servidas. Equivale a la directiva ApacheMaxClients con mpm_prefork y a la variable de entorno PHP_FCGI_CHILDREN del PHP FastCGI original.
pm.start_servers
in
Número de hilos de procesos creados al inicio. Usado solamente cuando pm es puesto a dynamic. Valor por defecto: min_spare_servers + (max_spare_servers - min_spare_servers) / 2.
pm.min_spare_servers
int
El número mínimo deseado de procesos libres en el servidor. Usado sólo cuando pm es puesto a dynamic. También obligatorio en este caso.
pm.max_spare_servers
int
El número máximo deseado de procesos libres en el servidor. usado sólo cuando pm es puesto a dynamic. También obligatorio en este caso.
pm.max_requests
int
El número de pedidos que cada hilo de proceso debe ejecutar antes de reaparecer. Esto puede ser útil para evitar las fugas de memoria en librerías de terceros. para el procesamiento de solicitudes sin límites especifique '0'. Equivale a PHP_FCGI_MAX_REQUESTS. Valor por defecto: 0.
pm.status_path
string
La dirección URI para ver la página de status FPM. Si este valor no es establecido, ninguna dirección URI será reconocida como una página de status. Valor por defecto: none.
ping.path
string
La dirección URI del ping para llamar a la página de monitor del FPM. Si este valor no es establecido, ninguna dirección URI será reconocida como página del ping. Esto debería ser usado para probar desde el exterior que el FPM está funcionando y respondiendo. Por favor, note que este valor debe empezar con un slash (/).
ping.response
string
Esta directiva puede ser usada para personalizar las peticiones de respuestas a ping. La respuesta es formateada como text/plain con un código de respuesta 200. Valor por defecto: pong.
request_terminate_timeout
mixed
El tiempo de espera para servir una simple petición luego que el proceso worker sea eliminado. Esta opción debe ser usada cuando la opción 'max_execution_time' no detenga la ejecuciuón del script por cualquier razón. Un valor de '0' corresponde a 'Off'. Unidades disponibles: s(egundos)(por defecto), m(inutos), h(horas), or d(ías). Default value: 0.
request_slowlog_timeout
mixed
El tiempo de espera para servir una simple petición después de que un backtrace PHP sea volcado al archivo 'slowlog'. Un valor de '0' corresponde a 'Off'. Unidades disponibles: s(egundos)(por defecto), m(inutos), h(oras), or d(ías). Valor por defecto: 0.
slowlog
string
El archivo de registro para peticiones lentas. Valor por defecto: #INSTALL_PREFIX#/log/php-fpm.log.slow.
rlimit_files
int
Establece el archivo descriptor rlimit. Valor por defecto: definido por el sistema.
rlimit_core
int
Establece el tamaño máximo del rlimit. Valores posibles: 'unlimited' o un entero mayor o igualo a 0. Valor por defecto: definido por el sistema.
chroot
string
Establece el Chroot (enjaulado) a este directorio al inicio. Este valor debe ser definido como una ruta absoluta. Cuando este valor no es establecido, el chroot no es usado.
chdir
string
Establece el Chdir a este directorio al inicio. Este valor debe ser establecido como una ruta absoluta. Valor por defecto: directorio actual o / cuando está en chroot (enjaulado).
catch_workers_output
boolean
Redirige los worker stdout y stderr en el archivo de registro principal. Sí no es establecido, stdout y stderr serán redirigidos a /dev/null de acuerdo a las especificaciones FastCGI. Valor por defecto: no.
Es posible pasar las variables de entorno adicionales y actualizar los ajustes PHP de ciertos grupos. Para ello, se necesita agregar las siguientes opciones a php-fpm.conf
Ejemplo #1 Pasando variables de entorno y ajustando las configuraciones de PHP por grupos
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 32M
Ajustes definidos con php_admin_value and php_admin_flag cannot be anulados con ini_set().
Como 5.3.3, establecer los ajustes PHP es también posible como servidor web.
Ejemplo #2 Establecer ajustes PHP en nginx.conf
set $php_value "pcre.backtrack_limit=424242"; set $php_value "$php_value \n pcre.recursion_limit=99999"; fastcgi_param PHP_VALUE $php_value; fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/htdocs";
Dado a que estos valores se pasan a php-fpm como cabeceras fastcgi, php-fpm no debe estar vinculado a una dirección accesible para todo el mundo. De lo contrario, cualquiera podría alterar las opciones de configuración de PHP. Ver también listen.allowed_clients.
» PECL es un respositorio de extensiones de PHP disponible mediante el sistema de paquetes » PEAR. Esta sección del manual tiene por objetivo ilustrar cómo obtener e instalar extensiones PECL.
Estas instrucciones asumen que la ruta al fuente de su distribución de PHP es /your/phpsrcdir/, y que extname es el nombre de la extensión PECL. Ajuste a sus valores. Estas instruccines, además, asumen conocimientos del » comando pear. La información del manual de PEAR para el comando pear también es aplicable al comando pecl.
Para poder usarse, una extensión compartida se debe construir, instalar, y cargar. Los métodos descritos abajo le proporcionan varias instrucciones para construir e instalar extensiones, pero no se cargarán automáticamente. Éstas se pueden cargar añadiendo una directivaextension. O bien al fichero php.ini, o bien mediante el uso de la función dl().
Al construir un módulo PHP, es importante contar con las versiones correctas de las herramientas requeridas (autoconf, automake, libtool, etc.). Para conocer los detalles de las herramientas requeridas y sus versiones, revise las » Instrucciones de Git Anónimo.
Existen varias opciones para descargar extensiones PECL, a saber:
Dispone de dos formas para cargar extensiones PHP en Windows: o bien compilándolas en PHP, o bien cargando su DLL. El método recomendado y más sencillo es cargar una extensión pre-compilada.
Para cargar una extensión, debe estar disponible como fichero ".dll" en su sistema. Todas las extensiones son compiladas por el Grupo PHP automática y periódicamente (revise la siguiente sección para realizar descargas).
Para compilar una extensión en PHP, por favor, acceda a la documentación de construcción de la fuente.
Para compilar una extensión independiente (o lo que es lo mismo, un fichero DLL), por favor, revise la documentación de construcción de la fuente. Si el fichero DLL no está disponible ni en su distribución de PHP ni en PECL, deberá compilarla antes de poder comenzar a usarla.
Las extensiones de PHP generalmente se llaman "php_*.dll" (donde el asterisco representa el nombre de la extensión) y se localizan bajo la carpeta "PHP\ext" ("PHP\extensions" en PHP 4).
PHP se distribuye con las extensiones más útiles para la mayoría de desarrolladores. Se les llama extensiones del "núcleo".
En cualquier caso, si necesita una funcionalidad que no proporciona ninguna de las extensiones del núcleo, podrá buscarla en PECL. La Biblioteca de la Comunidad de Extensiones de PHP (PECL) es un repositorio de extensiones PHP, que proporciona un directorio de todas las extensiones conocidas, y aloja utilidades para descargar y desarrollar extensiones de PHP.
Si usted ha desarrollado una extensión para su propio uso, quizá quiera considerar alojarla en PECL, de forma que otros desarrolladores con las mismas necesidades puedan verse beneficiados de su tiempo. Una de las ventajas es que tendrá la oportunidad de recibir colaboración, (ojalá) agradecimientos, informes de errores, e incluso parches/correcciones. Antes de enviar su extensión para ser alojada en PECL, por favor, lea http://pecl.php.net/package-new.php.
A menudo, encontrará varias versiones de cada DLL:
Debe tener en cuenta que los ajustes de su extensión deben coincidir con la configuración del ejecutable de PHP que está utilizando. El siguiente script de PHP le dirá todo sobre sus ajustes de PHP:
Ejemplo #1 llamada a phpinfo()
<?php
phpinfo();
?>
O ejecute desde la línea de comandos:
drive:\\path\to\php\executable\php.exe -i
La forma más común de cargar una extensión PHP consiste en incluirla en el fichero de configuración php.ini. Por favor, tenga en cuenta que ya hay muchas extensiones presentes en el fichero php.ini y que sólo es necesario eliminar el punto y coma para activarlas.
;extension=php_extname.dll
extension=php_extname.dll
Sin embargo, algunos servidores web puede resultar confusos, dado que no utilizan el php.ini ubicado junto al ejecutable de PHP. Para averiguar dónde se localiza el php.ini en uso, consulte su ruta usando phpinfo():
Configuration File (php.ini) Path C:\WINDOWS
Loaded Configuration File C:\Program Files\PHP\5.2\php.ini
Tras activar una extensión, guarde el fichero php.ini, reinicie el servidor web y vuelva a comprobar phpinfo(). La nueva extensión debe ahora tener su propia sección.
Si la extensión no aparece en phpinfo(), compruebe los registro de errores para conocer qué provoca el problema.
Si está utilizando PHP desde la línea de comandos (CLI), podrá leer directamente en pantalla el error en la carga de la extensión.
Si está usando PHP en un servidor web, la localización y formato de los registros vería en función de su software. Por favor, lea la documentación de su servidor web para localizar los registros, dado que esto no lo gestiona el propio ejecutable de PHP.
Los problemas más comunes son la ubicación del fichero DLL, el valor de " extension_dir" en php.ini, y desajustes de configuración en tiempo de compilación.
Si el problema reside en desajustes de configuración en tiempo de compilación, seguramente se deba a que no se ha descargado el fichero DLL correcto. Pruebe a descargar de nuevo la extensión con los ajustes correctos. De nuevo, phpinfo() puede resultar de gran ayuda.
PECL facilita la creación de extensiones PHP compartidas. Usando el » comando pecl, haga lo siguiente:
Esto descargará el código fuente de extname, lo compilará, e instalará extname.so en su extension_dir. Ahora se puede cargar extname.so mediante php.ini
Por omisión, el comando pecl no instalará paquetes marcados en los estados alpha o beta. Si no hay paquetes disponibles en estado stable, podrá instalar un paquete en estado beta utilizando el siguiente comando:
Del mismo modo, podrá también instalar una versión en concreto usando esta variante:
Nota:
Tras activar la extensión en php.ini, será necesario reiniciar el servidor web para hacer efectivos los cambios.
A menudo no es posible utilizar el instalador pecl. Esto se puede deber a que se encuentra tras un cortafuegos, o a que la extensión que trata de instalar no está disponible como paquete compatible con PECL, como por ejemplo extensiones no liberadas desde el SVN. Si necesita construir una extensión de este tipo, puede llevar a cabo esta tarea manualmente utilizando las herramientas de construcción de bajo nivel.
El comando phpize se utiliza para preparar el entorno de compilación de la extensión de PHP. En el siguiente ejemplo, el fuente de una extensión se ubica en un directorio llamado extname:
$ cd extname $ phpize $ ./configure $ make # make install
En caso de que la instalación sea correcta, se creará extname.so y se salvará en el directorio de extensiones de PHP. Quizá necesite ajustar el fichero php.ini y añadir una línea extension=extname.so antes de poder usar la extensión.
Si el sistema no contiene el comando phpize, y se están utilizando paquetes pre-compilados (como RPM), asegúrese de instalar también la versión de desarrollo apropiada del paquete PHP, dado que a menudo incluyen el comando phpize con los ficheros de cabeceras necesarios para construir PHP y sus extensiones.
Ejecute phpize --help para mostrar información de uso adicional.
php-config es una utilidad de consola que permite obtener información sobre la configuración de la instalación de PHP.
A la hora de compilar extensiones, si se tuvieran varias versiones de PHP instaladas, se podrá especificar sobre cuál se va a construir usando el modificador --with-php-config durante la configuración, donde especificaremos la ruta a su respecto script php-config.
En cualquier momento podrá consutlarse la lista de opciones de la utilidad php-config ejecutando php-config con el modificador -h :
Usage: /usr/local/bin/php-config [OPTION] Options: --prefix [...] --includes [...] --ldflags [...] --libs [...] --extension-dir [...] --include-dir [...] --php-binary [...] --php-sapis [...] --configure-options [...] --version [...] --vernum [...]
| Opción | Descripción |
|---|---|
| --prefix | Prefijo del directorio donde PHP está instalado, p.ej. /usr/local |
| --includes | Lista de opciones -I con todos los ficheros incluídos |
| --ldflags | Banderas LD con las que se ha compilado PHP |
| --libs | Bibliotecas extras con las que se ha compilado PHP |
| --extension-dir | Directorio en el que se buscan por omisión las extensiones |
| --include-dir | Prefijo de directorio donde se buscan por omisión los ficheros de cabeceras |
| --php-binary | Ruta completa al binario de php CLI o CGI |
| --php-sapis | Muestra todos los módulos SAPI disponibles |
| --configure-options | Opciones de configuración para recrear la configuración de la instalación actual de PHP |
| --version | Versión de PHP |
| --vernum | Versión de PHP en forma de entero |
Quizá necesite construir una extensión PECL estáticamente en su binario de PHP. Para hacer esto, necesitará ubicar el fuente de la extensión bajo el directorio php-src/ext/ e indicarle al sistema de construcción de PHP que regenere su script de configuración.
$ cd /your/phpsrcdir/ext $ pecl download extname $ gzip -d < extname.tgz | tar -xvf - $ mv extname-x.x.x extname
Esto generará el siguiente directorio:
Desde aquí, fuerce a PHP a regenerar el script de configuración, y entonces construya PHP con normalidad:
Nota: Necesitará autoconf 2.13 y automake 1.4+ para ejecutar el script 'buildconf' (es posible que funcionen versiones más recientes de autoconf, pero no están oficialmente soportadas).
Dependiendo de la extensión, utilizará --enable-extname o --with-extname. Las extensiones que no requieren de bibliotecas externas generalmente utilizan --enable. Para asegurarse, ejecute el siguiente comando después de buildconf:
Algunos problemas son más comunes que otros. Los más comunes están listados en la parte del manual PHP FAQ.
Si sigue bloqueado, seguramente alguien de la lista de correo de la instalación de PHP podrá ayudarle. Se debe consultar el archivo primero, para comprobar si alguien ya haya contestado a otra persona que haya tenido el mismo problema. Los archivos están disponibles desde la página de soporte en » http://www.php.net/support.php. Para subscribirse a la lista de correo de la instalación de PHP (en Inglés), envíe un E-Mail vacío a » php-install-subscribe@lists.php.net. La lista de correo es » php-install@lists.php.net.
Si quiere obtener ayuda de la lista de correo, por favor trate de ser preciso y dar toda la información necesaria a cerca de su entorno (qué sistema operativo, que versión de PHP, que tipo de servidor web, si está usando PHP como GCI o como módulo, safe mode, etc.), y preferiblemente suficiente código para que otras personas sean capaces de reproducir y comprobar su problema.
Si cree que ha encontrado un bug en PHP, por favor informe. Los desarrolladores de PHP probablemente no están informados a cerca del problema y a no ser que lo mencione, es muy provable que no sea solucionado. Puede informar sobre bugs usando el sistema de bug-tracking en » http://bugs.php.net/. Por favor no envie informes de bugs a listas de correos o cartas personales. El sistema de bugs también está capacitado para enviar sugerencias y peticiones.
Lea el documento » Como informar sobre bugs antes de enviar cualquier informe de bugs!
El fichero de configuración (php.ini) es leído al arrancar PHP. En las versiones en que PHP funciona como módulo de servidor, esto sucede únicamente cuando se inicia el servidor. En las versiones CGI y CLI, esto ocurre en cada ejecución.
El fichero php.ini se busca en las siguientes ubicaciones (en orden):
Si existiera el fichero php-SAPI.ini (donde SAPI es la SAPI en uso, por ejemplo, php-cli.ini o php-apache.ini), se usaría éste en lugar de php.ini. Se puede determinar el nombre de la SAPI usando php_sapi_name().
Nota:
El servidor web Apache cambia el directorio al raíz al arrancar, haciendo que PHP intente leer php.ini desde el sistema de ficheros raíz si existiera.
Nota:
Las variables de entorno se pueden usar en el fichero php.ini
Las directivas de php.ini manejadas por extensiones están documentadas en la propia página de cada extensión. Hay una lista de directivas del núcleo disponible en el apéndice. Es posible que no todas las directivas de PHP estén documentadas en el manual: para consultar una lista completa de las directivas disponibles en su versión de PHP, por favor, lea los comentarios del fichero php.ini. Adicionalmente, puede encontrar útil » el último php.ini desde Git.
Ejemplo #1 Ejemplo de php.ini
; todo texto en una línea tras un punto y coma sin comillas (;) será ignorado [php] ; los marcadores de sección (textos entre corchetes) también se ignoran ; Los valores de tipo boolean puede establecerse a: ; true, on, yes ; o false, off, no, none register_globals = off track_errors = yes ; se pueden encerrar los strings entre comillas dobles include_path = ".:/usr/local/lib/php" ; las barras invertidas reciben el mismo tratamiento que el resto de caracteres include_path = ".;c:\php\lib"
A partir de PHP 5.1.0, es posible hacer referencia a variables .ini ya existentes desde el propio fichero .ini. Ejemplo: open_basedir = ${open_basedir} ":/new/dir".
A partir de PHP 5.3.0 se incluye soporte para ficheros INI tipo .htaccess a nivel de directorios. Estos ficheros solo los procesa la SAPI CGI/FastCGI. Esta funcionalidad deja obsoleta la extensión PECL htscanner. Si está usando Apache, use los ficheros .htaccess para lograr el mismo efecto.
Además del fichero php.ini principal, PHP explora cada directorio en busca de ficheros INI, empezando por el directorio del fichero PHP solicitado, y continuando hasta el directorio raíz de documentos (tal y como esté establecido en $_SERVER['DOCUMENT_ROOT']). En el caso de que el fichero PHP se encuentre fuera del directorio raíz de documentos, sólo se explorará su directorio.
En los ficheros INI estilo .user.ini sólo se reconocerán
las cofiguraciones INI que tengan los modos
PHP_INI_PERDIR y
PHP_INI_USER.
Las dos nuevas directivas INI, user_ini.filename y user_ini.cache_ttl controlan el uso de los ficheros INI de usuarios.
user_ini.filename establece el nombre del fichero que PHP buscará en cada directorio; si se establece un string vacío, PHP no realizará ninguna búsqueda. El nombre por omisión es .user.ini.
user_ini.cache_ttl controla con qué frecuencia se releen los ficheros INI de usuario. El valor por omisión es 300 segundos (5 minutos).
Estos modos determinan cuándo y dónde se debe o no asignar una directiva de PHP, y cada directiva del manual hace referencia a uno de estos modos. Por ejemplo, algunos ajustes pueden establecerse en scripts de PHP usando ini_set(), mientras que otros requieren hacerlo en php.ini o en httpd.conf.
Por ejemplo, el ajuste output_buffering es PHP_INI_PERDIR por tanto no puede establecerse usando ini_set(). Sin embargo, la directiva display_errors es PHP_INI_ALL por tanto se puede establecer en cualquier lugar, incluso con ini_set().
| Modo | Significado |
|---|---|
| PHP_INI_USER | La entrada se puede establecer en scripts de usuario (como con ini_set()) o en el registro de Windows. Desde PHP 5.3, la entrada puede ser establecida en .user.ini |
| PHP_INI_PERDIR | La entrada se puede establecer en php.ini, .htaccess, httpd.conf o .user.ini (desde PHP 5.3) |
| PHP_INI_SYSTEM | La entrada se puede establecer en php.ini o en httpd.conf |
| PHP_INI_ALL | La entrada se puede establecer en cualquier lugar |
Cuando se usa PHP como un módulo de Apache, se pueden cambiar los ajustes de configuración usando directivas en los ficheros de configuración de Apache (p.ej. httpd.conf) y en los ficheros .htaccess. Se necesitarán los privilegios "AllowOverride Options" o "AllowOverride All" para poder hacerlo.
Existen varias directivas de Apache que permiten
cambiar la configuración de PHP desde los propios ficheros de configuración
de Apache. Para un listado las directivas que son
PHP_INI_ALL, PHP_INI_PERDIR,
o PHP_INI_SYSTEM, consulte el apéndice de la
Lista de directivas de php.ini.
php_value
nombre
valor
Establece el valor de la directiva especificada.
Sólo puede usarse con las directivas de tipo PHP_INI_ALL y PHP_INI_PERDIR.
Para borrar un valor previamente establecido, use none como valor.
Nota: No use
php_valuepara establecer valores boolean. Debe usarse en su lugarphp_flag(ver más abajo).
php_flag
nombre
on|off
Usado para establecer una directiva de configuración de tipo boolean.
Sólo puede usarse con las directivas de tipo
PHP_INI_ALL y PHP_INI_PERDIR.
php_admin_value
nombre
valor
Establece el valor de la directiva especificada.
Esto no se puede usar en ficheros .htaccess.
Ninguna directiva establecida con php_admin_value
podrá ser sobrescrita por .htaccess o por ini_set().
Para borrar un valor establecido previamente use none como valor.
php_admin_flag
nombre
on|off
Usado para establecer una directiva de configuración de tipo boolean.
Esto no se puede usar en ficheros .htaccess.
Ninguna directiva establecida con php_admin_flag
podrá ser sobrescrita por .htaccess o por ini_set().
Ejemplo #1 Ejemplo de configuración de Apache
<IfModule mod_php5.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag engine on </IfModule> <IfModule mod_php4.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag engine on </IfModule>
Las constantes de PHP no existen fuera de PHP. Por ejemplo, en
httpd.conf no se pueden usar constantes de PHP
tales como E_ALL o E_NOTICE
para establecer la directiva error_reporting
puesto que no tendrán ningún significado y se evaluarán como
0. Use en su lugar la máscara de bits asociada.
Estas constantes sí pueden ser usadas en php.ini
Cuando se ejecuta PHP en Windows, se pueden modificar los valores
de configuración a nivel de directorio usando el registro de Windows.
Los valores de configuración se almacenan en la clave de registro
HKLM\SOFTWARE\PHP\Per Directory Values,
en las subclaves correspondientes a los nombres de ruta. Por ejemplo, los valores
de configuración para el directorio c:\inetpub\wwwroot
se almacenarían en la clave HKLM\SOFTWARE\PHP\Per Directory
Values\c\inetpub\wwwroot. Los ajustes para el directorio
estarían activos para cualquier script dentro de este directorio o
en cualquiera de sus subdirectorios. Los valores bajo esta clave
deben tener el nombre de la directiva de configuración de PHP y el
valor como string. Las constantes de PHP usadas como valor no serán procesadas.
En cualquier caso, únicamente los valores de configuración
modificables de PHP_INI_USER podrán
establecerse con este método, mientras que los valores de PHP_INI_PERDIR no.
Independientemente de cómo ejecute PHP, se pueden cambiar determinados valores de los scripts en tiempo de ejecución mediante ini_set(). Consulte la documentación de la página ini_set() para más información.
Si está interesado en una lista completa de los ajustes de configuración en su sistema con sus valores actuales, puede ejecutar la función phpinfo(), y consultar la página mostrada. Puede también acceder a los valores de directivas de configuración concretas usando ini_get() o get_cfg_var().
Cualquier cosa fuera del par de etiquetas de apertura y cierre es ignorado por el intérprete de PHP, el cual permite que los ficheros de PHP tengan contenido mixto. Esto permite que PHP sea embebido en documentos HTML para, por ejemplo, crear plantillas.
<p>Esto va a ser ignorado por PHP y mostrado por el navegador.</p>
<?php echo 'Mientras que esto va a ser interpretado.'; ?>
<p>Esto también será ignorado por PHP y mostrado por el navegador.</p>
Usar estructuras con condiciones
Ejemplo #1 Salida avanzada usando condiciones
<?php if ($expresión == true): ?>
Esto se mostrará si la expresión es verdadera.
<?php else: ?>
En caso contrario se mostrará esto.
<?php endif; ?>
Para imprimir bloques de texto grandes, es más eficiente abandonar el modo intérprete de PHP que enviar todo el texto a través de echo o print.
Existen cuatro tipos de pares de etiquetas de apertura y de cierre que se pueden usar en PHP. Dos de estas, <?php ?> y <script language="php"> </script>, siempre están disponibles. Las otras dos son las etiquetas abreviadas y las etiquetas estilo ASP, que se pueden activar o desactivar desde el fichero de configuración php.ini Aunque algunas personas encuentran las etiquetas abreviadas y las etiquetas estilo ASP más convenientes, son menos portables y generalmente no se recomiendan.
Nota:
Observe también que si se está incrustando PHP dentro de XML o XHTML necesitará usar las etiquetas <?php ?> para seguir los estándares.
Ejemplo #2 Etiquetas de apertura y de cierre de PHP
1. <?php echo 'si se quiere mostrar documentos XHTML o XML, debe hacerse 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'; ?>
<?= expresión ?> Esto es una forma abreviada de "<? echo expresión ?>"
4. <% echo 'Quizá use de forma opcional etiquetas de estilo ASP'; %>
<%= $variable; # Esto es una forma abreviada de "<% 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 abreviadas (ejemplo tres) están solo disponibles cuando se activan mediante la directiva short_open_tag del fichero de configuración php.ini o si PHP se configuró con la opción --enable-short-tags .
Las etiquetas de estilo ASP (ejemplo cuatro) están solo disponibles cuando se activan mediante la directiva asp_tags del fichero de configuración php.ini.
Nota:
Se debe evitar el uso de etiquetas abreviadas cuando se desarrollen aplicaciones o bibliotecas que estén pensadas para su redistribución o despliegue en servidores PHP que no estén bajo su control, porque puede que las etiquetas abreviadas no estén soportadas en un servidor determinado. Por portabilidad y código redistribuible, asegúrese de no usar etiquetas abreviadas.
Nota:
En PHP 5.2 y anteriores, el intérprete no permite que un fichero contenga únicamente la etiqueta de apertura <?php. A partir de PHP 5.3 sí se permite siempre que existan uno o más caracteres espacio en blanco después de la etiqueta de apertura.
Nota:
Desde PHP 5.4, la etiqueta abreviada de echo <?= siempre es reconocida y válida, sin tener en cuenta la configuración de short_open_tag.
Como en C o en Perl, PHP requiere que las instrucciones terminen en punto y coma al final de cada sentencia. La etiqueta de cierre de un bloque de código de PHP automáticamente implica un punto y coma; no es necesario usar un punto y coma para cerrar la última línea de un bloque de PHP. La etiqueta de cierre del bloque incluirá la nueva línea final inmediata si está presente.
<?php
echo 'Esto es una prueba';
?>
<?php echo 'Esto es una prueba' ?>
<?php echo 'Hemos omitido la última etiqueta de cierre';
Nota:
La etiqueta de cierre de un bloque de PHP es opcional al final de un fichero, y en algunos casos es útil omitirla cuando se usa include o require, para que no se produzcan espacios en blanco al final de los ficheros, y así se podrán añadir aún cabeceras para la respuesta posterior. También es práctico si se utiliza la salida del buffer y no se desean espacios en blanco no deseados al final de las partes generadas por ficheros incluídos.
PHP soporta comentarios 'C', 'C++' y etilo consola Unix (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
y otra lína de comentarios */
echo 'Esto es otra pruba';
echo 'Una prueba final'; # Esto es un comentario estilo consola de una sola línea
?>
Los comentarios del estilo "una sola línea" solo comentan hasta el final de la línea o del bloque actual de código de PHP, lo primero que suceda. Esto implica que el código HTML después de // ... ?> o # ... ?> SERÁ impreso: ?> sale del modo PHP y vuelve al modo HTML, por lo que // o # no pueden influir en eso. Si la directiva de configuración asp_tags está activada, actúa igual que // %> y # %>. Sin embargo, la etiqueta </script> no sale del modo PHP en un comentario de una sola línea.
<h1>Esto es un <?php # echo 'simple';?> ejemplo</h1>
<p>El encabezado anterior dirá 'Esto es un ejemplo'.</p>
Los comentarios al estilo 'C' finalizan con el primer */ que se encuentre. Asegúrese de no anidar comentarios al estilo 'C'. Es muy fácil cometer este error cuando se intenta comentar un bloque grande de código.
<?php
/*
echo 'Esto es una prueba'; /* Este comentario causará un problema*/
*/
?>
PHP soporta ocho tipos primitivos.
Cuatro tipos escalares:
Dos tipos compuestos:
Y finalmente dos tipos especiales:
Este manual introduce también algunos pseudo-tipos por razones de legibilidad:
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.
Nota: Para comprobar el tipo y el valor de una expresión, utilice 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 comprobar 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 $a_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.
Este es el tipo más simple. Un boolean expresa un valor de
verdad. Puede ser TRUE or FALSE.
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, el resultado de un operador que devuelve un valor boolean 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";
}
?>
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:
FALSE
mismo
Cualquier otro valor es considerado TRUE (incluyendo cualquier resource).
-1 es considerado TRUE, como cualquier otro número
diferente a cero (¡ya sea negativo o positivo!)
<?php
var_dump((bool) ""); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)
?>
Un entero o integer es un número del conjunto ℤ = {..., -2, -1, 0, 1, 2, ...}.
Consulte tambien:
Los integer pueden ser especificados mediante notación decimal (base 10), hexadecimal (base 16), octal (base 8) o binaria (base 2), opcionalmente precedidos por un signo (- o +).
Los literales integer binarios están disponibles desde PHP 5.4.0.
Para usar la notación octal, se antepone al número un 0 (cero). Para usar la notación hexadecimal, se antepone al número un 0x. Para usar la notación binaria, se antepone al número un 0b.
Ejemplo #1 Enteros literales
<?php
$a = 1234; // número decimal
$a = -123; // un número negativo
$a = 0123; // número octal (equivalente a 83 decimal)
$a = 0x1A; // número hexadecimal (equivalente a 26 decimal)
?>
Formalmente, la estructura de integer literales es:
decimal : [1-9][0-9]*
| 0
hexadecimal : 0[xX][0-9a-fA-F]+
octal : 0[0-7]+
binario : 0b[01]+
entero : [+-]?decimal
| [+-]?hexadecimal
| [+-]?octal
| [+-]?binary
El tamaño de un integer depende de la plataforma, aunque un valor máximo
de aproximadamente dos billones es un valor usual (para 32 bits con signo).
Las plataformas de 64-bits normalmente tienen un valor máximo de aproximadamente 9E18. PHP
no admite integers sin signo. El tamaño de los integer
puede ser determinado mediante la constante PHP_INT_SIZE y el valor
máximo mediante la constante PHP_INT_MAX desde
PHP 4.4.0 y PHP 5.0.5.
Si en un integer octal se da un dígito incorrecto (por ejemplo 8 o 9), el resto del número se ignora.
Ejemplo #2 Octal raros
<?php
var_dump(01090); // 010 octal = 8 decimal
?>
Si PHP encuentra un número fuera de los límites de un integer, se interpretará como un float en su lugar. Tambien, una operación cuyo resultado es un número fuera de los límites de un integer devolverá en su lugar un float.
Ejemplo #3 Desbordamiento de enteros en sistemas 32-bits
<?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)
?>
Ejemplo #4 Desbordamiento de enteros en sistemas 64-bits
<?php
$large_number = 9223372036854775807;
var_dump($large_number); // int(9223372036854775807)
$large_number = 9223372036854775808;
var_dump($large_number); // float(9.2233720368548E+18)
$million = 1000000;
$large_number = 50000000000000 * $million;
var_dump($large_number); // float(5.0E+19)
?>
No existe operador de división de integer en PHP. 1/2produce el float 0.5. El valor puede ser forzado a ser un integer redondeando por defecto, o mediante la función round() que permite un mayor control sobre el redondeo.
<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>
Para convertir explicitamente un valor a integer, se puede emplear tanto (int) como (integer). Sin embargo, la mayoría de las veces la conversión no es necesaria, ya que un valor es convertido de forma automática cuando un operador, función o estructura de control necesite un argumento del tipo integer. Un valor tambien puede ser convertido a integer mediante la función intval().
Consulte también: manipulación de tipos.
FALSE produce 0 (cero), y TRUE produce
1 (uno).
Cuando se convierte de un float a un integer, el número será redondeado hacia cero.
Si el float esta por debajo de los límites de un integer (normalmente +/- 2.15e+9 = 2^31 en plataformas de 32 bits y +/- 9.22e+18 = 2^63 en plataformas de 64 bits), el resultado es indefinido, debido a que float no tiene la precisión suficiente para ofrecer el resultado como un integer exacto. No se mostrará ninguna advertencia, ni siquiera un aviso cuando esto ocurre!
Nunca se debe convertir una fracción desconocida a un integer, ya que a veces puede producir resultados inesperados.
<?php
echo (int) ( (0.1+0.7) * 10 ); // muestra 7!
?>
Consulte tambien aviso sobre la precisión de float
Consulte Conversión de cadenas a números
El comportamiento de la conversion de integer a otros tipos es indefinido. No espere que exista un comportamiento esperado, ya que puede cambiar sin previo aviso.
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).
Los números de punto flotante tienen una precisión limitada. Aunque depende del sistema, PHP típicamente utiliza el formato de doble precisión IEEE 754, el cual dará un error relativo máximo por aproximación del orden de 1.11e-16. Las operaciones aritméticas elementales no podrán dar grandes errores y por supuesto, los errores por propagación deben ser considerados cuando varias operaciones son compuestas.
Adicionalmente, los numeros racionales que son representables exactamente como números de punto flotante en base 10, como 0.1 o 0.7, no tienen una representación exacta como números de punto flotante en base 2, el cual es usado internamente, sin importar el tamaño de la mantisa. Por lo tanto, no se puede convertir en sus contrapartes binarias internas sin una pequeña pérdida de precisión. Esto puede llevar a confundir resultados: Por ejemplo, floor((0.1+0.7)*10) usualmente retornará 7 en lugar del 8 esperado, ya que la representación interna será algo así como 7.9999999999999991118....
Así que nunca se confía en resultados de números flotantes hasta el último dígito y no se comparan números de punto flotante directamente para igualdad. Si es necesaria una mejor precisión, están disponibles las funciones matemáticas de precisión arbitraria y las funciones gmp.
Para una explicación "simple", véase la » guía de punto flotante que también se titula "¿Por qué no suman mis números?"
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.
Como se indica en la advertencia anterior, comprobar la igualdad de valores de punto flotante es problemático, debido a la forma en que se representan internamente. Sin embargo, hay maneras de hacer comparaciones de los valores de punto flotante que trabajan rodeando a estas limitaciones.
Para comprobar la igualdad de valores de punto flotante, se utiliza un límite superior en el error relativo debido al redondeo. Este valor se conoce como el epsilon de la máquina o unidad de redondeo y es la menor diferencia aceptable en los cálculos.
$a y $b son iguales a 5 dígitos de precisión.
<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
echo "true";
}
?>
Algunas operaciones numéricas pueden resultar en un valor representado por la constante
NAN. Este resultado representa un valor no definido o
no representable mediante cálculos de coma flotante. Cualquier comparación, ya sea poco
rígida o estricta, de esta valor con cualquier otro valor, incluido él mismo
tenfrá un resultado de FALSE.
Ya que NAN representa cualquier número de diferentes valores,
NAN no debería compararse con otros valores, incluido
él mismo; en su lugar debería comprobarse usando la función is_nan().
Un string es una serie de caracteres donde un caracter es lo mismo que un byte. Esto significa que PHP solo soporta el conjunto de 256 caracteres y por lo tanto no tiene soporte nativo Unicode. Ver detalles del tipo de dato string.
Nota: string puede llegar a alcanzar 2GB de tamaño.
Un string literal puede ser especificado de cuatro formas diferentes:
La manera más sencilla de especificar un string es encerrarlo entre comillas simples (el caracter ').
Para especificar una comilla simple literal, se escapa con una barra invertida (\). Para especificar una barra invertida literal, se duplica (\\). Todas las otras instancias de barras invertidas serán tratadas como una barra invertida literal: esto significa que otras secuencias de escape que se puedan utilizar, tales como \r or \n, serán mostradas literalmente como se especifican en lugar de tener cualquier significado especial
Nota: A diferencia de las sintaxis de comillas dobles y heredoc, las variables y las sentencias de escape para caracteres especiales no se expandirán cuando estén incluidas dentro de un string con comillas simples.
<?php
echo 'Esto es una cadena sencilla';
echo 'Tambien puede incluir nuevas líneas en
cadenas de esta forma ya que es
correcto hacerlo así';
// Resultado: Arnold una vez dijo: "I'll be back"
echo 'Arnold una vez dijo: "I\'ll be back"';
// Resultado: Ha borrado C:\*.*?
echo 'Ha borrado C:\\*.*?';
// Resultado: Ha borrado C:\*.*?
echo 'Ha borrado C:\*.*?';
// Resultado: Esto no se expandirá: \n una nueva línea
echo 'Esto no se expandirá: \n una nueva línea';
// Resultado: Las variables $tampoco se $expandiran
echo 'Las variables $tampoco se $expandiran';
?>
Si un string está encerrado entre comillas dobles ("), PHP interpretará más sentencias de escape como caracteres especiales:
| Sentencia | Significado |
|---|---|
| \n | avance de línea (LF o 0x0A (10) en ASCII) |
| \r | retorno de carro (CR o 0x0D (13) en ASCII) |
| \t | tabulador horizontal (HT o 0x09 (9) en ASCII) |
| \v | tabulador vertical (VT o 0x0B (11) en ASCII) (desde PHP 5.2.5) |
| \e | escape (ESC o 0x1B (27) en ASCII) (desde PHP 5.4.0) |
| \f | avance de página (FF o 0x0C (12) en ASCII) (desde PHP 5.2.5) |
| \\ | barra invertida |
| \$ | signo del dólar |
| \" | comillas dobles |
| \[0-7]{1,3} | la secuencia de caracteres que coincida con la expresión regular es un caracter en notación octal |
| \x[0-9A-Fa-f]{1,2} | la secuencia de caracteres que coincida con la expresión regular es un caracter en notación hexadecimal |
Al igual que en la delimitación de un string mediante comillas simples, escapar cualquier otro caracter puede dar lugar a que se muestre tambien la barra invertida. Antes de PHP 5.1.1, la barra invertida en \{$var} no se mostraba.
La característica más importante de entrecomillar un string mediante comillas dobles es el hecho que los nombres de las variables son expandidas. Consulte string parsing para más detalles.
Una tercera forma de delimitar un string es mediante la sintaxis heredoc: <<<. Después de este operador, se deberá ofrecer un identificador y después una nueva línea. A continuación va el propio string, y para cerrar la notación se pone el mismo identificador.
El identificador de cierre debe empezar en la primera columna de la nueva línea. Asimismo, el identificador debe seguir las mismas reglas de nomenclatura de las etiquetas en PHP: debe contener solo caracteres alfanuméricos y guiones bajos, y debe empezar con un caracter alfabético o un guión bajo.
Es muy importante señalar que la línea con el identificador de cierre no debe contener ningún caracter, excepto posiblemente un punto y coma (;). Esto significa en particular que el identificador no debe usar sangría, y que no deben existir ningún espacio ni tabulación antes o después del punto y coma. Es muy importante darse cuenta que el primer caracter antes del identificador de cierre debe ser un salto de línea definida por el sistema operativo local. En los sistemas UNIX sería \n, al igual que en Mac OS X. El delimitador de cierre (posiblemente seguido de un punto y coma) también debe ser seguido de un salto de línea.
Si se rompe esta regla y el identificador de cierre no está "limpio", no será considerado como un identificador de cierre, y PHP continuará buscando uno. Si no se encuentra ningún identificador de cierre antes del final del fichero, se producirá un error de análisis en la última línea.
Tampoco se puede emplear Heredocs para inicializar las propiedades de una clase. Desde PHP 5.3, esta limitación solo concierne a los heredocs que contengan variables.
Ejemplo #1 Ejemplo no válido
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
El texto heredoc se comporta como un string entre comillas dobles, pero sin tener comillas dobles. Esto significa que las comillas en Heredoc no necesitan ser escapadas, pero los caracteres escapados indicados arriba se pueden seguir empleando. Las variables son expandidas, y se debe tener el mismo cuidado dentro de un Heredoc cuando se quieren expresar variables complejas, al igual que en los string.
Ejemplo #2 Ejemplo de entrecomillado de string Heredoc
<?php
$str = <<<EOD
Ejemplo de una cadena
expandida en varias líneas
empleando la sintaxis heredoc.
EOD;
/* Un ejemplo más complejo con variables. */
class foo
{
var $foo;
var $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MiNombre';
echo <<<EOT
Mi nombre es "$name". Estoy escribiendo un poco de $foo->foo.
Ahora, estoy escribiendo un poco de {$foo->bar[1]}.
Esto debe mostrar una 'A' mayúscula: \x41
EOT;
?>
El resultado del ejemplo sería:
Mi nombre es "MiNombre". Estoy escribiendo un poco de Foo. Ahora, estoy escribiendo un poco de Bar2. Esto debe mostrar una 'A' mayúscula: A
Tambien se puede emplear la sintaxis Heredoc para pasar datos como argumento de una función:
Ejemplo #3 Ejemplo de Heredoc como argumento
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
Desde PHP 5.3.0 es posible inicializar variables estáticas y propiedades/constantes de clase mediante la sintaxis Heredoc:
Ejemplo #4 Usando Heredoc para inicializar valores estáticos
<?php
// Variables estáticas
function foo()
{
static $bar = <<<LABEL
Nada aqui dentro...
LABEL;
}
// Propiedades/Constantes de clase
class foo
{
const BAR = <<<FOOBAR
Ejemplo de constante
FOOBAR;
public $baz = <<<FOOBAR
Ejemplo de propiedad
FOOBAR;
}
?>
PHP 5.3.0 tambien introdujo la posibilidad en Heredoc de emplear las comillas dobles en declaraciones:
Ejemplo #5 Empleando comillas dobles en Heredoc
<?php
echo <<<"FOOBAR"
Hola Mundo!
FOOBAR;
?>
Nowdocs son a las cadenas con comillas simples lo mismo que Heredoc lo es a las comillas dobles. Una cadena nowdoc se especifica de forma análoga a la heredoc, pero no se realiza ningún análisis dentro de nowdoc. Esta construcción es ideal para embeber código PHP o grandes fragmentos de texto sin necesidad de escaparlo. Comparte algunas características comunes con la construcción SGML <![CDATA[ ]]>, donde se declara un fragmento de texto que no debe ser analizado.
Una cadena nowdoc se identifica con la misma sintaxis <<< usada para heredoc, pero el identificador que le sigue esta encerrado entre comillas simples, por ejemplo <<<'EOT'. Todas las reglas para los identificadores heredoc también son aplicables a los identificadores nowdoc, especialmente aquellos que se refieren al empleo del identificador de cierre.
Ejemplo #6 Ejemplo de entrecomillado de string Nowdoc
<?php
$str = <<<'EOD'
Ejemplo de una cadena
expandida en varias líneas
empleando la sintaxis nowdoc.
EOD;
/* Un ejemplo más complejo con variables. */
class foo
{
public $foo;
public $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MiNombre';
echo <<<'EOT'
Mi nombre es "$name". Estoy escribiendo un poco de $foo->foo.
Ahora, estoy escribiendo un poco de {$foo->bar[1]}.
Esto debe mostrar una 'A' mayúscula: \x41
EOT;
?>
El resultado del ejemplo sería:
Mi nombre es "$name". Estoy escribiendo un poco de $foo->foo.
Ahora, estoy escribiendo un poco de {$foo->bar[1]}.
Esto debe mostrar una 'A' mayúscula: \x41Nota:
A diferencia de heredoc, nowdoc puede ser usado en cuaquier contexto de datos estáticos. Un ejemplo típico es la inicialización de propiedades o constantes en una clase:
Ejemplo #7 Ejemplo de datos estáticos
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Nota:
El soporte de Nowdoc se añadió en PHP 5.3.0.
Cuando un string es especificado mediante comillas dobles o mediante sintaxis heredoc, las variables dentro de dicha cadena son analizadas.
Existen dos tipos de sintaxis: una simple y otra compleja. La sintaxis simple es la más empleada y conveniente. Proporciona una forma de incluir una variable, un valor de un array o una propiedad de un object dentro de un string con el mínimo esfuerzo.
La sintaxis compleja puede ser reconocida por las llaves que encierran la expresión.
Si se encuentra un signo de dólar ($), el analizador ávidamente cogerá el mayor número de símbolos para formar un nombre de variable válido. Encerrar el nombre de la variable entre llaves permite especificar explícitamente el final del nombre.
<?php
$jugo = "manzana";
echo "El tomó algo de jugo de $jugo.".PHP_EOL;
// Inválido. "s" es un caracter válido para un nombre de variable, pero la variable es $jugo.
echo "El tomó algo de jugo hecho de $jugos.";
?>
El resultado del ejemplo sería:
El tomó algo de jugo de manzana. El tomó algo de jugo hecho de .
De forma parecida, el índice de un array o la propiedad de un object puede ser analizado. Con los índices de los arrays, el corchete de cierre (]) marca el final del índice. La misma regla se puede aplicar a las propiedades de los objetos y a las variables simples.
Ejemplo #8 Ejemplo de sintaxis simple
<?php
$jugos = array("manzana", "naranja", "koolaid1" => "púrpura");
echo "El tomó algo de jugo de $jugos[0].".PHP_EOL;
echo "El tomó algo de jugo de $jugos[1].".PHP_EOL;
echo "El tomó algo de jugo hecho de $jugo[0]s.".PHP_EOL;// No funcionará
echo "El tomó algo de jugo $jugos[koolaid1].".PHP_EOL;
class people {
public $john = "John Smith";
public $jane = "Jane Smith";
public $robert = "Robert Paulsen";
public $smith = "Smith";
}
$people = new people();
echo "$people->john tomó algo de jugo de $jugos[0].".PHP_EOL;
echo "$people->john entonces dijo hola a $people->jane.".PHP_EOL;
echo "La esposa de $people->john's saludó a $people->robert.".PHP_EOL;
echo "$people->robert saludó a los dos $people->smiths."; // No funcionará
?>
El resultado del ejemplo sería:
El tomó algo de jugo de manzana. El tomó algo de jugo de naranja. El tomó algo de jugo hecho de s. El tomó algo de jugo púrpura. John Smith tomó algo de jugo de manzana. John Smith entonces dijo hola a Jane Smith. La esposa de John Smith's saludó a Robert Paulsen. Robert Paulsen saludó a los dos .
Para casos más complejos se debe emplear la sintaxis compleja.
Esta sintaxis no se llama compleja poque sea compleja de aplicar, sino porque permite el empleo de expresiones complejas.
Cualquier variable escalar, elemento de array o propiedad de objeto con una representación de string puede ser incluido a través de esta sintaxis. Simplemente se escribe la expresión del mismo modo en que debe aparecer por fuera del string, y entonces se encierra ente { y }. Dado que { no puede ser escapado, esta sintaxis será reconocida únicamente cuando el $ siga inmediatamente al {. Utilice {\$ para obtener un {$ literal. Algunos ejemplos para que quede más claro:
<?php
// Muestra todos los errores
error_reporting(E_ALL);
$great = 'fantastico';
// No funciona, resultado: Esto es { fantastico}
echo "Esto es { $great}";
// Funciona, resultado: Esto es fantastico
echo "Esto es {$great}";
echo "Esto es ${great}";
// Funciona
echo "Este cuadrado tiene {$square->width}00 centímetros de lado.";
// Funciona, claves entre comillas sólo funcionan utilizando la sintaxis de llaves
echo "Esto funciona: {$arr['key']}";
// Funciona
echo "Funciona: {$arr[4][3]}";
// No funciona por la misma razón que $foo[bar] es incorrecto fuera de una cadena.
// En otras palabras, funcionaría pero solo porque PHP primero busca por una constante
// llamada foo; un error del nivel E_NOTICE (constante no definida) puede ser lanzado.
echo "No funciona: {$arr[foo][3]}";
// Funciona. Cuando se usan arrays multidimensionales, siempre emplee llaves encerrando
// los arrays cuando se encuentre dentro de una cadena
echo "Funciona: {$arr['foo'][3]}";
// Funciona.
echo "Funciona: " . $arr['foo'][3];
echo "Tambien funciona: {$obj->values[3]->name}";
echo "Este es el valor de la variable llamada $name: {${$name}}";
echo "Este es el valor de la variable llamada por el valor de retorno de getName(): {${getName()}}";
echo "Este es el valor de la variable llamada por el valor de retorno de \$object->getName(): {${$object->getName()}}";
//No funciona, imprime: Esto es el valor de retorno de getName(): {getName ()}
echo "Esto es el valor de retorno de getName(): {getName()}";
?>
También es posible acceder a las propiedades de una clase usando variables dentro de cadenas al emplear ésta sintaxis.
<?php
class foo {
var $bar = 'Soy bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->$baz[1]}\n";
?>
El resultado del ejemplo sería:
Soy bar. Soy bar.
Nota:
Funciones, llamadas a métodos, variables estáticas de clases y constantes de clases dentro de {$} funcionan desde PHP 5. Sin embargo, el valor accedido puede ser interpretado como el nombre de la variable en el ámbito en el que la cadena está definida. Empleando llaves simples ({}) no servirá para acceder al valor de retorno de las funciones o métodos, constantes o variables estáticas de clases.
<?php
// Muestra todos los errores.
error_reporting(E_ALL);
class beers {
const softdrink = 'rootbeer';
public static $ale = 'ipa';
}
$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';
// Funciona; resultado: Me gusta una A & W
echo "Me gusta una {${beers::softdrink}}\n";
// Tambien funciona; resultado: Me gusta una Alexander Keith's
echo "Me gusta una {${beers::$ale}}\n";
?>
Los caracteres dentro de un string pueden ser accedidos y modificados especificando la posición de caracter deseado (en base a la posición cero del primer caracter del string) empleando los corchetes de array, como en $str[42]. Piense en este caso que un string se comporta como un array de caracteres. Las funciones substr() y substr_replace() pueden ser empleados para extraer y reemplazar más de un caracter.
Nota: Los String también pueden accederse utilizando llaves, como en $str{42}, para el mismo propósito.
Escribir fuera del rango es compensado rellenando el string con espacios.
Los tipos que no sean integer son convertidos a integer. Las compensaciones fuera
de rango emiten E_NOTICE. Las compensaciones negativas
emiten E_NOTICE en la escritura pero en la lectura obtienen
una cadena vacía. Sólo se emplea el primer carácter de un string asignado. La
asignación de un string vacío asigna un byte NULL.
Internamente, las cadenas de PHP son arrays de bytes. Por tanto, acceder o modificar una cadena utilizando los corchetes de array no es seguro con caracteres multi-byte, y sólo debe hacerse con cadenas en codificaciones de un solo bit como ISO-8859-1.
Ejemplo #9 Algunos ejemplos de cadenas
<?php
// Obtención del primer caracter de una cadena
$str = 'Esto es un test.';
$first = $str[0];
// Obtención del tercer caracter de una cadena
$third = $str[2];
// Obtención del último caracter de una cadena
$str = 'Esto sigue siendo un test.';
$last = $str[strlen($str)-1];
// Modificación del último caracter de una cadena
$str = 'Mira el mar';
$str[strlen($str)-1] = 'e';
?>
A partir de PHP 5.4 los índices de cadenas tienen que ser enteros o enteros en forma de cadena, si no se lanzará una advertencia. Anteriormente un índice como "foo" era convertido de manera silenciosa a 0.
Ejemplo #10 Diferencias entre PHP 5.3 y PHP 5.4
<?php
$str = 'abc';
var_dump($str['1']);
var_dump(isset($str['1']));
var_dump($str['1.0']);
var_dump(isset($str['1.0']));
var_dump($str['x']);
var_dump(isset($str['x']));
var_dump($str['1x']);
var_dump(isset($str['1x']));
?>
Muestra el ejemplo de arriba en PHP 5.3:
string(1) "b" bool(true) string(1) "b" bool(true) string(1) "a" bool(true) string(1) "b" bool(true)
Muestra el ejemplo de arriba en PHP 5.4:
string(1) "b" bool(true) Warning: Illegal string offset '1.0' in /tmp/t.php on line 7 string(1) "b" bool(false) Warning: Illegal string offset 'x' in /tmp/t.php on line 9 string(1) "a" bool(false) string(1) "b" bool(false)
Nota:
El acceso a variables de otros tipos (sin incluir arrays u objetos implementando las interfaces apropiadas) utilizando [] o {} silenciosamente retorna
NULL.
Nota:
PHP 5.5 añadió soporte para acceder a caracteres dentro de cadenas literales utilizando [] o {}.
Los string pueden ser concatenados empleando el operador '.' (punto). Fíjese que el operador '+' (suma) no servirá para concatenar. Consulte operadores de string para más información.
Hay una serie de funciones útiles para la manipulación de string.
Consulte la sección de funciones de string para funciones generales, y las funciones de expresiones regulares o las funciones de expresiones regulares compatibles con Perl para funcionalidades avanzadas de búsqueda y sustitución.
Tambien existen funciones para cadenas URL, y funciones para encriptar/desencriptar cadenas (mcrypt y mhash).
Finalmente, tambien existen las funciones para el tipo caracter.
Un valor puede convertirse a una string mediante el forzado (string) o la función strval(). La conversión automática a string tiene lugar en el contexto de una expresióin que necesita un string. Esto ocurre cuando se utilizan las funciones echo o print, o cuando una variables es comparada con un string. Las secciones sobre tipos y Manipulación de tipos pueden ayudarle a enterderlo con más claridad. Consulte tambien la función settype().
El valor TRUE del tipo boolean es convertido en el
string "1". El valor FALSE del tipo
boolean es convertido en el string ""
(la cadena vacía). Esto permite la conversión en ambos sentidos entre los valores de
los tipos boolean y string.
Un integer o float es convertido en un string representando textualmente el número (incluyendo la parte exponencial para los floats. Los números de punto flotante pueden ser convertidos mediante la notación exponencial (4.1E+6).
Nota:
El caracter para el punto decimal se define en el script de configuración regional (categoría LC_NUMERIC). Consulte la función setlocale().
Los arrays siempre se convierten en un string "Array". Debido a esto, tanto echo y print no pueden pos sí mismos mostrar el contenido de un array. Para ver un elemento individualmente, utilice una construcción como echo $arr['foo']. Mire los trucos en la parte inferior para mostrar el contenido por completo.
Los objects en PHP 4 siempre se convierten en un string "Object". Para mostrar los valores de las propiedades de un objeto para depuración, mire los parrafos siguientes. Para obtener el nombre de la clase del objeto emplée la función get_class(). A partir de PHP 5 se puede emplear el método __toString.
Los resources siempre se convierten en strings mediante la estructura "Resource id #1", donde 1 es el número único asignado al resource por PHP en tiempo de ejecución. No debe confiar en esta estructura, ya que está sujeto a cambios. Para obtener el tipo del resource emplee la función get_resource_type().
NULL siempre es convertido a una cadena vacía.
Como se ha indicado anteriormente, la conversión directa de un array, object o resource a un string no proporciona información útil acerca del valor, más allá de su tipo. Consulte las funciones print_r() y var_dump() para obtener maneras más efectivas de inspeccionar el contenido de estos tipos.
La mayoría de los valores de PHP pueden ser convertidos a strings para su almacenamiento permanente. Este método se denomina serialización, y es realizado mediante la función serialize(). Si la máquina PHP está contruida con soporte de WDDX, los valores de PHP tambien pueden ser serializacos como texto XML correctamente formateado.
Cuando una string es evaluada en un contexto numérico, el valor resultante y el tipo se determina como se explica a continuación.
Si el string no contiene ninguno de los caracteres '.', 'e',
o 'E' y el valor numérico está entre los límites del tipo entero (como se
define en PHP_INT_MAX), la string será
evaluada como un integer. En todos los demas casos será
evaluado como un float.
El valor es dado por la parte inicial del string. Si el string empieza con un número válido, éste será el valor usado. De otra forma, el valor será 0 (cero). Se considera número válido a un signo opcional, seguido de uno o más dígitos (opcionalmente puede contener un punto decimal), seguido de un exponente opcional. El exponente es una 'e' o 'E' seguida de uno o más dígitos.
<?php
$foo = 1 + "10.5"; // $foo es float (11.5)
$foo = 1 + "-1.3e3"; // $foo es float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo es integer (1)
$foo = 1 + "bob3"; // $foo es integer (1)
$foo = 1 + "10 Small Pigs"; // $foo es integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo es float (14.2)
$foo = "10.0 pigs " + 1; // $foo es float (11)
$foo = "10.0 pigs " + 1.0; // $foo es float (11)
?>
Para más información sobre esta conversión, consulte la página del manual UNIX correspondiente a strtod(3).
Para probar cualquiera de los ejemplos en esta sección, copie y pegue los ejemplos e incluya la siguiente línea para ver que está ocurriendo:
<?php
echo "\$foo==$foo; tipo es " . gettype ($foo) . "<br />\n";
?>
No espere obtener el código de un caracter convirtiendolo a un entero, como ocurre en C. Emplee las funciones ord() y chr() para convertir entre código ASCII y caracteres.
En PHP, los string se implementan como una matriz de bytes y con un entero que indica la longitud del buffer. No guarda ninguna información sobre cómo traducir esos bytes, relegando esa tarea al programador. No existe ninguna limitación sobre el valor que puede contener un string; en concreto, está permitido colocar un bytes con valor 0 (“bytes NUL”) en cualquier posición del string (existen algunas funciones, marcadas en este manual como que no utilizan "modo binario seguro", podrían rechazar estos strings para aquellas bibliotecas que ignoren los datos preceden a un byte NUL.)
Este comportamiento de los strings justifica el que no exista un tipo de dato "byte" en PHP – los strings se encargan de esto. Las funciones que no devuelvan datos de texto – por ejemplo, cualquier dato leído a partir de un socket de red – devolverán strings.
Dado que PHP no obliga a utilizar ninguna condificación en particular, uno podría preguntarse cómo se codifican los textos literales. Por ejemplo, ¿es el string "á" equivalente a "\xE1" (ISO-8859-1), "\xC3\xA1" (forma en C UTF-8), "\x61\xCC\x81" (forma en D UTF-8) o cualquier otra representación posible? La resuesta es que un string se codifica en cualesquiera forma en que estuviera el fichero de código. Por tanto, si un fichero de código estuviera escrito en ISO-8859-1, el string se codificará en ISO-8859-1, y así. Sin embargo, esto no es aplicable si Zend Multibyte está habilitado; en ese caso, el fichero de código podría estar escrito en cualquier codificación (declarada explícitamente o bien detectada) para después convertirse a una determinada codificación interna, que será entonces la codificación usada para los textos literales. Tenga presente que existen algunas limitaciones sobre la codificación del código fuente (o en la codificación internal, si Zend Multibyte estuviera habilitado) – esto suele significar que se debe usar uan codificación complatible con el conjunto ASCII, como por ejemplo UTF-8 o ISO-8859-1. Por contra, las codificaciones dependientes de estados, donde un mismo byte se puede utilizar en estados de desplazamiento iniciales y no iniciales, podría generar problemas.
Por supuesto, para poder ser útil, las funciones que operen con texto podrán partir de unos supuestos sobre cómo está codificado el string. Desafortunadamente, respecto a esto existen muchas variaciones en la funciones de PHP:
En resumen, esto significa que para escribir programas Unicode de forma correcta hay que evitar cuidadosamente las funciones que pudean fallar y que muy probablemente vuelvan los datos corruptos, y utilizar en su lugar las funciones que se comportan de forma correcta, generalmente de las extensiones intl y mbstring. Sin embargo, el utilizar funciones que puedan manejar codificaciones Unicode es sólo el principio. No importa qué funciones incorpore el lenguaje; es primordial conocer la especificación Unicode. Por ejemplo, un programa que asuma que sólo hay mayúsculas y minúsculas estará haciendo una suposición erronea.
Un array en PHP es realmente 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), una tabla asociativa (una implementación de un mapa), diccionario, colección, pila, cola, y posiblemente más. Ya que los valores de un array pueden ser otros arrays, árboles y también son posibles arrays multidimensionales.
Una explicación sobre tales estructuras de datos está fuera del alcance 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.
Un array puede ser creado usando el constructor del lenguaje array(). Éste toma un cierto número de parejas clave => valor como argumentos.
array(
clave => valor,
clave2 => valor2,
clave3 => valor3,
...
)
La coma después del elemento del array es opcional y se puede omitir. Esto normalmente se hace para arrays de una sola línea, esto es, es preferible array(1, 2) que array(1, 2, ). Por otra parte, para arrays multilínea, la coma final se usa comnúnmente, ya que permite la adición sencilla de nuevos elementos al final.
A partir de PHP 5.4 también se puede usar la sintaxis de array corta, que reemplaza array() con [].
Ejemplo #1 Un array simple
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
// a partir de PHP 5.4
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
La clave puede ser un integer o un string. El valor puede ser de cualquier tipo.
Además, los siguientes moldeados de tipo en la clave producirá:
Si varios elementos en la declaración del array usan la misma clave, sólo la última será usada y los demás son sobrescritos.
Ejemplo #2 Ejemplo de moldeado de tipo y sobrescritura
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>
El resultado del ejemplo sería:
array(1) {
[1]=>
string(1) "d"
}
Como todas las claves en el ejemplo anterior se convierten en 1, los valores serán sobrescritos en cada nuevo elemento y el último valor asignado "d" es el único que queda.
Los arrays PHP pueden contener claves integer y string al mismo tiempo ya que PHP no distingue entre arrays indexados y asociativos.
Ejemplo #3 Claves mixtas integer y string
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
?>
El resultado del ejemplo sería:
array(4) {
["foo"]=>
string(3) "bar"
["bar"]=>
string(3) "foo"
[100]=>
int(-100)
[-100]=>
int(100)
}
La clave es opcional. Si no se especifica, PHP usará el incremento de la clave integer más grande utilizada anteriormente.
Ejemplo #4 Arrays indexados sin clave
<?php
$array = array("foo", "bar", "hallo", "world");
var_dump($array);
?>
El resultado del ejemplo sería:
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "hallo"
[3]=>
string(5) "world"
}
Es posible especificar la clave sólo para algunos de los elementos y dejar por fuera a los demás:
Ejemplo #5 Claves no en todos los elementos
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>
El resultado del ejemplo sería:
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
Como se puede ver el último valor "d" se le asignó la clave 7. Esto es debido a que la mayor clave integer era 6.
Los elementos de array se pueden acceder utilizando la sintaxis array[key].
Ejemplo #6 Acceso a elementos de array
<?php
$array = array(
"foo" => "bar",
42 => 24,
"multi" => array(
"dimensional" => array(
"array" => "foo"
)
)
);
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>
El resultado del ejemplo sería:
string(3) "bar" int(24) string(3) "foo"
Nota:
Tanto los corchetes como las llaves pueden ser utilizadas de forma indiferente para acceder a elementos de un array (por ejemplo: $array[42] and $array{42} harán lo mismo en el ejemplo anterior).
A partir de PHP 5.4 es posible hacer referencia al array del resultado de una llamada a una función o método directamente. Antes sólo era posible utilizando una variable temporal.
Desde PHP 5.5 es posible hacer referencia directa un elemento de un array literal.
Ejemplo #7 Hacer referencia al resultado array de funciones
<?php
function getArray() {
return array(1, 2, 3);
}
// en PHP 5.4
$secondElement = getArray()[1];
// anteriormente
$tmp = getArray();
$secondElement = $tmp[1];
// o
list(, $secondElement) = getArray();
?>
Nota:
Si intenta acceder a una clave del array que no se ha definido es lo mismo que el acceso a cualquier otra variable no definida: se emitirá un mensaje de error de nivel
E_NOTICE, y el resultado seráNULL.
Un array existente puede ser modificado al definir valores explícitamente en éste.
Esto se realiza mediante la asignación de valores al array, especificando la clave en corchetes. La clave también se puede omitir, resultando en un par de corchetes vacíos ([]).
$arr[clave] = valor;
$arr[] = valor;
// clave puede ser un integer o string
// valor puede ser cualquier valor de cualquier tipo
Si $arr aún no existe, se creará, así que esto es también una forma alternativa de crear un array. Sin embargo, esta práctica es desaconsejada ya que si $arr ya contiene algún valor (p.ej. un string de una variable de petición), entonces este valor estará en su lugar y [] puede significar realmente el operador de acceso a cadenas. Siempre es mejor inicializar variables mediante una asignación directa.
Para cambiar un valor determinado, se debe asignar un nuevo valor a ese elemento con su clave. Para quitar un par clave/valor, se debe llamar la función unset() en éste.
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // Esto es lo mismo que $arr[13] = 56;
// en este punto de el script
$arr["x"] = 42; // Esto agrega un nuevo elemento a
// el array con la clave "x"
unset($arr[5]); // Esto elimina el elemento del array
unset($arr); // Esto elimina el array completo
?>
Nota:
Como se mencionó anteriormente, si no se especifica una clave, se toma el máximo de los índices integer existentes, y la nueva clave será ese valor máximo más 1 (aunque al menos 0). Si todavía no existen índices integer, la clave será 0 (cero).
Tenga en cuenta que la clave integer máxima utilizada para éste no es necesario que actualmente exista en el array. Ésta sólo debe haber existido en el array en algún momento desde la última vez que el array fué re-indexado. El siguiente ejemplo ilustra este comportamiento:
<?php
// Crear un array simple.
$array = array(1, 2, 3, 4, 5);
print_r($array);
// Ahora elimina cada elemento, pero deja el mismo array intacto:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// Agregar un elemento (note que la nueva clave 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 ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 )
Hay un buen número de funciones útiles para trabajar con arrays. Véase la sección funciones de array.
Nota:
La función unset() permite remover claves de un array. Tenga en cuenta que el array no es re-indexado. Si se desea un verdadero comportamiento "eliminar y desplazar", el array puede ser re-indexado usando la función array_values().
<?php
$a = array(1 => 'uno', 2 => 'dos', 3 => 'tres');
unset($a[2]);
/* producirá un array que se ha definido como
$a = array(1 => 'uno', 3 => 'tres');
y NO
$a = array(1 => 'uno', 2 =>'tres');
*/
$b = array_values($a);
// Ahora $b es array(0 => 'uno', 1 =>'tres')
?>
La estructura de control foreach existe específicamente para arrays. Ésta provee una manera fácil de recorrer un array.
Siempre deben usarse comillas alrededor de un índice de array tipo string literal. Por ejemplo, $foo['bar'] es correcto, mientras que $foo[bar] no lo es. ¿Pero por qué? Es común encontrar este tipo de sintaxis en scripts viejos:
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>
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.
Nota: 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: $i in /path/to/script.html on line 9 Mal: Bien: 1 Notice: Undefined index: $i in /path/to/script.html on line 11 Mal: Bien: 1 Revisando 1: Notice: Undefined index: $i in /path/to/script.html on line 9 Mal: Bien: 2 Notice: Undefined index: $i in /path/to/script.html on line 11 Mal: Bien: 2
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
// 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 'veggie'
// 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 cadena. 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_NUM_STRING'
// Esto por supuesto se aplica también al uso de superglobales en cadenas
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";
?>
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.
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.
Nota: Reiterando, al interior de un valor string entre comillas dobles, es válido no rodear los índices de array 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.
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 propiedades del object. Las claves 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 '\0A\0A'
}
class B extends A {
private $A; // Este campo se convertirá en '\0B\0A'
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 '\0A\0A'.
Es posible comparar arrays con la función array_diff() y mediante operadores de arrays.
El tipo array en PHP es bastante versátil. Aquí hay algunos ejempos:
<?php
// Esto:
$a = array( 'color' => 'red',
'taste' => 'sweet',
'shape' => 'round',
'name' => 'apple',
4 // 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 = array();
$b[] = 'a';
$b[] = 'b';
$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').
?>
Ejemplo #8 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,
-10
);
// esto es lo mismo que array(0 => 7, 1 => 8, ...)
$switching = array( 10, // key = 0
5 => 6,
3 => 7,
'a' => 4,
11, // key = 6 (el índice entero máximo era 5)
'8' => 2, // key = 8 (integer!)
'02' => 77, // key = '02'
0 => 12 // el valor 10 será reemplazado por 12
);
// array vacío
$empty = array();
?>
Ejemplo #9 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 gusta el rojo? ¿Le gusta el azul? ¿Le gusta el verde? ¿Le gusta el 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:
Ejemplo #10 Cambiando elemento en el bucle
<?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);
?>
El resultado del ejemplo sería:
Array
(
[0] => ROJO
[1] => AZUL
[2] => VERDE
[3] => AMARILLO
)
Este ejemplo crea un array con base uno.
Ejemplo #11 Í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'
)
Ejemplo #12 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);
?>
Los Arrays son ordenados. 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.
Ejemplo #13 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 arrays recursivas y multi-dimensionales.
Ejemplo #14 Arrays recursivos y multi-dimensionales
<?php
$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 anterior
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 arrays 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
?>
Para crear un nuevo object, utilice la declaración new para instanciar una clase:
<?php
class foo
{
function do_foo()
{
echo "Doing foo.";
}
}
$bar = new foo;
$bar->do_foo();
?>
Para una descripción completa, vea el capítulo Clases y Objetos.
Si un object se convierte en un object, éste no se
ve modificado. Si un valor de cualquier otro tipo se convierte en un
object, se crea una nueva instancia de la clase stdClass
incorporada. Si el valor es NULL, la nueva instancia estará vacía. Los Arrays
se convierten en un object con propiedades nombradas por claves
con sus correspondientes valores. Para cualquier otro valor, una variable miembro
denominada scalar contendrá el valor.
<?php
$obj = (object) 'ciao';
echo $obj->scalar; // muestra 'ciao'
?>
Un valor tipo resource es una variable especial, que contiene una referencia a un recurso externo. Los recursos son creados y usados por funciones especiales. Vea el apéndice para un listado de todas estas funciones y los tipos resource correspondientes.
Vea también la función get_resource_type().
Dado que las variables resource contienen gestores especiales a archivos abiertos, conexiones con bases de datos, áreas de pintura de imágenes y cosas por el estilo, la conversión a tipo resource carece de sentido.
Gracias al sistema de conteo de referencias introducido con el Motor Zend de PHP 4, un recurso que ya no es referenciado es detectado automáticamente, y es liberado por el recolector de basura. Por esta razón, rara vez se necesita liberar la memoria manualmente.
Nota: Los enlaces persistentes con bases de datos son una excepción a esta regla. Ellos no son destruidos por el recolector de basura. Vea también la sección sobre conexiones persistentes para más información.
El valor especial NULL representa una variable sin valor. NULL es el
único valor posible del tipo null.
Una variable es considerada null si:
se le ha asignado la constante NULL.
no se le ha asignado un valor todavía.
se ha destruido con unset().
No hay más que un valor de tipo null, y es la
constante NULL insensible a mayúsculas/minúsculas.
<?php
$var = NULL;
?>
NULL
Convertir una variable a null usando (unset) $var
no eliminará la variable ni destruirá su valor.
Sólo retornará un valor NULL.
Las llamadas de retorno se pueden indicar con el tipo callable a partir de PHP 5.4. Esta documentación utilizó la información del tipo callback con el mismo propósito.
Algunas funciones como call_user_func() o usort() aceptan como parámetro funciones de llamada de retorno definidas por el usuario. Las funciones de llamadas de retorno no sólo pueden ser funciones simples, sino también métodos de un object, incluyendo métodos de clase estáticos.
Una función de PHP se pasa por su nombre como un string. Se puede utilizar cualquier función nativa o definida por el usuario, exceptuando contrucciones del lenguaje, tales como: array(), echo, empty(), eval(), exit(), isset(), list(), print o unset().
Un método de un object instanciado se pasa como un array que contiene un object en el índice 0 y el nombre del método en el índice 1.
Los métodos de clase estáticos también se pueden pasar sin instanciar un object de dicha clase, pasando el nombre de la clase en lugar de un object en el índice 0. A partir de PHP 5.2.3, también es posible pasar 'NombreDeClase::nombreDeMetodo'.
Además de las funciones definidas por el usuario normales, también se puede utilizar la función create_function() para crear funciones de llamadas de retorno anónimas. A partir de PHP 5.3.0 también es posible pasar una clausura a un parámetro de una llamada de retorno.
Ejemplo #1 Ejemplos de funciones de llamadas de retorno
<?php
// Un ejemplo de función de llamada de retorno
function mi_función_de_llamada_de_retorno() {
echo '¡hola mundo!';
}
// Un ejemplo de método de llamada de retorno
class MiClase {
static function miMétodoDeLlamadaDeRetorno() {
echo '¡Hola Mundo!';
}
}
// Tipo 1: Llamada de retorno simple
call_user_func('mi_función_de_llamada_de_retorno');
// Tipo 2: Llamada a un método de clase estático
call_user_func(array('MiClase', 'miMétodoDeLlamadaDeRetorno'));
// Tipo 3: Llamada al método de un objeto
$obj = new MiClase();
call_user_func(array($obj, 'miMétodoDeLlamadaDeRetorno'));
// Tipo 4: Llamada a un método de clase estático (A partir de PHP 5.2.3)
call_user_func('MiClase::miMétodoDeLlamadaDeRetorno');
// Tipo 5: Llamada a un método de clase estático relativo (A partir de PHP 5.3.0)
class A {
public static function quién() {
echo "A\n";
}
}
class B extends A {
public static function quién() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::quién')); // A
?>
Ejemplo #2 Ejemplo de llamada de retorno utilizando una clausura
<?php
// Nuestra clausura
$doble = function($a) {
return $a * 2;
};
// Este es nuestro rango de números
$números = range(1, 5);
// Usar la clausura como llamada de retorno para
// doblar el valor de cada elemento de nuestro
// rango
$números_nuevos = array_map($doble, $números);
print implode(' ', $números_nuevos);
?>
El resultado del ejemplo sería:
2 4 6 8 10
Nota: En PHP 4 era necesario usar una referencia para crear una llamada de retorno que apuntara al object real, y no a una copia del mismo. Para más detalles, véase la Explicación de las referencias.
Nota:
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.
mixed indica que un parámetro puede aceptar múltiples tipos (pero no necesariamente todos).
gettype(), por ejemplo, puede aceptar todos los tipos PHP, mientras que str_replace() sólo acepta strings y arrays.
Los pseudo-tipos callback fueron usados en está documentación antes de que la sugerencia de tipo callable fuera introducida en PHP 5.4. Significan exactamente lo mismo.
void como un tipo de variable de retorno significa que el valor de retorno no es útil. void en una lista de parámetros significa que la función no acepta ningún parámetro.
$... en el prototipo de funciones significa
and so on. Este nombre de variable se usa cuando una función
puede tomar un número infinito de argumentos.
PHP no requiere (ni soporta) la definición explicita de tipos en la declaración de variables; el tipo de la variable se determina por el contexto en el cual se emplea la variable. Es decir, si se asigna un valor string a una variable $var, entonces $var se convierte en un string. Si un valor integer es entonces asignado a la misma variable $var, ésta se convierte en integer.
Un ejemplo de la conversión de tipos automática de PHP es el operador suma '+'. Si ambos operandos son float, entonces ambos operandos son evaluados como floats y el resultado será un float. De otra manera, los operandos seran interpretados como integers, y el resultado será entonces integer. Tenga en cuenta que esto no implica que se cambien los tipos de los propios operandos; el único cambio es en como se evalúan los operandos y en el tipo de expresión en sí mismo.
<?php
$foo = "0"; // $foo es string (ASCII 48)
$foo += 2; // $foo es ahora un integer (2)
$foo = $foo + 1.3; // $foo es ahora un float (3.3)
$foo = 5 + "10 Cerditos pequeñitos"; // $foo es integer (15)
$foo = 5 + "10 Cerdos pequeños"; // $foo es integer (15)
?>
Si considera confusos los últimos dos ejemplos anteriores, consulte Conversión de cadenas a números.
Para forzar a que una variable sea evaluada como un determinado tipo, consulte la sección Forzado de tipos. Para cambiar el tipo de variable, consulte la función settype().
Para probar cualquiera de los ejemplos de esta sección, utilice la función var_dump().
Nota:
El comportamiento de la conversión automática en array está actualmente sin definir.
Tambien, debido a que PHP soporta el indexado de string mediante compensaciones mediante la misma sintaxis empleada en el indexado de arrays, los siguientes ejemplos son válidos para todas las versiones de PHP:
<?php
$a = 'car'; // $a es un string
$a[0] = 'b'; // $a sigue siendo un string
echo $a; // bar
?>Consulte la sección Acceso a cadenas mediante caracteres para más información.
El forzado de tipos en PHP funciona de la misma manera que en C:, donde el nombre del tipo deseado se escribe entre paréntesis antes de la variable que se quiera forzar.
<?php
$foo = 10; // $foo es un integer
$bar = (boolean) $foo; // $bar es un boolean
?>
Los siguientes forzados de tipos están permitidos:
El forzado (binary) y el soporte del prefijo b fueron añadidos en PHP 5.2.1
Fíjese que se permiten las tabulaciones y espacios dentro de los paréntesis, por lo que los siguientes ejemplos son funcionalmente equivalentes:
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
Forzado literal de strings y variables a strings binarios:
<?php
$binary = (binary) $string;
$binary = b"binary string";
?>
Nota:
El lugar de forzar una variable a string, tambien se puede encerrar la variable entre comillas dobles.
<?php
$foo = 10; // $foo es un integer
$str = "$foo"; // $str es un string
$fst = (string) $foo; // $fst es tambien un string
// Esto muestra que "son lo mismo"
if ($fst === $str) {
echo "son lo mismo";
}
?>
Puede que no sea obvio que sucede exactamente cuando se fuerzan ciertos tipos. Para más información, consulte estas secciones:
En PHP las variables se representan con un signo de dólar seguido por el nombre de la variable. El 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]*'
Nota: Para los propósitos de este manual, una letra es a-z, A-Z, y los bytes del 127 al 255 (0x7f-0xff).
Nota: $this es una variable especial que no puede ser asignada.
Vea también Guia de Entorno de Usuario para Nombres.
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"; // imprime "Roberto, Juan"
$4site = 'aun no'; // inválido; comienza con un número
$_4site = 'aun no'; // válido; comienza con un carácter de subrayado
$täyte = 'mansikka'; // 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 de 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"; // Modifica $bar...
echo $bar;
echo $foo; // $foo también se modifica.
?>
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.
$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ío.
Ejemplo #1 Valores predeterminados en variables sin inicializar
<?php
// Una variable no definida Y no referenciada (sin contexto de uso); imprime NULL
var_dump($variable_indefinida);
// Uso booleano; imprime 'false' (Vea operadores ternarios para más información sobre esta sintaxis)
echo($booleano_indefinido ? "true\n" : "false\n");
// 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.net/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 incluir 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 inicializado. La construcción del lenguaje isset() puede ser usada para detectar si una variable ya ha sido inicializada.
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.
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. Tener 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 .
Nota: Variables variables
Las superglobales no pueden ser usadas como variables variables al interior de funciones o métodos de clase.
Nota:
Aún 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.
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:
<?php
$a = 1;
include 'b.inc';
?>
Aquí, la variable $a estará disponible al interior del script incluido 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.
En primer lugar, un ejemplo de uso de global:
Ejemplo #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í:
Ejemplo #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:
Ejemplo #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 funciones.
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'];
}
?>
Nota:
Utilizar una clave global fuera de una función no es un error. Esta puede ser utilizada aún si el fichero está incluido desde el interior de una función.
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:
Ejemplo #4 Ejemplo que demuestra la necesidad de variables estáticas
<?php
function test()
{
$a = 0;
echo $a;
$a++;
}
?>
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:
Ejemplo #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:
Ejemplo #6 Variables estáticas con funciones recursivas
<?php
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
?>
Nota:
Las variables estáticas pueden ser declaradas 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.
Ejemplo #7 Declaración de variables estáticas
<?php
function foo(){
static $int = 0; // correcto
static $int = 1+2; // incorrecto (ya que es una expresión)
static $int = sqrt(121); // incorrecto (es una expresión también)
$int++;
echo $int;
}
?>
Nota:
Las declaraciones estáticas son resueltas en tiempo de compilación.
Nota:
Utilizar una clave global fuera de una función no es un error. Esta pueda ser utilizada aún si el fichero está incluido en el interior de una función.
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:
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() {
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:
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.
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';
?>
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.
También se pueden usar llaves para delimitar de forma clara el nombre de la propiedad. Son muy útila al acceder a valores dentro una propiedad que contiene un array, cuando el nombre de la propiedad está compuesto de múltiples partes, o cuando el nombre de la propiedad contiene caracteres que de otro modo no son válidos (p.ej. desde json_decode() o SimpleXML).
Ejemplo #1 Ejemplo de propiedad variable
<?php
class foo {
var $bar = 'Soy bar.';
var $arr = array('Soy A.', 'Soy B.', 'Soy C.');
var $r = 'Soy r.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "\n";
echo $foo->$baz[1] . "\n";
$start = 'b';
$end = 'ar';
echo $foo->{$start . $end} . "\n";
$arr = 'arr';
echo $foo->$arr[1] . "\n";
echo $foo->{$arr}[1] . "\n";
?>
El resultado del ejemplo sería:
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.
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:
Ejemplo #1 Variables de formulario simples
<form action="foo.php" method="post">
Nombre usuario: <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:
Ejemplo #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().
Nota:
Las matrices superglobales, como $_POST y $_GET, están disponibles desde PHP 4.1.0.
Nota:
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.
Nota:
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!\"). Se consideró que esto era necesario para el escape de caracteres para su inserción en base de datos hace una década, pero actualmente es una característica obsoleta que debe ser desactivada. Ver también addslashes(), stripslashes() y magic_quotes_sybase.
PHP también entiende arrays 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:
Ejemplo #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>
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.
PHP soporta cookies de HTTP de forma transparente tal y como están definidas en » RFC 6265. 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);
?>
Esto creará dos cookies separadas aunque MiCookie 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:
Ejemplo #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);
?>
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 */
?>
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).
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.
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 expresión regular, se representaría de la siguiente manera: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
Vea también Guia de Entorno de Usuario para Nombres.
Ejemplo #1 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");
?>
Nota: 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 constantes 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.
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 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.
Nota: Las contantes y las variables (globales) se encuentran en un espacio de nombres distinto. Esto implica que por ejemplo
TRUEy $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:
Ejemplo #1 Definiendo constantes
<?php
define("CONSTANT", "Hola mundo.");
echo CONSTANT; // muestra "Hola mundo."
echo Constant; // muestra "Constant" y provoca un error.
?>
Ejemplo #2 Definiendo constantes usando el keyword const
<?php
// Funciona desde PHP 5.3.0
const CONSTANT = 'Hola Mundo';
echo CONSTANT;
?>
Nota:
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.
PHP ofrece un largo número de constantes predefinidas a cualquier script en ejecucción. Muchas de estas constantes, sin embargo, son creadas por diferentes extensiones, y sólo estarán presentes si dichas extensiones están disponibles, bien por carga dinámica o porque han sido compiladas.
Hay ocho 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:
| Nombre | Descripción |
|---|---|
__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 según las circunstancias.
|
__DIR__ |
Directorio del fichero. Si se utiliza dentro de un include, devolverá el directorio del fichero incluído. 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) |
__FUNCTION__ |
Nombre de la función. (Añadida en PHP 4.3.0) Desde PHP 5 esta constante devuelve 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. El nombre de la clase incluye el namespace declarado en (p.e.j. Foo\Bar). Tenga en cuenta que a partir de PHP 5.4 __CLASS__ también funciona con traits. Cuando es usado en un método trait, __CLASS__ es el nombre de la clase del trait que está siendo utilizado. |
__TRAIT__ |
El nombre de el trait. (Añadido en PHP 5.4.0) A partir de PHP 5.4 esta constante devuelve el trait que fué declarado (sensible a mayúsculas y minúsculas). El nombre de el trait incluye el namespace si alguno fué declarado en (p.e.j. Foo\Bar). |
__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). |
__NAMESPACE__ |
Nombre del espacio de nombres actual (sensible a mayúsculas). Esta constante se define en tiempo de compilación (Añadida en PHP 5.3.0) El nombre del namespace actual (sensible a mayúsculas). |
Véase también get_class(), get_object_vars(), file_exists() y function_exists().
La expresiones son las piedras de construcción más importantes de PHP. En PHP casi todo lo que se escribe es una expresión. La manera más simple y acertada de definir lo que es una expresión es "cualquier cosa que tiene un valor".
Las formas más básicas de expresiones son las constantes y las variables. Cuando se escribe "$a = 5", se está asignando '5' a $a. '5', obviamente, tiene el valor 5, o en otras palabras, '5' es una expresión con el valor de 5 (en este caso, '5' es una constante entera).
Después de esta asignación, se espera que el valor de $a sea 5 también, por lo que si se escribe $b = $a, se espera que esto se comporte tal como si se escribiera $b = 5. En otras palabras, $a es también una expresión con el valor 5. Si todo funciona bien, esto es exactamente lo que sucederá.
Un ejemplo de expresiones algo más complejo son las funciones. Por ejemplo, considere la siguiente función:
<?php
function foo ()
{
return 5;
}
?>
Asumiendo que está familiarizado con el concepto de función (si no lo está, échele una ojeada al capítulo sobre funciones), asumirá que escribir $c = foo() es esencialmente igual que escribir $c = 5. Y está en lo cierto. Las funciones son expresiones con el valor de sus valores devueltos. Ya que foo() devuelve 5, el valor de la expresión 'foo()' es 5. Normalmente las funciones no sólo devuelven un valor estático, sino que computan algo.
Por supuesto, los valores en PHP no tienen que ser enteros, y con frecuencia no lo son. PHP soporta cuatro tipos de valores escalares: valores enteros (integer), valores de coma (punto) flotante (float), valores de cadena (string) y valores booleanos (boolean) - (valores escalares son aquellos que no se pueden descomponer en piezas más pequeñas, a diferencia de las matrices, por ejemplo). PHP también soporta dos tipos compuestos (no escalares): matrices (arrays) y objetos. Cada uno de estos tipos de valores pueden ser asignados a variables o devueltos desde funciones.
PHP lleva las expresiones mucho más allá, de la misma manera que lo hacen otros lenguajes. PHP es un lenguaje orientado a expresiones, en el sentido de que casi todo es una expresión. Considere el ejemplo que ya hemos tratado, '$a = 5'. Es fácil de ver que aquí hay dos valores involucrados, el valor de la constante entera '5', y el valor de $a que ha sido actualizado a 5 también. Aunque la verdad es que existe aquí un valor adicional involucrado, que es el valor de la asignación misma. La asignación evalúa al valor asignado, en este caso 5. En la práctica, esto significa que '$a = 5', sin importar lo que haga, es una expresión con el valor 5. De este modo, escribir algo como '$b = ($a = 5)' es igual que escribir '$a = 5; $b = 5;' (el punto y coma marca el final de una sentencia). Ya que las asignaciones se analizan de derecha a izquierda, también se puede escribir '$b = $a = 5'.
Otro buen ejemplo de orientación a expresiones es el pre- y post-incremento y decremento. Los usuarios de PHP y de otros muchos lenguajes pueden estar familiarizados con la notación variable++ y variable--. Éstos son los operadores de incremento y decremento. En PHP, al igual que en C, hay dos tipos de incrementos - pre-incremento y post-incremento. Ambos esencialmente incrementan la variable, y el efecto sobre la variable es idéntico. La diferencia está con el valor de la expresión de incremento. Pre-incremento, que se escribre '++$variable', evalúa al valor incrementado (PHP incrementa la variable antes de leer su valor, de ahí el nombre de 'pre-incremento'). Post-incremento, que se escribe '$variable++' evalúa el valor original de $variable, antes de que sea incrementado (PHP incrementa la variable después de leer su valor, de ahí el nombre de 'post-incremento').
Un tipo de expresiones muy comunes son las expresiones de comparación.
Estas expresiones evalúan si algo es FALSE (falso) o TRUE (verdadero). PHP
soporta > (mayor que), >= (mayor o igual que), == (igual),
!= (distinto), < (menor que) y <= (menor o igual que).
El lenguaje también soporta un conjunto de operadores de equivalencia estricta: ===
(igual y del mismo tipo) y !== (diferente o de distinto tipo).
Estas expresiones se usan mayormente dentro de ejecuciones condicionales,
tales como la sentencia if.
El último ejemplo de expresiones que trataremos aquí es una combinación de expresiones operador-asignación. Ya sabe que si quiere incrementar $a en 1, puede simplemente escribir '$a++' o '++$a'. Pero si lo que quiere es añadirle más de uno, por ejemplo 3, podría escribir '$a++' varias veces, pero esto, obviamente, no es una manera muy eficiente o cómoda. Una práctica mucho más común es escribir '$a = $a + 3'. '$a + 3' evalúa al valor de $a más 3, y se vuelve a asignar a $a, lo que resulta en incrementar $a en 3. En PHP, como en otros lenguajes como C, se puede escribir esto de una manera más abreviada, lo que con el tiempo se podría convertir en una forma más clara y rápida de entenderlo. Añadir 3 al valor actual de $a puede ser escrito '$a += 3'. Esto significa exactamente "toma el valor de $a, añádele 3 y asígnalo de nuevo a $a". Además de ser más corto y claro, también resulta en una ejecución más rápida. El valor de '$a += 3', al igual que el valor de una asignación normal, es el valor asignado. Observe que NO es 3, sino el valor combinado de $a más 3 (éste es el valor que es asignado a $a). Se puede usar cualquier operador compuesto de dos partes en este modo de operador-asignación, por ejemplo '$a -= 5' (restar 5 del valor de $a), '$b *= 7' (multiplicar el valor de $b por 7), etc.
Existe una expresión más que le puede parecer rara si no la ha visto en otros lenguajes, el operador condicional ternario:
<?php
$primero ? $segundo : $tercero
?>
Si el valor de la primera subexpresión es TRUE (no es cero),
se evalúa la segunda subexpresión, y ése será el resultado de
la expresión condicional. Si no, se evalúa la tercera
subexpresión, y ése será el valor.
El siguiente ejemplo debería ayudarle a comprender un poco mejor el pre- y post-incremento y las expresiones en general:
<?php
function doble($i)
{
return $i*2;
}
$b = $a = 5; /* asignar el valor cinco a la variable $a y $b */
$c = $a++; /* post-incremento, asignar el valor original de $a
(5) a $c */
$e = $d = ++$b; /* pre-incremento, asignar el valor incrementado de
$b (6) a $d y $e */
/* en este punto, $d y $e son iguales a 6 */
$f = doble($d++); /* asignar el doble del valor de $d antes
del incremento, 2*6 = 12, a $f */
$g = doble(++$e); /* asignar el doble del valor de $e después
del incremento, 2*7 = 14, a $g */
$h = $g += 10; /* primero, $g es incrementado en 10 y finaliza con el
valor 24. El valor de la asignación (24) es
asignado después a $h, y $h finaliza también con el
valor 24. */
?>
Algunas expresiones pueden considerarse como sentencias. En este caso, una sentencia tiene la forma 'expr ;', es decir, una expresión seguida de un punto y coma. En '$b = $a = 5;', '$a = 5' es una expresión válida, pero no es una sentencia en sí. Sin embargo, '$b = $a = 5;' es una sentencia válida.
Lo último que vale la pena mencionar es el valor verdadero de las expresiones.
En muchos casos, principalmente en ejecuciones condicionales y bucles, no
interesa saber el valor específico de la expresión, sino sólo
si el valor significa TRUE o FALSE.
Las constantes TRUE y FALSE (insensible a mayúsculas-minúsculas) son los
dos valores booleanos posibles. Cuando es necesario, una expresión es
convertida automáticamente al tipo boolean. Véase la
sección sobre
conversión de tipos para más detalles.
PHP proporciona una implementación completa y potente de expresiones, y documentarla por completo va más allá del ámbito de este manual. Los ejemplos de arriba deberían darle una buena idea de lo que son las expresiones y cómo construir expresiones útiles. Durante el resto de este manual se escribirá expr para indicar cualquier expresión de PHP válida.
Un operador es algo que toma uno más valores (o expresiones, en jerga de programación) y produce otro valor (de modo que la construcción en si misma se convierte en una expresión).
Los operadores se pueden agrupar de acuerdo con el número de valores que toman. Los operadores unarios toman sólo un valor, por ejemplo ! (el operador lógico de negación) o ++ (el operador de incremento). Los operadores binarios toman dos valores, como los familiares operadores aritméticos + (suma) y - (resta), y la mayoría de los operadores de PHP entran en esta categoría. Finalmente, hay sólo un operador ternario, ? :, el cual toma tres valores; usualmente a este se le refiere simplemente como "el operador ternario" (aunque podría tal vez llamarse más correctamente como el operador condicional).
Una lista completa de operadores de PHP sigue en la sección Precedencia de Operadores. La sección también explica la precedencia y asociatividad de los operadores, las cuales gobiernan exactamente cómo son evaluadas expresiones que contienen varios diferentes operadores.
La precedencia de un operador indica qué tan "estrechamente" se unen dos expresiones juntas. Por ejemplo, en la expresión 1 + 5 * 3 , la respuesta es 16 y no 18 porque el operador de multiplicación ("*") tiene una precedencia mayor que el operador de adición ("+"). Los paréntesis pueden ser usados para forzar la precedencia, si es necesario. Por ejemplo: (1 + 5) * 3 se evalúa como 18.
Cuando los operadores tienen la misma precedencia, su asociatividad decide si se evalúan a partir de la derecha o desde la izquierda - ver más abajo los ejemplos.
La siguiente tabla lista en orden la precedencia de los operadores, con los operadores de mayor precedencia en la parte superior. Los operadores en la misma línea tienen la misma precedencia, en cuyo caso su asociatividad decide cuál es el orden de evaluación.
| Asociatividad | Operadores | Información adicional |
|---|---|---|
| no asociativo | clone new | clone and new |
| izquierda | [ | array() |
| derecha | ++ -- ~ (int) (float) (string) (array) (object) (bool) @ | tipos e incremento/decremento |
| no asociativo | instanceof | tipos |
| derecha | ! | lógico |
| izquierda | * / % | aritmética |
| izquierda | + - . | aritmética y string |
| izquierda | << >> | bit a bit |
| no asociativo | < <= > >= | comparación |
| no asociativo | == != === !== <> | comparación |
| izquierda | & | bit a bit y referencias |
| izquierda | ^ | bit a bit |
| izquierda | | | bit a bit |
| izquierda | && | lógico |
| izquierda | || | lógico |
| izquierda | ? : | ternario |
| derecha | = += -= *= /= .= %= &= |= ^= <<= >>= => | asignación |
| izquierda | and | lógico |
| izquierda | xor | lógico |
| izquierda | or | lógico |
| izquierda | , | muchos usos |
Para operadores de igual precedencia, asociatividad izquierda significa que
la evaluación procede de la izquierda a la derecha y asociatividad derecha significa
lo opuesto. Los operadores de igual precedencia que no son asociativos
podrían no asociarse con sí mismos. Por ejemplo, la
sentencia 1 < 2 > 1, es ilegal en PHP; mientras que
la sentencia 1 <= 1 == 1 no lo es, ya que el
operador T_IS_EQUAL tiene menos precedencia que
el operador T_IS_SMALLER_OR_EQUAL.
Ejemplo #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
// mezclar ++ y + produce un comportamiento indefinido
$a = 1;
echo ++$a + $a++; // puede mostrar 4 o 5
?>
Nota:
Aunque = tiene una precedencia menor que la mayoría de los demás operadores, PHP permitirá aun expresiones similares a lo siguiente: if (!$a = foo()), en cuyo caso el valor devuelto de foo() es puesto en $a.
¿Recuerda la aritmética básica de la escuela? Estos funcionan igual que aquellos.
| Ejemplo | Nombre | Resultado |
|---|---|---|
| -$a | Negación | Opuesto de $a. |
| $a + $b | Adición | Suma de $a y $b. |
| $a - $b | Sustracción | Diferencia de $a y $b. |
| $a * $b | Multiplicación | Producto de $a y $b. |
| $a / $b | División | Cociente de $a y $b. |
| $a % $b | Módulo | Resto de $a dividido por $b. |
El operador de división ("/") devuelve un valor flotante a menos que los dos operandos sean integers (o strings que se conviertan a integers) y los números sean divisibles, en cuyo caso será devuelto un valor integer.
Los operandos del módulo se convierten en integers (por extracción de la parte decimal) antes del procesamiento.
El resultado del operador módulo % tiene el mismo signo que el dividendo — es decir, el resultado de $a % $b tendrá el mismo signo que $a. Por ejemplo:
<?php
echo (5 % 3)."\n"; // muestra 2
echo (5 % -3)."\n"; // muestra 2
echo (-5 % 3)."\n"; // muestra -2
echo (-5 % -3)."\n"; // muestra -2
?>
Véase también la página del manual sobre funciones matemáticas.
El operador básico de asignación es "=". Se podría inclinar a pensar primero que es como un "igual a". No lo es. Realmente significa que el operando de la izquierda se establece con el valor de la expresión de la derecha (es decir, "se define como").
El valor de una expresión de asignación es el valor asignado. Es decir, el valor de "$a = 3" es de 3. Esto permite hacer algunas cosas intrincadas:
<?php
$a = ($b = 4) + 5; // ahora $a es igual a 9 y $b se ha establecido en 4.
?>
Para arrays, asignar un valor a una clave con nombre se realiza utilizando el operador "=>". La precedencia de este operador es la misma que otros operadores de asignación.
Además del operador básico de asignación, existen "operadores combinados" para todos los de aritmética binaria, unión de arrays y operadores de strings que permiten usar un valor en una expresión y entonces establecer su valor como el resultado de esa expresión. Por ejemplo:
<?php
$a = 3;
$a += 5; // establece $a en 8, como si se hubiera dicho: $a = $a + 5;
$b = "Hola ";
$b .= "ahí!"; // establece $b en "Hola ahí!", al igual que $b = $b . "ahí!";
?>
Tener en cuenta que la asignación copia la variable original en la nueva (asignación por valor), por lo que los cambios en una no afectarán a la otra. Esto también puede tener relevancia si se necesita copiar algo como un gran array dentro de un bucle estrecho.
Una excepción al comportamiento usual de la asignación por valor en PHP ocurre con objects los cuales son asignados por referencia en PHP 5. Los objetos pueden ser explícitamente copiados por medio de la palabra clave clone.
La asignación por referencia también está soportada, utilizando la sintaxis "$var = &$othervar;". Asignación por referencia significa que ambas variables terminan apuntando a los mismos datos y nada es copiado en ninguna parte.
Ejemplo #1 Asignación por referencia
<?php
$a = 3;
$b = &$a; // $b es una referencia para $a
print "$a\n"; // muestra 3
print "$b\n"; // muestra 3
$a = 4; // cambia $a
print "$a\n"; // muestra 4
print "$b\n"; // muestra 4 también, dado que $b es una referencia para $a, la cual ha
// sido cambiada
?>
Desde PHP 5, el operador new
retorna una referencia automáticamente, así que asignar el resultado de
new por referencia, resulta
en un mensaje E_DEPRECATED en PHP 5.3 y posteriores y
un mensaje E_STRICT en versiones anteriores.
Por ejemplo, éste código resultará en una advertencia:
<?php
class C {}
/* La siguiente línea genera el siguiente mensaje de error:
* Deprecated: Assigning the return value of new by reference is deprecated in...
*/
$o = &new C;
?>
Más información sobre referencias y sus usos potenciales se puede encontrar en la sección del manual Referencias Explicadas
Los operadores bit a bit permiten la evaluación y la manipulación de bits específicos dentro de un integer.
| Ejemplo | Nombre | Resultado |
|---|---|---|
$a & $b |
And (y) | Los bits que están activos en ambos $a y $b son activados. |
$a | $b |
Or (o inclusivo) | Los bits que están activos ya sea en $a o en $b son activados. |
$a ^ $b |
Xor (o exclusivo) | Los bits que están activos en $a o en $b, pero no en ambos, son activados. |
~ $a |
Not (no) | Los bits que están activos en $a son desactivados, y viceversa. Bits that are set in $a are not set, and vice versa. |
$a << $b |
Shift left(desplazamiento a izquierda) | Desplaza los bits de $a, $b pasos a la izquierda (cada paso quiere decir "multiplicar por dos"). |
$a >> $b |
Shift right (desplazamiento a derecha) | Desplaza los bits de $a, $b pasos a la derecha (cada paso quiere decir "dividir por dos"). |
El desplazamiento de bits en PHP es aritmético. Los bits desplazados por fuera de cualquiera de los extremos son descartados. Desplazamientos de izquierda tienen ceros desplazados a la derecha mientras que el bit de signo es desplazado fuera a la izquierda, es decir que no se conserva el signo de un operando. Desplazamientos a la derecha tienen copias del bit de signo desplazado a la izquierda, es decir que se conserva el signo de un operando.
Utilice paréntesis para garantizar la precedencia deseada. Por ejemplo, $a & $b == true evalúa la equivalencia y luego el bit a bit, mientras que ($a & $b) == true evalúa el bit a bit y luego la equivalencia.
Sea consciente de las conversiones de tipos de datos. Si tanto los parámetros de la izquierda como los de la derecha son cadenas, el operador bit a bit operará en los valores ASCII de los caracteres.
La configuración error_reporting del PHP ini utiliza valores de bit a bit,
lo que ofrece una demostración del mundo real de desactivar
bits. Para mostrar todos los errores, a excepción de los avisos,
las instrucciones del archivo php.ini dicen utilizar:
E_ALL & ~E_NOTICE
Esto funciona iniciando con E_ALL:
00000000000000000111011111111111
Luego se toma el valor de E_NOTICE ...
00000000000000000000000000001000
... y se invierte por medio de ~:
11111111111111111111111111110111
Finalmente, se utiliza AND (&) para encontrar los bits que se
activaron en ambos valores:
00000000000000000111011111110111
Otra forma de lograrlo es mediante XOR (^)
para encontrar los bits que están activados en sólo el primer valor o en el otro:
E_ALL ^ E_NOTICE
error_reporting también se puede utilizar para demostrar la activación de bits.
La forma para mostrar sólo los errores y los errores recuperables es:
E_ERROR | E_RECOVERABLE_ERROR
Este proceso combina E_ERROR
00000000000000000000000000000001
y
00000000000000000001000000000000
usando el operador OR (|)
para obtener los bits activados en cualquiera de estos valores:
00000000000000000001000000000001
Ejemplo #1 Operaciones AND, OR y XOR bit a bit sobre integers
<?php
/*
* Ignore la sección superior,
* es sólo el formateado para hacer la salida más clara.
*/
$format = '(%1$2d = %1$04b) = (%2$2d = %2$04b)'
. ' %3$s (%4$2d = %4$04b)' . "\n";
echo <<<EOH
--------- --------- -- ---------
resultado valor op prueba
--------- --------- -- ---------
EOH;
/*
* Aquí están los ejemplos.
*/
$values = array(0, 1, 2, 4, 8);
$test = 1 + 4;
echo "\n AND bit a bit \n";
foreach ($values as $value) {
$result = $value & $test;
printf($format, $result, $value, '&', $test);
}
echo "\n OR inclusivo bit a bit \n";
foreach ($values as $value) {
$result = $value | $test;
printf($format, $result, $value, '|', $test);
}
echo "\n OR exclusivo (XOR) bit a bit \n";
foreach ($values as $value) {
$result = $value ^ $test;
printf($format, $result, $value, '^', $test);
}
?>
El resultado del ejemplo sería:
--------- --------- -- --------- resultado valor op prueba --------- --------- -- --------- AND bit a bit ( 0 = 0000) = ( 0 = 0000) & ( 5 = 0101) ( 1 = 0001) = ( 1 = 0001) & ( 5 = 0101) ( 0 = 0000) = ( 2 = 0010) & ( 5 = 0101) ( 4 = 0100) = ( 4 = 0100) & ( 5 = 0101) ( 0 = 0000) = ( 8 = 1000) & ( 5 = 0101) OR inclusivo bit a bit ( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101) ( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101) ( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101) (13 = 1101) = ( 8 = 1000) | ( 5 = 0101) OR exclusivo (XOR) bit a bit ( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101) ( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101) ( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101) (13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101)
Ejemplo #2 Operaciones XOR bit a bit sobre strings
<?php
echo 12 ^ 9; // Sale '5'
echo "12" ^ "9"; // Sale el caracter de retroceso (ascii 8)
// ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8
echo "hallo" ^ "hello"; // Salen los valores ascii #0 #4 #0 #0 #0
// 'a' ^ 'e' = #4
echo 2 ^ "3"; // Sale 1
// 2 ^ ((int)"3") == 1
echo "2" ^ 3; // Sale 1
// ((int)"2") ^ 3 == 1
?>
Ejemplo #3 Desplazamiento de bits sobre integers
<?php
/*
* Aquí están los ejemplos.
*/
echo "\n--- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS POSITIVOS ---\n";
$val = 4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copia del bit de signo desplazado hacia el lado izquierdo');
$val = 4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places);
$val = 4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'bits desplazados fuera del lado derecho');
$val = 4;
$places = 4;
$res = $val >> $places;
p($res, $val, '>>', $places, 'mismo resultado que arriba; no se puede desplazar más allá del 0');
echo "\n--- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS NEGATIVOS ---\n";
$val = -4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copia del bit de signo desplazado al lado izquierdo');
$val = -4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places, 'bits desplazados fuera del lado derecho');
$val = -4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'mismo resultado que arriba; no se puede desplazar más allá del -1');
echo "\n--- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS POSITIVOS ---\n";
$val = 4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'ceros rellenan en el lado derecho');
$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, 'bit de signo resulta desplazado fuera');
$val = 4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'bit de signo desplazado fuera del lado izquierdo');
echo "\n--- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS NEGATIVOS ---\n";
$val = -4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'ceros rellenan en el lado derecho');
$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 desplazados fuera del lado izquierdo, incluyendo el bit de signo');
/*
* 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) . "b\n";
printf("Expression: %d = %d %s %d\n", $res, $val, $op, $places);
echo " Decimal:\n";
printf(" val=%d\n", $val);
printf(" res=%d\n", $res);
echo " Binary:\n";
printf(' val=' . $format, $val);
printf(' res=' . $format, $res);
if ($note) {
echo " NOTE: $note\n";
}
echo "\n";
}
?>
El resultado del ejemplo en equipos de 32 bits sería:
--- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS POSITIVOS --- Expression: 2 = 4 >> 1 Decimal: val=4 res=2 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000010 NOTE: copia del bit de signo desplazado hacia el lado izquierdo Expression: 1 = 4 >> 2 Decimal: 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 desplazados fuera del lado derecho Expression: 0 = 4 >> 4 Decimal: val=4 res=0 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000000 NOTE: mismo resultado que arriba; no se puede desplazar más allá del 0 --- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS NEGATIVOS --- Expression: -2 = -4 >> 1 Decimal: val=-4 res=-2 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111110 NOTE: copia del bit de signo desplazado al lado izquierdo Expression: -1 = -4 >> 2 Decimal: val=-4 res=-1 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111111 NOTE: bits desplazados fuera del lado derecho Expression: -1 = -4 >> 3 Decimal: val=-4 res=-1 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111111 NOTE: mismo resultado que arriba; no se puede desplazar más allá del -1 --- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS POSITIVOS --- Expression: 8 = 4 << 1 Decimal: val=4 res=8 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000001000 NOTE: ceros rellenan en el lado derecho Expression: 1073741824 = 4 << 28 Decimal: val=4 res=1073741824 Binary: val=00000000000000000000000000000100 res=01000000000000000000000000000000 Expression: -2147483648 = 4 << 29 Decimal: val=4 res=-2147483648 Binary: val=00000000000000000000000000000100 res=10000000000000000000000000000000 NOTE: bit de signo resulta desplazado fuera Expression: 0 = 4 << 30 Decimal: val=4 res=0 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000000 NOTE: bit de signo desplazado fuera del lado izquierdo --- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS NEGATIVOS --- Expression: -8 = -4 << 1 Decimal: val=-4 res=-8 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111000 NOTE: ceros rellenan en el lado derecho 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 desplazados fuera del lado izquierdo, incluyendo el bit de signo
El resultado del ejemplo en equipos de 64 bits sería:
--- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS POSITIVOS --- Expression: 2 = 4 >> 1 Decimal: val=4 res=2 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000010 NOTE: copia del bit de signo desplazado hacia el lado izquierdo Expression: 1 = 4 >> 2 Decimal: 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 desplazados fuera del lado derecho Expression: 0 = 4 >> 4 Decimal: val=4 res=0 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: mismo resultado que arriba; no se puede desplazar más allá del 0 --- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS NEGATIVOS --- Expression: -2 = -4 >> 1 Decimal: val=-4 res=-2 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111110 NOTE: copia del bit de signo desplazado al lado izquierdo Expression: -1 = -4 >> 2 Decimal: val=-4 res=-1 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 NOTE: bits desplazados fuera del lado derecho Expression: -1 = -4 >> 3 Decimal: val=-4 res=-1 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 NOTE: mismo resultado que arriba; no se puede desplazar más allá del -1 --- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS POSITIVOS --- Expression: 8 = 4 << 1 Decimal: val=4 res=8 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000001000 NOTE: ceros rellenan en el lado derecho Expression: 4611686018427387904 = 4 << 60 Decimal: val=4 res=4611686018427387904 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0100000000000000000000000000000000000000000000000000000000000000 Expression: -9223372036854775808 = 4 << 61 Decimal: val=4 res=-9223372036854775808 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=1000000000000000000000000000000000000000000000000000000000000000 NOTE: bit de signo resulta desplazado fuera Expression: 0 = 4 << 62 Decimal: val=4 res=0 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: bit de signo desplazado fuera del lado izquierdo --- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS NEGATIVOS --- Expression: -8 = -4 << 1 Decimal: val=-4 res=-8 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111000 NOTE: ceros rellenan en el lado derecho 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 desplazados fuera del lado izquierdo, incluyendo el bit de signo
No desplazar a la derecha más de 32 bits en sistemas de 32 bits. No desplazar a la izquierda en caso de que resulte en un número más largo de 32 bits. Usar funciones de la extensión gmp para manipulación bit a bit sobre números más allá de PHP_INT_MAX.
Ver también pack(), unpack(), gmp_and(), gmp_or(), gmp_xor(), gmp_testbit(), gmp_clrbit()
Los operadores de comparación, como su nombre lo indica, permiten comparar dos valores. Puede también estar interesado en ver las tablas de comparación de tipos, ya que muestran ejemplos de las varias comparaciones relacionadas con tipos.
| Ejemplo | Nombre | Resultado |
|---|---|---|
| $a == $b | Igual | TRUE si $a es igual a $b después de la manipulación de tipos. |
| $a === $b | Idéntico |
TRUE si $a es igual a $b, y son del mismo
tipo.
|
| $a != $b | Diferente | TRUE si $a no es igual a $b después de la manipulación de tipos. |
| $a <> $b | Diferente | TRUE si $a no es igual a $b después de la manipulación de tipos. |
| $a !== $b | No idéntico |
TRUE si $a no es igual a $b, o si no son del mismo
tipo.
|
| $a < $b | Menor que | TRUE si $a es estrictamente 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 un string o la comparación implica strings numéricos, entonces cada string es convertido en un número y la comparación realizada numéricamente. Estas reglas también se aplican a la sentencia switch. La conversión de tipo no tiene lugar cuando la comparación es === o !== ya que esto involucra 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 alcanzado debido a que "a" ya ha coincidido con 0
echo "a";
break;
}
?>
Para varios tipos, la comparación se realiza de acuerdo a la siguiente tabla (en orden).
| Tipo de operando 1 | Tipo de operando 2 | Resultado |
|---|---|---|
| null o string | string | Convierte NULL en "", comparación numérica o léxica |
| bool o null | cualquiera | Convierte en bool, FALSE < TRUE |
| object | object | Las clases internas pueden definir su propia comparación, diferentes clases son incomparables, la misma clase - comparan propiedades en la misma forma que los arrays (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 | Un array con menos elementos es menor, si una clave del operando 1 no se encuentra en el operando 2 entonces los arrays son incomparables, de otra forma - compara valor por valor (ver el siguiente ejemplo) |
| object | cualquiera | object es siempre mayor |
| array | cualquiera | array es siempre mayor |
Ejemplo #1 Transcripción de la comparación estándar de arrays
<?php
// Arrays son comparados de esta forma con los operadores de comparación estándar
function standard_array_compare($op1, $op2)
{
if (count($op1) < count($op2)) {
return -1; // $op1 < $op2
} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return null; // uncomparable
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
?>
Ver también strcasecmp(), strcmp(), operadores de array, y la sección del manual sobre tipos.
Debido a la forma en que son representados internamente los floats, no se deben probar por igualdad dos floats.
Ver la documentación de float para más información.
Otro operador condicional es el operador "?:" (o ternario).
Ejemplo #2 Asignación de un valor predeterminado
<?php
// Ejemplo de uso para: Operador Ternario
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// Lo anterior es idéntico a esta sentencia if/else
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
TRUE y a
expr3 si
expr1 se evalúa como FALSE.
A partir de PHP 5.3, es posible dejar de lado la parte media del operador
ternario. La expresión expr1 ?: expr3 retorna
expr1 si expr1
se evalúa como TRUE y expr3 si es de otra manera.
Nota: Por favor note que el operador ternario es una sentencia, y que no evalúa a una variable, pero si al resultado de una sentencia. Esto es importante saberlo si se desea retornar una variable por referencia. La sentencia return $var == 42 ? $a : $b; en una función con retorno-por-referencia no funcionará por lo que se ha mencionado y una advertencia es generada en versiones posteriores de PHP.
Nota:
Es recomendable evitar el "apilamiento" expresiones ternarias. El comportamiento de PHP al utilizar más de un operador ternario en una única sentencia no es evidente:
Ejemplo #3 Comportamiento Ternario poco obvio
<?php
// a primera vista, lo siguiente parece tener la salida de 'true'
echo (true?'true':false?'t':'f');
// sin embargo, la salida real de lo anterior es 't'
// esto se debe a que las expresiones ternarias se evalúan de izquierda a derecha
// la siguiente es una versión más obvia del mismo código anterior
echo ((true ? 'true' : false) ? 't' : 'f');
// aquí, se puede ver que la primera expresión es evaluada como 'true', que
// a su vez se evalúa como (bool)true, retornando así la rama verdadera de la
// segunda expresión ternaria.
?>
PHP soporta un operador de control de errores: el signo de arroba (@). Cuando se antepone a una expresión en PHP, cualquier mensaje de error que pueden ser generado por esa expresión será ignorado.
Si se ha establecido una función controladora de errores personalizada con set_error_handler() entonces todavía será llamada, pero este controlador de errores personalizado puede (y debe) llamar a error_reporting() el cual devolverá 0 cuando la llamada que provocó el error fue precedida por el signo @.
Si la propiedad track_errors está activada, cualquier mensaje de error generado por la expresión será guardada en la variable $php_errormsg. Esta variable se sobrescribe en cada error, así que se debe comprobar antes si se desea utilizar.
<?php
/* Error intencional de archivo */
$my_file = @file ('non_existent_file') or
die ("La apertura de archivo ha fallado: el error fue '$php_errormsg'");
// esto funciona con cualquier expresión, no solo con funciones:
$value = @$cache[$key];
// no producirá una anotación si el índice $key no existe.
?>
Nota: El operador @ trabaja sólo sobre expresiones. Una simple regla de oro es: si se puede tomar el valor de algo, entonces se le puede anteponer el operador @. Por ejemplo, puede anteponerse a variables, a llamadas a funciones e includes, constantes y así sucesivamente. No puede anteponerse a definiciones de función o clase, ni a estructuras condicionales como if y foreach, y así sucesivamente.
Ver también error_reporting() y la sección del manual sobre funciones de Manejo de Errores y Registros.
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 se 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 indicación de por qué.
PHP soporta un operador de ejecución: las comillas invertidas (``). ¡Note que estas no son las comillas sencillas! PHP intentará ejecutar el contenido entre las comillas invertidas como si se tratara de un comando del shell; la salida será retornada (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
$output = `ls -al`;
echo "<pre>$output</pre>";
?>
Nota:
El operador de comillas invertidas se deshabilita cuando safe mode esta activado o shell_exec() esta desactivado.
Nota:
A diferencia de otros lenguajes, las comillas invertidas no pueden ser usadas dentro de strings entre comillas dobles.
Vea también la sección del manual sobre funciones de ejecución de programas, popen() proc_open() y Usando PHP desde la línea de comandos.
PHP soporta operadores estilo C de pre- y post-incremento y decremento.
Nota: Los operadores de incremento/decremento no afectan a los valores booleanos. Decrementar valores
NULLtampoco tiene efecto, pero incrementarlos entonces resulta en 1.
| Ejemplo | Nombre | Efecto |
|---|---|---|
| ++$a | Pre-incremento | Incrementa $a en uno, y luego retorna $a. |
| $a++ | Post-incremento | Retorna $a, y luego incrementa $a en uno. |
| --$a | Pre-decremento | Decrementa $a en uno, luego retorna $a. |
| $a-- | Post-decremento | Retorna $a, luego decrementa $a en uno. |
Aquí hay un script simple de ejemplo:
<?php
echo "<h3>Postincremento</h3>";
$a = 5;
echo "Debe ser 5: " . $a++ . "<br />\n";
echo "Debe ser 6: " . $a . "<br />\n";
echo "<h3>Preincremento</h3>";
$a = 5;
echo "Debe ser 6: " . ++$a . "<br />\n";
echo "Debe ser 6: " . $a . "<br />\n";
echo "<h3>Postdecremento</h3>";
$a = 5;
echo "Debe ser 5: " . $a-- . "<br />\n";
echo "Debe ser 4: " . $a . "<br />\n";
echo "<h3>Predecremento</h3>";
$a = 5;
echo "Debe ser 4: " . --$a . "<br />\n";
echo "Debe ser 4: " . $a . "<br />\n";
?>
PHP sigue la convención de Perl cuando trabaja con operaciones aritméticas sobre variables de caracteres y no la de C. Por ejemplo, en PHP y Perl $a = 'Z'; $a++; convierte $a en 'AA', mientras que en C a = 'Z'; a++; convierte a en '[' (el valor ASCII de 'Z' es 90, el valor ASCII de '[' es 91). Nótese que las variables de caracteres pueden ser incrementadas pero no decrementadas y aun así sólo caracteres de ASCII plano (a-z y A-Z) están soportados. Incrementar o decrementar otras variables de caracteres no tiene efecto, el string original no se modifica.
Ejemplo #1 Operaciones aritméticas sobre variables de caracteres
<?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 booleanos no tiene efecto.
| Ejemplo | Nombre | Resultado |
|---|---|---|
| $a and $b | And (y) | TRUE si tanto $a como $b son TRUE. |
| $a or $b | Or (o inclusivo) | TRUE si cualquiera de $a o $b es TRUE. |
| $a xor $b | Xor (o exclusivo) | TRUE si $a o $b es TRUE, pero no ambos. |
| ! $a | Not (no) | TRUE si $a no es TRUE. |
| $a && $b | And (y) | TRUE si tanto $a como $b son TRUE. |
| $a || $b | Or (o inclusivo) | TRUE si cualquiera de $a o $b es TRUE. |
La razón para tener las dos variaciones diferentes de los operadores "and" y "or" es que ellos operan con precedencias diferentes. (Ver Precedencia de operadores.)
Ejemplo #1 Los operadores lógicos ilustrados
<?php
// --------------------
// foo() nunca será llamado ya que los operadores están en cortocircuito
$a = (false && foo());
$b = (true || foo());
$c = (false and foo());
$d = (true or foo());
// --------------------
// "||" tiene una precedencia mayor que "or"
// El resultado de la expresión (false || true) es asignado a $e
// Actúa como: ($e = (false || true))
$e = false || true;
// La constante false es asignada a $f y entonces true es ignorado
// Actúa como: (($f = 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
// Actúa como: ($g = (true && false))
$g = true && false;
// La constante true es asignada a $h y entonces false es ignorado
// Actúa 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)
Existen dos operadores para datos tipo string. El primero es el operador de concatenación ('.'), el cual retorna el resultado de concatenar sus argumentos derecho e izquierdo. El segundo es el operador de asignación sobre concatenación ('.='), el cual añade 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 = "Hello ";
$b = $a . "World!"; // ahora $b contiene "Hello World!"
$a = "Hello ";
$a .= "World!"; // ahora $a contiene "Hello World!"
?>
Ver también las secciones del manual sobre el tipo string y las funciones de strings.
| Ejemplo | Nombre | Resultado |
|---|---|---|
| $a + $b | Unión | Unión de $a y $b. |
| $a == $b | Igualdad | TRUE si $a i $b tienen las mismas parejas clave/valor. |
| $a === $b | Identidad | TRUE si $a y $b tienen las mismas parejas clave/valor en el mismo
orden y de los mismos tipos. |
| $a != $b | Desigualdad | TRUE si $a no es igual a $b. |
| $a <> $b | Desigualdad | TRUE si $a no es igual a $b. |
| $a !== $b | No-identidad | TRUE si $a no es idéntica a $b. |
El operador + devuelve el array del lado derecho añadido al array del lado izquierdo; para las claves que existan en ambos arrays, serán utilizados los elementos del array de la izquierda y serán ignorados los elementos correspondientes del array de la derecha.
<?php
$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");
$c = $a + $b; // Unión de $a y $b
echo "Union of \$a and \$b: \n";
var_dump($c);
$c = $b + $a; // Unión de $b y $a
echo "Union of \$b and \$a: \n";
var_dump($c);
?>
Union of $a and $b:
array(3) {
["a"]=>
string(5) "apple"
["b"]=>
string(6) "banana"
["c"]=>
string(6) "cherry"
}
Union of $b and $a:
array(3) {
["a"]=>
string(4) "pear"
["b"]=>
string(10) "strawberry"
["c"]=>
string(6) "cherry"
}
Los elementos de los arrays son iguales para la comparación si éstos tienen la misma clave y valor.
Ejemplo #1 Comparando arrays
<?php
$a = array("apple", "banana");
$b = array(1 => "banana", "0" => "apple");
var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
?>
Ver también las secciones del manual sobre el tipo array y funciones de arrays.
instanceof se utiliza para determinar si una variable de PHP es un objeto instanciado de una cierta clase:
Ejemplo #1 Utilizando instanceof con clases
<?php
class MyClass
{
}
class NotMyClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>
El resultado del ejemplo sería:
bool(true) bool(false)
instanceof también se puede utilizar para determinar si una variable es un objeto instanciado de una clase que hereda de una clase padre:
Ejemplo #2 Utilizando instanceof con clases heredadas
<?php
class ParentClass
{
}
class MyClass extends ParentClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
?>
El resultado del ejemplo sería:
bool(true) bool(true)
Para comprobar si un objeto no es una instancia de una clase, se puede usar el operador lógico not.
Ejemplo #3 Utilizando instanceof para verificar si un objeto no es una instancia de una clase
<?php
class MyClass
{
}
$a = new MyClass;
var_dump(!($a instanceof stdClass));
?>
El resultado del ejemplo sería:
bool(true)
Finalmente, instanceof también se puede utilizar para determinar si una variable es un objeto instanciado de una clase que implementa una interface:
Ejemplo #4 Utilizando instanceof para la clase
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof MyInterface);
?>
El resultado del ejemplo sería:
bool(true) bool(true)
Aunque instanceof se utiliza generalmente con un nombre de clase literal, también puede ser utilizado con otro objeto o una variable string:
Ejemplo #5 Utilizando instanceof con otras variables
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';
var_dump($a instanceof $b); // $b is an object of class MyClass
var_dump($a instanceof $c); // $c is a string 'MyClass'
var_dump($a instanceof $d); // $d is a string 'NotMyClass'
?>
El resultado del ejemplo sería:
bool(true) bool(true) bool(false)
instanceof no lanza ningún error si la variable que está siendo comprobada no es
un objeto, simplemente devuelve FALSE. Las constantes, sin embargo, no está permitidas.
Ejemplo #6 Usar instanceof para comprobar otras variables
<?php
$a = 1;
$b = NULL;
$c = imagecreate(5, 5);
var_dump($a instanceof stdClass); // $a es un entero
var_dump($b instanceof stdClass); // $b es NULL
var_dump($c instanceof stdClass); // $c es un recurso
var_dump(FALSE instanceof stdClass);
?>
El resultado del ejemplo sería:
bool(false) bool(false) bool(false) PHP Fatal error: instanceof expects an object instance, constant given
Hay algunas trampas a tener en cuenta. Antes de versión de PHP 5.1.0, instanceof llamaría a __autoload() si el nombre de clase no existía. Además, si la clase no estaba cargada, un error fatal ocurriría. Esto se puede solucionar mediante una referencia de clase dinámica o una variable string que contenga el nombre de la clase:
Ejemplo #7 Evitando búsquedas del nombre de clase y errores fatales con instanceof en PHP 5.0
<?php
$d = 'NotMyClass';
var_dump($a instanceof $d); // aquí no hay error fatal
?>
El resultado del ejemplo sería:
bool(false)
El operador instanceof fue introducido en PHP 5. Antes de esta época se utilizaba is_a(), pero desde entonces is_a() se ha quedado obsoleto en favor de instanceof. Tenga en cuenta que a partir de PHP 5.3.0, is_a() ya no está obsoleto.
Ver también get_class() y is_a().
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.
(PHP 4, PHP 5)
El constructor if es una de las características más importantes de muchos lenguajes, incluido PHP. Permite la ejecución condicional de fragmentos de código. PHP dispone de una estructura if que es similar a la de C:
if (expr) sentencia
Como se describe en la sección sobre
expresiones , la expresión es evaluada a su
valor booleano. Si la expresión se evalúa como TRUE,
PHP ejecutará la sentencia y si se evalúa
como FALSE la ignorará. Más información sobre qué valores evalúan
como FALSE se puede encontrar en la sección 'Convirtiendo a booleano'.
El siguiente ejemplo mostraría a es mayor que b si $a es mayor que $b:
<?php
if ($a > $b) {
echo "a es mayor que b";
}
?>
A menudo se desea tener más de una sentencia para ser ejecutada condicionalmente. Por supuesto, no hay necesidad de envolver cada sentencia con una cláusula if. En cambio, se pueden agrupar varias sentencias en un grupo de sentencias. Por ejemplo, este código mostraría a es mayor que b si $a es mayor que $b y entonces asignaría el valor de $a a $b:
<?php
if ($a > $b) {
echo "a es mayor que b";
$b = $a;
}
?>
Las sentencias if pueden anidarse dentro de otra sentencias if infinitamente, lo cual provee completa flexibilidad para la ejecución condicional de diferentes partes del programa.
(PHP 4, PHP 5)
Con frecuencia se desea ejecutar una sentencia si una determinada condición se
cumple y una sentencia diferente si la condición no se cumple. Esto
es para lo que sirve else. El else
extiende una sentencia if para ejecutar una sentencia
en caso que la expresión en la sentencia if se evalúe
como FALSE. Por ejemplo, el siguiente código
deberá mostrar a es mayor que
b si $a es mayor que
$b y a NO es mayor
que b en el caso contrario:
<?php
if ($a > $b) {
echo "a es mayor que b";
} else {
echo "a NO es mayor que b";
}
?>
FALSE y si hay algunas expresiones
elseif - sólo se ejecuta si también todas son evaluadas
como FALSE (ver elseif).
(PHP 4, PHP 5)
elseif, como su nombre lo sugiere, es una combinación
de if y else. Del mismo modo que
else, extiende una sentencia if
para ejecutar una sentencia diferente en caso que la expresión
if original se evalúe como
FALSE. Sin embargo, a diferencia de
else, esa expresión alternativa sólo se
ejecutará si la expresión condicional del elseif
se evalúa como TRUE. Por ejemplo, el
siguiente código debe mostrar a es mayor que
b, a es igual que b
o a es menor que b:
<?php
if ($a > $b) {
echo "a es mayor que b";
} elseif ($a == $b) {
echo "a es igual que b";
} else {
echo "a es menor que b";
}
?>
Puede haber varios elseif dentro de la misma
sentencia if. La primera
expresión elseif (si hay alguna) que se evalúe como
TRUE sería ejecutada. En PHP también se puede
escribir 'else if' (en dos palabras) y el comportamiento sería idéntico
al de 'elseif' (en una sola palabra). El significado sintáctico
es ligeramente diferente (si se está familiarizado con C, este es el mismo
comportamiento) pero la conclusión es que ambos resultarían tener exactamente
el mismo comportamiento.
La sentencia elseif es ejecutada solamente si la
expresión if precedente y cualquiera de las expresiones
elseif precedentes son evaluadas como
FALSE, y la expresión
elseif actual se evalúa como
TRUE.
Nota: Tenga en cuenta que elseif y else if serán considerados exactamente iguales sólamente cuando se utilizan corchetes como en el ejemplo anterior. Al utilizar los dos puntos para definir las condiciones if/elseif, no debe separarse else if en dos palabras o PHP fallará con un error del interprete.
<?php
/* Método incorrecto: */
if($a > $b):
echo $a." es mayor que ".$b;
else if($a == $b): // No compilará
echo "La línea anterior provoca un error del interprete.";
endif;
/* Método correcto: */
if($a > $b):
echo $a." es mayor que ".$b;
elseif($a == $b): // Tenga en cuenta la combinación de las palabras.
echo $a." igual ".$b;
else:
echo $a." no es ni mayor que ni igual a ".$b;
endif;
?>
(PHP 4, PHP 5)
PHP ofrece una sintaxis alternativa para algunas de sus estructuras de control; a saber: if, while, for, foreach, y switch. En cada caso, la forma básica de la sintaxis alternativa es cambiar el corchete de apertura por dos puntos (:) y el corchete de cierre por endif;, endwhile;, endfor;, endforeach;, o endswitch;, respectivamente.
<?php if ($a == 5): ?>
A es igual a 5
<?php endif; ?>
En el ejemplo anterior, el bloque HTML "A es igual a 5" se anida dentro de una sentencia if escrita en la sintaxis alternativa. El bloque HTML se mostraría solamente si $a es igual a 5.
La sintaxis alternativa también se aplica a else y elseif. El siguiente es una estructura if con elseif y else en el formato alternativo:
<?php
if ($a == 5):
echo "a igual 5";
echo "...";
elseif ($a == 6):
echo "a igual 6";
echo "!!!";
else:
echo "a no es 5 ni 6";
endif;
?>
Nota:
No se soporta la mezcla de sintaxis en el mismo bloque de control.
(PHP 4, PHP 5)
Los bucles while son el tipo más sencillo de bucle en PHP. Se comportan igual que su contrapartida en C. La forma básica de una sentencia while es:
while (expr)
sentencia
El significado de una sentencia while es simple. Le
dice a PHP que ejecute las sentencias anidadas, tanto
como la expresión while se evalúe como
TRUE. El valor de la expresión es verificado
cada vez al inicio del bucle, por lo que incluso si este valor
cambia durante la ejecución de las sentencias anidadas, la ejecución
no se detendrá hasta el final de la iteración (cada vez que PHP ejecuta
las sentencias contenidas en el bucle es una iteración). A veces, si la
expresión while se evalúa como
FALSE desde el principio, las sentencias
anidadas no se ejecutarán ni siquiera una vez.
Al igual que con la sentencia if, se pueden agrupar varias instrucciones dentro del mismo bucle while rodeando un grupo de sentencias con corchetes, o utilizando la sintaxis alternativa:
while (expr):
sentencias
...
endwhile;
Los siguientes ejemplos son idénticos y ambos presentan los números del 1 al 10:
<?php
/* ejemplo 1 */
$i = 1;
while ($i <= 10) {
echo $i++; /* el valor presentado sería
$i antes del incremento
(post-incremento) */
}
/* ejemplo 2 */
$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;
?>
(PHP 4, PHP 5)
Los bucles do-while son muy similares a los
bucles while, excepto que la expresión verdadera es
verificada al final de cada iteración en lugar que al principio.
La diferencia principal con los bucles while es
que está garantizado que corra la primera iteración de un bucle
do-while (la expresión verdadera sólo es verificada al
final de la iteración), mientras que no necesariamente va a correr con un
bucle while regular (la expresión verdadera es
verificada al principio de cada iteración, si se evalúa como
FALSE justo desde el comienzo, la ejecución del
bucle terminaría inmediatamente).
Hay una sola sintaxis para bucles do-while:
<?php
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
El bucle de arriba se ejecutaría exactamente una sola vez, ya que después de la primera
iteración, cuando la expresión verdadera es verificada, se evalúa como
FALSE ($i no es mayor que 0) y termina la ejecución
del bucle.
Los usuarios avanzados de C pueden estar familiarizados con un uso distinto del bucle do-while, para permitir parar la ejecución en medio de los bloques de código, mediante el encapsulado con do-while (0), y utilizando la sentencia break. El siguiente fragmento de código demuestra esto:
<?php
do {
if ($i < 5) {
echo "i no es lo suficientemente grande";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
echo "i está bien";
/* procesar i */
} while (0);
?>
No se preocupe si no se entiende esto completamente o en absoluto. Se pueden codificar scripts e incluso scripts potentes sin usar esta 'característica'. Desde PHP 5.3.0, es posible utilizar el operador goto en lugar de este hack.
(PHP 4, PHP 5)
Los bucles for son los más complejos en PHP. Se comportan como sus homólogos en C. La sintaxis de un bucle for es:
for (expr1; expr2; expr3)
sentencia
La primera expresión (expr1) es evaluada (ejecutada) una vez incondicionalmente al comienzo del bucle.
En el comienzo de cada iteración,
se evalúa expr2. Si se evalúa como
TRUE, el bucle continúa y se ejecutan la/sy
sentencia/s anidada/s. Si se evalúa como
FALSE, finaliza la ejecución del bucle.
Al final de cada iteración, se evalúa (ejecuta) expr3.
Cada una de las expresiones puede estar vacía o contener múltiples
expresiones separadas por comas. En expr2, todas
las expresiones separadas por una coma son evaluadas, pero el resultado se toma
de la última parte.
Que expr2 esté vacía significa que el bucle debería
ser corrido indefinidamente (PHP implícitamente lo considera como
TRUE, como en C). Esto puede no ser tan inútil como se
pudiera pensar, ya que muchas veces se debe terminar el bucle usando
una sentencia condicional break
en lugar de utilizar la expresión verdadera del
for.
Considere los siguientes ejemplos. Todos ellos muestran los números del 1 al 10:
<?php
/* ejemplo 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* ejemplo 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
/* ejemplo 3 */
$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}
/* ejemplo 4 */
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>
Por supuesto, el primer ejemplo parece ser el mejor (o quizás el cuarto), pero se puede observar que la posibilidad de usar expresiones vacías en los bucles for resulta útil en muchas ocasiones.
PHP también admite la sintaxis alternativa de los dos puntos para bucles for.
for (expr1; expr2; expr3):
sentencia
...
endfor;
Es una cosa común a muchos usuarios iterar por medio de arrays como en el siguiente ejemplo.
<?php
/*
* Este es un array con algunos datos que se quieren modificar
* cuando se recorra el bucle for.
*/
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>
El código anterior puede ser lento, debido a que el tamaño del array se capta en cada iteración. Dado que el tamaño nunca cambia, el bucle ser fácilmente optimizado mediante el uso de una variable intermedia para almacenar el tamaño en lugar de llamar repetidamente a count():
<?php
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0, $size = count($people); $i < $size; ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>
(PHP 4, PHP 5)
El constructor foreach proporciona un modo sencillo de iterar sobre arrays. foreach funciona sólo sobre arrays y objetos, y emitirá un error al intentar usarlo con una variable de un tipo diferente de datos o una variable no inicializada. Existen dos sintaxis:
foreach (expresión_array as $valor)
sentencias
foreach (expresión_array as $clave => $valor)
sentencias
La primera forma recorre el array dado por expresión_array. En cada iteración, el valor del elemento actual se asigna a $valor y el puntero interno del array avanza una posición (así en la próxima iteración se estará observando el siguiente elemento).
La segunda forma además asigna la clave del elemento actual a la variable $clave en cada iteración.
También es posible personalizar la iteración de objetos.
Nota:
Cuando foreach inicia su ejecución, el puntero interno del array se pone automáticamente en el primer elemento del array. Esto significa que no es necesario llamar la función reset() antes de un bucle foreach.
Ya que foreach depende el puntero de array interno, cambiar éste dentro del bucle puede conducir a un comportamiento inesperado.
Para poder modificar directamente los elementos del array dentro de bucle, se ha de anteponer & a $valor. En este caso el valor será asignado por referencia.
<?php
$array = array(1, 2, 3, 4);
foreach ($array as &$valor) {
$valor = $valor * 2;
}
// $array ahora es array(2, 4, 6, 8)
unset($valor); // rompe la referencia con el último elemento
?>
Referenciar $valor sólo es posible si el array iterado puede ser referenciado (es decir, si es una variable). El siguiente código no funcionará:
<?php
foreach (array(1, 2, 3, 4) as &$valor) {
$valor = $valor * 2;
}
?>
La referencia del $valor y el último elemento del array permanecen aún después del bucle foreach. Se recomienda destruirlos con unset().
Nota:
foreach no soporta la capacidad de suprimir mensajes de error usando '@'.
Se puede haber notado que las siguientes construcciones son funcionalmente idénticas:
<?php
$array = array("uno", "dos", "tres");
reset($array);
while (list(, $valor) = each($array)) {
echo "Valor: $valor<br />\n";
}
foreach ($array as $valor) {
echo "Valor: $valor<br />\n";
}
?>
Las siguientes construcciones también son funcionalmente idénticas:
<?php
$array = array("uno", "dos", "tres");
reset($array);
while (list($clave, $valor) = each($array)) {
echo "Clave: $clave; Valor: $valor<br />\n";
}
foreach ($array as $clave => $valor) {
echo "Clave: $clave; Valor: $valor<br />\n";
}
?>
Algunos ejemplos más para demostrar su uso:
<?php
/* Ejemplo 1 de foreach: sólo el valor */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Valor actual de \$a: $v.\n";
}
/* Ejemplo 2 de foreach: valor (con su notación de acceso manual impreso con fines ilustrativos) */
$a = array(1, 2, 3, 17);
$i = 0; /* sólo para efectos ilustrativos */
foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}
/* Ejemplo 3 de foreach: clave y valor */
$a = array(
"uno" => 1,
"dos" => 2,
"tres" => 3,
"diecisiete" => 17
);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}
/* Ejemplo 4 de foreach: arrays multidimensionales */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}
/* Ejemplo 5 de foreach: arrays dinámicos */
foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>
(PHP 5 >= 5.5.0)
PHP 5.5 añade la posibilidad de recorrer un array de arrays y utilizar el array interior en las variables del bucle proporcionando list() como el valor.
Por ejemplo:
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b)) {
// $a contiene el primer elemento del array interior,
// y $b contiene el segundo elemento.
echo "A: $a; B: $b\n";
}
?>
El resultado del ejemplo sería:
A: 1; B: 2 A: 3; B: 4
Puedes proporcionar menos elementos a list() de los que hay en el array interior, en cuyo caso los elementos sobrantes del array serán descartados:
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a)) {
// Observa que no hay $b en este caso.
echo "$a\n";
}
?>
El resultado del ejemplo sería:
1 3
Se generará un notice si no hay suficientes elementos en el array para completar el list():
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b, $c)) {
echo "A: $a; B: $b; C: $c\n";
}
?>
El resultado del ejemplo sería:
Notice: Undefined offset: 2 in example.php on line 7 A: 1; B: 2; C: Notice: Undefined offset: 2 in example.php on line 7 A: 3; B: 4; C:
(PHP 4, PHP 5)
break termina la ejecución de la estructura actual for, foreach, while, do-while o switch.
break acepta un argumento numérico opcional el cual indica de cuantas estructuras anidadas encerradas se debe salir.
<?php
$arr = array('uno', 'dos', 'tres', 'cuatro', 'pare', 'cinco');
while (list(, $val) = each($arr)) {
if ($val == 'pare') {
break; /* Se puede también escribir 'break 1;' aquí. */
}
echo "$val<br />\n";
}
/* Usando el argumento opcional. */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "En 5<br />\n";
break 1; /* Sólo sale del switch. */
case 10:
echo "En 10; saliendo<br />\n";
break 2; /* Sale del switch y del while. */
default:
break;
}
}
?>
| Versión | Descripción |
|---|---|
| 5.4.0 | break 0; ya no es válido. En versiones anteriores se interpretaba igual que break 1;. |
| 5.4.0 | Removida la posibilidad de pasar variables (por ejemplo, $num = 2; break $num;) como argumento numérico. |
(PHP 4, PHP 5)
continue se utiliza dentro de las estructuras iterativas para saltar el resto de la iteración actual del bucle y continuar la ejecución en la evaluación de la condición, y luego comenzar la siguiente iteración.
Nota: Tenga en cuenta que en PHP la sentencia switch se considera una estructura iterativa para los propósitos de continue.
continue acepta un argumento numérico opcional, que indica a cuántos niveles de bucles encerrados se ha de saltar al final. El valor por omisión es 1, por lo que salta al final del bucle actual.
<?php
while (list($clave, $valor) = each($arr)) {
if (!($clave % 2)) { // saltar los miembros impares
continue;
}
hacer_algo($valor);
}
$i = 0;
while ($i++ < 5) {
echo "Exterior<br />\n";
while (1) {
echo "Medio<br />\n";
while (1) {
echo "Interior<br />\n";
continue 3;
}
echo "Esto nunca se imprimirá.<br />\n";
}
echo "Ni esto tampoco.<br />\n";
}
?>
Omitir el punto y coma después del continue puede llevar a confusión. He aquí un ejemplo de lo que no se debe hacer.
<?php
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
print "$i\n";
}
?>
Se esperaría que el resultado fuera:
0 1 3 4
pero la salida de este script será:
2
debido a que continue print "$i\n"; se evalúa completo como una sola expresión, y así print se llama solamente cuando $i == 2 es verdadero. (El valor de retorno de print es pasado a continue como el argumento numérico.)
| Versión | Descripción |
|---|---|
| 5.4.0 | continue 0; ya no es válido. En versiones anteriores era interpretado de la misma manera que continue 1;. |
| 5.4.0 | Se eliminó la posibilidad de pasar variables (por ejemplo, $num = 2; continue $num;) como el argumento numérico. |
(PHP 4, PHP 5)
La sentencia switch es similar a una serie de sentencias IF en la misma expresión. En muchas ocasiones, es posible que se quiera comparar la misma variable (o expresión) con muchos valores diferentes, y ejecutar una parte de código distinta dependiendo de a que valor es igual. Para esto es exactamente la expresión switch.
Nota: Cabe señalar que a diferencia de algunos otros lenguajes, la sentencia continue se aplica a switch y actúa de manera similar a break. Si se tiene un switch dentro de un bucle y se desea continuar a la siguiente iteración de del ciclo exterior, se utiliza continue 2.
Nota:
Tener en cuenta que switch/case hace comparaciones flexibles.
Los dos ejemplos siguientes son dos formas diferentes de escribir lo mismo, uno con una serie de sentencias if y elseif, y el otro usando la sentencia switch:
Ejemplo #1 Estructura switch
<?php
if ($i == 0) {
echo "i es igual a 0";
} elseif ($i == 1) {
echo "i es igual a 1";
} elseif ($i == 2) {
echo "i es igual a 2";
}
switch ($i) {
case 0:
echo "i es igual a 0";
break;
case 1:
echo "i es igual a 1";
break;
case 2:
echo "i es igual a 2";
break;
}
?>
Ejemplo #2 Estrutura switch permite el uso de strings
<?php
switch ($i) {
case "manzana":
echo "i es una manzana";
break;
case "barra":
echo "i es una barra";
break;
case "pastel":
echo "i es un pastel";
break;
}
?>
Es importante entender cómo la sentencia switch es ejecutada con el fin de evitar errores. La sentencia switch ejecuta línea por línea (en realidad, sentencia por sentencia). Al principio, ningún código es ejecutado. Sólo cuando una sentencia case es encontrada con un valor que coincide con el valor de la sentencia switch, PHP comienza a ejecutar la sentencias. PHP continúa ejecutando las sentencias hasta el final del bloque switch, o hasta la primera vez que vea una sentencia break. Si no se escribe una sentencia break al final de la lista de sentencias de un caso, PHP seguirá ejecutando las sentencias del caso siguiente. Por ejemplo:
<?php
switch ($i) {
case 0:
echo "i es igual a 0";
case 1:
echo "i es igual a 1";
case 2:
echo "i es igual a 2";
}
?>
Aquí, si $i es igual a 0, PHP ejecutaría todas las sentencias echo! Si $i es igual a 1, PHP ejecutaría las últimas dos sentencias echo. Se obtendría el comportamiento esperado (se mostraría 'i es igual a 2') sólo si $i es igual a 2. Por lo tanto, es importante no olvidar las sentencias break (aunque es posible que se desee evitar proporcionarlas a propósito bajo determinadas circunstancias).
En una sentencia switch, la condición es evaluada sólo una vez y el resultado es comparado con cada una de las sentencias case. En una sentencia elseif, la condición es evaluada otra vez. Si la condición es más complicada que una simple comparación y/o está en un bucle estrecho, un switch puede ser más rápido.
La lista de sentencias para un caso también puede estar vacía, lo cual simplemente pasa el control a la lista de sentencias para el siguiente caso.
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i es menor que 3 pero no negativo";
break;
case 3:
echo "i es 3";
}
?>
Un caso especial es el default. Este caso coincide con cualquier cosa que no se haya correspondido por los otros casos. Por ejemplo:
<?php
switch ($i) {
case 0:
echo "i es igual a 0";
break;
case 1:
echo "i es igual a 1";
break;
case 2:
echo "i es igual a 2";
break;
default:
echo "i no es igual a 0, 1 ni 2";
}
?>
La expresión case puede ser cualquier expresión que se evalúa como un tipo simple, es decir, entero o números de punto flotante y strings. Los arrays u objetos no se pueden utilizar aquí a menos que sean desreferenciados a un tipo simple.
La sintaxis alternativa para las estructuras de control es compatible con los switch. Para obtener más información, consulte Sintaxis alternativa de estructuras de control.
<?php
switch ($i):
case 0:
echo "i es igual a 0";
break;
case 1:
echo "i es igual a 1";
break;
case 2:
echo "i es igual a 2";
break;
default:
echo "i no es igual a 0, 1 ni 2";
endswitch;
?>
Es posible utilizar un punto y coma en lugar de dos puntos después de un caso como:
<?php
switch($beer)
{
case 'tuborg';
case 'carlsberg';
case 'heineken';
echo 'Buena elección';
break;
default;
echo 'Por favor haga una nueva selección...';
break;
}
?>
(PHP 4, PHP 5)
El constructor declare es usado para fijar directivas de ejecución para un bloque de código. La sintaxis de declare es similar a la sintaxis de otros constructores de control de flujo:
declare (directive)
statement
La sección directive permite que el comportamiento de declare sea configurado. Actualmente, sólo dos directivas están reconocidas: ticks (Ver abajo para más información sobre la directiva ticks) y encoding (Ver abajo para más información sobre la directiva encoding ).
Nota: La directiva encoding fue agregada en PHP 5.3.0
La parte statement del bloque declare será ejecutada - como se ejecuta y que efectos secundarios ocurran durante la ejecución puede depender de la directiva fijada en el bloque directive.
El constructor declare también se puede utilizar en el alcance global, afectando a todo el código que le sigue (sin embargo, si el archivo con el declare fue incluido entonces no afectará al archivo padre).
<?php
// estos son lo mismo:
// se puede usar ésto:
declare(ticks=1) {
// script entero aquí
}
// o se puede usar ésto:
declare(ticks=1);
// script entero aquí
?>
Un tick es un evento que ocurre para cada
sentencia tickable N de bajo nivel ejecutada
por el intérprete dentro del bloque declare.
El valor para N se especifica
usando ticks=N
dentro del bloque de declare
de la sección directive.
No todas las sentencias son tickable. Por lo general, expresiones de condición y expresiones de argumento no son tickables.
Los eventos que ocurren en cada tick se especifican mediante la register_tick_function(). Ver el ejemplo abajo para más detalles. Tener en cuenta que más de un evento puede ocurrir por cada tick.
Ejemplo #1 Ejemplo de uso del tick
<?php
declare(ticks=1);
// Una función llamada en cada evento tick
function tick_handler()
{
echo "tick_handler() llamado\n";
}
register_tick_function('tick_handler');
$a = 1;
if ($a > 0) {
$a += 2;
print($a);
}
?>
Ejemplo #2 Ejemplo de uso de ticks
<?php
function tick_handler()
{
echo "tick_handler() llamado\n";
}
$a = 1;
tick_handler();
if ($a > 0) {
$a += 2;
tick_handler();
print($a);
tick_handler();
}
tick_handler();
?>
Véase también register_tick_function() y unregister_tick_function().
Una codificación de script puede ser especificada para cada script usando la directiva encoding.
Ejemplo #3 Declarando un encoding para el script
<?php
declare(encoding='ISO-8859-1');
// código aquí
?>
Cuando se combina con espacios de nombres, la única sintaxis legal para declarar es declare(encoding='...'); donde ... es el valor del encoding. declare(encoding='...') {} resultará en un error de análisis cuando se combina con espacios de nombres.
El valor declarado de encoding es ignorado en PHP 5.3 a menos que php esté compilado con --enable-zend-multibyte.
Tener en cuenta que PHP no expone si --enable-zend-multibyte fue utilizado para compilar PHP que no sea por phpinfo().
Ver también zend.script_encoding.
(PHP 4, PHP 5)
Si se llama desde una función, la sentencia return inmediatamente termina la ejecución de la función actual, y devuelve su argumento como el valor de la llamada a la función. return también pondrá fin a la ejecución de una sentencia eval() o a un archivo de script.
Si se llama desde el ámbito global, entonces la ejecución del script actual se termina. Si el archivo script actual fue incluido o requerido con include o require, entonces el control es pasado de regreso al archivo que hizo el llamado. Además, si el archivo script actual fue incluido con include, entonces el valor dado a return será retornado como el valor de la llamada include. Si return es llamado desde dentro del fichero del script principal, entonces termina la ejecución del script. Si el archivo script actual fue nombrado por las opciones de configuración auto_prepend_file o auto_append_file en php.ini, entonces se termina la ejecución de ese archivo script.
Para más información, ver Retornando valores.
Nota: Cabe señalar que dado que return es un constructor del lenguaje y no una función, los paréntesis que rodean su argumentos no son necesarios. Es común no utilizarlos, y en realidad se debería hacer así a fin de que PHP tenga menos trabajo que hacer en este caso.
Nota: Si no se suministra un parámetro, entonces el paréntesis debe omitirse y
NULLserá retornado. Llamadas a return con paréntesis pero sin argumentos resultarán en un error del intérprete.
Nota: Nunca se deben usar paréntesis al rededor de la variable de retorno cuando se retorna por referencia, ya que esto no funcionará. Sólo se pueden retornar variables por referencia, no el resultado de una sentencia. Si se utiliza return ($a); entonces no se está retornando una variable, sino el resultado de la expresión ($a) (el cual es, por supuesto, el valor de $a).
(PHP 4, PHP 5)
require es idéntico a include
excepto que en caso de fallo producirá un error fatal de nivel E_COMPILE_ERROR.
En otras palabras, éste detiene el script mientras que
include sólo emitirá una advertencia
(E_WARNING) lo cual permite continuar el script.
Véase la documentación de include para más información.
(PHP 4, PHP 5)
La sentencia include incluye y evalúa el archivo especificado.
La siguiente documentación también se aplica a require.
Los archivos son incluidos con base en la ruta de acceso dada o, si ninguna es dada, el include_path especificado. Si el archivo no se encuentra en el include_path, include finalmente verificará en el propio directorio del script que hace el llamado y en el directorio de trabajo actual, antes de fallar. El constructor include emitirá una advertencia si no puede encontrar un archivo, éste es un comportamiento diferente al de require, el cual emitirá un error fatal..
Si una ruta es definida — ya sea absoluta (comenzando con una letra de unidad o \ en Windows o / en sistemas Unix/Linux) o relativa al directorio actual (comenzando con . o ..) — el include_path será ignorado por completo. Por ejemplo, si un nombre de archivo comienza con ../, el interprete buscará en el directorio padre para encontrar el archivo solicitado.
Para más información sobre como PHP maneja la inclusión de archivos y la ruta de accesos para incluir, ver la documentación de include_path.
Cuando se incluye un archivo, el código que contiene hereda el ámbito de las variables de la línea en la cual ocurre la inclusión. Cualquier variable disponible en esa línea del archivo que hace el llamado, estará disponible en el archivo llamado, desde ese punto en adelante. Sin embargo, todas las funciones y clases definidas en el archivo incluido tienen el ámbito global.
Ejemplo #1 Ejemplo básico de include
vars.php
<?php
$color = 'verde';
$fruta = 'manzana';
?>
test.php
<?php
echo "Una $fruta $color"; // Una
include 'vars.php';
echo "Una $fruta $color"; // Una manzana verde
?>
Si la inclusión ocurre al interior de una función dentro del archivo que hace el llamado, entonces todo el código contenido en el archivo llamado se comportará como si hubiera sido definida dentro de esa función. Por lo tanto, seguirá el ámbito de las variables de esa función. Una excepción a esta regla son las constantes mágicas las cuales son evaluadas por el intérprete antes que ocurra la inclusión.
Ejemplo #2 Incluyendo dentro de funciones
<?php
function foo()
{
global $color;
include 'vars.php';
echo "Una $fruta $color";
}
/* vars.php está en el ámbito de foo() así que *
* $fruta NO está disponible por fuera de éste *
* ámbito. $color sí está porque fue declarado *
* como global. */
foo(); // Una manzana verde
echo "Una $fruta $color"; // Una verde
?>
Cuando un archivo es incluido, el intérprete abandona el modo PHP e ingresa al modo HTML al comienzo del archivo objetivo y se reanuda de nuevo al final. Por esta razón, cualquier código al interior del archivo objetivo que deba ser ejecutado como código PHP, tendrá que ser encerrado dentro de etiquetas válidas de comienzo y terminación de PHP.
Si las "envolturas URL fopen" están activadas en PHP (las cuales lo están en la configuración predeterminada), se puede especificar el archivo a ser incluido usando una URL (vía HTTP u otra envoltura soportada - ver Protocolos y Envolturas soportados para una lista de protocolos) en lugar de una ruta de acceso local. Si el servidor objetivo interpreta el archivo objetivo como código PHP, las variables se pueden pasar al archivo incluido usando una string de petición como la usada con HTTP GET. Esto no es, en estricto rigor, lo mismo que haber incluido el archivo y que haya heredado el ámbito de variables del archivo padre; el script realmente está siendo ejecutado en el servidor remoto y el resultado entonces se incluye dentro del script local.
Versiones de PHP para Windows anteriores a 4.3.0, no soportan el acceso remoto a archivos para esta función, no funcionará ni activando siquiera allow_url_fopen.
Ejemplo #3 include por medio de HTTP
<?php
/* Este ejemplo asume que www.example.com está configurado para interpretar archivos
* .php y no archivos .txt. Además, aquí 'Funciona' quiere decir que las variables
* $foo y $bar están disponibles dentro del archivo incluido. */
// No funciona; file.txt no puede ser manejado por www.example.com como PHP
include 'http://www.example.com/file.txt?foo=1&bar=2';
// No funciona; busca por un archivo llamado 'file.php?foo=1&bar=2' en el
// sistema de archivos local.
include 'file.php?foo=1&bar=2';
// Si funciona.
include 'http://www.example.com/file.php?foo=1&bar=2';
$foo = 1;
$bar = 2;
include 'file.txt'; // Funciona.
include 'file.php'; // Funciona.
?>
El archivo remoto puede ser procesado en el servidor remoto (dependiendo de la extensión del archivo y del hecho de si el servidor remoto corre PHP o no) pero aun así tiene que producir un script PHP válido, porque será procesado en el servidor local. Si el archivo desde el servidor remoto debe ser procesado allá y entregar la salida solamente, readfile() es la mejor función para usar. De lo contrario, debe tenerse especial cuidado para asegurar que el script remoto produce un código válido y deseado.
Ver también Archivos remotos, fopen() y file() para información relacionada.
Manejando retornos: include devuelve FALSE en caso de falla y eleva una advertencia. Inclusiones exitosas, a menos que sea reemplazado por el archivo incluido, devolverá 1. Es posible ejecutar una sentencia return dentro de un archivo incluido con el fin de terminar el procesamiento en ese archivo y volver a script que lo llamó. Además, es posible retornar valores desde los archivos incluidos. Se puede tomar el valor de la llamada "include" de la misma forma como se haría con una función normal. Esto no es, sin embargo, posible si se incluyen archivos remotos, a menos que la salida del archivo remoto tenga unas etiquetas válidas de inicio y terminación de PHP (igual que con cualquier archivo local). Se pueden declarar las variables necesarias dentro de esas etiquetas y serán introducidas en cualquiera sea el punto del archivo en el cual fue incluido.
Debido a que include es un constructor especial del lenguaje, los paréntesis no son necesarios en torno a su argumento. Se debe tener cuidado cuando se compara el valor de retorno.
Ejemplo #4 Comparando el valor de retorno de include
<?php
// no funciona, evaluado como include(('vars.php') == 'OK'), es decir include('')
if (include('vars.php') == 'OK') {
echo 'OK';
}
// si funciona
if ((include 'vars.php') == 'OK') {
echo 'OK';
}
?>
Ejemplo #5 include y la sentencia return
return.php
<?php
$var = 'PHP';
return $var;
?>
noreturn.php
<?php
$var = 'PHP';
?>
testreturns.php
<?php
$foo = include 'return.php';
echo $foo; // muestra 'PHP'
$bar = include 'noreturn.php';
echo $bar; // muestra 1
?>
$bar tiene el valor 1 debido a que el include
fue exitoso. Nótese la diferencia entre los ejemplos anteriores. El primero usa
return dentro del archivo incluido, mientras que el otro no.
Si el archivo no se pueden incluir, se retorna FALSE y
se emite un E_WARNING.
Si hay funciones definidas en el archivo incluido, se pueden utilizar en el archivo principal independientemente que hayan return antes o después. Si el archivo se incluye dos veces, PHP 5 arrojará un error fatal ya que las funciones ya han sido declaradas, mientras que PHP 4 no se queja acerca de las funciones definidas después de un return. Se recomienda el uso de include_once en lugar de comprobar si el archivo ya estaba incluido y hacer el retorno de forma condicionada dentro del archivo incluido.
Otra forma de "incluir" un archivo PHP en una variable es capturar la salida mediante el uso de Funciones de control de salida con include. Por ejemplo:
Ejemplo #6 Usando buffering de salida para incluir un archivo PHP dentro de una cadena
<?php
$string = get_include_contents('somefile.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
return ob_get_clean();
}
return false;
}
?>
Con el fin de incluir archivos de forma automática dentro de scripts, véase también las opciones de configuración auto_prepend_file and auto_append_file en php.ini.
Nota: Puesto que esto es una construcción del lenguaje y no una función, no puede ser llamada usando funciones variables.
Ver también require, require_once, include_once, get_included_files(), readfile(), virtual() y include_path.
(PHP 4, PHP 5)
La sentencia require_once es idéntica a require excepto que PHP verificará si el archivo ya ha sido incluido y si es así, no se incluye (require) de nuevo.
Ver la documentación de include_once para información sobre el comportamiento de _once, y como difiere de sus hermanos no _once.
(PHP 4, PHP 5)
La sentencia include_once incluye y evalúa el fichero especificado durante la ejecución del script. Es un comportamiento similar al de la sentencia include, siendo la única diferencia que si el código del fichero ya ha sido incluido, no se volverá a incluir. Como su nombre lo indica, será incluido sólo una vez.
include_once puede ser usado en casos donde el mismo fichero podría ser incluido y evaluado más de una vez durante una ejecución particular de un script, así que en este caso, puede ayudar a evitar problemas como la redefinición de funciones, reasignación de valores de variables, etc.
Ver la documentación de include para información sobre como trabaja esta función.
Nota:
Con PHP 4, la funcionalidad _once difiere entre sistemas operativos insensibles a mayúsculas y minúsculas (como Windows) así que por ejemplo:
Ejemplo #1 include_once con un SO insensible a mayúsculas y minúsculas en PHP 4
<?php
include_once "a.php"; // esto incluirá a.php
include_once "A.php"; // esto incluirá a.php otra vez! (sólo PHP 4)
?>Este comportamiento cambió en PHP 5, así que por ejemplo con Windows primero se normaliza la ruta de acceso para que C:\PROGRA~1\A.php sea identificado igual que C:\Program Files\a.php y el fichero sea incluido sólo una vez.
(PHP 5 >= 5.3.0)
El operador goto puede ser usado para saltar a otra sección en el programa. El punto de destino es especificado mediante una etiqueta seguida de dos puntos y la instrucción es dada como goto seguida de la etiqueta del destino deseado. Este goto no es completamente sin restricciones. La etiqueta de destino debe estar dentro del mismo fichero y contexto, lo que significa que no se puede saltar fuera de una función o método, ni se puede saltar dentro de uno. Tampoco se puede saltar dentro de cualquier clase de estructura de bucle o switch. Se puede saltar fuera de estos y un uso común es utilizar un goto en lugar de un break multi-nivel.
Ejemplo #1 Ejemplo de goto
<?php
goto a;
echo 'Foo';
a:
echo 'Bar';
?>
El resultado del ejemplo sería:
Bar
Ejemplo #2 Ejemplo de goto en un bucle
<?php
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j alcanzó 17';
?>
El resultado del ejemplo sería:
j hit 17
Ejemplo #3 Esto no funcionará
<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
loop:
}
}
echo "$i = $i";
?>
El resultado del ejemplo sería:
Fatal error: 'goto' into loop or switch statement is disallowed in script on line 2 (Error fatal: 'goto' hacia el interior de un bucle o sentencia switch no esta permitido en el script en la línea 2)
Nota:
El operador goto está disponible a partir de PHP 5.3.
Una función puede ser definida usando una sintaxis como la siguiente:
Ejemplo #1 Pseudo código para demostrar el uso de funciones
<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
echo "Función de ejemplo.\n";
return $valordevuelto;
}
?>
Cualquier código PHP válido puede aparecer dentro de una función, incluso otras funciones y definiciones de clases.
Los nombres de las funciones siguen las mismas reglas que otras etiquetas de PHP. Un nombre de función válido comienza con una letra o guión bajo, seguido de cualquier número de letras, números, o guiones bajos. Como expresión regular se expresaría así: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Vea también Guia de Entorno de Usuario para Nombres.
Las funciones no necesitan ser definidas antes de que se referencien, excepto cuando una función está condicionalmente definida como se muestra en los dos ejemplos de abajo.
Cuando una función está definida de una forma condicional como en los dos ejemplos mostrados, sus definiciones deben ser procesadas antes de ser llamadas.
Ejemplo #2 Funciones condicionales
<?php
$haceralgo = true;
/* No podemos llamar a foo() desde aquí
ya que no existe aún,
pero podemos llamar a bar() */
bar();
if ($haceralgo) {
function foo()
{
echo "No existo hasta que la ejecución del programa llegue hasta mí.\n";
}
}
/* Ahora podemos llamar de forma segura a foo()
ya que $haceralgo se evaluó como verdadero */
if ($haceralgo) foo();
function bar()
{
echo "Existo desde el momento inmediato que comenzó el programa.\n";
}
?>
Ejemplo #3 Funciones dentro de funciones
<?php
function foo()
{
function bar()
{
echo "No existo hasta que se llame a foo().\n";
}
}
/* No podemos llamar aún a bar()
ya que no existe. */
foo();
/* Ahora podemos llamar a bar(),
el procesamiento de foo()
la ha hecho accesible. */
bar();
?>
Todas las funciones y las clases de PHP tienen ámbito global - pueden ser llamadas fuera de una función incluso si fueron definidas dentro, y viceversa.
PHP no soporta la sobrecarga de funciones, ni es posible 'desdefinir' ni redefinir funciones previamente declaradas.
Nota: Los nombres de las fuciones son insensibles a mayúsculas-minúsculas, por lo que es una buena idea llamar a las funciones tal y como aparecen en sus declaraciones.
El número variable de argumentos y los argumentos predeterminados están soportados por las funciones. Vea también las referencias de funciones para func_num_args(), func_get_arg(), y func_get_args() para más información.
En PHP es posible llamar a funciones recursivas. Sin embargo, evite las llamadas a funciones/métodos recursivos con más de 100-200 niveles de recursividad ya que pueden agotar la pila y causar la terminación del script actual.
Ejemplo #4 Funciones recursivas
<?php
function recursividad($a)
{
if ($a < 20) {
echo "$a\n";
recursividad($a + 1);
}
}
?>
La información puede ser pasada a las funciones mediante la lista de argumentos, la cual es una lista de expresiones delimitadas por comas. Los argumentos son evaluados de izquierda a derecha.
PHP soporta argumentos pasados por valor (por defecto), pasados por referencia, y valores de argumentos predeterminados. Las Listas de argumentos de longitud variable también están soportadas, vea también las referencias de funciones para func_num_args(), func_get_arg(), y func_get_args() para más información.
Ejemplo #1 Pasar arrays a funciones
<?php
function tomar_array($entrada)
{
echo "$entrada[0] + $entrada[1] = ".$entrada[0]+$entrada[1];
}
?>
Por defecto, los argumentos de las funciones son pasados por valor (por lo que si el valor del argumento dentro de la función se cambia, no se cambia fuera de la función). Para permitir a una función modificar sus argumentos, éstos deben pasarse por referencia.
Para hacer que un argumento a una función sea siempre pasado por referencia hay que poner delante del nombre del argumento el signo 'ampersand' (&) en la definición de la función:
Ejemplo #2 Pasar parámetros de una función por referencia
<?php
function añadir_algo(&$cadena)
{
$cadena .= 'y algo más.';
}
$cad = 'Esto es una cadena, ';
añadir_algo($cad);
echo $cad; // imprime 'Esto es una cadena, y algo más.'
?>
Una función puede definir valores predeterminados al estilo C++ para argumentos escalares como sigue:
Ejemplo #3 Uso de parámetros predeterminados en funciones
<?php
function hacercafé($tipo = "capuchino")
{
return "Hacer una taza de $tipo.\n";
}
echo hacercafé();
echo hacercafé(null);
echo hacercafé("espresso");
?>
El resultado del ejemplo sería:
Hacer una taza de capuchino. Hacer una taza de . Hacer una taza de espresso.
PHP también permite el uso de arrays y del tipo especial NULL
como valores predeterminados, por ejemplo:
Ejemplo #4 Usar tipos no escalares como valores predeterminados
<?php
function hacercafé($tipos = array("capuchino"), $fabricanteCafé = NULL)
{
$aparato = is_null($fabricanteCafé) ? "las manos" : $fabricanteCafé;
return "Hacer una taza de ".join(", ", $tipos)." con $aparato.\n";
}
echo hacercafé();
echo hacercafé(array("capuchino", "lavazza"), "una tetera");
?>
El valor predeterminado debe ser una expresión constante, no (por ejemplo) una variable, un miembro de una clase o una llamada a una función.
Observe que cuando se usan argumentos predeterminados, cualquiera de ellos debería estar a la derecha de los argumentos no predeterminados; si no, las cosas no funcionarán como se esperaba. Considere el siguiente trozo de código:
Ejemplo #5 Uso incorrecto de argumentos predeterminados en una función
<?php
function haceryogur($tipo = "acidófilo", $sabor)
{
return "Hacer un tazón de yogur $tipo de $sabor.\n";
}
echo haceryogur("frambuesa"); // no funcionará como se esperaba
?>
El resultado del ejemplo sería:
Warning: Missing argument 2 in call to haceryogur() in /usr/local/etc/httpd/htdocs/phptest/functest.html on line 41 Hacer un tazón de yogur frambuesa de .
Ahora compare el ejemplo de arriba con este:
Ejemplo #6 Uso correcto de argumentos predeterminados en una función
<?php
function haceryogur($sabor, $tipo = "acidófilo")
{
return "Hacer un tazón de yogur $tipo de $sabor.\n";
}
echo haceryogur("frambuesa"); // funciona como se esperaba
?>
El resultado del ejemplo sería:
Hacer un tazón de yogur acidófilo de frambuensa.
Nota: A partir de PHP 5, los valores predeterminados se pueden pasar por referencia.
PHP tiene soporte para listas de argumentos de longitud variable en funciones definidas por el usuario. Esto realmente es bastante fácil si se usan las funciones func_num_args(), func_get_arg(), y func_get_args().
No se necesita una sintaxis especial, y la lista de argumentos aún puede ser proporcionada explícitamente con definiciones de funciones, y se comportará con normalidad.
Los valores son devueltos usando la sentencia opcional return. Se puede devolver cualquier tipo, incluidos arrays y objetos. Esto causa que la función finalice su ejecución inmediatamente y pase el control de nuevo a la línea desde la que fue llamada. Véase return para más información.
Nota:
Si se omite return será devuelto el valor
NULL.
Ejemplo #1 Uso de return
<?php
function cuadrado($núm)
{
return $núm * $núm;
}
echo cuadrado(4); // imprime '16'.
?>
Una función no puede devolver múltiples valores, pero se pueden obtener resultados similares devolviendo un array.
Ejemplo #2 Devolver un array para obtener múltiples valores
<?php
function números_pequeños()
{
return array (0, 1, 2);
}
list ($cero, $uno, $dos) = números_pequeños();
?>
Para devolver una referencia desde una función use el operador de referencia &, en la declaración de la función y cuando se asigne el valor devuelto a una variable:
Ejemplo #3 Devolver una referencia desde una función
<?php
function &devolver_referencia()
{
return $algunaref;
}
$nuevaref =& devolver_referencia();
?>
Para más información sobre referencias, por favor, lea las Referencias Explicadas.
PHP soporta el concepto de funciones variables. Esto significa que si un nombre de variable tiene paréntesis anexos a él, PHP buscará una función con el mismo nombre que lo evaluado por la variable, e intentará ejecutarla. Entre otras cosas, esto se puede usar para implementar llamadas de retorno, tablas de funciones, y así sucesivamente.
Las funciones variables no funcionarán con constructores de lenguaje como echo, print, unset(), isset(), empty(), include, require y similares. Utilice funciones de envoltura para hacer uso de cualquiera de estos constructores como funciones variables.
Ejemplo #1 Ejemplo de función variable
<?php
function foo() {
echo "En foo()<br />\n";
}
function bar($arg = '')
{
echo "En bar(); el argumento era '$arg'.<br />\n";
}
// Esta es una función de envoltura alrededor de echo
function hacerecho($cadena)
{
echo $cadena;
}
$func = 'foo';
$func(); // Esto llama a foo()
$func = 'bar';
$func('prueba'); // Esto llama a bar()
$func = 'hacerecho';
$func('prueba'); // Esto llama a hacerecho()
?>
Los métodos de objetos también puede ser llamados con la sintaxis de funciones variables.
Ejemplo #2 Ejemplo de método variable
<?php
class Foo
{
function Variable()
{
$nombre = 'Bar';
$this->$nombre(); // Esto llama al método Bar()
}
function Bar()
{
echo "Esto es Bar";
}
}
$foo = new Foo();
$nombrefunc = "Variable";
$foo->$nombrefunc(); // Esto llama a $foo->Variable()
?>
Cuando se llaman a métodos estáticos, la llamada a la función es más fuerte que el operador de propiedad static:
Ejemplo #3 Ejemplo de método variable con propiedades estáticas
<?php
class Foo
{
static $variable = 'propiedad estática';
static function Variable()
{
echo 'Método Variable llamado';
}
}
echo Foo::$variable; // Esto imprime 'propiedad estática'. No necesita una $variable en este ámbito.
$variable = "Variable";
Foo::$variable(); // Esto llama a $foo->Variable() leyendo $variable en este ámbito.
?>
Véase también is_callable(), call_user_func(), variables variables y function_exists().
PHP se estandariza con muchas funciones y construcciones. También existen funciones que necesitan extensiones específicas de PHP compiladas, si no, aparecerán errores fatales "undefined function" ("función no definida"). Por ejemplo, para usar las funciones de image tales como imagecreatetruecolor(), PHP debe ser compilado con soporte para GD. O para usar mysql_connect(), PHP debe ser compilado con soporte para MySQL. Hay muchas funciones de núcleo que está incluidas en cada versión de PHP, tales como las funciones de string y de variable. Una llamada a phpinfo() o get_loaded_extensions() mostrará las extensiones que están cargadas en PHP. Observe también que muchas extensiones están habilitadas por defecto y que el manual de PHP está dividido por extensiones. Véase configuración, instalación, y capítulos individuales de extensiones para más información sobre cómo configurar PHP.
Interpretar y comprender un prototipo de una función está explicado dentro de la sección del manual titulada cómo interpretar la definición de una función. Es importante comprender lo que devuelve una función o si una función funciona directamente con un valor pasado. Por ejemplo, str_replace() devolverá la cadena modificada mientras que usort() funciona con la variable actual pasada. Cada página del manual también tiene información específica para cada función, como información sobre parámetros de funciones, cambios de comportamiento, valores devueltos en caso de éxito o fallo, e información de disponibilidad. Conocer estas importantes diferencias (a menudo imperceptibles) es crucial para escribir código de PHP correcto.
Nota: Si los parámetros dados a una función no son los que se esperaban, como pasar un array donde se esperaba un string, el valor devuelto de la función será indefinido. En este caso lo más probable es que devuelva
NULLpero esto es sólo una convención, y no se puede confiar en ello.
Véase también function_exists(), la referencia de funciones, get_extension_funcs(), y dl().
Las funciones anónimas, también conocidas como clausuras (closures), permiten la creación de funciones que no tienen un nombre especificado. Son más útiles como valor de los parámetros de llamadas de retorno, pero tienen muchos otros usos.
Ejemplo #1 Ejemplo de función anónima
<?php
echo preg_replace_callback('~-([a-z])~', function ($coincidencia) {
return strtoupper($coincidencia[1]);
}, 'hola-mundo');
// imprime holaMundo
?>
Las clausuras también se pueden usar como valores de variables; PHP automáticamente convierte tales expresiones en instancias de la clase interna Closure. Se asume que una clausura a una variable usa la misma sintaxis que cualquier otra asignación, incluido el punto y coma final:
Ejemplo #2 Ejemplo de asignación de variable de una función anónima
<?php
$saludo = function($nombre)
{
printf("Hola %s\r\n", $nombre);
};
$saludo('Mundo');
$saludo('PHP');
?>
Las clausuras también pueden heredar variables del ámbito padre. Cualquier variable de estas debe ser declarada en la cabecera de la función. Heredar variables del ámbito padre no es lo mismo que usar variables globales. Las variables globales existen en el ámbito global, lo que implica que no importa qué función se esté ejecutando. El ámbito padre de una clausura es la función en la que la clausura fue declarado (no necesariamente la función desde la que se llamó). Vea el siguiente ejemplo:
Ejemplo #3 Clausuras y ámbito
<?php
// Un carro de compras básico que contiene una lista de productos añadidos
// y la cantidad de cada producto. Incluye un método que
// calcula el precio total de los artículos del carro usando una
// clausura como llamada de retorno.
class Carro
{
const PRECIO_MANTEQUILLA = 1.00;
const PRECIO_LECHE = 3.00;
const PRECIO_HUEVOS = 6.95;
protected $productos = array();
public function añadir($producto, $cantidad)
{
$this->productos[$producto] = $cantidad;
}
public function obtenerCantidad($producto)
{
return isset($this->productos[$producto]) ? $this->productos[$producto] :
FALSE;
}
public function obtenerTotal($impuesto)
{
$total = 0.00;
$llamadaDeRetorno =
function ($cantidad, $producto) use ($impuesto, &$total)
{
$precioUnidad = constant(__CLASS__ . "::PRECIO_" .
strtoupper($producto));
$total += ($precioUnidad * $cantidad) * ($impuesto + 1.0);
};
array_walk($this->productos, $llamadaDeRetorno);
return round($total, 2);
}
}
$mi_carro = new Carro;
// Añadir algunos artículos al carro
$mi_carro->añadir('mantequilla', 1);
$mi_carro->añadir('leche', 3);
$mi_carro->añadir('huevos', 6);
// Imprimir el total con un impuesto de venta del 5%.
print $mi_carro->obtenerTotal(0.05) . "\n";
// El resultado es 54.29
?>
Las funciones anónimas son implementadas usando la clase Closure.
| Versión | Descripción |
|---|---|
| 5.4.0 | $this puede ser usado en funciones anónimas. |
| 5.3.0 | Las funciones anónimas se encuentran disponibles. |
Nota: Es posible usar func_num_args(), func_get_arg(), y func_get_args() desde dentro de una clausura.
A partir de PHP 5, el modelo de objetos ha sido reescrito para permitir un mejor rendimiento y con más características. Este fue un cambio importante a partir de PHP 4. PHP 5 tiene un modelo de objetos completo.
Entre las características de PHP 5 están la inclusión de la visibilidad, las clases abstractas y clases y métodos finales, métodos mágicos adicionales, interfaces, clonación y tipos sugeridos.
PHP trata los objetos de la misma manera como referencias o manejadores, lo que significa que cada variable contiene una referencia de objeto en lugar de una copia de todo el objeto. Ver objetos y referencias
Vea también Guia de Entorno de Usuario para Nombres.
La definición básica de clases comienza con la palabra clave class, seguido por un nombre de clase, continuado por un par de llaves que encierran las definiciones de las propiedades y métodos pertenecientes a la clase.
El nombre de clase puede ser cualquier etiqueta válida que no sea una palabra reservada de PHP. Un nombre válido de clase comienza con una letra o un guión bajo, seguido de la cantidad de letras, números o guiones bajos que sea. Como una expresión regular, se expresaría de la siguiente forma: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Una clase puede tener sus propias constantes, variables (llamadas "propiedades"), y funciones (llamadas "métodos").
Ejemplo #1 Definición simple de una clase
<?php
class SimpleClass
{
// Declaración de la propiedad
public $var = 'a default value';
// Declaración del método
public function displayVar() {
echo $this->var;
}
}
?>
La pseudo-variable $this está disponible cuando un método es invocado dentro del contexto de un objeto. $this es una referencia del objeto que invoca (usualmente el objeto al que el método pertenece, pero posiblemente sea otro objeto, si el método es llamado estáticamente desde el contexto de un objeto secundario).
Ejemplo #2 Algunos ejemplo de la pseudo-variable $this
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this está definida (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this no está definida.\n";
}
}
}
class B
{
function bar()
{
// Nota: la siguiente línea arrojará un Warning si E_STRICT está habilitada.
A::foo();
}
}
$a = new A();
$a->foo();
// Nota: la siguiente línea arrojará un Warning si E_STRICT está habilitada.
A::foo();
$b = new B();
$b->bar();
// Nota: la siguiente línea arrojará un Warning si E_STRICT está habilitada.
B::bar();
?>
El resultado del ejemplo sería:
$this está definida (A) $this no está definida. $this está definida (B) $this no está definida.
Para crear una instancia de una clase, la palabra clave new debe ser usada. Un objeto siempre se creará a menos que el objeto tenga un constructor que arroje una excepción en caso de error. Las clases deberían ser definidas antes de la instanciación (y en algunos casos esto es un requerimiento).
Si un string que contiene el nombre de una clase se usa con new, una nueva instancia de esa clase será creada. Si la clase está en un espacio de nombres, su nombre completo debe ser usado cuando se hace esto.
Ejemplo #3 Creación de una instancia
<?php
$instance = new SimpleClass();
// Esto también se puede hacer con variables:
$className = 'Foo';
$instance = new $className(); // Foo()
?>
En el contexto de una clase, es posible crear un nuevo objeto con new self y new parent.
Cuando se asigna una instancia de una clase ya creada a una nueva variable, ésta última accederá a la misma instancia como al objeto que le fue asignado. Esta conducta es la misma cuando se pasan instancias a una función. Una copia de un objeto ya creado se puede lograr a través de la clonación de la misma.
Ejemplo #4 Asignación de objetos
<?php
$instance = new SimpleClass();
$assigned = $instance;
$reference =& $instance;
$instance->var = '$assigned tendrá este valor';
$instance = null; // $instance y $reference se transforman en null
var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>
El resultado del ejemplo sería:
NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned tendrá este valor"
}
PHP 5.3.0 introdujo un par de nuevas maneras para crear instancias de un objeto:
Ejemplo #5 Creando nuevos objetos
<?php
class Test
{
static public function getNew()
{
return new static;
}
}
class Child extends Test
{}
$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);
$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);
$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>
El resultado del ejemplo sería:
bool(true) bool(true) bool(true)
Una clase puede heredar los métodos y propiedades de otra clase al utilizar la palabra clave extends en la declaración de la clase. No es posible extender múltiples clases; una clase sólo puede heredar de una