Está en la página 1de 973

Copyright

Manual de PHP
Prefacio
Conceptos bsicos
Introduccin
Un tutorial sencillo
Instalacin y configuracin
Consideraciones generales de instalacin
Instalacin sobre sistemas Unix
Instalacin en Mac OS X
Instalacin en sistemas Windows
Instalacin en las plataformas de Nube Informtica
Manejador de Procesos FastCGI (FPM)
Instalacin de extensiones PECL
Problemas?
Configuracin en tiempo de ejecucin
Referencia del lenguaje
Sintaxis bsica
Tipos
Variables
Constantes
Expresiones
Operadores
Estructuras de Control
Funciones
Clases y Objetos
Espacios de Nombres
Excepciones
Generadores
Referencias Explicadas
Variables predefinidas
Excepciones predefinidas
Interfaces y clases predefinidas
Opciones de contexto y parmetros
Protocolos y Envolturas soportados
Seguridad
Introduccin
Consideraciones generales
Installed as CGI binary
Instalado como mdulo de Apache
Seguridad del Sistema de Archivos
Seguridad de Bases de Datos
Reportando errores
Usando Register Globals
Datos Enviados por el Usuario
Comillas Mgicas
Ocultando PHP
Mantenerse al da
Caractersticas
Autenticacin HTTP con PHP


Cookies
Sesiones
Manejo de XForms
Manejando la carga de archivos
Usando archivos remotos
Manejo de Conexiones
Conexiones Persistentes a Bases de Datos
Safe Mode
Funcionamiento en la lnea de comandos Usando PHP desde la
lnea de comandos
Recoleccin de Basura
Referencia de funciones
Afecta el comportamiento de PHP
Manipulacin de formatos de audio
Servicios de autenticacin
Extensiones relacionadas con fecha y hora
Extensiones especficas de la lnea de comandos
Extensiones de compresin y archivos
Procesamiento de tarjetas de crdito
Extensiones criptogrficas
Extensiones de bases de datos
Extensiones relacionadas con el sistema de ficheros
Soporte para lenguaje humano y codificacin de caracteres
Procesamiento y generacin de imgenes
Extensiones relacionadas con Email
Extensiones matemticas
Salida MIME que no es texto
Extensiones de control de procesos
Otras extensiones bsicas
Otros servicios
Extensiones para motores de bsqueda
Extensiones especficas para Servidores
Extensiones de sesiones
Procesamiento de texto
Extensiones relacionadas con variable y tipo
Servicios web
Extensiones especficas de Windows
Manipulacin XML
El ncleo de PHP: Gua del Hacker
Preface
Memory management
Working with Variables
Writing Functions
Writing Classes
Working with Resources
Working with INI settings
Trabajar con flujos
The "counter" Extension - A Continuing Example
The PHP 5 build system
Extension structure


PDO Driver How-To
Extension FAQs
Zend Engine 2 API reference
Zend Engine 2 Opcodes
Zend Engine 1
FAQ FAQ: Preguntas frequentes
Informacin general
Listas de correos
Consiguiendo PHP
Problemas con bases de datos
Instalacin
Problemas de Compilacin
Usando PHP
Hash de Contraseas Hash de contraseas seguro
PHP y HTML
PHP y COM
PHP y otros lenguajes
Migracin de PHP 4 a PHP 5
Preguntas Varias
Apndices
Historia de PHP y Proyectos Relacionados
Migrating from PHP 5.4.x to PHP 5.5.x
Migrando de PHP 5.3.x hacia PHP 5.4.x
Migrando de PHP 5.2.x a PHP 5.3.x
Migracin de PHP 5.1.x a PHP 5.2.x
Migracin de PHP 5.0.x a PHP 5.1.x
Migracin desde PHP 4 a PHP 5.0.x
Clases y Objetos (PHP 4)
Depuracin en PHP
Opciones de configuracin
Directivas de php.ini
Categorizacin de Extensiones
Listado de funciones alias
Lista de palabras reservadas
Lista de Tipos de Recurso
Lista de Filtros Disponibles
Lista de Transportes de Sockets Soportados
Tablas de comparacin de tipos de PHP
Lista de componentes lxicos del analizador
Guia de Entorno de Usuario para Nombres
Acerca del manual
Creative Commons Attribution 3.0
Listado de ndices
Registro de cambios
Prefacio
PHP, acrnimo de "PHP: Hypertext Preprocessor", es un lenguaje de
'scripting' de propsito general y de cdigo abierto que est especialmente
pensado para el desarrollo web y que puede ser embebido en pginas
HTML. Su sintaxis recurre a C, Java y Perl, y es fcil de aprender. La meta
printcipal de este lenguaje es permitir a los desarrolladores web escribir


dinmica y rpidamente pginas web generadas; aunque se puede hacer
mucho ms con PHP.
Este manual consiste principalmente en una referencia de funciones,
aunque tambin contiene una referencia del lenguaje, explicaciones de
algunas de las caractersticas importantes de PHP, y otra
informacin suplementaria.
Este manual se puede descargar en diferentes formatos
en http://www.php.net/download-docs.php. Puede encontrarse ms
informacin sobre cmo se desarrolla este manual en el apndice 'Acerca de
este manual'. Si est interesado en la Historia de PHP, visite el apndice
correspondiente.
Qu es PHP?
PHP (acrnimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de
cdigo abierto muy popular especialmente adecuado para el desarrollo web y que
puede ser incrustado en HTML.
Bien, 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>Ejemplo</title>
</head>
<body>

<?php
echo "Hola, soy un script de PHP!";
?>

</body>
</html>
En lugar de usar muchos comandos para mostar HTML (como en C o en Perl), las
pginas de PHP contienen HTML con cdigo incrustado que hace "algo" (en este
caso, mostrar "Hola, soy un script de PHP!). El cdigo de PHP est encerrado entre
las etiquetas especiales de comienzo y final <?php y ?> que permiten entrar y salir
del "modo PHP".
Lo que distingue a PHP de algo como Javascript del lado del cliente es que el
cdigo es ejecutado en el servidor, generando HTML y envindolo al cliente. El
cliente recibir el resultado de ejecutar el script, aunque no se sabra el cdigo
subyacente que era. El servidor web puede ser incluso configurado para que procese
todos los ficheros HTML con PHP, por lo que no hay manera de que los usuarios
puedan saber qu se tiene debajo de la manga.
Lo mejor de usar PHP es que es extremadamente simple para el principiante, pero a
su vez ofrece muchas caractersticas avanzadas para los programadores
profesionales. No sienta miedo de leer la larga lista de caractersticas de PHP. En
unas pocas horas podr empezar a escribir sus primeros scripts.
Aunque el desarrollo de PHP est centrado en programacin de scripts del lado del
servidor, se puede utilizar para muchas otras cosas. Siga leyendo y descubra ms en


la seccin Qu puede hacer PHP?, o vaya directo al tutorial introductorio si
solamente est interesado en programacin web.

Summary this chapter...

1. PHP : Hypertext PreProcessor.
2. Open Source Scripting Language - provides Publicity.
3. Loosely Typed language - provides Low Learning Curve.
4. Gets Embedded into HTML - provides High Productivity.
5. Strictly Server Side Processing only - provides Encapsulation.
6. PHP code is written between the tag <?php ?> or <? ?>
Qu puede hacer PHP?
Cualquier cosa. PHP est enfocado principalmente a la programacin de scripts del
lado del servidor, por lo que se puede hacer cualquier cosa que pueda hacer otro
programa CGI, como recopilar datos de formularios, generar pginas con
contenidos dinmicos, o enviar y recibir cookies. Aunque PHP puede hacer mucho
ms.
Existen principalmente tres campos principales donde se usan scripts de PHP.
Scripts del lado del servidor. Este es el campo ms tradicional y el foco
principal. Se necesitan tres cosas para que esto funcione. El analizador de
PHP (mdulo CGI o servidor), un servidor web y un navegador web. Es
necesario ejecutar el servidor, con una instalacin de PHP conectada. Se
puede acceder al resultado del programa PHP con un navegador, viendo la
pgina de PHP a travs del servidor. Todo esto se puede ejecutar en su
mquina si est experimentado con la programacin de PHP. Vase la
seccin sobre las instrucciones de instalacin para ms informacin.
Scripts desde la lnea de comandos. Se puede crear un script de PHP y
ejecutarlo sin necesidad de un servidor o navegador. Solamente es
necesario el analizador de PHP para utilizarlo de esta manera. Este tipo de
uso es ideal para scripts ejecutados regularmente usando cron (en *nix o
Linux) o el Planificador de tareas (en Windows). Estos scripts tambin
pueden usarse para tareas simples de procesamiento de texto. Vase la
seccin Uso de PHP en la lnea de comandos para ms informacin.
Escribir aplicaciones de escritorio. Probablemente PHP no sea el lenguaje
ms apropiado para crear aplicaciones de escritorio con una interfaz grfica
de usuario, pero si se conoce bien PHP, y se quisiera utilizar algunas
caractersticas avanzadas de PHP en aplicaciones del lado del cliente, se
puede utilizar PHP-GTK para escribir dichos programas. Tambin es posible
de esta manera escribir aplicaciones independientes de una plataforma.
PHP-GTK es una extensin de PHP, no disponible en la distribucin principal.
Si est interesado en PHP-GTK, puede visitar su propio sitio web.
PHP puede usarse en todos los principales sistemas operativos, incluyendo Linux,
muchas variantes de Unix (incluyendo HP-UX, Solaris y OpenBSD), Microsoft
Windows, Mac OS X, RISC OS y probablemente otros ms. PHP admite la mayora
de servidores web de hoy en da, incluyendo Apache, IIS, y muchos otros. Esto


incluye cualquier servidor web que pueda utilizar el binario de PHP FastCGI, como
lighttpd y nginx. PHP funciona tanto como mdulo como procesador de CGI.
De modo que con PHP se tiene la libertad de elegir el sistema operativo y el
servidor web. Adems, se tiene la posibilidad de utilizar programacin por
procedimientos o programacin orientada a objetos (POO), o una mezcla de
ambas.
Con PHP no se est limitado a generar HTML. Entre las capacidades de PHP se
incluyen la creacin de imgenes, ficheros PDF e incluso pelculas Flash (usando
libswf y Ming) generadas sobre la marcha. Tambin se puede generar fcilmente
cualquier tipo de texto, como XHTML y cualquier otro tipo de fichero XML. PHP
puede autogenerar stos ficheros y guardarlos en el sistema de ficheros en vez de
imprimirlos en pantalla, creando una cach en el lado del servidor para contenido
dinmico.
Una de las caractersticas ms potentes y destacables de PHP es su soporte para
un amplio abanico de bases de datos. Escribir una pgina web con acceso a una
base de datos es increiblemente simple utilizando una de las extensiones
especficas de bases de datos (p.ej., para mysql), o utilizar una capa de
abstraccin como PDO, o conectarse a cualquier base de datos que admita el
estndar de Conexin Abierta a Bases de Datos por medio de la extensin ODBC.
Otras bases de datos podran utilizar cURL o sockets, como lo hace CouchDB.
PHP tambin cuenta con soporte para comunicarse con otros servicios usando
protocolos tales como LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (en Windows)
y muchos otros. Tambin se pueden crear sockets de red puros e interactuar
usando cualquier otro protocolo. PHP tiene soporte para el intercambio de datos
complejos de WDDX entre virtualmente todos los lenguajes de programacin web.
Y hablando de interconexin, PHP posee soporte para la instalacin de objetos
Java y usarlos de forma transparente como objetos de PHP.
PHP tiene tiles caractersticas de procesamiento de texto, las cuales incluyen las
expresiones regulares compatibles con Perl (PCRE), y muchas extensiones y
herramientas para el acceso y anlisis de documentos XML. PHP estandariza todas
las extensiones XML sobre el fundamento slido de libxml2, y ampla este conjunto
de caractersticas aadiendo soporte para SimpleXML, XMLReader y XMLWriter.
Existen otras extensiones interesantes, las cuales estn
categorizadas alfabticamente y por categora. Y hay extensiones adicionales de
PECL que podran estar documentadas o no dentro del manual de PHP, tal
como XDebug.
Como se puede apreciar, esta pgina no es suficiente para enumerar todas las
caractersticas y beneficios que PHP ofrece. Consulte las seccionesInstalacin de
PHP y Referencia de las funciones para una explicacin de las extensiones
mencionadas aqu.
Qu necesito?


En este manual se asume que se cuenta con un servidor que tiene soporte
activado para PHP y que todos los ficheros con la extensin .php son tratados por
PHP. En la mayora de servidores, sta es la extensin predeterminada para los
ficheros de PHP, aunque puede preguntar al administrador de su servidor para
estar seguro. Si el servidor tiene soporte para PHP, entonces no es necesario hacer
nada. Simplemente cree sus ficheros .php, gurdelos en su directorio web y el
servidor los analizar por usted. No hay necesidad de compilar nada o instalar
otras herramientas. Piense en estos ficheros habilitados para PHP como simples
ficheros de HTML con el aadido de una nueva familia de etiquetas mgicas que
permiten todo tipo de cosas. La mayora de las compaas de hospedaje de
pginas web ofrecen soporte para usar PHP, pero si por alguna razn no lo hacen,
considere leer la seccin Enlaces de PHP para ms informacin acerca de
compaas de hospedaje que tienen soporte para PHP.
Digamos que quiere ahorrar el preciado ancho de banda y trabajar localmente. En
este caso, querr instalar un servidor web, como Apache, y por supuesto PHP.
Lo ms seguro es que tambin quiera instalar una base de datos como MySQL.
Puede instalarlos de forma independiente o bien puede elegir una manera ms
sencilla. Este manual contiene Instrucciones de instalacin de PHP(asumiendo que
tiene algn tipo de servidor web ya configurado). Si tuviera problemas con la
instalacin, sugerimos que formule sus preguntas en nuestra lista de correo de
instalacin. Si elige la manera ms sencilla, localice un paquete
preconfigurado para su sistema operativo, el cual instala automticamente todo
esto con nicamente unos pocos clics de ratn. Es sencillo configurar un servidor
web con soporte para PHP en cualquier sistema operativo, incluyendo MacOSX,
Linux y Windows. En Linux, podra encontrar til rpmfind y PBone para
localizar los RPMs. Tambin puede visitar apt-get para buscar paquetes para
Debian..
Su primera pgina con PHP
Comienze por crear un fichero llamado hola.php y pngalo en el directorio raz de
su servidor web (DOCUMENT_ROOT) con el siguiente contenido:
Ejemplo #1 Nuestro primer script de PHP: hola.php
<html>
<head>
<title>Prueba de PHP</title>
</head>
<body>
<?php echo '<p>Hola Mundo</p>'; ?>
</body>
</html>
Utilice su navegador web para acceder al fichero con el URL de su servidor,
finalizado con la referencia al fichero /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 configuracin de su servidor web. Si todo est configurado


correctamente, el fichero ser analizado por PHP y se enviar el siguiente
contenido a su navegador:
<html>
<head>
<title>Prueba de PHP</title>
</head>
<body>
<p>Hola mundo</p>
</body>
</html>
Este programa es extremadamente simple y realmente no es necesario usar PHP
para crear una pgina como esta. Lo nico que muestra es: Hola mundo usando
la sentencia echo de PHP. Observe que el fichero no necesita ser ejecutable o
especial de ninguna forma. El servidor reconoce que este fichero necesita ser
interpretado por PHP debido al uso de la extensin ".php", ya que el servidor est
configurado para enviarlo a PHP. Piense como si fuera un fichero HTML normal que
tiene una serie de etiquetas especiales disponibles con las que puede hacer
muchas cosas interesantes.
Si intent usar este ejemplo y no produjo ningn resultado, se le pregunt si
deseaba descargar el fichero, o se mostr todo el fichero como texto, lo ms
seguro es que PHP no se encuentre habilitado en su servidor o no est configurado
adecuadamente. Pdale a su administrador que lo habilite usando el
captulo Instalacin del manual. Si est trabajando localmente, lea tambin el
captulo dedicado a la instalacin para asegurarse de que todo est configurado
adecuadamente. Asegrese de que est accediendo al fichero mediante http y que
el servidor muestre el resultado. Si est abriendo el fichero desde el sistema de
ficheros, probablemente no ser analizado por PHP. Si el problema persiste, no
dude en usar alguna de las mltiples opciones del Soporte para PHP.
El objetivo de este ejemplo es el formato de las etiquetas especiales de PHP. En
este ejemplo usamos <?php para indicar el inicio de una etiqueta de PHP.
Despus ponemos la sentencia y abandonamos el modo PHP aadiendo la etiqueta
de cierre ?>. De esta manera, se puede entrar y salir del modo PHP en un fichero
HTML cada vez que se quiera. Para ms informacin, lea la seccin del manual
titulada Sintaxis bsica de PHP.
Nota: Una observacin sobre los avances de lnea
Los avances de lnea tienen poco sentido en HTML, aunque sigue siendo buena
idea hacer que el cdigo HTML se vea limpio y claro poniendo avances de lnea.
PHP automticamente eliminar los avances de lnea que estn despus de una
etiqueta de cierre ?>. Esto puede ser muy til al poner muchos bloques de PHP o
incluir ficheros que contienen PHP y que se supone que no deben mostarar nada.
Al mismo tiempo, puede resultar un poco confuso. Se puede poner un espacio
despus de la etiqueta de cierre ?> para mostrar forzosamente un espacio y un
avance de lnea, o se puede poner un avance de lnea explcito en el ltimo
echo/print dentro del bloque de PHP.


Nota: Una observacin sobre los editores de texto
Hay muchos editores de texto y Entornos de Desarrollo Integrados (IDE por sus
siglas en Ingls) que se pueden usar para crear, editar, y gestionar ficheros de
PHP. Se puede encontrar una lista parcial de stos en Lista de editores de PHP.
Si desea recomendar un editor, por favor visite la pgina mencionada
anteriormente y pregunte al mantenedor de la pgina para que lo incluyan en la
lista. Contar con un editor que resalte la sintaxis puede ser de mucha ayuda.
Nota: Una observacin sobre los procesadores de texto
Los procesadores de texto como StarOffice Writer, Microsoft Word y Abiword no
son buenas opciones para editar ficheros de PHP. Si desea usar uno de stos
programas para probar este script, debe asegurarse de guardar el documento
como texto sin formato o PHP no ser capaz de leerlo y ejecutarlo.
Nota: Una observacin sobre el Bloc de Notas de Windows
Si escribe sus scripts de PHP usando el Bloc de Notas de Windows, debe
asegurarse de que sus ficheros sean guardados con la extensin .php. (El Bloc de
Notas automticamente aade la extensin .txt a los ficheros a menos que siga los
siguientes pasos para prevenirlo). Cuando guarde el fichero y el programa le
pregunte qu nombre desea dar al fichero, entrecomille el nombre (es decir,
"hola.php"). Una alternativa es hacer clic en el men desplegable "Documentos de
Texto (*.txt)" del cuadro de dilogo "Guardar como", y cambiar a la opcin "Todos
los archivos (*.*)". Aqu puede escribir el nombre del fichero sin las comillas.
Ahora que ha creado un pequeo script de PHP que funciona correctamente, es
hora de crear el script de PHP ms famoso: hacer una llamada a la
funcin phpinfo() para obtener mucha informacin til acerca de su sistema y
configuracin, como las variables predefinidas disponibles, los mdulos de PHP
cargados, y los ajustes de configuracin. Tmese algo de tiempo para revisar esta
importante informacin.
Ejemplo #2 Obtener la informacin del sistema desde PHP
<?php phpinfo(); ?>
Algo til
Hagamos ahora algo que puede ser ms til. Vamos a comprobar qu tipo de
navegador est utilizando el usuario vistante. Para hacerlo, vamos a comprobar el
string del agente de usuario que el navegador enva como parte de la peticin
HTTP. Esta informacin es almacenada en una variable. En PHP, las variables
siempre comienzan con un signo de dlar. La variable que nos interesa ahora
es $_SERVER['HTTP_USER_AGENT'].
Nota:


$_SERVER es una variable especial reservada por PHP que contiene toda la
informacin del servidor web. Es conocida como una Superglobal. Consulte la
pgina del manual sobre Superglobales para ms informacin. Estas variables
especiales fueron introducidas en la versin 4.1.0 de PHP. Antes se podan usar
en su lugar los antiguos arrays $HTTP_*_VARS, tales como $HTTP_SERVER_VARS.
Aunque estn obsoletos, estos antiguos arrays todava existen. (Vase tambin la
nota sobre cdigo antiguo.)
Para mostrar esta variable, se puede hacer simplemente:
Ejemplo #1 Imprimir una variable (elemento de array)
<?php
echo $_SERVER['HTTP_USER_AGENT'];
?>
Un ejemplo del resultado de este script podra ser:

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Hay muchos tipos de variables en PHP. En el ejemplo anterior se muestra un
elemento de un Array. Los arrays pueden ser muy tiles.
$_SERVER es simplemente una variable que se encuentra disponible
automticamente en PHP. Se puede encontrar una lista en la seccin Variables
reservadas del manual, o se puede obtener una lista completa observando la salida
de la funcin phpinfo() usada en el ejemplo de la seccin anterior.
Puede usar mltiples sentencias de PHP dentro de una etiqueta PHP y crear
pequeos bloques de cdigo que realicen ms que un solo 'echo'. Por ejemplo, si
se quisiera detectar el uso de Internet Explorer, se podra hacer 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 este script sera:
Est usando Internet Explorer.<br />
Aqu hemos introducido un par de conceptos nuevos. Tenemos una sentencia if. Si
est familiarizado con la sintaxis bsica del lenguaje C, debera parecerle lgico.
De lo contrario, probablemente debera conseguir un libro que le introduzca a PHP,
y leer el primer par de captulos, o leer la parte del manual titulada Referencia del
lenguaje.
El segundo concepto que introducimos fue la funcin llamada strpos(). strpos() es
una funcin integrada en PHP que busca un cadena dentro de otra. En este caso


estamos buscando 'MSIE' (tambin llamado aguja) dentro
de $_SERVER['HTTP_USER_AGENT'] (tambin llamado pajar). Si la cadena se
encuentra dentro del pajar, la funcin devuelve la posicin de la aguja relativa al
inicio del pajar. De lo contrario, devuelve FALSE. Si no devuelve FALSE, la
expresin if se evala como TRUE y se ejecuta el cdigo entre llaves {}. De lo
contrario, el cdigo no ser ejecutado. Tmese la libertad de crear ejemplos
similares, con if, else, y otras funciones como strtoupper() y strlen(). Cada pgina
del manual relacionada tambin contiene ejemplos. Si no est seguro de cmo
usar estas funciones, es recomendable que lea las pginas del manual sobre Cmo
interpretar una definicin de funcin y la seccin sobre Funciones de PHP.
Podemos dar un paso ms y mostrar cmo se puede entrar y salir del modo PHP
incluso en medio de un bloque de cdigo de PHP:
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() debe haber devuelto falso</h3>
<p>No est usando Internet Explorer</p>
<?php
}
?>
Un ejemplo del resultado del script podra ser:
<h3>strpos() debe haber devuelto no falso</h3>
<p>Est usando Internet Explorer</p>
En vez de usar una sentencia echo de PHP para mostrar algo, salimos del modo
PHP y enviamos solamente HTML. Este es un punto muy importante y potente que
debemos observar aqu, y es que la fluidez lgica del script permanece intacta.
Slamente uno de los bloques HTML terminar siendo enviado al navegador
dependiendo del resultado de strpos(). En otras palabras, depende de si la
cadena MSIE fue encontrada o no.
Tratar con formularios
Otra de las caractersticas ms potentes de PHP es la forma en que gestiona
formularios HTML. El concepto bsico que es importante entender es que cualquier
elemento de un formulario estar disponible automticamente en sus scripts de
PHP. Por favor, lea la seccin del manual sobreVariables desde fuentes
externas para obtener ms informacin y ejemplos sobre cmo usar formularios
con PHP. Observemos un ejemplo:
Ejemplo #1 Un formulario HTML sencillo


<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 formulario. Es solamente un formulario HTML sin
ninguna clase de etiqueta especial. Cuando el usuario rellena este formulario y
oprime el botn de envo, se llama a la pgina accion.php. En este fichero se
podra escribir algo as:
Ejemplo #2 Mostrar informacin de nuestro formulario
Hola <?php echo htmlspecialchars($_POST['nombre']); ?>.
Usted tiene <?php echo (int)$_POST['edad']; ?> aos.
Un ejemplo del resultado de este script podra ser:
Hola Jos. Usted tiene 22 aos.
Excepto las partes de htmlspecialchars() y de (int), debera ser obvio qu es lo
que hace el cdigo. htmlspecialchars() se asegura de que cualquier carcter que es
especial en html sea codificado adecuadamente, de manera que nadie pueda
inyectar etiquetas HTML o Javascript en la pgina. El campo edad, ya que sabemos
que es un nmero, podemos convertirlo a un valor de tipo integer que
automticamente se deshar de cualquier carcter no numrico. Tambin se puede
hacer lo mismo con PHP con la extensin filter. Las
variables $_POST['nombre'] y $_POST['edad'] son establecidas automticamente
por PHP. Anteriormente hemos usado la superglobal $_SERVER; arriba
introdujimos la superglobal $_POST, la cual contiene todos los datos de POST.
Observe que el mtodo de nuestro formulario es POST. Si hubisemos usado el
mtodo GET, nuestra informacin estara en su lugar en la superglobal $_GET.
Tambin se podra usar la superglobal $_REQUEST, si no le preocupa la fuente de
los datos solicitados. Contiene toda la informacin mezclada de los datos de GET,
POST y COOKIE. Vea tambin la funcin import_request_variables().
En PHP, tambin puede tratar con entradas de XForms; aunque probablemente al
principio se sienta cmodo con los formularios de HTML, los cuales estn
ampliamente respaldados. A pesar de que trabajar con XForms no es para
principiantes, podran interesarle. Si es as, en la seccin de caractersticas hay
una pequea introduccin a la manipulacin de datos recibidos desde XForms.
siso dot abraham at gmail dot com
2 months ago
Para principiantes.
El html
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Formulario</title>
</head>
<body>


<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>
</body>
</html>
El php
<?php echo " Hola " . htmlspecialchars($_POST['nombre']);
echo " Usted tiene ".(int)$_POST['edad']." aos de edad.";
?>
Usar cdigo antiguo en nuevas versiones de PHP
Ahora que PHP ha crecido y se ha convertido en un lenguaje popular, hay muchos
ms repositorios y bibliotecas que contienen cdigo que puede reutilizar. Los
desarrolladores de PHP han intentado preservar la retrocompatibilidad, es decir, si
un script fue escrito para una versin antigua, funcionar (idealmente) sin ningn
cambio en una versin reciente de PHP. En la prctica, son necesarios
normalmente algunos cambios.
Dos de los cambios ms importantes que afectan el cdigo antiguo son:
La obsolescencia de los antiguos arrays $HTTP_*_VARS (que necesitan ser
indicados como globales al utilizarlos dentro de una funcin o mtodo). Los
siguientes arrays superglobales fueron introducidos en PHP 4.1.0.
Son: $_GET, $_POST, $_COOKIE, $_SERVER, $_FILES,$_ENV, $_REQUEST,
y $_SESSION. Los antiguos arrays $HTTP_*_VARS,
como $HTTP_POST_VARS, todava existen. A partir de PHP 5.0.0, los arrays
de variables predefinidas de tipo long de PHP se pueden desactivar con la
directiva register_long_arrays .
Las variables externas ya no son registradas en el mbito global de forma
predeterminada. En otras palabras, a partir de PHP 4.2.0, la directiva de
PHP register_globals est desactivada (off) por defecto en php.ini. El mejor
mtodo para acceder a estos valores es por medio de las variables
superglobales mencionadas anteriormente. Los scripts, libros y tutoriales
antiguos podran contar con que est directiva est activada (on). Si
fuera on, por ejemplo, se podra usar $id desde el
URL http://www.example.com/foo.php?id=42. Ya est activada o
desactivada,$_GET['id'] est siempre disponible.
Consideraciones generales de instalacin
Antes de empezar con la instalacin, primero necesita saber para qu quiere
utilizar PHP. Existen tres campos principales donde se puede utilizar PHP tal y
como se describe en la seccin: Qu se puede hacer con PHP?
Aplicaciones web y sitios web (scripting del lado del servidor)
Scripting en la lnea de comandos
Aplicaciones de escritorio (GUI)


Para la primera forma mencionada, que es la ms comn, se necesitan tres cosas:
PHP, un servidor web y un navegador web. Seguramente ya disponga del
navegador web y, dependiendo de la configuracin del sistema operativo, quiz ya
tenga un servidor web (p.ej. Apache en Linux y MacOS X; IIS en Windows).
Tambin puede alquilar espacio web en una empresa. De esta forma, no se
necesita instalar nada, solo tiene que escribir los scripts de PHP, subirlos al
servidor que alquile y ver los resultados en su navegador.
En caso de configurar el servidor y PHP por su cuenta, existen dos opciones para el
modo de conectar PHP con el servidor. Para muchos servidores, PHP tiene un
mdulo de interfaz directo (tambin llamado SAPI). Entre estos servidores se
incluyen Apache, Microsoft Internet Information Server, Netscape y iPlanet.
Muchos otros servidores tienen soporte para ISAPI, el mdulo de interfaz de
Microsoft (OmniHTTPd por ejemplo). Si PHP no tiene soporte para el mdulo de su
servidor web, siempre puede usarlo como procesador CGI o FastCGI. Esto significa
configurar el servidor para usar el CGI ejecutable de PHP para procesar cada una
de las peticiones a ficheros PHP en el servidor.
Si tambin est interesado en usar PHP bajo la lnea de comandos (p.ej. escribir
scripts que autogeneran imgenes de forma offline, o procesar ficheros de texto
dependiendo de los argumentos que se les pasen), siempre necesitar el
ejecutable de lnea de comandos. Para ms informacin, lea la seccin
sobre escribir aplicaciones PHP desde la lnea de comandos. En este caso, no se
necesita ningn servidor o navegador.
Con PHP tambin se pueden escribir aplicaciones GUI de escritorio usando la
extensin PHP-GTK. Este enfoque no tiene nada que ver con escribir pginas web,
ya que no se muestra nada de HTML, pero gestiona ventanas y objetos dentro de
ellas. Para ms informacin acerca de PHP-GTK, por favor visite el sitio dedicado
a esta extensin. PHP-GTK no est incluido en la distribucin oficial de PHP.
De aqu en adelante, esta seccin trata de la configuracin de PHP para servidores
web sobre Unix y Windows con interfaces de mdulo de servidor y ejecutables
CGI. Tambin se puede encontrar informacin sobre ejecutables de lnea de
comandos en las siguientes secciones.
El cdigo fuente de PHP y las distribuciones binarias para Windows pueden
encontrarse en http://www.php.net/downloads.php. Recomendamos elegir
un sitio alternativo cercano para descargar las distribuciones.
Instalacin sobre sistemas Unix
Tabla de contenidos
Apache 1.3.x sobre sistemas Unix
Apache 2.x sobre sistemas Unix
Lighttpd 1.4 en sistemas Unix
Servidores Sun, iPlanet y Netscape sobre Sun Solaris
CGI y configuraciones de lnea de comandos


Notas de instalacin especficas para HP-UX
Notas de instalacin para OpenBSD
Solaris sugerencias especficas de instalacin
Notas de instalacin en Debian GNU/Linux
Esta seccin le guiar a travs de la configuracin general e instalacin de PHP
sobre sistemas Unix. Asegrese de investigar cualquier seccin especfica a su
plataforma o servidor web antes de comenzar el proceso.
Tal como el manual lo esboza en la seccin Consideraciones generales de
instalacin, se est tratando principalmente con configuraciones de PHP centradas
en web en esta seccin, aunque tambin se cubrir el preparar PHP para usarse en
lnea de comando.
Existen varias maneras de instalar PHP para la plataforma Unix, ya sea con un
proceso de compilar y configurar, o a travs de varios mtodos pre-
empaquetados. Esta documentacin est enfocada principalmente alrededor del
proceso de compilar y configurar PHP. Muchos sistemas estilo Unix tienen algn
tipo de sistema de instalacin de paquetes. Esto puede ayudar en preparar una
configuracin standard, pero si se requiere tener un conjunto diferente de
caractersticas (tales como un servidor seguro, o un manejador diferente de base
de datos), podra ser necesario construir PHP y/o el servidor web. Si no se est
familiarizado con la construccin y el compilado de su propio software, vale la pena
revisar para ver si alguien ya ha construido una versin empaquetada de PHP con
las caractersticas que se necesitan.
Conocimientos y software necesarios para compilar:
Habilidades bsicas en Unix (ser capaz de operar "make" y un compilador
de C)
Un compilador ANSI C
Un servidor web
Cualquier componente especfico para mdulos (tales como GD, PDF libs,
etc.)
Cuando compile directamente de una fuente Git o despus de realizar
modificaciones usted necesita tambin:
autoconf: 2.13+ (para PHP < 5.4.0), 2.59+ (para PHP >= 5.4.0)
automake: 1.4+
libtool: 1.4.x+ (excepto 1.4.2)
re2c: Versin 0.13.4 o superior
flex: Versin 2.5.4 (para PHP <= 5.2)
bison: Versin 1.28 (preferido), 1.35, o 1.75
El proceso inicial de preparacin y configuracin de PHP es controlado por el uso
de las opciones de lnea de comando del script configure. Es posible obtener una
lista de todas las opciones disponibles junto con una descripcin corta
ejecutando ./configure --help. El manual documenta las diferentes opciones por
separado. Se encontrarn las opciones principales en el apndice, mientras que las


diferentes opciones especficas de las extensiones se describen en las pginas de
referencia.
Cuando PHP est configurado, se est listo para compilar el mdulo y/o
ejecutables. El comando make debera hacerse cargo de esto. Si falla y no se
puede encontrar el porque, vase la seccin de problemas.


Apache 1.3.x sobre sistemas Unix
Esta seccin contiene notas y consejos especficos a instalaciones Apache de PHP
sobre plataformas Unix. Tambin se tienen instrucciones y notas para Apache 2 en
una pgina por separado.
Se pueden seleccionar argumentos para agregar a configure en la lnea 10 debajo
de la lista de opciones principales de configure y de opciones especficas a
extensiones descritas en sus respectivos lugares en el manual. Los nmeros de
versin 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 instalacin (Versin de mdulo 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 habilitarn. 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 despus de la instalacin,
solamente se necesita repetir los ltimos tres pasos. Slo hace falta
reiniciar apache para que el nuevo mdulo tenga efecto. Una recompilacin de
Apache no es necesaria.



Ntese que a menos que se mencione lo contrario, 'make install' tambin
instalar PEAR,
varias herramientas de PHP tales como phpize, instalar la lnea de comando
(CLI) de PHP, y ms.

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 ubicacin, 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 mdulo de PHP. La ruta de acceso al lado
derecho
de el enunciado LoadModule debe apuntar a la ruta del mdulo de PHP
en su sistema. El make install anterior podra haber agregado esto ya
por usted, pero asegrese de revisarlo.

LoadModule php5_module libexec/libphp5.so

15. Y en la seccin AddModule de httpd.conf, en algn 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 extensin .php como PHP. Se podra
hacer que cualquier extensin o extensiones sean procesadas como PHP
simplemente aadiendo ms, con
cada una separada por un espacio. Se agregar .phtml para demostrarlo.

AddType application/x-httpd-php .php .phtml

Tambin es comn configurar la extensin .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 slo causar que el servidor recargue
utilizando
una seal HUP o USR1.)
Alternativamente, para instalar PHP como un objeto esttico:
Ejemplo #2 Instrucciones de instalacin (Instalacin de mdulo esttico
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 lnea anterior es correcta! S, ya se sabe que libphp5.a an 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 instalacin entonces se necesita dar "make install"
tambin)

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 aadir:
AddType application/x-httpd-php .php
Dependiendo de la instalacin de Apache y la variante de Unix, hay muchas
maneras posibles de detener y reiniciar el servidor. Abajo hay algunas lneas
tpicas 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 varan 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 librera compartida libphp5.so que se carga en Apache utilizando
una lnea LoadModule en el fichero de Apache httpd.conf. El soporte para
PostgreSQL est incluido dentro de esta librera.
./configure --with-apxs --with-pgsql=shared
Esto crear una librera compartida libphp5.so para Apache, pero tambin crear
una librera compartida pgsql.so que se carga en PHP ya sea usando la directiva de
extensin en el fichero php.ini o cargndola explcitamente en un script utilizando
la funcin dl().
./configure --with-apache=/path/to/apache_source --with-pgsql
Esto crear una librera libmodphp5.a, un mod_php5.c y algunos ficheros
acompaantes y cpiese estos dentro del directorio src/modules/php5en el
rbol de fuentes de Apache. Entonces se compila Apache utilizando --activate-
module=src/modules/php5/libphp5.a y el sistema de compilacin de Apache
crear libphp5.a y lo enlazar estticamente 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 librera compartidapgsql.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 mtodo. 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 (mtodo esttico) significa que PHP cargar y ejecutar ms rpido.
Para ms informacin, ver la pgina web de Apache sobre soporte DSO.
Nota:
El httpd.conf por omisin de Apache actualmente se distribuye con una seccin
que se parece a esto:


User nobody
Group "#-1"
A menos que se cambie esto a "Group nogroup" o algo como esto ("Group
daemon" es tambin muy comn) PHP no ser capaz de abrir ficheros.
Nota:
Asegrese de que se especifica la versin instalada de apxs cuando se utiliza --
with-apxs=/path/to/apxs . NO se debe utilizar la versin de apxs que est en
las fuentes de apache, si no la que en realidad est instalada en el sistema.
Apache 2.x sobre sistemas Unix
Esta seccin contiene notas y consejos especficos a las instalaciones de Apache
2.x de PHP sobre sistemas Unix.
Advertencia
No se recomienda utilizar un MPM threaded en produccin con Apache 2. Use MPM
prefork, que es el MPM por defecto en Apache 2.0 y 2.2. Para informacin sobre
cmo, lea la correspondiente entrada de la FAQ sobre utilizar Apache2 con un MPM
threaded
La Documentacin de Apache es la fuente de informacin ms autorizada acerca
del servidor Apache 2.x. Ah se puede encontrar ms informacin acerca de las
opciones de instalacin.
La versin ms reciente de Apache HTTP Server puede obtenerse del Sitio de
descargas de Apache, y una versin apropiada de PHP de los lugares
anteriormente mencionados. Esta gua rpida solamente cubre lo bsico para
comenzar con Apache 2.x y PHP. Para obtener ms informacin lea
la Documentacin de Apache. Los nmeros de versin han sido omitidos aqu,
para asegurar que las instrucciones no sean incorrectas. En los ejemplos
siguientes, 'NN' deber ser reemplazado con la versin especfica 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 versin
ms reciente, y la que se recomienda, si es que esa opcin est disponible. Sin
embargo, las instrucciones aqu funcionarn ya sea para 2.0 2.2.
1. Obtngase el servidor HTTP Apache de la ubicacin listada con anterioridad,
y desempquese:
2. gzip -d httpd-2_x_NN.tar.gz
3. tar -xf httpd-2_x_NN.tar
4. De la misma manera, obtener y desempacar las fuentes de PHP:
5. gunzip php-NN.tar.gz
6. tar -xf php-NN.tar


7. Compilar e instalar Apache. Consltese la documentacin de instalacin de
Apache para mayores detalles sobre la compilacin de Apache.
8. cd httpd-2_x_NN
9. ./configure --enable-so
10. make
11. make install
12. Ahora se tiene Apache 2.x.NN disponible debajo de /usr/local/apache2,
configurado con soporte para mdulos cargables y con el MPM (Mdulo de
multiproceso) prefork estndar. Para probar la instalacin sese el
procedimiento para iniciar el servidor Apache, por ej.:
13. /usr/local/apache2/bin/apachectl start
y detngase el servidor para proceder con la configuracin para PHP:
/usr/local/apache2/bin/apachectl stop
14. 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. Ntese que algunas
distribuciones pueden renombrar apxs cmo 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 configuracin despus de la
instalacin, se deben volver a ejecutar los pasos configure, make, y make
install. Solamente se necesita reiniciar apache para que el nuevo mdulo
tenga efecto. Una recompilacin de Apache no es necesaria.
Ntese que a menos que se indique lo contrario, 'make install' tambin
instalar PEAR, varias herramientas de PHP tales como phpize, instalar la
interfaz de lnea de comando (CLI) de PHP, y ms.
15. Configurar php.ini
16. 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 ubicacin, utilice --with-config-file-
path=/alguna/trayectoria en el paso 5.
Si en vez de eso se elige php.ini-production, asegrese de leer la lista de
cambios al interior, ya que afectan como se comporta PHP.


17. Edtese httpd.conf para cargar el mdulo PHP. La trayectoria a la derecha de
la sentencia LoadModule debe apuntar a la trayectoria del mdulo PHP en el
sistema. El make install anterior podra ya haber agregado esto
automticamente, pero asegrese de revisar.
LoadModule php5_module modules/libphp5.so
18. Indicar a Apache que procese ciertas extensiones como PHP. Por ejemplo,
hgase 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 extensin o extensiones sean procesadas como PHP simplemente
aadindolas. Se agregar .php para demostrarlo.
19. <FilesMatch \.php$>
20. 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 ms, se utilizara
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 cdigo 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 cdigo 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 cdigo fuente php no debe habilitarse en sistemas de produccin,
donde podra exponer informacin confidencial o de alguna otra manera
sensible incluida en cdigo fuente.
21. Utilcese el procedimiento normal para iniciar el servidor Apache, por ej.:
22. /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 mdulo SAPI. Por supuesto existen muchas opciones
ms de configuracin disponibles para Apache y PHP. Para ms informacin
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 opcin al argumento pasado a ./configure, en el paso 3
anterior:

--with-mpm=worker
Esto no debe llevarse a cabo sin ser consciente de las consecuencias de esta
decisin, y tener al menos un ligero entendimiento acerca de las implicaciones. La
documentacin de Apache al respecto de MPM-Modules discute los MPM en forma
mucho ms detallada.
Nota:
Las Preguntas frecuentes de Apache MultiViews discute acerca del uso de
multiviews con PHP.
Nota:
Para compilar una versin multihilo de Apache, el sistema destino debe soportar
hilos. En este caso, PHP tambin debe compilarse con la opcin Zend Thread
Safety (ZTS) experimental. Bajo esta configuracin, no todas las extensiones se
encontrarn disponibles. La configuracin recomendada es compilar Apache con el
MPM-module prefork por omisin.
Lighttpd 1.4 en sistemas Unix
Esta seccin contiene anotaciones y consejos especficos para la instalacin de PHP
en Lighttpd 1.4 para sistemas Unix.
Por favor, antes de continuar consulte el sistema de seguimiento de
Lighttpd para saber cmo instalar Lighttpd apropiadamente.
La SAPI recomendada para conectar PHP a Lighttpd es Fastcig. Esta SAPI viene
habilitada por omisin 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 haba php-cgi).


Permitiendo que Lighttpd lance procesos de php
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 dinmicamente.
PHP crear nuevos procesos hijos segn 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 nmero 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 cachs como APC slo estarn disponibles
para los procesos gestionados por PHP. Si se establece "min-procs" a un nmero
superior a 1, el nmero total de procesos oyentes en php se multiplicar por
PHP_FCGI_CHILDREN (2 min-procs * 16 hijos produce 32 oyentes).
Lanzando procesos con spawn-fcgi
Lighttpd contiene el programa spawn-fcgi que facilita lanzar procesos fastcgi.
Lanzando procesos php-cgi
Pese a que es ms laborioso, es posible lanzar procesos sin spawn-fcgi. La variable
de entorno PHP_FCGI_CHILDREN controla cuntos procesos hijo de PHP se
lanzarn 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 creacin de procesos php.
Ejemplo #2 Lanzando oyentes FastCGI
#!/bin/sh

# Ubicacin del binario php-cgi


PHP=/usr/local/bin/php-cgi

# Ubicacin del fichero PID
PHP_PID=/tmp/php.pid

# Enlazando a una direccin
#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"

Conexin a instancias FCGI remotas
Para poder tener aplicaciones escalables, pueden lanzarse instancias de fastcgi en
mltiples equipos remotos.
Ejemplo #3 Conexin a instancias de php-fastcgi remotas
fastcgi.server = ( ".php" =>
(( "host" => "10.0.0.2", "port" => 1030 ),
( "host" => "10.0.0.3", "port" => 1030 ))
)
Servidores Sun, iPlanet y Netscape sobre Sun Solaris
Esta seccin contiene notas y consejos especficos 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 mdulo
NSAPI para generar listados de directorio y pginas de errores personalizados.
Funciones adicionales para compatibilidad con Apache tambin se encuentran
disponibles. Para soporte en servidores web actuales, lase la nota sobre
subpeticiones.
Se puede encontrar ms informacin 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 instalacin apropiado para la
opcin--with-nsapi=[DIR]. El directorio por omisin es
comnmente /opt/netscape/suitespot/. Por favor tambin lase /php-xxx-
version/sapi/nsapi/nsapi-readme.txt.


1. Instalar los siguientes paquetes de http://www.sunfreeware.com/ o
algn otro sitio de descargas:
autoconf-2.13
automake-1.4
bison-1_25-sol26-sparc-local
flex-2_5_4a-sol26-sparc-local
gcc-2_95_2-sol26-sparc-local
gzip-1.2.4-sol26-sparc-local
m4-1_4-sol26-sparc-local
make-3_76_1-sol26-sparc-local
mysql-3.23.24-beta (si se desea soporte para mysql)
perl-5_005_03-sol26-sparc-local
tar-1.13 (GNU tar)
2. Asegurar que la ruta de acceso incluye los directorios
apropiados PATH=.:/usr/local/bin:/usr/sbin:/usr/bin:/usr/ccs/bin
y hacer que est disponible al sistema export PATH.
3. gunzip php-x.x.x.tar.gz (si se tiene una distribucin .gz, de lo contrario ir a
4).
4. tar xvf php-x.x.x.tar
5. Cambiarse al directorio de PHP ya extrado: cd ../php-x.x.x
6. 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:
7. ./configure --with-mysql=/usr/local/mysql \
8. --with-nsapi=/opt/netscape/suitespot/ \
--enable-libgcc
9. Ejecutar make seguido por make install.
Despus de realizar la instalacin base y de leer el fichero readme apropiado, es
posible que sea necesario realizar algunos pasos adicionales de configuracin.
Instrucciones de configuracin para Sun/iPlanet/Netscape
Primeramente quizs sea necesario agregar algunas rutas de acceso al
entorno LD_LIBRARY_PATH para que el servidor encuentre todas las libreras
compartidas. Esto puede hacerse de mejor manera en el script de arranque del
servidor web. El script de arranque se encuentra comnmente localizado
en: /ruta/al/servidor/https-servername/start. Quizs tambin sea necesario editar
los ficheros de configuracin que estn ubicados en: /ruta/al/servidor/https-
servername/config/.
1. Agregar la siguiente lnea a mime.types (se puede hacer esto por medio del
servidor de administracin):
2. type=magnus-internal/x-httpd-php exts=php
3. 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 lneas despus de mime types init.


4. Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans"
shlib="/opt/netscape/suitespot/bin/libphp4.so"
5. Init fn="php4_init" LateInit="yes" errorString="Failed to initialize
PHP!" [php_ini="/path/to/php.ini"]
(PHP >= 4.3.3) El parmetro php_ini es opcional pero con l se puede
colocar php.ini en el directorio de configuracin del servidor web.
6. Configurar el objeto por omisin en obj.conf (para clases de servidor virtual
[versin 6.0+] en su vserver.obj.conf):
7. <Object name="default">
8. .
9. .
10. .
11. .#NOTA esta siguiente lnea debera ocurrir despus de todos las lneas
'ObjectType' y antes de todas las lneas 'AddLog'
12. Service fn="php4_execute" type="magnus-internal/x-httpd-php"
[inikey=value inikey=value ...]
13. .
14. .
15. </Object>
(PHP >= 4.3.3) Como parmetros adicionales se pueden agregar algunos
valores especiales de php.ini, por ejemplo se puede fijar
unadocroot="/ruta/a/raz_de_documentos" especfica al
contexto php4_execute es llamado. Para llaves ini boleanas favor de
utilizar 0/1 como valor, no "On","Off",... (esto no funcionar
correctamente), por ejemplo. zlib.output_compression=1 en vez
dezlib.output_compression="On"
16. Esto es slo necesario si se quiere configurar un directorio que solamente
consiste de scripts de PHP (igual que un directorio cgi-bin):
17. <Object name="x-httpd-php">
18. ObjectType fn="force-type" type="magnus-internal/x-httpd-php"
19. Service fn=php4_execute [inikey=value inikey=value ...]
20. </Object>
Despus de configurar un directorio en el servidor de administracin y
asignarle el estilo x-httpd-php. Todos los ficheros en ste se ejecutarn
como PHP. Esto est bien para esconder el uso de PHP renombrando los
ficheros a .html.
21. Configuracin de la autenticacin: La autenticacin PHP no puede ser
utilizada con ninguna otra autenticacin. TODA AUTENTICACION LE ES
PASADA AL SCRIPT DE PHP. Para configurar la autenticacin de PHP para el
servidor entero, agregar la lnea siguiente al objeto por omisin:
22. <Object name="default">
23. AuthTrans fn=php4_auth_trans
24. .
25. .


26. .
27. </Object>
28. Para utilizar autenticacin de PHP en slo un directorio, agregar lo
siguiente:
29. <Object ppath="d:\ruta\al\directorio\auntenticado\*">
30. AuthTrans fn=php4_auth_trans
31. </Object>
Nota:
El tamao de la pila que utiliza PHP depende de la configuracin del servidor web.
Si se tienen fallas generales con scripts de PHP muy grandes, se recomienda
elevarlo con el servidor de administracin (en la seccin "MAGNUS EDITOR").
Ambiente CGI y modificaciones recomendadas en php.ini
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 vlida!
Nota:
Por qu hay variables CGI (invlidas) en el ambiente?
Respuesta: Esto es por que se inici el proceso del servidor web desde el servidor
de administracin que ejecuta el script de arranque del servidor web, que se
quera iniciar, como un script de CGI (Un script de CGI dentro del servidor de
administracin!). 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 administracin. Utilizar la lnea de comando como usuario root
e iniciarlo manualmente - se ver que no hay variables de ambiente a la CGI.
Simplemente cmbiense los scripts para obtener las variables CGI de la manera
correcta para PHP 4.x utilizando la superglobal $_SERVER. Si se tienen scripts ms
antiguos que usan $HTTP_HOST, etc., se debe
activar register_globals en php.ini y cambiar el orden de las variables tambin
(importante: quitar "E" de sta, porque no se necesita el entorno aqu):
variables_order = "GPCS"
register_globals = On


Uso especial para pginas de error o listados personalizados de
directorios (PHP >= 4.3.3)
Se puede utilizar PHP para generar pginas de errores para "404 Not Found" o
similares. Agregar la siguiente lnea al objeto en obj.conf por cada pgina de error
que se quiera sobreescribir:
Error fn="php4_execute" code=XXX script="/path/to/script.php" [inikey=value
inikey=value...]
donde XXX es el cdigo de error HTTP. Favor de borrar cualquier otra
directiva Error que pudiese interferir con la propia. Si se desea colocar una pgina
para todos los errores que puedan existir, dejar fuera el parmetro code. El script
puede obtener el cdigo de estado HTTP con$_SERVER['ERROR_TYPE'].
Otra posibilidad es generar listados de directorio personalizados. Solamente
creando un script PHP que despliegue un listado de directorio y reemplazando la
lnea por omisin 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...]
Para ambas pginas, de error y listados de directorio la URI original y la URI
traducida estn en las
variables $_SERVER['PATH_INFO'] y$_SERVER['PATH_TRANSLATED'].
Nota acerca de nsapi_virtual() y subpeticiones (PHP >= 4.3.3)
El mdulo NSAPI ahora soporta la funcin nsapi_virtual() (alias: virtual()) para
realizar subpeticiones en el servidor web e insertar el resultado en la pgina web.
Esta funcin utiliza algunas caractersticas no documentadas de la librera NSAPI.
En Unix el mdulo automticamente busca las funciones necesarias y las utiliza si
estn disponibles. Si no, se deshabilita nsapi_virtual().
Nota:
Pero se advierte: El soporte para nsapi_virtual() es EXPERIMENTAL!!!
CGI y configuraciones de lnea de comandos
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 mdulos, por lo general debe irse por esta solucin por
razones de rendimiento. Sin embargo, la versin CGI permite a los usuarios
ejecutar diferentes pginas con PHP bajo diferentes identificadores de usuarios.
Advertencia


Al usar el modo CGI, su servidor esta expuesto a diferentes ataques. Por favor,
leer la seccin Seguridad con CGI para aprender como defenderse de estos
ataques.
Pruebas
Si has construido PHP como un programa CGI, puede probar su construccin
escribiendo make test. Siempre es una buena idea probar su construccin. De
esta manera usted puede encontrar un problema al principio con PHP en la
plataforma, en lugar de tener que luchar con l ms adelante.
Utilizacin de variables
Algunos servidores suministrando variables de entorno no se definen en las
actuales CGI/1.1 specification. Slo las siguientes variables no se
definen: AUTH_TYPE, CONTENT_LENGTH, CONTENT_TYPE, GATEWAY_INTERFACE,
PATH_INFO, PATH_TRANSLATED, QUERY_STRING,REMOTE_ADDR, REMOTE_HOS
T, REMOTE_IDENT, REMOTE_USER, REQUEST_METHOD, SCRIPT_NAME, SERVER_
NAME, SERVER_PORT,SERVER_PROTOCOL, and SERVER_SOFTWARE. Todo lo
dems debe ser tratado como "extensiones de proveedor".
Notas de instalacin para OpenBSD
Esta seccin contiene notas y consejos especficos a la instalacin de PHP
sobre OpenBSD 3.6.
Utilizando paquetes binarios
Utilizar paquetes binarios para instalar PHP sobre OpenBSD es el mtodo ms
simple y recomendado. El paquete principal ha sido separado de los distintos
mdulos, 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 bsico (adems de gettext e iconv). Seguido, tmese un vistazo a los
paquetes de mdulos, 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 mdulos en el
fichero php.ini.
Ejemplo #1 Ejemplo de instalacin 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 libreras de PEAR)
# pkg_add php4-pear-4.3.8.tgz
Leer la pgina del manual packages(7) para mas informacin sobre paquetes
binarios en OpenBSD.
Utilizando portes
Tambin se puede compilar PHP a partir de fuentes utilizando el rbol de portes.
Sin embargo, esto slo 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 mdulos soportados de
PHP. Si se encuentra que no se desea crear alguno de estos mdulos, utilice el
sabor o FLAVOR no_*. Por ejemplo, para evitar compilar el mdulo imap, fijar el
sabor o FLAVOR a no_imap.
Problemas comunes
La instalacin por omisin de Apache se ejecuta dentro de una jaula
chroot(2), que habr de restringir a los script PHP el acceso a ficheros
debajo de /var/www. Por lo tanto se requiere crear un
directorio /var/www/tmp para que los ficheros de sesin de PHP sean
almacenados, o utilizar un medio alternativo de almacenamiento de
sesiones. Adems, los sockets de base de datos necesitan colocarse dentro
de la jaula o escuchar en la interfaz de localhost. Se se hace uso de
funciones de red, algunos ficheros de /etc tales
como /etc/resolv.conf y /etc/servicestendrn que ser movidos
a /var/www/etc. El paquete PEAR de OpenBSD automticamente se instala
dentro de los directorios correctos del chroot, as que no hace falta ninguna
modificacin especial ah. Ms informacin sobre el Apache de OpenBSD
est disponible en las preguntas frecuentes OpenBSD.
El paquete de OpenBSD 3.6 para la extensin gd requiere que XFree86
sea instalado. Si no se desea utilizar algunas de las caractersticas de
fuentes tipogrficas que requieren de X11, es mejor instalar el
paquete php4-gd-4.3.8-no_x11.tgz.
Ediciones antiguas
Ediciones antiguas de OpenBSD utilizaban el sistema FLAVORS para compilar un
PHP enlazado estticamente. Dado que es difcil generar paquetes binarios
utilizando este mtodo, ahora es depreciado. An 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 algn comentario al respecto, el responsable
actual del port es Anil Madhavapeddy (avsm arroba openbsd punto org).


Solaris sugerencias especficas de instalacin
Esta seccin contiene notas y sugerencias especficas para la instalacin de PHP en
sistemas Solaris.
Software necesario
La instalacion Solaris carece con frecuencia de los compiladores de C y sus
herramientas relacionadas. Lea las preguntas frecuentes para obtener informacin
sobre porqu usar versiones GNU de algunas de estas herramientas.
Para descomprimir la distribucin PHP se necesita
tar
gzip
bzip2
Para compilar PHP se necesita
gcc (recomendado, aunque puede que sirvan otros compiladores de C)
make
GNU sed
Para compilar extensiones adicionales o hackear el cdigo PHP puede que se
necesite tambin
flex (versin PHP 5.2 o posterior)
re2c
bison
m4
autoconf
automake
Adems, usted tendr que instalar (y posiblemente compilar) cualquier software
adicional especfico para la configuracin, tales como Oracle o MySQL.
Empleo de paquetes
Se puede simplificar el procesao de intalacin de Solaris mediante el uso de
pkgadd para instalar la mayora de sus componentes necesarios. El Sistema de
Empaquetado de Imagen (IPS) para Solaris 11 Express contiene tambin la
mayora de los componentes requeridos para la instalacin usando el comando
pkg.
Notas de instalacin en Debian GNU/Linux
Esta seccin contiene notas y consejos especficos para instalar PHP
sobre Debian GNU/Linux.


Advertencia
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
tambin, esta pgina del manual contiene informacin especfica para otras
opciones, tales como utilizar ya sea los comandos apt-get o aptitude. En esta
pgina del manual estos dos comandos se pueden utilizar indistintamente.
Utilizando APT
Primero, ntese que otros paquetes relacionados podran ser deseables
como libapache2-mod-php5 para integracin con Apache 2, y php-pearpara
PEAR.
Segundo, antes de instalar un paquete, es sensato asegurarse de que la lista de
paquetes est al da. Tpicamente, esto se realiza ejecutando el comando apt-get
update.
Ejemplo #1 Ejemplo de Instalacin en Debian con Apache 2
# apt-get install php5-common libapache2-mod-php5 php5-cli
APT instalar automticamente el mdulo PHP 5 para Apache 2 junto con todas
sus dependencias, y luego lo activar. Apache debera 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
Un mejor control de la configuracin
En la seccin anterior, PHP se instal nicamente con los mdulos principales. Es
muy probable que se deseen mdulos adicionales, tales comoMySQL, cURL, GD,
etc. Estos tambin pueden ser instalados va el comando apt-get.
Ejemplo #3 Mtodos para listar paquetes relacionados con PHP 5
# apt-cache search php5
# aptitude search php5
# aptitude search php5 |grep -i mysql
Los ejemplos mostrarn una gran cantidad de paquetes incluyendo varios
especficos a PHP como php5-cgi, php5-cli y php5-dev. Determine cuales son
necesarios e instlelos como cualquier otro ya sea con apt-get o aptitude. Y ya
que Debian realiza revisin 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 automticamente las lneas 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 extensin, le agregar registros similares a extension=foo.so.
De cualquier manera, reiniciar el servidor web (como es Apache) es requerido
antes de que estos cambios tengan efecto.
Problemas Frecuentes
Si los scripts de PHP no se estn interpretando por el servidor web,
entonces es probable que PHP no haya sido agregado al fichero de
configuracin del servidor web, que en Debian puede
ser /etc/apache2/apache2.conf o algo semejante. Vase el manual de
Debian para mayores detalles.
Si una extensin fue aparentemente instalada y an as las funciones no
aparecen definidas, asegurar de que el fichero ini apropiado est siendo
cargado y/o que el servidor web fue reiniciado despus de la instalacin.
Hay dos comandos bsicos para instalar paquetes en Debian (y otras
variantes de linux): apt-get y aptitude. Pero, explicar las sutiles
diferencias entre estos comandos va ms all del alcance de este manual.
Usando el paquete PHP
PHP est incluido en los Macs desde la versin OS X 10.0.0. Habilitar PHP con el
servidor web por defecto requiere descomentar unas cuantas lneas en el fichero
de configuracin de Apache httpd.conf donde CGI y/o CLI estn activados por
defecto (son fcilmente accesibles a travs del programa Terminal).
Siguiendo las instrucciones que se ofrecen a continuacin se podr habilitar PHP de
una forma rpida para un entorno de desarrollo local. Es muy
recomendable tener siempre actualizado PHP a la ltima versin. Como casi todo
el software vivo, y PHP no es una excepcin, se crean nuevas versiones para
resolver errores y aadir nuevas funcionalidades. Consulte la documentacin de
instalacin de Mac OS X adecuada para ms detalles. Las siguientes instrucciones
para obtener una configuracin estn orientadas a los principiantes que deseen
obtener una configuracin totalmente operativa. Se anima a todos los usuarios a
compilar o instalar una nueva versin ya empaquetada.
La instalacin tpica 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:
1. Localizar y abrir el archivo de configuracin de Apache. Por defecto, la
localizacin de dicho fichero es: /private/etc/apache2/httpd.confMediante


el Finder o el Spotlight puede ser algo complicado encontrar dicho fichero
ya que por defecto es privado y pertenece al usuarioroot.
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, tecle lo siguiente en
el Terminal (tras lo cual le preguntar por la contrasea): 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.
2. En el editor de texto, descomente las lneas (eliminando el smbolo #) que
sean similares a las que se muestran a continuacin (a menudo estas lneas
se encuentran separadas, asi que tendr que localizar ambas en el fichero):
3. # LoadModule php5_module libexec/httpd/libphp5.so
4.
5. # AddModule mod_php5.c
Fjese en la localizacin/ruta de acceso. Cuando compile PHP en el futuro,
las lineas arriba indicadas debern ser reemplazadas o comentadas.
6. Asegrese que las extensiones que desee puedan ser interpretadas como
PHP (por ejemplo: .php .html y .inc)
Como las siguientes sentencias ya existan en el httpd.conf (desde el Max
Panther), una vez se habilite PHP los ficheros .php automticamente 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.
7. Asegrese que DirectoryIndex carga el fichero por defecto index
deseado Esto tambien se configura en httpd.conf. Normalmente se
usanindex.php y index.html. Por defecto index.php est habilitado porque
est incluido en la comprobacin de PHP mostrada arriba. Ajuste a
conveniencia.
8. Configure la localizacion de php.ini o use el valor por defecto. Por defecto se
localiza en los Mac OS X en /usr/local/php/php.ini y empleandophpinfo() se
puede obtener esta informacin. Si no se est usando php.ini, PHP usar los
valores por defecto. Vase tambin las preguntas frecuentes relacionadas
en finding php.ini.
9. Localize o configure el DocumentRoot ste es el directorio raz de todos
los ficheros web. Los ficheros en este directorio son obtenidos del servidor
web a fin de que los ficheros PHP sean ejecutados como PHP antes de ser
enviados al navegador. Una ruta de acceso tpica
es/Library/WebServer/Documents pero puede ser configurada
en httpd.conf. Como alternativa, el DocumentRoot por defecto para usuarios
individuales es /Users/yourusername/Sites
10. Cree un fichero phpinfo()
La funcin phpinfo() muestra informacin sobre PHP. Considere la creacin
de un fichero en el DocumentRoot que contenga el siguiente cdigo PHP:
<?php phpinfo(); ?>
11. Reinicie Apache, y cargue el fichero PHP creado arriba
Para reiniciar, ejecute sudo apachectl graceful en el shell o
desactive/active la opcin "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 opcin, y la URL sera parecida
a: http://localhost/~yourusername/info.php
CLI (o CGI en versiones antiguas) tambin es llamado de forma correcta php y
posiblemente existe como /usr/bin/php. Abra el Terminal, lea laseccin de lnea de
comando del manual de PHP, y ejecute php -v para comprobar la versin de PHP
del binario PHP. Una llamada a phpinfo()tambin le mostrar esta informacin.
Windows Installer (PHP 5.1.0 y anteriores)
El instalador de Windows de PHP est disponible en la pgina 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 tambin. El instalador no
incluye ninguna extensin externas de PHP adicionales (php_*.dll) ya que slo se
encontrar los del paquetes de Windows Zip y descarga de PECL


Nota:
Si bien el instalador de Windows es una manera fcil de trabajar con PHP, es
restringido en muchos aspectos como, por ejemplo, la configuracin automtica de
extensiones no es soportada. El uso de la instalacin no es un mtodo preferido
para la instalacin 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 instalacin. Dos tipos de instalacin son soportadas - estndar, que
proporciona los parmetros por defecto para todos las configuraciones que puede,
y avanzado, que hace preguntas a medida que avanza.
El asistente de instalacin recopila informacin suficiente para configurar el
fichero php.ini y configurar ciertos servidores web para utilizar PHP. Uno de los
servidores web que el programa de instalacin de PHP no configura es Apache, por
lo que tendrs que configurarlo manualmente.
Una vez que haya terminado la instalacin, el instalador le informar si se es
necesario reiniciar el sistema, reiniciar el servidor, o simplemente empezar a usar
PHP.
Advertencia
Tenga en cuenta que esta configuracin de PHP no es segura. Si a usted le
gustara tener una segura instalacin de PHP, es mejor que vayas en el modo
manual, y establecer todos los opcin con cuidado. Esta configuracin automtica
disminuiye el trabajo de instalacin de PHP, pero no es destinado a ser usado en
los servidores en lnea.
Windows Installer (PHP 5.2 y posterior)
Para crear el instalador de las ltimas versiones de PHP en Windows se ha usado la
tecnologa MSI en conjunto con Wix Toolkit ( http://wix.sourceforge.net/). Esta
aplicacin se encarga de instalar y configurar tanto PHP, como las extensiones
base y PECL. Adems, tambin permite configurar muchos de los servidores web
ms 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
mtodos de instalacin.


Instalacin Normal
Ejecute el instalador MSI y siga las instrucciones que le indica el asistente de
instalacin. En primer lugar, se le solicitar que seleccione el Servidor Web que
desea configurar, junto con algunos detalles de configuracin 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 acompaa 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 subcategoras del elemento seleccionado (por
ejemplo, al marcar esta opcin en "PDO", se instalarn todos los Drivers PDO).
Advertencia
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 Reparacin de Instalacin (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. Tambin 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.
Instalacin Silenciosa
El instalador tambin permite ser ejecutado en modo silencioso, muy til para
Administradores de Sistemas que desean implantar PHP fcilmente. Para usar el
modo silencioso:

msiexec.exe /i php-VERSION-win32-install.msi /q
Puede especificar el directorio de instalacin como parmetro al instalador. Por
ejemplo, para instalarlo en e:\php:

msiexec.exe /i php-VERSION-win32-install.msi /q INSTALLDIR=e:\php
Puede usar la misma sintaxis para especificar el Directorio de Configuracin de
Apache (APACHEDIR), el directorio del Servidor Sambar (SAMBARDIR), o el
directorio del Servidor Xitami (XITAMIDIR).
Puede, del mismo modo, especificar qu componentes instalar. Por ejemplo, para
instalar la extensin 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 omisin)
ScriptExecutable - ejecutable php-win.exe
ext_php_* - varias extensiones ( por ejemplo: ext_php_mysql para MySQL )
apache13 - mdulo de Apache 1.3
apache20 - mdulo de Apache 2.0
apache22 - mdulo de Apache 2.2
apacheCGI - Ejecutable CGI de Apache
iis4ISAPI - mdulo ISAPI de IIS
iis4CGI - ejecutable CGI de IIS
iis4FastCGI - ejecutable CGI de IIS
NSAPI - mdulo de servidores Sun/iPlanet/Netscape
netserve - ejecutable CGI de Servidores Web NetServe
Xitami - ejecutable CGI de Xitami
Sambar - mdulo ISAPI del Servidor Sambar
CGI - ejecutable php-cgi.exe
PEAR - instalador PEAR
Manual - manual de PHP en formato CHM
Si desea ms informacin sobre instalaciones MSI desde la lnea de comandos,
consulte http://msdn.microsoft.com/en-us/library/aa367988.aspx
Actualizando PHP con el instalador
Para actualizar, debe ejecutar el instalador indistintamente desde la lnea de
comandos o del entorno grfico. El instalador comprobar sus opciones de
instalacin actuales, eliminar la instalacin antigua, y reinstalar PHP con las
mismas opciones que ya tena. Se recomienda utilizar este mtodo para mantener
PHP actualizado, en lugar de sobrescribir a mano cada fichero del directorio de
instalacin.
Manual de Instalacin
Esta seccin contiene instrucciones para instalar y configurar manualmente PHP en
Windows de Microsoft. Para las instrucciones sobre cmo utilizar el instalador de
PHP para instalar y configurar PHP y un servidor web en Windows,
consulte Windows Installer (PHP 5.2 y posteriores).
Seleccin y descarga de el paquete de distribucin PHP
Descarga la distribucin binaria de PHP zip PHP para Windows: Binarios y
Fuentes . Hay varias versiones diferentes del paquete zip - Seleccione por la
versin que sea adecuado para el servidor web utilizado:


Si se utiliza PHP con IIS a continuacin 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 continuacin los archivos
binarios VC9 de PHP que se deben utilizar.
Si se utiliza PHP con Apache 1 o Apache 2 a continuacin 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.
La estructura del paquete PHP y el contenido
Descomprimir el contenido del archivo zip en un directorio de su eleccin, por
ejemplo C:\PHP\. La estructura de directorios y archivos extrados 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 continuacin se muestra la lista de los mdulos y archivos ejecutables incluidos
en la distribucin del archivo zip de PHP:
go-pear.bat - el script de configuracin de PEAR. Consulte Instalacin
(PEAR) para ms detalles.
php-cgi.exe - ejecutable CGI que se puede utilizar cuando se ejecuta PHP
en IIS a travs de CGI o FastCGI.
php-win.exe - el ejecutable para la ejecucin de scripts en PHP sin
necesidad de utilizar una ventana de lnea de comandos de PHP (Por
ejemplo, las aplicaciones PHP que utilizan Windows GUI).
php.exe - el ejecutable para la ejecucin de scripts PHP dentro de una
interfaz de lnea de comandos (CLI) de PHP.
php5apache2_2.dll - Apache 2.2.X module.
php5apache2_2_filter.dll - Apache 2.2.X filter.
Cambio el fichero php.ini
Despus de que el contenido del paquete de PHP se ha extrado, copie el php.ini-
production en php.ini en la misma carpeta. Si es necesario, tambin es posible
colocar el php.ini en cualquier otro lugar. Pero se requieren pasos adicionales de
configuracin como se describe enConfiguracin de PHP.
El fichero php.ini le dice a PHP cmo se configura, y cmo trabajar con el ambiente
que se ejecuta. Aqu hay una serie de ajustes para el ficherophp.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 ms informacin.
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 ms baja
en el php.inificheros que se encuentra en el extension_dir .
extension = xxxxx.dll - Para cada extensin 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 instalacin 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 continuacin.
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 relacin con el archivo donde los
errores de PHP debe estar registrado. Este archivo debe tener permisos de
escritura para el servidor web. Los lugares ms 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 proteccin de la instalacin de la gua 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 despus de
la especificacin 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 excepcin HTTP 500.
Directivas opcionales
max_execution_time = ## - Esta directiva le dice a PHP, el importe
mximo de tiempo que puede ejecutar cualquier script determinado. El
defecto es 30 segundos. Aumentar el valor de esta directiva, si la aplicacin
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 mayora de las aplicaciones PHP. Algunos de los ms complejos
puede ser que necesite ms.
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 produccin con el fin de no revelar ninguna informacin
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 operacin de
fichero fuera de las rutas especificadas se producir un error. Esta directiva
es especialmente til para bloquear la instalacin de PHP en entornos de
alojamiento compartido para evitar que scripts PHP de acceso a los archivos
fuera del directorio raz del sitio web.
upload_max_filesize = ###M and post_max_size = ###M - El tamao
mximo permitido de un archivo subido y los datos posteriores,
respectivamente. Los valores de estas directivas sern aumenta si las
aplicaciones PHP necesita realizar grandes cargas, como por ejemplo fotos o
archivos de vdeo.
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.
Adems de ejecutar PHP a travs de un servidor web, PHP puede ejecutar desde la
lnea de comandos como un script .BAT. Ver PHP lnea de comandos de Microsoft
Windows para ms detalles.
Microsoft IIS 5.1 y IIS 6.0
Esta seccin 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
configuracin 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.
Configurar IIS para procesar solicitudes de PHP
Descarga e instala PHP de acuerdo a las instrucciones descritas en manual
detallado de instalacin
Nota:
Non-thread-safe build de PHP se recomienda cuando se utiliza IIS. Non-thread-
safe builds estn disponibles en PHP para Windows: Binarios y Fuentes.
Configure el CGI- y configure FastCGI-specific en el archivo php.ini como se
muestra a continuacin:
Ejemplo #1 Configuracin 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 extensin para IIS 5.1 y 6.0. La extensin
est disponible para 32-bit y plataformas de 64-bit - seleccionar el paquete de
descarga adecuada para la plataforma.
Configure la extensin FastCGI para manejar las solicitudes especficas de PHP
ejecutando el comando que se muestra a continuacin. Vuelva a colocar el valor de
el parmetro "-path" con la ruta absoluta del fichero en el fichero php-cgi.exe.
Ejemplo #2 Configuracin de la extensin 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 extensin *.php , lo
que resultar en todas las URLs que terminan con .php siendo manejado por la
extensin FastCGI. Asimismo, se configurar la extensin FastCGI a usar en el
ejecutable php-cgi.exe para procesar las solicitudes de PHP.
Nota:
En este punto la necesidad de instalacin y configuracin de los pasos se han
completado. El resto de instrucciones a continuacin son opcionales, pero
altamente recomendable para lograr una funcionalidad ptima y el rendimiento de
PHP en IIS.
Suplantacin y acceso a ficheros del sistema
Se recomienda habilitar la suplantacin FastCGI en PHP cuando este utilizando IIS.
Esto es controlado por la directiva fastcgi.impersonate en el fichero php.ini.
Cuando suplantacin est activado, PHP realizar todas las operaciones de ficheros
de sistema en favor de la cuenta de usuario que se ha determinado por la
autentificacin 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 autenticacin IIS en cada sitio web.
Por ejemplo IIS 5.1 and IIS 6.0, en su configuracin predeterminada, se ha
habilitado la autenticacin annima con una funcin 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 continuacin la cuenta
IUSR_<MACHINE_NAME> debe tener permiso para escribir en ellos.
Para determinar qu cuenta de usuario es utilizado por IIS autenticacin annima,
siga estos pasos:


1. En el men Inicio de Windows seleccione "Run:", type "inetmgr" y haga clic
en "Ok";
2. 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";
3. Haga clic en "Directory Security" tab;
4. Tome nota de un "User name:" campo en el cuadro de dialogo
"Authentication Methods"

Para modificar la configuracin de permisos en ficheros y carpetas, utilice la
interfaz de usuario de el Explorador de Windows o el comando icacls.
Ejemplo #3 Configuracin del fichero de los permisos de acceso
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
Establecerindex.php como un documento predeterminado en IIS
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 aadir index.php a la lista de
documentos predeterminados IIS, siga estos pasos:


1. En el men Inicio de Windows seleccione "Run:", teclee "inetmgr" y haga
clic en "Ok";
2. Haga clic derecho en el nodo ""Web Sites" de la vista de rbol y seleccione
"Properties";
3. Haga clic en "Documents" tab;
4. Haga clic en el botn "Add..." y enter en "index.php" para el " Contenido de
la pgina por defecto :".

FastCGI y Reciclaje de configuracin de PHP
Configurar la extensin IIS FastCGI para el reciclaje de procesos PHP utilizando los
comandos de abajo. Los controles de configuracin de
FastCGIinstanceMaxRequests nmero de solicitudes que sern procesadas por un
solo proceso php-cgi.exe antes de el cierre de la extensin FastCGI. La variable
PHP de entorno PHP_FCGI_MAX_REQUESTS controla cuntas peticiones de un
nico proceso php-cgi.exe se encargar antes de que se recicle as mismo.
Asegrese de que el valor especificado por la configuracin
FastCGI InstanceMaxRequests es menor o igual al valor especificado
para PHP_FCGI_MAX_REQUESTS.
Ejemplo #4 Configuracin 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
Configuracin de los ajustes de tiempo de espera FastCGI
Aumentar la configuracin de tiempo de espera para la extensin 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. Vase Configuracin de Extensin
FastCGI para IIS 6.0 para ms informacin sobre los ajustes.
Ejemplo #5 Configuracin 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
Cambiar la ubicacin del fichero php.ini
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 configuracin
desde una ubicacin personalizada, ejecute el comando que se muestra a
continuacin. La ruta de acceso absoluta al directorio con el fichero php.ini debe
ser especifica con un valor de variable de entornoPHPRC.
Ejemplo #6 Cambiar la ubicacin del fichero php.ini
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^
-EnvironmentVars:PHPRC:"C:\Some\Directory\"
Microsoft IIS 7.0 y posteriores
Esta seccin 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 configuracin de IIS 5.1 and IIS 6.0 on
Windows XP and Windows Server 2003 refirase a Microsoft IIS 5.1 and IIS 6.0.
Habilitacin de apoyo FastCGI en IIS
Mdulo FastCGI est deshabilitado en la instalacin por defecto de IIS. Los pasos
para que pueda variar segn la versin de Windows se est utilizando.
Para activar el soporte FastCGI en Windows Vista SP1 y Windows 7:
1. En el menu de inicio de Windows seleccione "Run:", teclee
"optionalfeatures.exe" y click "Ok";


2. En el "Windows Features" cuadro de dilogo "Internet Information
Services", "World Wide Web Services", " Caracteristicas Desarrollo de
aplicaciones " y luego permitir que el "CGI" checkbox;
3. Haga clic en Aceptar y espere hasta que se complete la instalacin

Para activar el soporte FastCGI en Windows Server 2008 y Windows Server 2008
R2:
1. En el men Inicio de Windows elegir "Run:", teclee "CompMgmtLauncher" y
click "Ok";
2. En el "Web Server (IIS)" El rol no est presente en el marco del "Roles"
nodo, a continuacin, aadir haciendo clic en "Adicionar Roles";
3. Si la "Web Server (IIS)" role esta presente, entonces haga click "Add Role
Services" y luego permitir que el "CGI" casilla de verificacin en grupo
"Desarrollo de Aplicaciones" ;
4. Click "Next" y luego "Install" ay espere a que la instalacin se complete.



Configurar IIS para procesar las solicitudes de PHP
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 estn disponibles en PHP para Windows: binarios y fuentes.
Configure el CGI y la configuracin especfica de FastCGI php.ini fichero como se
muestra a continuacin:
Ejemplo #1 CGI y FastCGI en la configuracin php.ini
fastcgi.impersonate = 1
fastcgi.logging = 0
cgi.fix_pathinfo=1
cgi.force_redirect = 0
Configurar la asignacin de IIS controlador para PHP utilizando la interfaz de
usuario Administrador de IIS o una herramienta de lnea de comandos.


El uso de IIS interfaz de usuario de Manager para crear una asignacin de
controlador para PHP
Siga estos pasos para crear una asignacin de controlador de IIS para PHP en la
interfaz de usuario Administrador de IIS:
1. En el men Inicio de Windows elegir "Run:", escriba "inetmgr" y click "Ok";
2. En la interfaz de usuario de IIS Manager, seleccione el nodo de servidor en
el "Connections" vista de rbol;
3. En el "Caractersticas" Pgina de abrir el "Handler Mappings" feature;

4. En el "Actions" haga click en panel "Add Module Mapping...";
5. En el "Add Module Mapping" dilogo entre lo siguiente:
Solicitud de ruta: *.php
Modulo: FastCgiModule
Ejecutable: C:\[Path to PHP installation]\php-cgi.exe
Nombre: PHP_via_FastCGI


6. Haga Click en "Solicitar Restricciones" botn y luego configurar la
asignacin de invocar controlador slo si la solicitud se asigna a un archivo
o una carpeta;
7. Haga clic en Aceptar en todos los cuadros de dilogo para guardar la
configuracin.

Utilizando la herramienta de lnea de comandos para crear una asignacin
de controlador para PHP
Utilice el comando mostrado a continuacin para crear un grupo de IIS FastCGI
proceso que utilizar php-cgi.exe ejecutable para la tramitacin de solicitudes de
PHP. Vuelva a colocar el valor del parmetro fullPath con la ruta absoluta al
fichero php-cgi.exe.
Ejemplo #2 >Creacin 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 ejecucin del
comando que se muestra a continuacin. Vuelva a colocar el valor del
parmetro scriptProcessor con la ruta de acceso absoluta al fichero php-cgi.exe.
Ejemplo #3 Creacin 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 asignacin de controlador de IIS para la extensin de
archivo *.php, lo que resultar en todas las direcciones URL que terminan con. Php
siendo manejado por el mdulo FastCGI.
Nota:
En este punto la necesidad de instalacin y configuracin de los pasos se han
completado. Las instrucciones a continuacin son opcionales, pero altamente
recomendable para lograr una funcionalidad ptima y el rendimiento de PHP en
IIS.
Suplantacin de identidad y acceso a archivos del sistema
Se recomienda habilitar la suplantacin en PHP FastCGI cuando IIS utilizando. Esta
est controlado por la directiva fastcgi.impersonate en el ficherophp.ini. Cuando
est habilitada la suplantacin, PHP realizar todas las operaciones del sistema de
ficheros en nombre de la cuenta de usuario que ha sido determinado por la
autentificacin de IIS. Esto asegura que, aunque el proceso mismo PHP es
compartido a travs de diferentes sitios web IIS, los scripts PHP en los sitios web
no ser capaz de acceder a los dems ficheros, siempre y cuando las cuentas de
usuario se utilizan para la autenticacin de IIS en cada sitio web.
Por ejemplo IIS 7, en su configuracin por defecto, se ha habilitado la
autenticacin annima 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 annima 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 produccin configuracin XML
aspecto de elemento para el atributo userName.
Ejemplo #4 La determinacin de la cuenta utilizada como IIS identidad
annima
%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 vaca, entonces
significa que la identidad del grupo de aplicaciones se utiliza como un identidad
annima para ese sitio web.
Para modificar la configuracin de permisos de archivos y carpetas, utilice la
interfaz de usuario del Explorador de Windows o comando icacls.
Ejemplo #5 Configuracin de archivo de los permisos de acceso
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)

Establecer index.php como un documento predeterminado en IIS
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 acta como un documento predeterminado. Para aadir 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

FastCGI y configuracin de PHP Reciclaje
Configurar la configuracin de IIS FastCGI PHP para el reciclaje de los procesos
mediante los comandos de abajo. La configuracin
FastCGIinstanceMaxRequests controla cuntas peticiones se procesado por un solo
peoceso php-cgi.exe antes de IIS se cierra. La variable de entorno
PHPPHP_FCGI_MAX_REQUESTS controla el nmero pide una sola proceso php-
cgi.exe se encargar antes de que se recicla s misma. Asegrese de que el valor
especificado para la configuracin FastCGI InstanceMaxRequests es menor o igual
al valor especificado para PHP_FCGI_MAX_REQUESTS.
Ejemplo #7 Configuracin 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']"

FastCGI ajustes de tiempo de espera
Aumentar el tiempo de espera para la configuracin 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 configuracin de tiempo de espera. Asegrese de sustituir el valor en el
parmetro a fullPath contendr la ruta absoluta a el fichero php-cgi.exe.
Ejemplo #8 Configuracin 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

Cambiar la ubicacin del fichero php.ini
PHP busca el fichero php.ini en varios lugares y es posible cambiar las ubicaciones
predeterminadas del fichero php.ini utilizando variable de entornoPHPRC.
Encomendar a PHP para cargar el archivo de configuracin desde una ubicacin
personalizada, ejecute el comando se muestra a continuacin. 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 ubicacin 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

Apache 1.3.x en Microsoft Windows
Esta seccin contiene notas y sugerencias especficas para Apache 1.3.x instaladas
con PHP en sistemas Microsoft Windows. Tambin hayinstrucciones y notas para
Apache 2 en una nueva pgina.
Nota:


Por favor lea primero el manual de instalacin
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.exepara PHP 5), la otra
es utilizar el mdulo DLL de Apache. En ambos casos se necesita
editar httpd.conf para configurar Apache para trabajar con PHP, y despus reiniciar
el servidor.
Vale la pena resaltar, que el mdulo SAPI ha sido desarrollado mas estable bajo
Windows. Se recomienda su uso ms que el binario CGI, ya que es ms
trasparente y seguro.
Aunque pueden haber algunas variaciones en la configuracin de PHP bajo Apache,
estas son sencillas para ser utilizados por el principiante. Por favor consulte la
documentacin de Apache para seguir directivas de configuracin.
Despus de modificar el archivo de configuracin, 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
configuracin de Apache en Windows, todas las barras invertidas tal
como c:\directory\file.ext deberan ser convertidas en barras
comunes: c:/directory/file.ext. Una barra comn al final ser necesaria para
directorios.
Instalacin como mdulo de Apache
Se deben agregar las siguientes lneas a su archivo de configuracin
Apache httpd.conf
Ejemplo #1 PHP como mdulo 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 seccin LoadModule
# No olvidar copiar este ficrero desde el directorio sapi!
LoadModule php4_module "C:/php/php4apache.dll"

# Adicionar al final de la seccin AddModule
AddModule mod_php4.c
Para PHP 5:
# Adicionar al final de la seccin LoadModule
LoadModule php5_module "C:/php/php5apache.dll"

# Adicionar al final de la seccin AddModule
AddModule mod_php5.c
Para ambos :
# Adicionar esta lnea 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
Instalacin como un binario CGI
Si se ha descomprimido el paquete PHP C:\php\ como se describe en la
seccin Manual de instalacin paso a paso, es necesario insertar estas lneas a su
archivo de configuracin 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
Tenga en cuenta que la segunda lnea en la lista anterior se puede encontrar en las
versiones actuales de httpd.conf, pero se comenta. Recordar tambin sustituir
el c:\php\ para su ruta de acceso real a PHP.
Advertencia
Al usar el modo CGI, su servidor esta expuesto a diferentes ataques. Por favor,
leer la seccin Seguridad con CGI para aprender como defenderse de estos
ataques.
Si desea presentar archivos de cdigo fuente PHP sintaxis highlighted, no existe la
opcin ms conveniente con la versin de PHP como mdulo. Si ha elegido
configurar Apache para usar PHP como un binario CGI, tendr que usar la
funcin highlight_file(). Para ello se necesita crear un script PHP y agregarle el
cdigo <?php highlight_file('some_php_script.php'); ?>.
Apache 2.x en Microsoft Windows
Esta seccin contiene notas y sugerencias especficas de Apache 2.x instaladas con
PHP en sistemas Microsoft Windows. Tambin hay instrucciones y notas para
usuarios de Apache 1.3.x en una nueva pgina..
Nota:
Por favor lea primero el manual de instalacin
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 dephp5apache2.dll y slo est
disponible para PHP 5.2.0 y posteriores. Ver tambin http://snaps.php.net/
Se le recomienda consultar la Documentacin de Apache Para obtener un
conocimiento bsico 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 diseado 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 situacin.
Descargue la versin ms reciente de Apache 2.x y un accesorio de la versin
de PHP. Siga los pasos del Manual de Instalacin y regrese a continuar con la
integracin 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
configuracin de Apache en Windows, todas las barras invertidas tal
como c:\directory\file.ext deberan ser convertidas en barras
comunes: c:/directory/file.ext. Una barra comn al final ser necesaria para
directorios.
Instalacin como un controlador de Apache
Es necesario insertar las siguientes lneas en Apache httpd.conf archivo de
configuracin para cargar el mdulo 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
seaphp5apache2.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
seala en la presente directiva.
La configuracin anterior permite habilitar PHP como controlador de cualquier
fichero que tiene una extensin .php, aunque existen otras extensiones de fichero.
Por ejemplo, un fichero llamadoexample.php.txt ser ejecutado por el controlador


de PHP. Para garantizar que slo los ficheros queterminen en .php son
ejecutados, se utiliza la siguiente configuracin en su lugar:
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
Ejecutar PHP como CGI
Se debe consultar la Documentacin de Apache CGI para una comprensin ms
completa de ejecutar CGI en Apache
Para ejecutar PHP como CGI, tendrs que colocar los ficheros php-cgi en un
directorio designado como directorio CGI usando la directiva ScriptAlias.
A continuacin, se nesesita insertar una #! lnea en los ficheros PHP, apuntando a
la ubicacin del binario de PHP:
Ejemplo #2 PHP y Apache 2.x como CGI
#!C:/php/php.exe
<?php
phpinfo();
?>
Advertencia
Al usar el modo CGI, su servidor esta expuesto a diferentes ataques. Por favor,
leer la seccin Seguridad con CGI para aprender como defenderse de estos
ataques.
Ejecutar PHP bajo FastCGI
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 estn disponibles para la descargar en ese sitio. Instalar el mdulo 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
Los ficheros con extensin .php ahora sern ejecutados por PHP FastCGI


Servidores Sun, iPlanet y Netscape en Microsoft Windows
Esta seccin contiene anotaciones y consejos especficos 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 mdulo NSAPI para generar
listados de directorios y pginas de error personalizadas. Tambin hay funciones
adicionales para la compatibilidad con Apache. Para tener soporte con los
servidores web actuales consulte las anotaciones sobre subpeticiones.
Instalacin CGI en servidores Sun, iPlanet y Netscape
Para instalar PHP como un manejador CGI, haga lo siguiente:
Copie php4ts.dll al raz del sistema (directorio en el que instal Windows)
Realice la asociacin de ficheros en la lnea de comandos. Introduzca las
siguientes lneas:
assoc .php=PHPScript
ftype PHPScript=c:\php\php.exe %1 %*
En Netscape Enterprise Administration Server cree un directorio shellcgi
temporal y brrelo despus (este paso aadir 5 lneas importantes a
obj.conf y permitir que el servidor web maneje scripts shellcgi).
En Netscape Enterprise Administration Server cree un nuevo tipo mime
(Category: type, Content-Type: magnus-internal/shellcgi, File Suffix:php).
Realcelo para cada instancia de servidor web en que desee ejecutar PHP
Se pueden encontrar ms detalles sobre cmo configurar PHP como ejecutable CGI
en http://benoit.noss.free.fr/php/install-php.html
Configuracin de NSAPI en servidores Sun, iPlanet y Netscape
Para instalar PHP con NSAPI, haga lo siguiente:
Copie php4ts.dll al raz de su sistema (directorio en que instal Windows)
Haga la asociacin de ficheros en la lnea de comandos. Introduzca las
siguientes lneas:
assoc .php=PHPScript
ftype PHPScript=c:\php\php.exe %1 %*
En Netscape Enterprise Administration Server cree un nuevo tipo mime
(Category: type, Content-Type: magnus-internal/x-httpd-php, File Suffix:
php).
Edite magnus.conf (para servidores >= 6) o obj.conf (para servidores < 6)
e introduzca lo siguiente: Debe ubicar estas lneas 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"]
(PHP >= 4.3.3) El parmetro php_ini es opcional, pero usndolo se puede
reubicar el fichero php.ini al directorio de configuracin del servidor web.
Configure el objeto por omisin en obj.conf (para clases de servidores
virtuales [Sun Web Server 6.0+] en su fichero vserver.obj.conf): En la
seccin <Object name="default">, aada esta lnea tras los 'ObjectType'
y antes de las lneas 'AddLog':
Service fn="php4_execute" type="magnus-internal/x-httpd-php"
[inikey=value inikey=value ...]
(PHP >= 4.3.3) Se pueden aadir parmetros adicionales del tipo php.ini-
values, por ejemplo, se puede especificar
eldocroot="/path/to/docroot" especfico para el contexto en que se
invoca a php4_execute. En las claves ini booleanas, debe usarse 0 o 1
como valor, y nunca "On","Off",... (no funcionar correctamente),
p.ej. zlib.output_compression=1 en lugar
dezlib.output_compression="On"
Esto slo 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>
Tras eso, se puede configurar un directorio en la administracin del servidor
para asignarle el estilo x-httpd-php. Todos los ficheros que contenga se
ejecutarn con PHP. Es til para ocultar el uso de PHP, renombrando los
ficheros a .html.
Reinicie el servidor web y aplique los cambios
Realcelo para cada instancia del servidor web en que desee ejecutar PHP
Nota:
Puede consultar ms detalles sobre cmo configurar PHP como filtro NSAPI
aqu: http://benoit.noss.free.fr/php/install-php4.html
Nota:
El tamao de pila de PHP depende de la configuracin del servidor web. Si la
ejecucin de scripts extensos de PHP se detiene, se recomienda que lo propague
con Admin Server (en la seccin "MAGNUS EDITOR").


entornos CGI y modificaciones recomendadas en php.ini
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 slo contiene un entorno de ejecucin. 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). Slo
se obtendr el entorno del servidor web en ejecucin sin ninguna variable CGI
vlida.
Nota:
Pero por qu hay variables CGI (invlidas) en el entorno?
Respuesta: Se debe a que se inici el proceso del servidor web desde el servidor
de administracin que lanza el script de inicio del servidor web como un script CGI
(un script CGI dentro del servidor de administracin!). sta es la razn 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 arrnquelo 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., debera
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
Uso especial de pginas de error y listados de directorios
personalizados (PHP >= 4.3.3)
Se puede utilizar PHP para generar pginas de error para "404 Not Found" o
similar. Debe aadirse la siguiente lnea al objeto en obj.conf para cada pgina de
error que se desee redefinir:
Error fn="php4_execute" code=XXX script="/path/to/script.php" [inikey=value
inikey=value...]
donde XXX es el cdigo de error HTTP. Debe eliminarse todas las
directivas Error que puedan colisionar con las nuevas. Si se desea crear una
pgina genrica para todos los errores, debe omitirse el parmetro code. El script
podr consultar el cdigo de estado HTTP en$_SERVER['ERROR_TYPE'].
Otra posibilidad es generar listados de directorios personalizados. Debe crearse un
script PHP que liste el contenido de un directorio y reemplace la lnea 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...]
Tanto para la pgina de error como de listado de directorios, la URI original y la
traducida estn disponibles en las
variables$_SERVER['PATH_INFO'] y $_SERVER['PATH_TRANSLATED'].
Anotaciones sobre nsapi_virtual() y subpeticioness (PHP >= 4.3.3)
El mdulo NSAPI ahora soporta la funcin nsapi_virtual() (alias: virtual()) para
hacer subpeticiones al sevidor web e insertar el resultado en la pgina web. El
problema es que esta funcin utiliza algunas funcionalidades no documentadas de
la biblioteca NSAPI.
En Unix esto no es un problema, porque el mdulo automticamente 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 deteccin
automtica del fichero ns-httpdXX.dll ms reciente. Se ha probado hasta en
servidores versin 6.1. Si se utiliza una versin ms reciente del servidor Sun, la
deteccin falla y nsapi_virtual() se deshabilita.
Si este fuera el caso, debe probarse lo siguiente: Aada el siguiente parmetro
a php4_init en magnus.conf/obj.conf:
Init fn=php4_init ... server_lib="ns-httpdXX.dll"
donde XX es el nmero de versin correcto de la DLL. Para conocerlo, busca en el
raz del servidor el nombre correcto de la DLL. La DLL de mayor tamao es la
adecuada.
Puede comprobar el estado usando la funcin phpinfo().
Nota:
Pero tenga en cuenta: El soporte para nsapi_virtual() es EXPERIMENTAL.
Sambar Server en Microsoft Windows
Esta seccin contiene notas y consejos especficos a el Servidor Sambar para
Windows.
Nota:
Debe leer primero los pasos del manual de instalacin.
Esta lista describe cmo configurar el mdulo ISAPI para trabajar con el servidor
Sambar en Windows.


Busque el archivo llamado mappings.ini (en el directorio de configuracin)
en el directorio de instalacin de Sambar.
Abra mappings.ini y adicione la siguiente lnea 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

(Esta lnea asume que PHP se instal en c:\php.)
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 tendrn acceso a recursos remotos. La
cuenta puede ser modificada mediante el uso de la opcin de servicios de Windows
en el Panel de control de las herramientas de administracin.
Xitami en Microsoft Windows
Esta seccin contiene notas y sugerencias especficas para Xitami en Windows.
Nota:
Debe leer primero los pasos del Manual de instalacin.
Esta lista describe cmo 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 ms detalles importantes.
Esta directiva se debe establecer a0. Si desea
utilizar$_SERVER['PHP_SELF'] tienes que habilitar la directiva cgi.fix_pathinfo.
Advertencia
Al usar el modo CGI, su servidor esta expuesto a diferentes ataques. Por favor,
leer la seccin Seguridad con CGI para aprender como defenderse de estos
ataques.


Asegrese de que el servidor web est funcionando, y apunte el navegador
a la consola de administracin xitamis (por lo
generalhttp://127.0.0.1/admin), Y haga clic en Configuracin.
Navegue a los filtros, y ponga la extensin 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.
Instalacin de extensiones en Windows
Despus 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. Tambin puede
cargar un mdulo dinmicamente en el script con dll().
Los DLL para las extensiones PHP tienen el prefijo php_.
Algunas extensiones son construidas dentro de la versin de Windows de PHP.
Esto significa que los ficheros DLL adicionales, y la extensindirectiva, 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 (actualizacin de PHP
4.3.11): BCMath, Caledar, COM, Ctype, FTP, MySQL, ODBC,
Overload, PCRE, Session, Tokenizer, WDDX, XML y Zlib
En PHP 5 (actualizacin de PHP 5.0.4), existen los siguientes cambios. Contruidos
en: DOM, LibXML, Iconv, SimpleXML, SPL y SQLite. Y a continuacin se enumeran
los no construidos en: MySQL y Overload.
La ubicacin predeterminada de las bsquedas PHP para las extensiones
es C:\php4\extensions en PHP 4 y C:\php5 en PHP 5. Para cambiar estos
parmetros reflejando la configuracin de PHP, edite el fichero php.ini:
Tendr que cambiar los parmetros de la extension_dir para apuntar al
directorio donde est la extensin, o donde tenga localizado el
ficherophp_*.dll. Por ejemplo:
extension_dir = C:\php\extensions
Habilite la extensin(s) en php.ini que desea utilizar descomentando las
siguientes lneas extension=php_*.dll en php.ini. Esto se hace mediante
el borrado de la cabecera, desde la extensin que desea cargar.
Ejemplo #1 Habilitar la extensin Bzip2 para PHP-Windows


// cambiar la siguiente lnea 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 distribucin, 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 distribucin. Si va a instalar PHP 4, copie el
paquete DLL de la carpeta C:\php\dlls a la carpeta principalC:\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 distribucin de PHP. Consulta
cada pgina de documentacin de las extensiones para ms detalles.
Adems, lea el manual seccin titulada Instalacin de extensiones
PECL para ms detalles sobre PECL. Un gran nmero de extensiones de PHP
se encuentran en PECL, y estas extensiones requieren una
descarga independiente .
Nota: Si est ejecutando un servidor de la versin de PHP como mdulo 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.
Extensiones de PHP
Extensin Descripcin Notas
php_bz2.dll
Funciones de
compresin bzip2
Nada
php_calendar.dll
Funciones de
conversin Calenda
rio
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
Requiere: libeay32.dll, ssleay32.dll(inclui


Extensiones de PHP
Extensin Descripcin Notas
URLCURL do)
php_dba.dll
DBA: Funciones de
Capa de
abstraccin 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 despus
de php_mbstring.dll enphp.ini.
php_fbsql.dll
Funciones FrontBas
e
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 slo lectura
php_ftp.dll Funciones FTP Incorporado desde PHP 4.0.3
php_gd.dll
Funciones de Eliminada en PHP 4.3.2. Tambin tenga


Extensiones de PHP
Extensin Descripcin Notas
libreria de
imagen GD
en cuenta que las funciones de color
verdadero no estn 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.dl
l
Funciones HyperW
ave
Nada
php_iconv.dll
Conversin 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 InterBas
e
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


Extensiones de PHP
Extensin Descripcin Notas
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 Mimetyp
e
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 OpenSS
L
Requiere: libeay32.dll (incluido)


Extensiones de PHP
Extensin Descripcin Notas
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 PostgreS
QL
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 Tokenize
r
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


Extensiones de PHP
Extensin Descripcin Notas
requieresablot.dll, expat.dll, iconv.dll (incl
uido).
php_yaz.dll Funciones YAZ Requiere: yaz.dll (incluido)
php_zip.dll
Ficheros
Zip incluido
Acceso de slo lectura
php_zlib.dll
Funciones de
compresin ZLib
Construido a partir de PHP 4.3.0
Linea de Comandos PHP en Microsoft Windows
Esta seccin contiene notas y sugerencias especficas para conseguir ejecutar PHP
en la lnea de comandos para Windows.
Nota:
Usted debe leer primero el manual de instalacin
Cmo ejecutar PHP desde la lnea de comandos sin hacer ningn 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 deberan 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.
Aada la ubicacin del ejecutable de PHP (php.exe, php-win.exe o php-
cli.exe dependiendo de su versin de PHP y las preferencias de
presentacin) a la variable de entorno PATH. Lea ms acerca de cmo
aadir el directorio de PHP PATH en la entrada correspondiente de
preguntas frecuentes.


Aada la extensin .PHP de la variable de entorno PATHEXT. Esto se puede
hacer al mismo tiempo, con la modificacin de la variable de entorno PATH.
Siga los mismos pasos como se describe en las Preguntas frecuentes pero
habra que modificar la variable de entornoPATHEXTen lugar de la variable
de entornoPATH.
Nota:
La posicin 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 extensin .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 extensin .PHP y todos los
parmetros, ser enviada a el script para el procesamiento.
En el ejemplo a continuacin 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
O, si la ruta de acceso "C:\PHP Scripts" est en el variable de entorno PATH:
script -arg1 -arg2 -arg3
Nota:
Hay un pequeo problema si tiene intencin de utilizar esta tcnica y usar scripts
PHP como filtro de lnea de comandos, como el ejemplo a continuacin:
dir | "C:\PHP Scripts\script" -arg1 -arg2 -arg3
o
dir | script -arg1 -arg2 -arg3
Es posible que el script simplemente se cuelga y no salga nada. Para hacer esto
operacional, es necesario hacer otro cambio en el registro.
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer]
"InheritConsoleHandles"=dword:00000001
Informacin adicional sobre este tema se pueden encontrar en el artculo de
Microsoft: 321788
Manejador de Procesos FastCGI (FPM)
Tabla de contenidos
Instalacin
Configuracin
FPM (FastCGI Process Manager) es una implementacin alternativa al PHP FastCGI
con algunas caractersticas adicionales (la mayora) tiles para sitios web con
mucho trfico.
Estas caractersticas incluyen:
Manejo avanzado para detener/arrancar procesos de forma grcil;
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 destruccin accidental del cach opcode;
Soporte acelerado de subidas;
"slowlog" - scripts de registro de procesos (no slo sus nombres, sin sus
backtraces tambin, usando ptrace y similares para leer procesos
execute_data remotos) que son inusualmente lentos;


fastcgi_finish_request() - Funcin especial para detener y descargar todos
los datos mientras continua haciendo algn proceso ms largo (conversin
de vdeos, procesamiento de estadsticas, etc.);
Creacin dinmico/esttico de hilos;
Informacin bsica del status SAPI (similar al mod_status de Apache);
Basado en archivos de configuracin php.ini
Instalacin
Compilando el cdigo fuente
Para habilitar FPM en la compilacin de PHP, debe aadirse --enable-fpm a la
lnea de configuracin-
Hay otras opciones de configuracin especficas de FPM (todas ellas optativas):
--with-fpm-user - usuario de FPM (por omisin - nobody).
--with-fpm-group - grupo de FPM (por omisin - nobody).
Configuracin
FPM usa la sintaxis de php.ini para su archivo de configuracin - php-fpm.conf.
Lista de directivas globales de 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 nmero de procesos termina con SIGSEGV o SIGBUS dentro del
intervalo de tiempo establecido por emergency_restart_intervalentonces
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
Lmite de tiempo que un hilo de proceso espera por una seal maestra.
Unidades disponibles: s(egundos), m(inutos), h(oras), o d(as) Unidad por
defecto: segundos. Valor por defecto: 0.
daemonize boolean
Enva a FPM al background. Establezca a 'no' para mantener FPM en
foreground para depuracin. Valor por defecto: yes.
Lista de directivas de grupo
Con FPM usted puede correr varios grupos de procesos con diferentes ajustes.
Estos son los parmetros que pueden ser ajustados por grupo.
listen string
La direccin sobre la cual desea aceptar peticiones FastCGI. Las sintaxis
vlidas 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 direccin debe ser
separada por coma. Si este valor es dejado en blanco, las conexiones sern
aceptas desde cualquier direccin 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 segn 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 opcin 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 cmo el manejador de procesos controlar el nmero de hilos de
procesos. Valores posibles: static, ondemand, dynamic. Esta opcin es
obligatoria.
static - el nmero 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 nmero de hilos de proceso ser basado dinmicamente
basado en las siguientes
directivas: pm.max_children,pm.start_servers, pm.min_spare_server
s, pm.max_spare_servers.
pm.max_children int
El nmero de hilos de procesos a ser creados cuando pm es puesto
a static y el mximo nmero de hilos de proceso a ser creados
cuandopm es puesto a dynamic. Esta opcin es obligatoria.
Esta opcin establece el lmite sobre el nmero de peticiones simultaneas
que sern 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 int
Nmero 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 nmero mnimo deseado de procesos libres en el servidor. Usado slo
cuando pm es puesto a dynamic. Tambin obligatorio en este caso.
pm.max_spare_servers int
El nmero mximo deseado de procesos libres en el servidor. usado slo
cuando pm es puesto a dynamic. Tambin obligatorio en este caso.
pm.max_requests int
El nmero de pedidos que cada hilo de proceso debe ejecutar antes de
reaparecer. Esto puede ser til para evitar las fugas de memoria en libreras
de terceros. para el procesamiento de solicitudes sin lmites especifique '0'.
Equivale a PHP_FCGI_MAX_REQUESTS. Valor por defecto: 0.
pm.status_path string
La direccin URI para ver la pgina de status FPM. Si este valor no es
establecido, ninguna direccin URI ser reconocida como una pgina de
status. Valor por defecto: none.
ping.path string
La direccin URI del ping para llamar a la pgina de monitor del FPM. Si
este valor no es establecido, ninguna direccin URI ser reconocida como
pgina del ping. Esto debera 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
cdigo de respuesta 200. Valor por defecto: pong.
request_terminate_timeout mixed
El tiempo de espera para servir una simple peticin luego que el proceso
worker sea eliminado. Esta opcin debe ser usada cuando la opcin
'max_execution_time' no detenga la ejecuciun del script por cualquier


razn. 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 peticin despus 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 tamao mximo 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 sern 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
Los ajustes PHP pasados con php_value o php_flag sern sobre-escritos a sus
valores previos. Por favor note que
definiendo disable_functions odisable_classes no sobre-escribir los valores de
definiciones anteriores php.ini, pero aadirn nuevos en cambio.
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 tambin 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";
Precaucin
Dado a que estos valores se pasan a php-fpm como cabeceras fastcgi, php-fpm no
debe estar vinculado a una direccin accesible para todo el mundo. De lo contrario,
cualquiera podra alterar las opciones de configuracin de PHP. Ver
tambinlisten.allowed_clients.
Introduccin a las Instalaciones en PECL
PECL es un respositorio de extensiones de PHP disponible mediante el sistema de
paquetes PEAR. Esta seccin del manual tiene por objetivo ilustrar cmo obtener
e instalar extensiones PECL.
Estas instrucciones asumen que la ruta al fuente de su distribucin de PHP
es /your/phpsrcdir/, y que extname es el nombre de la extensin PECL. Ajuste


a sus valores. Estas instrucciones, adems, asumen conocimientos del comando
pear. La informacin del manual de PEAR para el comando pear tambin es
aplicable al comando pecl.
Para poder usarse, una extensin compartida se debe construir, instalar, y cargar.
Los mtodos descritos abajo le proporcionan varias instrucciones para construir e
instalar extensiones, pero no se cargarn automticamente. stas se pueden
cargar aadiendo una directiva extension. al ficherophp.ini, o bien mediante el uso
de la funcin dl().
Al construir un mdulo 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 Annimo.
Descarga de extensiones PECL
Existen varias opciones para descargar extensiones PECL, a saber:
El comando pecl install extname descarga el cdigo de la extensin
automticamente, de modo que en este caso no se hace necesario realizar
una descarga por separado.
http://pecl.php.net/ La pgina web de PECL contiene informacin sobre
las diferentes extensiones que ofrece el Equipo de Desarrollo de PHP. La
informacin disponible aqu incluye: ChangeLog, notas de la versin,
requisitos, y otros detalles similares.
pecl download extname Puede descargar e instalar las extensiones PECL
listadas en el sitio web de PECL usando el comando pecl. Tambin se
podrn especificar versiones concretas.
SVN La mayor parte de las extensiones PECL tambin estn alojadas
en SVN. Puede consultar la interfaz web
en http://svn.php.net/viewvc/pecl/. Para descargar directamente del SVN,
debe usar la siguiente secuencia de comandos:

$ svn checkout http://svn.php.net/repository/pecl/extname/trunk extname
Descargas para Windows Actualmente el proyecto PHP no compila binarios
para Windows de las extensiones PECL. En cualquier caso, para compilar
PHP bajo Windows, revise el captulo titulado construccin de la fuente en
Windows.
Instalacin una extensin de PHP en Windows
Dispone de dos formas para cargar extensiones PHP en Windows: o bien
compilndolas en PHP, o bien cargando su DLL. El mtodo recomendado y ms
sencillo es cargar una extensin pre-compilada.


Para cargar una extensin, debe estar disponible como fichero ".dll" en su sistema.
Todas las extensiones son compiladas por el Grupo PHP automtica y
peridicamente (revise la siguiente seccin para realizar descargas).
Para compilar una extensin en PHP, por favor, acceda a la documentacin
de construccin de la fuente.
Para compilar una extensin independiente (o lo que es lo mismo, un fichero DLL),
por favor, revise la documentacin de construccin de la fuente. Si el fichero DLL
no est disponible ni en su distribucin de PHP ni en PECL, deber compilarla antes
de poder comenzar a usarla.
Dnde encontrar una extensin?
Las extensiones de PHP generalmente se llaman "php_*.dll" (donde el asterisco
representa el nombre de la extensin) y se localizan bajo la carpeta "PHP\ext"
("PHP\extensions" en PHP 4).
PHP se distribuye con las extensiones ms tiles para la mayora de
desarrolladores. Se les llama extensiones del "ncleo".
En cualquier caso, si necesita una funcionalidad que no proporciona ninguna de las
extensiones del ncleo, 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 extensin 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 colaboracin, (ojal) agradecimientos, informes de errores,
e incluso parches/correcciones. Antes de enviar su extensin para ser alojada en
PECL, por favor, lea http://pecl.php.net/package-new.php.
Qu extensin descargar?
A menudo, encontrar varias versiones de cada DLL:
Nmeros de versin diferentes (al menos los dos primeros nmeros deben
coincidir)
Diferentes ajustes de seguridad en hilos
Diferentes arquitecturas de procesadores (x86, x64, ...)
Diferentes ajustes de depuracin
etc.
Debe tener en cuenta que los ajustes de su extensin deben coincidir con la
configuracin 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 lnea de comandos:
drive:\\path\to\php\executable\php.exe -i
Cargando una extensin
La forma ms comn de cargar una extensin PHP consiste en incluirla en el
fichero de configuracin php.ini. Por favor, tenga en cuenta que ya hay muchas
extensiones presentes en el fichero php.ini y que slo 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 dnde 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 extensin, guarde el fichero php.ini, reinicie el servidor web y
vuelva a comprobar phpinfo(). La nueva extensin debe ahora tener su propia
seccin.
Resolviendo problemas
Si la extensin no aparece en phpinfo(), compruebe los registro de errores para
conocer qu provoca el problema.
Si est utilizando PHP desde la lnea de comandos (CLI), podr leer directamente
en pantalla el error en la carga de la extensin.
Si est usando PHP en un servidor web, la localizacin y formato de los registros
vera en funcin de su software. Por favor, lea la documentacin de su servidor
web para localizar los registros, dado que esto no lo gestiona el propio ejecutable
de PHP.
Los problemas ms comunes son la ubicacin del fichero DLL, el valor de
" extension_dir" en php.ini, y desajustes de configuracin en tiempo de
compilacin.
Si el problema reside en desajustes de configuracin en tiempo de compilacin,
seguramente se deba a que no se ha descargado el fichero DLL correcto. Pruebe a


descargar de nuevo la extensin con los ajustes correctos. De
nuevo, phpinfo() puede resultar de gran ayuda.
Compilando extensiones PECL compartidas con el comando
pecl
PECL facilita la creacin de extensiones PHP compartidas. Usando el comando
pecl, haga lo siguiente:

$ pecl install extname
Esto descargar el cdigo fuente de extname, lo compilar, e
instalar extname.so en su extension_dir. Ahora se puede
cargar extname.somediante php.ini
Por omisin, 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:

$ pecl install extname-beta
Del mismo modo, podr tambin instalar una versin en concreto usando esta
variante:

$ pecl install extname-0.1
Nota:
Tras activar la extensin en php.ini, ser necesario reiniciar el servidor web para
hacer efectivos los cambios.
Compilando extensiones PEC compartidas con phpize
A menudo no es posible utilizar el instalador pecl. Esto se puede deber a que se
encuentra tras un cortafuegos, o a que la extensin 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 extensin de este tipo, puede
llevar a cabo esta tarea manualmente utilizando las herramientas de construccin
de bajo nivel.
El comando phpize se utiliza para preparar el entorno de compilacin de la
extensin de PHP. En el siguiente ejemplo, el fuente de una extensin se ubica en
un directorio llamado extname:


$ cd extname
$ phpize
$ ./configure
$ make
# make install
En caso de que la instalacin sea correcta, se crear extname.so y se salvar en
el directorio de extensiones de PHP. Quiz necesite ajustar el fichero php.ini y
aadir una lnea extension=extname.so antes de poder usar la extensin.
Si el sistema no contiene el comando phpize, y se estn utilizando paquetes pre-
compilados (como RPM), asegrese de instalar tambin la versin 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 informacin de uso adicional.
php-config
php-config es una utilidad de consola que permite obtener informacin sobre la
configuracin de la instalacin de PHP.
A la hora de compilar extensiones, si se tuvieran varias versiones de PHP
instaladas, se podr especificar sobre cul se va a construir usando el
modificador --with-php-config durante la configuracin, 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 [...]
Opciones de lnea de comandos
Opcin Descripcin
--prefix Prefijo del directorio donde PHP est instalado, p.ej. /usr/local


Opciones de lnea de comandos
Opcin Descripcin
--includes Lista de opciones -I con todos los ficheros includos
--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 omisin las extensiones
--include-dir
Prefijo de directorio donde se buscan por omisin los ficheros de
cabeceras
--php-binary Ruta completa al binario de php CLI o CGI
--php-sapis Muestra todos los mdulos SAPI disponibles
--configure-
options
Opciones de configuracin para recrear la configuracin de la
instalacin actual de PHP
--version Versin de PHP
--vernum Versin de PHP en forma de entero
Compilando extensiones PECL estticamente en PHP
Quiz necesite construir una extensin PECL estticamente en su binario de PHP.
Para hacer esto, necesitar ubicar el fuente de la extensin bajo el directorio php-
src/ext/ e indicarle al sistema de construccin de PHP que regenere su script de
configuracin.
$ cd /your/phpsrcdir/ext
$ pecl download extname
$ gzip -d < extname.tgz | tar -xvf -
$ mv extname-x.x.x extname
Esto generar el siguiente directorio:



/your/phpsrcdir/ext/extname
Desde aqu, fuerce a PHP a regenerar el script de configuracin, y entonces
construya PHP con normalidad:

$ cd /your/phpsrcdir
$ rm configure
$ ./buildconf --force
$ ./configure --help
$ ./configure --with-extname --enable-someotherext --with-foobar
$ make
$ make install
Nota: Necesitar autoconf 2.13 y automake 1.4+ para ejecutar el script 'buildconf'
(es posible que funcionen versiones ms recientes de autoconf, pero no estn
oficialmente soportadas).
Dependiendo de la extensin, utilizar --enable-extname o --with-extname.
Las extensiones que no requieren de bibliotecas externas generalmente utilizan --
enable. Para asegurarse, ejecute el siguiente comando despus de buildconf:

$ ./configure --help | grep extname
El fichero de configuracin
El fichero de configuracin (php.ini) es ledo al arrancar PHP. En las versiones en
que PHP funciona como mdulo de servidor, esto sucede nicamente cuando se
inicia el servidor. En las versiones CGI y CLI, esto ocurre en cada ejecucin.
El fichero php.ini se busca en las siguientes ubicaciones (en orden):
La ubicacin especfica de mdulo SAPI (directiva PHPIniDir en Apache 2,
opcin de lnea de comandos -c en CGI y CLI, parmetro php_inien NSAPI,
variable de entorno PHP_INI_PATH en THTTPD)
La variable de entorno PHPRC. Antes de PHP 5.2.0, esta ubicacin se
comprobaba despus de la clave de registro mencionada ms abajo.
A partir de PHP 5.2.0, se puede establecer la ubicacin del
fichero php.ini para diferentes versiones de PHP. Se examinan en orden las
siguientes claves de
registro: [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z], [HKEY_L
OCAL_MACHINE\SOFTWARE\PHP\x.y] y[HKEY_LOCAL_MACHINE\S
OFTWARE\PHP\x], donde 'x', 'y' y 'z' significan la versin mayor, menor,
y de edicin de PHP. Si existiera un valor para IniFilePath en cualquiera de
estas claves, la primera en ser encontrada se utilizara como ubicacin del
fichero php.ini (solo en Windows).


[HKEY_LOCAL_MACHINE\SOFTWARE\PHP], valor de IniFilePath (solo
en Windows).
El directorio actual de trabajo (excepto CLI)
El directorio del servidor web (para mdulos SAPI), o el directorio de PHP
(excepto en Windows)
El directorio de Windows (C:\windows o C:\winnt) (para Windows), o la
opcin en tiempo de compilacin --with-config-file-path.
Si existiera el fichero php-SAPI.ini (donde SAPI es la SAPI en uso, por
ejemplo, php-cli.ini o php-apache.ini), se usara 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 raz al arrancar, haciendo que PHP
intente leer php.ini desde el sistema de ficheros raz si existiera.
Nota:
Las variables de entorno se pueden usar en el fichero php.ini
Las directivas de php.ini manejadas por extensiones estn documentadas en la
propia pgina de cada extensin. Hay una lista de directivas del ncleo disponible
en el apndice. Es posible que no todas las directivas de PHP estn documentadas
en el manual: para consultar una lista completa de las directivas disponibles en su
versin de PHP, por favor, lea los comentarios del fichero php.ini. Adicionalmente,
puede encontrar til el ltimophp.ini desde Git.
Ejemplo #1 Ejemplo de php.ini
; todo texto en una lnea tras un punto y coma sin comillas (;) ser ignorado
[php] ; los marcadores de seccin (textos entre corchetes) tambin 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".


Ficheros .user.ini
A partir de PHP 5.3.0 se incluye soporte para ficheros de configuracin INI a nivel
de directorios. Estos ficheros solo los procesa la SAPI CGI/FastCGI. Esta
funcionalidad deja obsoleta la extensin PECL htscanner. Si est usando Apache,
use los ficheros .htaccess para lograr el mismo efecto.
Adems 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 raz de documentos (tal y como est establecido
en $_SERVER['DOCUMENT_ROOT']). En el caso de que el fichero PHP se encuentre
fuera del directorio raz de documentos, slo se explorar su directorio.
En los ficheros INI estilo .user.ini slo se reconocern 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 vaco, PHP no realizar ninguna bsqueda. El
nombre por omisin es .user.ini.
user_ini.cache_ttl controla con qu frecuencia se releen los ficheros INI de
usuario. El valor por omisin es 300 segundos (5 minutos).
Dnde se puede realizar un ajuste de configuracin
Estos modos determinan cundo y dnde 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 enhttpd.conf.
Por ejemplo, el ajuste output_buffering es PHP_INI_PERDIR por tanto no puede
establecerse usando ini_set(). Sin embargo, la
directivadisplay_errors es PHP_INI_ALL por tanto se puede establecer en
cualquier lugar, incluso con ini_set().
Definicin de los modos PHP_INI_*
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


Definicin de los modos PHP_INI_*
Modo Significado
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
Cmo cambiar los ajustes de configuracin
Ejecutar PHP como un mdulo de Apache
Cuando se usa PHP como un mdulo de Apache, se pueden cambiar los ajustes de
configuracin usando directivas en los ficheros de configuracin de Apache
(p.ej. httpd.conf) y en los ficheros .htaccess. Se necesitarn los privilegios
"AllowOverride Options" o "AllowOverride All" para poder hacerlo.
Existen varias directivas de Apache que permiten cambiar la configuracin de PHP
desde los propios ficheros de configuracin de Apache. Para un listado las
directivas que son PHP_INI_ALL, PHP_INI_PERDIR, o PHP_INI_SYSTEM, consulte el
apndice de la Lista de directivas de php.ini.
php_value nombre valor
Establece el valor de la directiva especificada. Slo 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_value para establecer valores boolean. Debe usarse en su
lugar php_flag (ver ms abajo).
php_flag nombre on|off
Usado para establecer una directiva de configuracin de tipo boolean. Slo
puede usarse con las directivas de tipo PHP_INI_ALL yPHP_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 conphp_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 configuracin 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 configuracin 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>
Precaucin
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 oE_NOTICE para establecer la
directiva error_reporting puesto que no tendrn ningn
significado y se evaluarn como 0. Use en su lugar la mscara
de bits asociada. Estas constantes s pueden ser usadas
en php.ini
Cambiar la configuracin de PHP a travs del registro
de Windows
Cuando se ejecuta PHP en Windows, se pueden modificar los
valores de configuracin a nivel de directorio usando el registro
de Windows. Los valores de configuracin 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 configuracin para el
directorio c:\inetpub\wwwroot se almacenaran en la
claveHKLM\SOFTWARE\PHP\Per Directory
Values\c\inetpub\wwwroot. Los ajustes para el directorio
estaran 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 configuracin de PHP y
el valor como string. Las constantes de PHP usadas como valor
no sern procesadas. En cualquier caso, nicamente los valores
de configuracin modificables de PHP_INI_USER podrn
establecerse con este mtodo, mientras que los valores
de PHP_INI_PERDIR no.


Otras interfaces a PHP
Independientemente de cmo ejecute PHP, se pueden cambiar
determinados valores de los scripts en tiempo de ejecucin
mediante ini_set(). Consulte la documentacin de la
pgina ini_set() para ms informacin.
Si est interesado en una lista completa de los ajustes de
configuracin en su sistema con sus valores actuales, puede
ejecutar la funcin phpinfo(), y consultar la pgina mostrada.
Puede tambin acceder a los valores de directivas de
configuracin concretas usando ini_get() o get_cfg_var().
Etiquetas de PHP
Cuando PHP interpreta un fichero, busca las etiquetas de apertura y cierre, que
son <?php y ?>, y que indican a PHP dnde empezar y finalizar la interpretacin
del cdigo. Este mecanismo permite a PHP ser incrustado en todo tipo de
documentos, ya que todo lo que est fuera de las etiquetas de PHP ser ignorado
por el intrprete.
PHP tambin permite las etiquetas abreviadas <? y ?> (las cuales estn
desaconsejadas debido a que slo estn disponibles si se habilitan con la
directiva short_open_tag del fichero de configuracin php.ini, o si PHP se configur
con la opcin --enable-short-tags .
Si un fichero contiene cdigo PHP puro, es preferible omitir la etiqueta de cierre de
PHP al final del fichero. Esto impide que se aadan espacios en blanco o nuevas
lneas despus de la etiqueta de cierre de PHP, los cuales pueden causar efectos
no deseados debido a que PHP iniciar la salida del buffer cuando no haba
intencin por parte del programador de enviar ninguna salida en ese punto del
script.
<?php
echo "Hola mundo";

// ... ms cdigo

echo "ltima sentencia";

// el script finaliza aqu sin etiqueta de cierre de PHP
Salir de HTML
Cualquier cosa fuera del par de etiquetas de apertura y cierre es ignorado por el
intrprete 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 tambin ser ignorado por PHP y mostrado por el navegador.</p>
Esto funciona como se espera, porque cuando PHP intercepta las etiquetas de
cierre ?>, simplemente comienza a imprimir cualquier cosa que encuentre (a
excepcin de un una nueva lna inmediatamente despus - vase separacin de
instrucciones) haste que d con otra etiqueta de apertura a menos que se
encuentre en mitad de una sentencia condicional, en cuyo caso el intrprete
determinar el resultado de la condicin antes de tomar una decisin de qu es lo
que tiene que saltar. Vea el siguiente ejemplo.
Usar estructuras con condiciones
Ejemplo #1 Salida avanzada usando condiciones
<?php if ($expresin == true): ?>
Esto se mostrar si la expresin es verdadera.
<?php else: ?>
En caso contrario se mostrar esto.
<?php endif; ?>
En este ejemplo, PHP saltar los bloques donde la condicin no se cumpla, incluso
si estn fuera de las etiquetas de apertura/cierre de PHP, PHP los saltar segn la
condicin, ya que el intrprete saltar por encima de los bloques contenidos dentro
de una condicin que no se cumpla.
Para imprimir bloques de texto grandes, es ms eficiente abandonar el modo
intrprete de PHP que enviar todo el texto a travs 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 estn disponibles. Las otras dos son las etiquetas abreviadas y las
etiquetas estilo ASP, que se pueden activar o desactivar desde el fichero de
configuracin php.ini Aunque algunas personas encuentran las etiquetas
abreviadas y las etiquetas estilo ASP ms convenientes, son menos portables y
generalmente no se recomiendan.
Nota:
Observe tambin que si se est incrustando PHP dentro de XML o XHTML
necesitar usar las etiquetas <?php ?> para seguir los estndares.
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 ms simple, una instrucin de procesado SGML'; ?>
<?= expresin ?> Esto es una forma abreviada de "<? echo expresin ?>"

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 estn siempre disponibles; el
ejemplo uno es el ms comn y recomendado de los dos.
Las etiquetas abreviadas (ejemplo tres) estn solo disponibles cuando se activan
mediante la directiva short_open_tag del fichero de configuracinphp.ini o si PHP
se configur con la opcin --enable-short-tags .
Las etiquetas de estilo ASP (ejemplo cuatro) estn solo disponibles cuando se
activan mediante la directiva asp_tags del fichero de configuracinphp.ini.
Nota:
Se debe evitar el uso de etiquetas abreviadas cuando se desarrollen aplicaciones o
bibliotecas que estn pensadas para su redistribucin o despliegue en servidores
PHP que no estn bajo su control, porque puede que las etiquetas abreviadas no
estn soportadas en un servidor determinado. Por portabilidad y cdigo
redistribuible, asegrese de no usar etiquetas abreviadas.
Nota:
En PHP 5.2 y anteriores, el intrprete 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 ms caracteres espacio en blanco despus de la
etiqueta de apertura.
Nota:
Desde PHP 5.4, la etiqueta abreviada de echo <?= siempre es reconocida y vlida,
sin tener en cuenta la configuracin de short_open_tag.
Separacin de instrucciones
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 cdigo de PHP
automticamente implica un punto y coma; no es necesario usar un punto y coma
para cerrar la ltima lnea de un bloque de PHP. La etiqueta de cierre del bloque
incluir la nueva lnea 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 podrn aadir an
cabeceras para la respuesta posterior. Tambin es prctico si se utiliza la salida del
buffer y no se desean espacios en blanco no deseados al final de las partes
generadas por ficheros includos.
Comentarios
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-lnea
y otra lna de comentarios */
echo 'Esto es otra pruba';
echo 'Una prueba final'; # Esto es un comentario estilo consola de una sola
lnea
?>
Los comentarios del estilo "una sola lnea" solo comentan hasta el final de la lnea
o del bloque actual de cdigo de PHP, lo primero que suceda. Esto implica que el
cdigo HTML despus 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 configuracin asp_tags est activada, acta igual que // %> y # %>. Sin
embargo, la etiqueta </script>no sale del modo PHP en un comentario de una
sola lnea.
<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.
Asegrese de no anidar comentarios al estilo 'C'. Es muy fcil cometer este error
cuando se intenta comentar un bloque grande de cdigo.
<?php
/*


echo 'Esto es una prueba'; /* Este comentario causar un problema*/
*/
?>
Introduccin
PHP soporta ocho tipos primitivos.
Cuatro tipos escalares:
boolean
integer
float (nmero de punto flotante, tambin conocido como double)
string
Dos tipos compuestos:
array
object
Y finalmente dos tipos especiales:
resource
NULL
Este manual introduce tambin algunos pseudo-tipos por razones de legibilidad:
mixed
number
callback
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 slo
por razones histricas.
El tipo de una variable usualmente no es declarado por el programador; en
cambio, es decidido en tiempo de ejecucin por PHP dependiendo del contexto en
el que es usado la variable.
Nota: Para comprobar el tipo y el valor de una expresin, utilice la
funcin var_dump().
Para obtener una representacin legible para humanos del tipo para propsitos de
depuracin, use la funcin 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 conversin de una variable a cierto tipo, puede moldear la variable o
usar la funcin 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 ms
informacin, vea la seccin sobre Manipulacin de Tipos. Las tablas de
comparacin de tipos pueden resultar tiles tambin, ya que muestran ejemplos
de varias comparaciones relacionadas con tipos.
Booleanos
Este es el tipo ms simple. Un boolean expresa un valor de verdad. Puede
ser TRUE or FALSE.
Sintaxis
Para especificar un literal boolean, use alguna de las palabras clave TRUE o FALSE.
Ambas son insensibles a maysculas y minsculas.
<?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 versin 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";
}
?>
Conversin a booleano
Para convertir explcitamente un valor a boolean, use el
moldeamiento (bool) o (boolean). Sin embargo, en la mayora de casos no es
necesario usar el moldeamiento, ya que un valor ser convertido automticamente
si un operador, funcin o estructura de control requiere un argumento tipoboolean.
Vea tambin Manipulacin de Tipos.
Cuando se realizan conversiones a boolean, los siguientes valores son
considerados FALSE:
el boolean FALSE mismo
el integer 0 (cero)
el float 0.0 (cero)
el valor string vaco, y el string "0"
un array con cero elementos
un object con cero variables miembro (slo en PHP 4)
el tipo especial NULL (incluyendo variables no definidas)
objetos SimpleXML creados desde etiquetas vacas
Cualquier otro valor es considerado TRUE (incluyendo cualquier resource).
Advertencia
-1 es considerado TRUE, como cualquier otro nmero 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)
?>
Enteros
Un entero o integer es un nmero del conjunto = {..., -2, -1, 0, 1, 2, ...}.
Consulte tambien:
Entero de longitud arbitraria / GMP
Nmeros de punto flotante
BCMath matemticas de precisin arbitraria
Sintaxis
Los integer pueden ser especificados mediante notacin decimal (base 10),
hexadecimal (base 16), octal (base 8) o binaria (base 2), opcionalmente
precedidos por un signo (- o +).
Los literales integer binarios estn disponibles desde PHP 5.4.0.
Para usar la notacin octal, se antepone al nmero un 0 (cero). Para usar la
notacin hexadecimal, se antepone al nmero un 0x. Para usar la notacin binaria,
se antepone al nmero un 0b.
Ejemplo #1 Enteros literales
<?php
$a = 1234; // nmero decimal
$a = -123; // un nmero negativo
$a = 0123; // nmero octal (equivalente a 83 decimal)
$a = 0x1A; // nmero 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 tamao de un integer depende de la plataforma, aunque un valor mximo de
aproximadamente dos mil millones es el valor usual (para 32 bits con signo). Las
plataformas de 64-bits normalmente tienen un valor mximo de aproximadamente
9E18. PHP no admite integers sin signo. El tamao de un integer puede ser
determinado mediante la constante PHP_INT_SIZE y el valor mximo mediante la
constante PHP_INT_MAX desde PHP 4.4.0 y PHP 5.0.5.
Advertencia
Si en un integer octal se da un dgito incorrecto (por ejemplo 8 o 9), el resto del
nmero se ignora.
Ejemplo #2 Octal raros
<?php
var_dump(01090); // 010 octal = 8 decimal
?>
Desbordamiento de enteros
Si PHP encuentra un nmero fuera de los lmites de un integer, se interpretar
como un float en su lugar. Tambien, una operacin cuyo resultado es un nmero
fuera de los lmites 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 divisin 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
funcin 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)
?>
Conversin a enteros
Para convertir explicitamente un valor a integer, se puede emplear
tanto (int) como (integer). Sin embargo, la mayora de las veces la conversin
no es necesaria, ya que un valor es convertido de forma automtica cuando un
operador, funcin o estructura de control necesite un argumento del tipo integer.
Un valor tambien puede ser convertido a integer mediante la funcin intval().
Consulte tambin la manipulacin de tipos.
Desde booleanos
FALSE produce 0 (cero), y TRUE produce 1 (uno).
Desde nmeros de punto flotante
Cuando se convierte de un float a un integer, el nmero ser redondeado hacia
cero.
Si el float esta por debajo de los lmites de un integer (normalmente +/- 2.15e+9
= 2^31 en plataformas de 32 bits y +/- 9.22e+18 = 2^63en plataformas de 64
bits), el resultado es indefinido, debido a que float no tiene la precisin suficiente
para ofrecer el resultado como un integerexacto. No se mostrar ninguna
advertencia, ni siquiera un aviso cuando esto ocurre!


Advertencia
Nunca se debe convertir una fraccin 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 precisin de float
Desde cadenas
Consulte Conversin de cadenas a nmeros
Desde otros tipos
Precaucin
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.
Nmeros de punto flotante
Los nmeros de punto flotante (tambin conocidos como "flotantes", "dobles" o
"nmeros 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 tamao de un flotante depende de la plataforma, aunque un valor comn
consiste en un mximo de ~1.8e308 con una precisin de aproximadamente 14
dgitos decimales (lo que es un valor de 64 bits en formato IEEE).
Advertencia


Precisin del punto flotante
Los nmeros de punto flotante tienen una precisin limitada. Aunque depende del
sistema, PHP tpicamente utiliza el formato de doble precisin IEEE 754, el cual
dar un error relativo mximo por aproximacin del orden de 1.11e-16. Las
operaciones aritmticas elementales no podrn dar grandes errores y por
supuesto, los errores por propagacin deben ser considerados cuando varias
operaciones son compuestas.
Adicionalmente, los numeros racionales que son representables exactamente como
nmeros de punto flotante en base 10, como 0.1 o 0.7, no tienen una
representacin exacta como nmeros de punto flotante en base 2, el cual es usado
internamente, sin importar el tamao de la mantisa. Por lo tanto, no se puede
convertir en sus contrapartes binarias internas sin una pequea prdida de
precisin. 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 representacin interna ser algo as
como7.9999999999999991118....
As que nunca se confa en resultados de nmeros flotantes hasta el ltimo dgito y
no se comparan nmeros de punto flotante directamente para igualdad. Si es
necesaria una mejor precisin, estn disponibles las funciones matemticas de
precisin arbitraria y las funciones gmp.
Para una explicacin "simple", vase la gua de punto flotante que tambin se
titula "Por qu no suman mis nmeros?"
Conversin a flotante
Para ms informacin sobre las conversiones de string a float, vea Conversin de
cadenas a nmeros. Para valores de otros tipos, la conversin es la misma que si
el valor hubiese sido convertido a integer y luego a float. Vea Conversin a
entero para ms informacin. A partir de PHP 5, una noticia es generada si intenta
convertir un objeto a float.
Comparing floats
Como se indica en la advertencia anterior, comprobar la igualdad de valores de
punto flotante es problemtico, 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 lmite
superior en el error relativo debido al redondeo. Este valor se conoce como el
epsilon de la mquina o unidad de redondeo y es la menor diferencia aceptable en
los clculos.
$a y $b son iguales a 5 dgitos de precisin.


<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {
echo "true";
}
?>
NaN
Algunas operaciones numricas pueden resultar en un valor representado por la
constante NAN. Este resultado representa un valor no definido o no representable
mediante clculos de coma flotante. Cualquier comparacin, ya sea poco rgida o
estricta, de esta valor con cualquier otro valor, incluido l mismo tenfr un
resultado de FALSE.
Ya que NAN representa cualquier nmero de diferentes valores, NAN no debera
compararse con otros valores, incluido l mismo; en su lugar debera comprobarse
usando la funcin is_nan().
Cadenas
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 tamao.
Sintaxis
Un string literal puede ser especificado de cuatro formas diferentes:
comillas simples
comillas dobles
sintaxis heredoc
sintaxis nowdoc (desde PHP 5.3.0)
Comillas simples
La manera ms 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 sern tratadas como una barra invertida literal:
esto significa que otras secuencias de escape que se puedan utilizar, tales


como \r or \n, sern 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 expandirn cuando estn
incluidas dentro de un string con comillas simples.
<?php
echo 'Esto es una cadena sencilla';

echo 'Tambien puede incluir nuevas lneas 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 lnea
echo 'Esto no se expandir: \n una nueva lnea';

// Resultado: Las variables $tampoco se $expandiran
echo 'Las variables $tampoco se $expandiran';
?>
Comillas dobles
Si un string est encerrado entre comillas dobles ("), PHP interpretar ms
sentencias de escape como caracteres especiales:
Caracteres escapados
Sentencia Significado
\n avance de lnea (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)


Caracteres escapados
Sentencia Significado
\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 pgina (FF o 0x0C (12) en ASCII) (desde PHP 5.2.5)
\\ barra invertida
\$ signo del dlar
\" comillas dobles
\[0-7]{1,3}
la secuencia de caracteres que coincida con la expresin regular es un caracter
en notacin octal
\x[0-9A-Fa-
f]{1,2}
la secuencia de caracteres que coincida con la expresin regular es un caracter
en notacin hexadecimal
Al igual que en la delimitacin 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 caracterstica ms importante de entrecomillar un string mediante comillas
dobles es el hecho que los nombres de las variables son expandidas.
Consulte string parsing para ms detalles.
Heredoc
Una tercera forma de delimitar un string es mediante la sintaxis heredoc: <<<.
Despus de este operador, se deber ofrecer un identificador y despus una nueva
lnea. A continuacin va el propio string, y para cerrar la notacin se pone el
mismo identificador.
El identificador de cierre debe empezar en la primera columna de la nueva lnea.
Asimismo, el identificador debe seguir las mismas reglas de nomenclatura de las
etiquetas en PHP: debe contener solo caracteres alfanumricos y guiones bajos, y
debe empezar con un caracter alfabtico o un guin bajo.


Advertencia
Es muy importante sealar que la lnea con el identificador de cierre no debe
contener ningn caracter, exceptoposiblemente un punto y coma (;). Esto
significa en particular que el identificador no debe usar sangra, y que no deben
existir ningn espacio ni tabulacin antes o despus del punto y coma. Es muy
importante darse cuenta que el primer caracter antes del identificador de cierre
debe ser un salto de lnea definida por el sistema operativo local. En los sistemas
UNIX sera \n, al igual que en Mac OS X. El delimitador de cierre (posiblemente
seguido de un punto y coma) tambin debe ser seguido de un salto de lnea.
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 ningn identificador de cierre antes del final del fichero, se producir
un error de anlisis en la ltima lnea.
Tampoco se puede emplear Heredocs para inicializar las propiedades de una clase.
Desde PHP 5.3, esta limitacin solo concierne a los heredocs que contengan
variables.
Ejemplo #1 Ejemplo no vlido
<?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 lneas
empleando la sintaxis heredoc.
EOD;

/* Un ejemplo ms 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' mayscula: \x41
EOT;
?>
El resultado del ejemplo sera:
Mi nombre es "MiNombre". Estoy escribiendo un poco de Foo.
Ahora, estoy escribiendo un poco de Bar2.
Esto debe mostrar una 'A' mayscula: A
Tambien se puede emplear la sintaxis Heredoc para pasar datos como argumento
de una funcin:
Ejemplo #3 Ejemplo de Heredoc como argumento
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
Desde PHP 5.3.0 es posible inicializar variables estticas y propiedades/constantes
de clase mediante la sintaxis Heredoc:
Ejemplo #4 Usando Heredoc para inicializar valores estticos
<?php
// Variables estticas
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;
?>
Nowdoc
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 anloga a la heredoc,
pero no se realiza ningn anlisis dentro de nowdoc. Esta construccin es ideal
para embeber cdigo PHP o grandes fragmentos de texto sin necesidad de
escaparlo. Comparte algunas caractersticas comunes con la construccin
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 tambin 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 lneas
empleando la sintaxis nowdoc.
EOD;



/* Un ejemplo ms 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' mayscula: \x41
EOT;
?>
El resultado del ejemplo sera:
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' mayscula: \x41
Nota:
A diferencia de heredoc, nowdoc puede ser usado en cuaquier contexto de datos
estticos. Un ejemplo tpico es la inicializacin de propiedades o constantes en una
clase:
Ejemplo #7 Ejemplo de datos estticos
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Nota:
El soporte de Nowdoc se aadi en PHP 5.3.0.


Anlisis de variables
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
ms 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 mnimo
esfuerzo.
La sintaxis compleja puede ser reconocida por las llaves que encierran la
expresin.
Sintaxis simple
Si se encuentra un signo de dlar ($), el analizador vidamente coger el mayor
nmero de smbolos para formar un nombre de variable vlido. Encerrar el nombre
de la variable entre llaves permite especificar explcitamente el final del nombre.
<?php
$jugo = "manzana";

echo "El tom algo de jugo de $jugo.".PHP_EOL;
// Invlido. "s" es un caracter vlido para un nombre de variable, pero la varia
ble es $jugo.
echo "El tom algo de jugo hecho de $jugos.";
?>
El resultado del ejemplo sera:
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" => "prpura");

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 sera:
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 prpura.
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 ms complejos se debe emplear la sintaxis compleja.
Sintaxis compleja (llaves)
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
representacin de string puede ser incluido a travs de esta sintaxis. Simplemente
se escribe la expresin 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 ms
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 centmetros de lado.";

// Funciona, claves entre comillas slo funcionan utilizando la sintaxis de llav
es
echo "Esto funciona: {$arr['key']}";

// Funciona
echo "Funciona: {$arr[4][3]}";

// No funciona por la misma razn que $foo[bar] es incorrecto fuera de una caden
a.
// En otras palabras, funcionara pero solo porque PHP primero busca por una con
stante
// llamada foo; un error del nivel E_NOTICE (constante no definida) puede ser la
nzado.
echo "No funciona: {$arr[foo][3]}";

// Funciona. Cuando se usan arrays multidimensionales, siempre emplee llaves enc
errando
// 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 \$objec
t->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()}";
?>
Tambin 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 sera:
Soy bar.
Soy bar.
Nota:
Funciones, llamadas a mtodos, variables estticas 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 mtodos, constantes o variables estticas 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";
?>
Acceso a cadenas y modificacion por caracteres
Los caracteres dentro de un string pueden ser accedidos y modificados
especificando la posicin de caracter deseado (en base a la posicin 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 ms de un caracter.
Nota: Los String tambin pueden accederse utilizando llaves, como en $str{42},
para el mismo propsito.
Advertencia
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 vaca. Slo se emplea el primer carcter de
un string asignado. La asignacin de un string vaco asigna un byte NULL.
Advertencia
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 slo debe hacerse con cadenas en codificaciones de un solo bit como
ISO-8859-1.
Ejemplo #9 Algunos ejemplos de cadenas
<?php
// Obtencin del primer caracter de una cadena
$str = 'Esto es un test.';
$first = $str[0];

// Obtencin del tercer caracter de una cadena
$third = $str[2];

// Obtencin del ltimo caracter de una cadena
$str = 'Esto sigue siendo un test.';
$last = $str[strlen($str)-1];

// Modificacin 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 aadi soporte para acceder a caracteres dentro de cadenas literales
utilizando [] o {}.


Funciones y operadores tiles
Los string pueden ser concatenados empleando el operador '.' (punto). Fjese que
el operador '+' (suma) no servir para concatenar. Consulteoperadores de
string para ms informacin.
Hay una serie de funciones tiles para la manipulacin de string.
Consulte la seccin 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 bsqueda y sustitucin.
Tambien existen funciones para cadenas URL, y funciones para
encriptar/desencriptar cadenas (mcrypt y mhash).
Finalmente, tambien existen las funciones para el tipo caracter.
Conversin a cadena
Un valor puede convertirse a una string mediante el forzado (string) o la
funcin strval(). La conversin automtica a string tiene lugar en el contexto de
una expresiin 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 Manipulacin de tipos pueden ayudarle a enterderlo con
ms claridad. Consulte tambien la funcinsettype().
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 vaca). Esto permite la
conversin en ambos sentidos entre los valores de los tipos boolean y string.
Un integer o float es convertido en un string representando textualmente el
nmero (incluyendo la parte exponencial para los floats. Los nmeros de punto
flotante pueden ser convertidos mediante la notacin exponencial (4.1E+6).
Nota:
El caracter para el punto decimal se define en el script de configuracin regional
(categora LC_NUMERIC). Consulte la funcin 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 unarray. Para
ver un elemento individualmente, utilice una construccin 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 depuracin, mire los parrafos
siguientes. Para obtener el nombre de la clase del objeto emple la
funcin get_class(). A partir de PHP 5 se puede emplear el mtodo__toString.


Los resources siempre se convierten en strings mediante la estructura "Resource
id #1", donde 1 es el nmero nico asignado al resource por PHP en tiempo de
ejecucin. No debe confiar en esta estructura, ya que est sujeto a cambios. Para
obtener el tipo del resource emplee la funcinget_resource_type().
NULL siempre es convertido a una cadena vaca.
Como se ha indicado anteriormente, la conversin directa de
un array, object o resource a un string no proporciona informacin til acerca del
valor, ms all de su tipo. Consulte las funciones print_r() y var_dump() para
obtener maneras ms efectivas de inspeccionar el contenido de estos tipos.
La mayora de los valores de PHP pueden ser convertidos a strings para su
almacenamiento permanente. Este mtodo se denomina serializacin, y es
realizado mediante la funcin serialize(). Si la mquina PHP est contruida con
soporte de WDDX, los valores de PHP tambien pueden ser serializacos como texto
XML correctamente formateado.
Conversin de cadenas a nmeros
Cuando una string es evaluada en un contexto numrico, el valor resultante y el
tipo se determina como se explica a continuacin.
Si el string no contiene ninguno de los caracteres '.', 'e', o 'E' y el valor numrico
est entre los lmites del tipo entero (como se define enPHP_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 nmero
vlido, ste ser el valor usado. De otra forma, el valor ser 0 (cero). Se considera
nmero vlido a un signo opcional, seguido de uno o ms dgitos (opcionalmente
puede contener un punto decimal), seguido de un exponente opcional. El
exponente es una 'e' o 'E' seguida de uno o ms dgitos.
<?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 ms informacin sobre esta conversin, consulte la pgina del manual UNIX
correspondiente a strtod(3).
Para probar cualquiera de los ejemplos en esta seccin, copie y pegue los ejemplos
e incluya la siguiente lnea para ver que est ocurriendo:


<?php
echo "\$foo==$foo; tipo es " . gettype ($foo) . "<br />\n";
?>
No espere obtener el cdigo de un caracter convirtiendolo a un entero, como
ocurre en C. Emplee las funciones ord() y chr() para convertir entre cdigo ASCII y
caracteres.
Detalles del tipo de dato String
En PHP, los string se implementan como una matriz de bytes y con un entero que
indica la longitud del buffer. No guarda ninguna informacin sobre cmo traducir
esos bytes, relegando esa tarea al programador. No existe ninguna limitacin
sobre el valor que puede contener un string; en concreto, est permitido colocar
un bytes con valor 0 (bytes NUL) en cualquier posicin del string (existen
algunas funciones, marcadas en este manual como que no utilizan "modo binario
seguro", podran 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 ledo a partir de un socket de red devolvern
strings.
Dado que PHP no obliga a utilizar ninguna condificacin en particular, uno podra
preguntarse cmo 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 representacin
posible? La resuesta es que un string se codifica en cualesquiera forma en que
estuviera el fichero de cdigo. Por tanto, si un fichero de cdigo 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 cdigo
podra estar escrito en cualquier codificacin (declarada explcitamente o bien
detectada) para despus convertirse a una determinada codificacin interna, que
ser entonces la codificacin usada para los textos literales. Tenga presente que
existen algunas limitaciones sobre la codificacin del cdigo fuente (o en la
codificacin internal, si Zend Multibyte estuviera habilitado) esto suele significar
que se debe usar uan codificacin 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, podra generar problemas.
Por supuesto, para poder ser til, las funciones que operen con texto podrn partir
de unos supuestos sobre cmo est codificado el string. Desafortunadamente,
respecto a esto existen muchas variaciones en la funciones de PHP:
Algunas funciones asumen que el string est codificado en una codificacin
simple de bytes, por lo que no necesitan interpretar estos bytes como
caracteres especficos. Este es el caso de, por


ejemplo, substr(), strpos(), strlen() o strcmp(). Otra forma de entender
estas funciones es pensando que operan sobre buffers de memoria, es
decir, trabajan con bytes y con desplazamientos de bytes.
A otras funciones se les indica la codificacin del string, si bien es posible
que tengan una codificacin predeterminada. Este es el caso
dehtmlentities() y la mayora de funciones de la extensin mbstring.
Otras, utilizan las locales en uso (ver setlocale()), pero operan byte a byte.
Este es el caso de strcasecmp(), strtoupper() y ucfirst(). Esto significa que
slo se pueden usar con codificaciones de un byte, siempre y cuando la
codificacin coincida con la de la local. Por ejemplostrtoupper("") podra
devolver "" si las locales estn correctamente habilitadas y est
codificado con un nico byte. Si est codificado en UTF-8, no se devolver
un resultado correcto y el string resultante podra, o no, devolverse
corrupto, en funcin de las locales en uso.
Por ltimo, podrn tambien asumir que se utiliza una codificacin en
particular, usualmente UTF-8. Este es el caso de la mayora de las funciones
de la extensin intl y de la extensin PCRE (en este ltimo caso, slo
cuando se utiliza el modificador u). Debido a su propsito especial, la
funcin utf8_decode() asume una codificacin UTF-8, mientras que la
funcin utf8_encode() asume una codificacin ISO-8859-1.
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
slo el principio. No importa qu funciones incorpore el lenguaje; es primordial
conocer la especificacin Unicode. Por ejemplo, un programa que asuma que slo
hay maysculas y minsculas estar haciendo una suposicin erronea.
Arrays
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 implementacin de un mapa), diccionario, coleccin, pila, cola, y
posiblemente ms. Ya que los valores de un array pueden ser otros arrays, rboles
y tambin son posibles arrays multidimensionales.
Una explicacin sobre tales estructuras de datos est fuera del alcance de este
manual, pero encontrar al menos un ejemplo de cada uno de ellos. Para ms
informacin, consulte la extensa literatura que existe sobre este amplio tema.
Sintaxis
Especificacin con array()
Un array puede ser creado usando el constructor del lenguaje array(). ste toma
un cierto nmero de parejas clave => valor como argumentos.


array(
clave => valor,
clave2 => valor2,
clave3 => valor3,
...
)
La coma despus del elemento del array es opcional y se puede omitir. Esto
normalmente se hace para arrays de una sola lnea, esto es, es
preferible array(1, 2) que array(1, 2, ). Por otra parte, para arrays multilnea, la
coma final se usa comnnmente, ya que permite la adicin sencilla de nuevos
elementos al final.
A partir de PHP 5.4 tambin 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.
Adems, los siguientes moldeados de tipo en la clave producir:
Strings que contienen integers vlidos sern moldeados a el tipo integer.
P.e.j. la clave "8" en realidad ser almacenada como 8. Por otro
lado"08" no ser convertido, ya que no es un nmero integer decimal
vlido.
Floats tambin sern moldeados en integers, lo que significa que la parte
fraccionaria se elimina. P.e.j. la clave 8.7 en realidad ser almacenada
como 8.
Bools son moldeados a integers, tambin, p.e.j. la clave true en realidad
ser almacenada como 1 y la clave false como 0.
Null ser moldeado a un string vaco, p.e.j. la clave null en realidad ser
almacenada como "".
Arrays y objects no pueden ser usados como claves. Si lo hace, dar lugar
a una advertencia: Illegal offset type.


Si varios elementos en la declaracin del array usan la misma clave, slo la ltima
ser usada y los dems 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 sera:
array(1) {
[1]=>
string(1) "d"
}
Como todas las claves en el ejemplo anterior se convierten en 1, los valores sern
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 sera:
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 ms grande utilizada anteriormente.
Ejemplo #4 Arrays indexados sin clave
<?php
$array = array("foo", "bar", "hallo", "world");
var_dump($array);
?>
El resultado del ejemplo sera:
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "hallo"
[3]=>
string(5) "world"
}
Es posible especificar la clave slo para algunos de los elementos y dejar por fuera
a los dems:
Ejemplo #5 Claves no en todos los elementos
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>
El resultado del ejemplo sera:
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.


Acceso a elementos de array con la sintaxis de corchete
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 sera:
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} harn
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 funcin o mtodo directamente. Antes slo 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.
Creacin/modificacin con sintaxis de corchete
Un array existente puede ser modificado al definir valores explcitamente en ste.
Esto se realiza mediante la asignacin de valores al array, especificando la clave
en corchetes. La clave tambin se puede omitir, resultando en un par de corchetes
vacos ([]).
$arr[clave] = valor;
$arr[] = valor;
// clave puede ser un integer o string
// valor puede ser cualquier valor de cualquier tipo
Si $arr an no existe, se crear, as que esto es tambin una forma alternativa de
crear un array. Sin embargo, esta prctica es desaconsejada ya que si $arr ya
contiene algn valor (p.ej. un string de una variable de peticin), entonces este
valor estar en su lugar y [] puede significar realmente el operador de acceso a
cadenas. Siempre es mejor inicializar variables mediante una asignacin 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
funcin 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
mximo de los ndices integer existentes, y la nueva clave ser ese valor mximo
ms 1 (aunque al menos 0). Si todava no existen ndices integer, la clave
ser 0 (cero).
Tenga en cuenta que la clave integer mxima utilizada para ste no es necesario
que actualmente exista en el array. sta slo debe haber existido en
el array en algn 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 sera:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
Array


(
)
Array
(
[5] => 6
)
Array
(
[0] => 6
[1] => 7
)
Funciones tiles
Hay un buen nmero de funciones tiles para trabajar con arrays. Vase la
seccin funciones de array.
Nota:
La funcin 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 funcin 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 especficamente para arrays. sta provee
una manera fcil de recorrer un array.


Recomendaciones sobre arrays y cosas a evitar
Por qu es incorrecto $foo[bar]?
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 comn encontrar este tipo de sintaxis en scripts viejos:
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>
Esto est mal, pero funciona. La razn es que este cdigo tiene una constante
indefinida (bar) en lugar de un string ('bar' - observe las comillas). Puede que en
el futuro PHP defina constantes que, desafortunadamente para tales tipo de
cdigo, tengan el mismo nombre. Funciona porque PHP automticamente convierte
un string puro (un string sin comillas que no corresponde con ningn smbolo
conocido) en un string que contiene elstring puro. Por ejemplo, si no se ha definido
una constante llamada bar, entonces PHP reemplazar su valor por
el string 'bar' y usar ste ltimo.
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 sera:
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
Ms 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 tambin 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 con
stantes 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 excepcin, 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 intrprete como:


// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Esto por supuesto se aplica tambin al uso de superglobales en cadenas
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";

// La concatenacin es otra opcin
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 sern inmediatamente
visibles. Por omisin, error_reporting se encuentra configurado para no mostrarlos.
Tal y como se indica en la seccin de sintaxis, lo que existe entre los corchetes
cuadrados ('[' y ']') debe ser una expresin. Esto quiere decir que cdigo como el
siguiente funciona:
<?php
echo $arr[somefunc($bar)];
?>
Este es un ejemplo del uso de un valor devuelto por una funcin como ndice del
array. PHP tambin 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 tambin un identificador vlido, asi como bar en el primer
ejemplo. Pero el ltimo ejemplo es equivalente a escribir:
<?php
$error_descriptions[1] = "Un error fatal ha ocurrido";
$error_descriptions[2] = "PHP produjo una advertencia";
$error_descriptions[8] = "Esta es una noticia informal";
?>
ya que E_ERROR es igual a 1, etc.
Entonces porqu est mal?
En algn momento en el futuro, puede que el equipo de PHP quiera usar otra
constante o palabra clave, o una constante proveniente de otro cdigo 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 vlido no
rodear los ndices de array con comillas, as que "$foo[bar]"es vlido. Consulte
los ejemplos anteriores para ms detalles sobre el porqu, as como la seccin
sobre procesamiento de variables en cadenas.
Conversin a array
Para cualquiera de los tipos: integer, float, string, boolean y resource, convertir un
valor a un array resulta en un array con un solo elemento, con ndice 0, y el valor
del escalar que fue convertido. En otras palabras, (array)$scalarValue es
exactamente lo mismo que array($scalarValue).
Si convierte un object a un array, el resultado es un array cuyos elementos son las
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'.
Si convierte un valor NULL a array, obtiene un array vaco.
Comparacin
Es posible comparar arrays con la funcin array_diff() y mediante operadores de
arrays.
Ejemplos
El tipo array en PHP es bastante verstil. 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';

// Despus de que se ejecute el cdigo, $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 numricas
$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 mximo era 5)
'8' => 2, // key = 8 (integer!)
'02' => 77, // key = '02'
0 => 12 // el valor 10 ser reemplazado por 12
);

// array vaco
$empty = array();
?>
Ejemplo #9 Coleccin
<?php
$colors = array('rojo', 'azul', 'verde', 'amarillo');

foreach ($colors as $color) {
echo "Le gusta el $color?\n";
}

?>
El resultado del ejemplo sera:
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,
pasndolos por referencia. Las versiones anteriores necesitan una solucin
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 sera:
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 sera:
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 seccin sobre funciones de arrays para ms informacin. La
funcin count() puede ser usada para contar el nmero 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, tambin 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 asignacin 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
?>
Objetos
Inicializacin de Objetos
Para crear un nuevo object, utilice la declaracin new para instanciar una clase:


<?php
class foo
{
function do_foo()
{
echo "Doing foo.";
}
}

$bar = new foo;
$bar->do_foo();
?>
Para una descripcin completa, vea el captulo Clases y Objetos.
Conversin a un objeto
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 vaca.
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'
?>
Recursos
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 apndice para un listado de todas estas funciones y los
tipos resource correspondientes.
Vea tambin la funcin get_resource_type().
Conversin a recurso
Dado que las variables resource contienen gestores especiales a archivos abiertos,
conexiones con bases de datos, reas de pintura de imgenes y cosas por el estilo,
la conversin a tipo resource carece de sentido.
Liberacin de recursos
Gracias al sistema de conteo de referencias introducido con el Motor Zend de PHP
4, un recurso que ya no es referenciado es detectado automticamente, y es


liberado por el recolector de basura. Por esta razn, rara vez se necesita liberar la
memoria manualmente.
Nota: Los enlaces persistentes con bases de datos son una excepcin a esta regla.
Ellos no son destruidos por el recolector de basura. Vea tambin la seccin
sobre conexiones persistentes para ms informacin.
NULO
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 todava.
se ha destruido con unset().
Sintaxis
No hay ms que un valor de tipo null, y es la constante NULL insensible a
maysculas/minsculas.
<?php
$var = NULL;
?>
Vase tambin las funciones is_null() y unset().
La conversin a NULL
Convertir una variable a null usando (unset) $var no eliminar la variable ni
destruir su valor. Slo retornar un valor NULL.
Llamadas de retorno
Las llamadas de retorno se pueden indicar con el tipo callable a partir de PHP 5.4.
Esta documentacin utiliz la informacin del tipo callback con el mismo propsito.
Algunas funciones como call_user_func() o usort() aceptan como parmetro
funciones de llamada de retorno definidas por el usuario. Las funciones de
llamadas de retorno no slo pueden ser funciones simples, sino tambin mtodos
de un object, incluyendo mtodos de clase estticos.


Pasar una funcin de llamada de retorno
Una funcin de PHP se pasa por su nombre como un string. Se puede utilizar
cualquier funcin nativa o definida por el usuario, exceptuando contrucciones del
lenguaje, tales
como: array(), echo, empty(), eval(), exit(), isset(), list(), print o unset().
Un mtodo de un object instanciado se pasa como un array que contiene
un object en el ndice 0 y el nombre del mtodo en el ndice 1.
Los mtodos de clase estticos tambin se pueden pasar sin instanciar
un object de dicha clase, pasando el nombre de la clase en lugar de unobject en el
ndice 0. A partir de PHP 5.2.3, tambin es posible
pasar 'NombreDeClase::nombreDeMetodo'.
Adems de las funciones definidas por el usuario normales, tambin se puede
utilizar la funcin create_function() para crear funciones de llamadas de retorno
annimas. A partir de PHP 5.3.0 tambin es posible pasar una clausura a un
parmetro de una llamada de retorno.
Ejemplo #1 Ejemplos de funciones de llamadas de retorno
<?php

// Un ejemplo de funcin de llamada de retorno
function mi_funcin_de_llamada_de_retorno() {
echo 'hola mundo!';
}

// Un ejemplo de mtodo de llamada de retorno
class MiClase {
static function miMtodoDeLlamadaDeRetorno() {
echo 'Hola Mundo!';
}
}

// Tipo 1: Llamada de retorno simple
call_user_func('mi_funcin_de_llamada_de_retorno');

// Tipo 2: Llamada a un mtodo de clase esttico
call_user_func(array('MiClase', 'miMtodoDeLlamadaDeRetorno'));

// Tipo 3: Llamada al mtodo de un objeto
$obj = new MiClase();
call_user_func(array($obj, 'miMtodoDeLlamadaDeRetorno'));

// Tipo 4: Llamada a un mtodo de clase esttico (A partir de PHP 5.2.3)
call_user_func('MiClase::miMtodoDeLlamadaDeRetorno');



// Tipo 5: Llamada a un mtodo de clase esttico relativo (A partir de PHP 5.3.0
)
class A {
public static function quin() {
echo "A\n";
}
}

class B extends A {
public static function quin() {
echo "B\n";
}
}

call_user_func(array('B', 'parent::quin')); // 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 nmeros
$nmeros = range(1, 5);

// Usar la clausura como llamada de retorno para
// doblar el valor de cada elemento de nuestro
// rango
$nmeros_nuevos = array_map($doble, $nmeros);

print implode(' ', $nmeros_nuevos);
?>
El resultado del ejemplo sera:
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 ms
detalles, vase la Explicacin 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 llamarn si se produce una
excepcin en la funcin de retorno previa.


Pseudo tipos y variables usadas en esta documentacin
mixed
mixed indica que un parmetro puede aceptar mltiples tipos (pero no
necesariamente todos).
gettype(), por ejemplo, puede aceptar todos los tipos PHP, mientras
que str_replace() slo acepta strings y arrays.
number
number indica que un parmetro puede ser tanto un integer como un float.
Llamada de retorno
Los pseudo-tipos callback fueron usados en est documentacin antes de que la
sugerencia de tipo callable fuera introducida en PHP 5.4. Significan exactamente lo
mismo.
void
void como un tipo de variable de retorno significa que el valor de retorno no es
til. void en una lista de parmetros significa que la funcin no acepta ningn
parmetro.
...
$... en el prototipo de funciones significa and so on. Este nombre de variable se
usa cuando una funcin puede tomar un nmero infinito de argumentos.
Manipulacin de tipos
PHP no requiere (ni soporta) la definicin explicita de tipos en la declaracin 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 conversin de tipos automtica 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 entoncesinteger. Tenga en cuenta
que esto no implica que se cambien los tipos de los propios operandos; el nico
cambio es en como se evalan los operandos y en el tipo de expresin 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 pequeitos"; // $foo es integer (15)
$foo = 5 + "10 Cerdos pequeos"; // $foo es integer (15)
?>
Si considera confusos los ltimos dos ejemplos anteriores, consulte Conversin de
cadenas a nmeros.
Para forzar a que una variable sea evaluada como un determinado tipo, consulte la
seccin Forzado de tipos. Para cambiar el tipo de variable, consulte la
funcin settype().
Para probar cualquiera de los ejemplos de esta seccin, utilice la
funcin var_dump().
Nota:
El comportamiento de la conversin automtica 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 dearrays,
los siguientes ejemplos son vlidos 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 seccin Acceso a cadenas mediante caracteres para ms informacin.
Forzado de tipos
El forzado de tipos en PHP funciona de la misma manera que en C:, donde el
nombre del tipo deseado se escribe entre parntesis 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 estn permitidos:


(int), (integer) - forzado a integer
(bool), (boolean) - forzado a boolean
(float), (double), (real) - forzado a float
(string) - forzado a string
(array) - forzado a array
(object) - forzado a object
(unset) - forzado a NULL (PHP 5)
El forzado (binary) y el soporte del prefijo b fueron aadidos en PHP 5.2.1
Fjese que se permiten las tabulaciones y espacios dentro de los parntesis, 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 ms informacin, consulte estas secciones:
Conversin a booleano
Conversin a entero
Conversin a nmero de punto flotante
Conversin a cadena


Conversin a array
Conversin a objecto
Conversin a recurso
Conversin a NULL
Tablas de comparacin de tipos
Variables
Conceptos bsicos
En PHP las variables se representan con un signo de dlar seguido por el nombre
de la variable. El nombre de la variable es sensible a minsculas y maysculas.
Los nombres de variables siguen las mismas reglas que otras etiquetas en PHP. Un
nombre de variable vlido tiene que empezar con una letra o un carcter de
subrayado (underscore), seguido de cualquier nmero de letras, nmeros y
caracteres de subrayado. Como expresin regular se podra expresar como: '[a-
zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Nota: Para los propsitos 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.
Sugerencia
Vea tambin Guia de Entorno de Usuario para Nombres.
Para ms informacin 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'; // invlido; comienza con un nmero
$_4site = 'aun no'; // vlido; comienza con un carcter de subrayado
$tyte = 'mansikka'; // vlido; '' es ASCII (Extendido) 228
?>
De forma predeterminada, las variables siempre se asignan por valor. Esto
significa que cuando se asigna una expresin a una variable, el valor completo de
la expresin original se copia en la variable de destino. Esto quiere decir que, por
ejemplo, despus de asignar el valor de una variable a otra, los cambios que se
efecten a una de esas variables no afectar a la otra. Para ms informacin sobre
este tipo de asignacin, veaExpresiones.


PHP tambin 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 cdigo produce la salida 'Mi nombre es Bob'
dos veces:
<?php
$foo = 'Bob'; // Asigna el valor 'Bob' a $foo
$bar = &$foo; // Referenciar $foo va $bar.
$bar = "Mi nombre es $bar"; // Modifica $bar...
echo $bar;
echo $foo; // $foo tambin se modifica.
?>
Algo importante a tener en cuenta es que slo las variables con nombre pueden
ser asignadas por referencia.
<?php
$foo = 25;
$bar = &$foo; // Esta es una asignacin vlida.
$bar = &(24 * 7); // Invlida; referencia una expresin sin nombre.

function test()
{
return 25;
}

$bar = &test(); // Invlido.
?>
No es necesario inicializar variables en PHP, sin embargo, es una muy buena
prctica. 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 vaca y las matrices se convierten en un
array vaco.
Ejemplo #1 Valores predeterminados en variables sin inicializar
<?php
// Una variable no definida Y no referenciada (sin contexto de uso); imprime NUL
L
var_dump($variable_indefinida);

// Uso booleano; imprime 'false' (Vea operadores ternarios para ms informacin


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 problemtico
al incluir un archivo en otro que use el mismo nombre de variable. Tambin es un
importante riesgo de seguridad cuando la opcin register_globals se encuentra
habilitada. Un error de nivel E_NOTICE es emitido cuendo se trabaja con variables
sin inicializar, con la excepcin del caso en el que se anexan elementos a un array
no inicializado. La construccin del lenguaje isset() puede ser usada para detectar
si una variable ya ha sido inicializada.
Variables Predefinidas
PHP proporciona una gran cantidad de variables predefinidas a cualquier script que
se ejecute. Muchas de stas, sin embargo, no pueden ser completamente
documentadas ya que dependen del servidor que est corriendo, la versin y
configuracin de dicho servidor, y otros factores. Algunas de estas variables no
estarn disponibles cuando se ejecute PHP desde la lnea de comandos. Para
obtener una lista de estas variables, por favor vea la seccin sobre Variables
Predefinidas Reservadas.
Advertencia


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 ms informacin sobre este cambio, puede consultar el apartado de
configuracin sobre register_globals, el captulo 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 automticamente globales. Por
esta razn, son conocidas a menudo como "superglobales". Las superglobales se
mencionan ms abajo; sin embargo para una lista de sus contenidos y ms
informacin sobre variables predefinidas en PHP, por favor consulte la
seccin Variables predefinidas reservadas. Asimismo, podr notar cmo las
antiguas variables predefinidas ($HTTP_*_VARS) todava existen. A partir de PHP
5.0.0, los arrays de variables predefinidas de tipo long de PHP 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 mtodos de clase.
Nota:
An cuando las superglobales y HTTP_*_VARS pueden existir al mismo tiempo;
estas variables no son idnticas, as que modificar una no cambia la otra.
Si ciertas variables no son definidas en variables_order, las matrices PHP
predefinidas asociadas a estas, estarn vacas.
mbito de las variables
El mbito de una variable es el contexto dentro del que la variable est definida.
La mayor parte de las variables PHP slo tienen un mbito simple. Este mbito
simple tambin abarca los ficheros includos 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 funcin. Cualquier variable usada dentro de una funcin est, por
omisin, limitada al mbito local de la funcin. 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 versin local
de la variable $a, a la que no se ha asignado ningn valor en su mbito. Puede
que usted note que hay una pequea diferencia con el lenguaje C, en el que las
variables globales estn disponibles automticamente dentro de la funcin a
menos que sean expresamente sobreescritas por una definicin local. Esto puede
causar algunos problemas, ya que la gente puede cambiar variables globales
inadvertidamente. En PHP, las variables globales deben ser declaradas globales
dentro de la funcin si van a ser utilizadas dentro de dicha funcin.
La palabra clave global
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
funcin, todas las referencias a tales variables se referirn a la versin global. No
hay lmite al nmero de variables globales que se pueden manipular dentro de una
funcin.
Un segundo mtodo para acceder a las variables desde un mbito global es usando
el array $GLOBALS. 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 mayora 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 estn disponibles en cualquier mbito y no
// requieren 'global'. Las superglobales estn 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 funcin no es un error. Esta puede ser
utilizada an si el fichero est incluido desde el interior de una funcin.
Uso de variables static
Otra caracterstica importante del mbito de las variables es la variable esttica.
Una variable esttica existe slo en el mbito local de la funcin, pero no pierde su
valor cuando la ejecucin del programa abandona este mbito. Consideremos el
siguiente ejemplo:
Ejemplo #4 Ejemplo que demuestra la necesidad de variables estticas
<?php
function test()
{
$a = 0;
echo $a;
$a++;
}
?>
Esta funcin tiene poca utilidad ya que cada vez que es llamada asigna a $a el
valor 0 e imprime un 0. La sentencia $a++, que incrementa la variable, no sirve
para nada, ya que en cuanto la funcin finaliza, la variable $a desaparece. Para
hacer una funcin til para contar, que no pierda la pista del valor actual del
conteo, la variable $a debe declararse como esttica:
Ejemplo #5 Ejemplo del uso de variables estticas
<?php
function test()
{
static $a = 0;
echo $a;
$a++;
}
?>
Ahora, $a se inicializa nicamente en la primera llamada a la funcin, y cada vez
que la funcin test() es llamada, imprimir el valor de $a y lo incrementa.
Las variables estticas tambin proporcionan una forma de manejar funciones
recursivas. Una funcin recursiva es la que se llama a s misma. Se debe tener
cuidado al escribir una funcin recursiva, ya que puede ocurrir que se llame a s
misma indefinidamente. Hay que asegurarse de implementar una forma adecuada
de terminar la recursin. La siguiente funcin cuenta recursivamente hasta 10,
usando la variable esttica $countpara saber cundo parar:
Ejemplo #6 Variables estticas con funciones recursivas


<?php
function test()
{
static $count = 0;

$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
?>
Nota:
Las variables estticas 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 anlisis sintctico.
Ejemplo #7 Declaracin de variables estticas
<?php
function foo(){
static $int = 0; // correcto
static $int = 1+2; // incorrecto (ya que es una expresin)
static $int = sqrt(121); // incorrecto (es una expresin tambin)

$int++;
echo $int;
}
?>
Nota:
Las declaraciones estticas son resueltas en tiempo de compilacin.
Nota:
Utilizar una clave global fuera de una funcin no es un error. Esta pueda ser
utilizada an si el fichero est incluido en el interior de una funcin.
Referencias con variables global y static
El motor Zend 1, utilizado por PHP 4, implementa los
modificadores static y global para variables en trminos de referencias. Por
ejemplo, una variable global verdadera importada dentro del mbito de una
funcin 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 sera:

NULL
object(stdClass)(0) {
}
Un comportamiento similar se aplica a static. Las referencias no son almacenadas
estticamente.
<?php
function &obtener_instancia_ref() {
static $obj;

echo 'Objeto esttico: ';
var_dump($obj);
if (!isset($obj)) {
// Asignar una referencia a la variable esttica
$obj = &new stdclass;
}
$obj->property++;
return $obj;
}

function &obtener_instancia_no_ref() {
static $obj;

echo 'Objeto esttico: ';


var_dump($obj);
if (!isset($obj)) {
// Asignar el objeto a la variable esttica
$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 sera:

Objeto esttico: NULL
Objeto esttico: NULL

Objeto esttico: NULL
Objeto esttico: object(stdClass)(1) {
["property"]=>
int(1)
}
Este ejemplo demuestra que al asignar una referencia a una variable esttica, esta
no es recordada cuando se invoca la funcion&obtener_instancia_ref() por
segunda vez.
Variables variables
A veces es conveniente tener nombres de variables variables. Dicho de otro modo,
son nombres de variables que se pueden definir y usar dinmicamente. 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 dlar. Es decir:


<?php
$$a = 'mundo';
?>
En este momento se han definido y almacenado dos variables en el rbol de
smbolos de PHP: $a, que contiene "hola", y $hola, que contiene "mundo". Es ms,
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
ambigedad. Si se escribe $$a[1] el intrprete necesita saber si nos referimos a
utilizar $a[1] como una variable, o si se pretenda utilizar $$a como variable y el
ndice [1] como ndice de dicha variable. La sintaxis para resolver esta ambigedad
es: ${$a[1]} para el primer caso y ${$a}[1] para el segundo.
Tambin 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 segn donde se
hizo la llamada. Por ejemplo, en esta expresin $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 tambin es cierto si $bar es un acceso a un array.
Tambin 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 mltiples partes, o
cuando el nombre de la propiedad contiene caracteres que de otro modo no son
vlidos (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 sera:

Soy bar.
Soy bar.
Soy bar.
Soy r.
Soy B.
Advertencia
Por favor tenga en cuenta que las variables variables no pueden usarse con
las Matrices superglobales de PHP al interior de funciones o mtodos de clase. La
variable $this es tambin una variable especial que no puede ser referenciada
dinmicamente.
Variables Desde Fuentes Externas
Formularios HTML (GET y POST)
Cuando se enva un formulario a un script PHP, las variables de dicho formulario
pasan a estar automticamente disponibles en el script gracias a PHP. Por ejemplo,
consideremos el siguiente formulario:
Ejemplo #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 configuracin 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 mtodo no es recomendable.

echo $username;
?>
Usar un formulario GET es similar excepto en el uso de variables predefinidas, que
en este caso sern del tipo GET. GET tambin se usa conQUERY_STRING (la
informacin despues del smbolo '?' en una URL). Por
ejemplo http://www.example.com/test.php?id=3 contiene datos GET que
son accesibles con $_GET['id']. Vea
tambin $_REQUEST e import_request_variables().
Nota:
Las matrices superglobales, como $_POST y $_GET, estn 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 omisin
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 configuracin magic_quotes_gpc afecta a valores Get, Post y
Cookie. Si est activada (on), el valor (It's "PHP!") ser convertido
automticamente a (It\'s \"PHP!\"). Se consider que esto era necesario para el
escape de caracteres para su insercin en base de datos hace una dcada, pero
actualmente es una caracterstica obsoleta que debe ser desactivada. Ver
tambin addslashes(), stripslashes() ymagic_quotes_sybase.


PHP tambin entiende arrays en el contexto de variables de formularios (vea la faq
relacionada). Se puede, por ejemplo, agrupar juntas variables relacionadas o usar
esta caracterstica para obtener valores de una entrada "select" mltiple. Por
ejemplo, vamos a mandar un formulario a s mismo y a presentar los datos cuando
se reciban:
Ejemplo #3 Variables de formulario ms 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 Schwabenbru</option>
</select><br />
<input type="submit" value="enviarme!" />
</form>
Nombres de variables tipo IMAGE SUBMIT
Cuando se enva un formulario, es posible usar una imagen en vez del botn
estndar "submit":
<input type="image" src="image.gif" name="sub" />
Cuando el usuario hace click en cualquier parte de la imagen, el formulario que la
acompaa se transmitir al servidor con dos variables adicionales,sub_x y sub_y.
stas contienen las coordenadas del clic del usuario dentro de la imagen. Los ms
experimentados puede notar que los nombres de variable enviados por el
navegador contienen un guin en vez de un subrayado (guin bajo), pero PHP
convierte el guin en subrayado automticamente.
Cookies HTTP
PHP soporta cookies de HTTP de forma transparente tal y como estn 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 funcin setcookie(). Las cookies son parte de la cabecera HTTP,
as que se debe llamar a la funcin SetCookie antes de que se enve cualquier
salida al navegador. Es la misma restriccin que para la funcin header(). Los


datos de una cookie estn disponibles en el array con datos de cookies apropiada,
tal como $_COOKIE,$HTTP_COOKIE_VARS y tambin en $_REQUEST. Vea la
funcin setcookie() para ms detalles y ejemplos.
Si se quieren asignar mltiples 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 mltiples, considere el uso
de la funcin serialize() o explode() primero en el valor.
Ntese 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 aplicacin de carrito de compras se podra querer mantener un contador
e ir pasndolo. 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);
?>
Puntos en los nombres de variables de entrada
Tpicamente, 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 carcter vlido en el
nombre de una variable PHP. Para conocer la razn, considere el siguiente
ejemplo:
<?php
$varname.ext; /* nombre de variable invlido */
?>
Lo que el intrprete v es el nombre de una variable $varname, seguido por el
operador de concatenacin, y seguido por la cadena pura (es decir, una cadena sin
entrecomillar que no coincide con ninguna palabra clave o reservada conocida)
'ext'. Obviamente, no se pretenda que fuese ste el resultado.


Por esta razn, es importante hacer notar que PHP reemplazar automticamente
cualquier punto en los nombres de variables de entrada por guiones bajos
(subrayados).
Determinacin de los tipos de variables
Dado que PHP determina los tipos de las variables y los convierte (generalmente)
segn lo necesita, no siempre resulta obvio de qu tipo es una variable dada en 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
tambin el captulo sobre Tipos.
Constantes
Tabla de contenidos
Sintaxis
Constantes predefinidas
Una constante es un identificador (nombre) para expresar un valor simple. Como
el nombre sugiere, este valor no puede variar durante la ejecuccin del script. (A
excepcin de las constantes predefinidas, que en realidad no son constantes). Una
constante es sensible a maysculas por defecto. Por convencin, los identificadores
de contantes siempre suelen declararse en maysculas.
El nombre de una constante sigue las mismas reglas que cualquier otra etiqueta de
PHP. Un nombre de constante vlido empieza por una letra o subguin, seguido
por cualquier nmero o letras, nmeros o subguiones. Usando una expresin
regular, se representara de la siguiente manera:[a-zA-Z_\x7f-\xff][a-zA-Z0-
9_\x7f-\xff]*
Sugerencia
Vea tambin 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 vlido, pero debera ser evitado:
// Ya que quiz algn da PHP crea una constante mgica


// con el mismo nombre y en ese caso provocara un error en tu script
define("__FOO__", "something");

?>
Nota: Para nuestros propsitos, entenderemos como letra los carcteres 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 ms
informacin en el acceso, lea el manual en la seccin acceso a variables.
Sintaxis
Se puede definir una constante usando la funcin define() o tambin declarndola
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 ningn momento.
Solo se puede definir como constantes valores escalares
(boolean, integer, float y string). Se puede definir resource en constantes, pero
debera 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 $.
Tambin se puede usar la funcin constant() para leer el valor de una constante si
se desea obtener el valor de una constante de forma dinmica.
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 TRUE y $TRUEson diferentes.
Si se usa una constante que todava no est definida, PHP asume que se est
refiriendo al nombre de la constante en si, igual que si fuera unastring (CONSTANT
vs "CONSTANT"). Cuando esto suceda, se mostrar un error de nivel E_NOTICE.
Ver tambin la seccin 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 funcin defined().
Estas son las diferencias entre constantes y variables:
Las constantes no llevan el signo dlar ($), como prefijo.
Las constantes solo pueden ser definidas usando la funcin define(), y no
por simple asignacin.
Las constantes pueden ser definidas y accedidas desde cualquier sitio sin
importar las reglas de acceso de variables.
Las constantes no pueden ser redefinidas o eliminadas una vez se han
definido. Y
Las constantes solo deberan contener valores escalares.


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
aplicacin porque se definen en tiempo de ejecucin. Esto significa que no pueden
declararse dentro de funciones, loops o declaraciones if.
Constantes predefinidas
PHP ofrece un largo nmero de constantes predefinidas a cualquier script en
ejecuccin. Muchas de estas constantes, sin embargo, son creadas por diferentes
extensiones, y slo estarn presentes si dichas extensiones estn disponibles, bien
por carga dinmica 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 lnea que se use en el script. Estas
constantes especiales son sensibles a maysculas y son las siguientes:
Varias constantes PHP "mgicas"
Nombre Descripcin
__LINE__ Lnea 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 contena la ruta relativa segn las
circunstancias.


Varias constantes PHP "mgicas"
Nombre Descripcin
__DIR__
Directorio del fichero. Si se utiliza dentro de un include, devolver
el directorio del fichero includo. Esta constante es igual
quedirname(__FILE__). El nombre del directorio no lleva la barra
inicial a no ser que est en el directorio root. (Fue aadida en PHP
5.3.0)
__FUNCTION__
Nombre de la funcin. (Aadida en PHP 4.3.0) Desde PHP 5 esta
constante devuelve el nombre de la funcin donde fue declarada
(sensible a maysculas). En PHP 4 su valor siempre es en
minsculas.
__CLASS__
Nombre de la clase. (Aadida en PHP 4.3.0) Desde PHP 5 esta
constante devuelve el nombre de la clase donde fue declarada
(sensible a maysculas). En PHP 4 su valor siempre es en
minsculas. 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__ tambin funciona con traits. Cuando es usado en un
mtodo trait, __CLASS__ es el nombre de la clase del trait que est
siendo utilizado.
__TRAIT__
El nombre de el trait. (Aadido en PHP 5.4.0) A partir de PHP 5.4
esta constante devuelve el trait que fu declarado (sensible a
maysculas y minsculas). El nombre de el trait incluye el
namespace si alguno fu declarado en (p.e.j. Foo\Bar).
__METHOD__
Nombre del mtodo de la clase. (Aadida en PHP 5.0.0.) Nombre
del mtodo devuelto donde fue declarada. (sensible a maysculas).
__NAMESPACE__
Nombre del espacio de nombres actual (sensible a maysculas).
Esta constante se define en tiempo de compilacin (Aadida en PHP
5.3.0) El nombre del namespace actual (sensible a maysculas).
Vase tambin get_class(), get_object_vars(), file_exists() y function_exists().
Expresiones


La expresiones son las piedras de construccin ms importantes de PHP. En PHP
casi todo lo que se escribe es una expresin. La manera ms simple y acertada de
definir lo que es una expresin es "cualquier cosa que tiene un valor".
Las formas ms bsicas 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 expresin con el valor de 5 (en este caso, '5' es una
constante entera).
Despus de esta asignacin, se espera que el valor de $a sea 5 tambin, 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 tambin una expresin con el valor 5.
Si todo funciona bien, esto es exactamente lo que suceder.
Un ejemplo de expresiones algo ms complejo son las funciones. Por ejemplo,
considere la siguiente funcin:
<?php
function foo ()
{
return 5;
}
?>
Asumiendo que est familiarizado con el concepto de funcin (si no lo est, chele
una ojeada al captulo 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 quefoo() devuelve 5, el
valor de la expresin 'foo()' es 5. Normalmente las funciones no slo devuelven
un valor esttico, 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 ms pequeas, a diferencia de las matrices, por ejemplo).
PHP tambin 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 ms 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 expresin. Considere el ejemplo que ya hemos tratado, '$a = 5'. Es
fcil 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 tambin. Aunque la verdad es que
existe aqu un valor adicional involucrado, que es el valor de la asignacin misma.
La asignacin evala al valor asignado, en este caso 5. En la prctica, esto
significa que '$a = 5', sin importar lo que haga, es una expresin 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, tambin se puede escribir
'$b= $a = 5'.
Otro buen ejemplo de orientacin a expresiones es el pre- y post-incremento y
decremento. Los usuarios de PHP y de otros muchos lenguajes pueden estar
familiarizados con la notacin 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 idntico. La diferencia est
con el valor de la expresin de incremento. Pre-incremento, que se escribre
'++$variable', evala 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++' evala el valor original de $variable, antes de que sea
incrementado (PHP incrementa la variable despus de leer su valor, de ah el
nombre de 'post-incremento').
Un tipo de expresiones muy comunes son las expresiones de comparacin. Estas
expresiones evalan 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 tambin 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 combinacin de
expresiones operador-asignacin. Ya sabe que si quiere incrementar$a en 1, puede
simplemente escribir '$a++' o '++$a'. Pero si lo que quiere es aadirle ms de
uno, por ejemplo 3, podra escribir '$a++' varias veces, pero esto, obviamente, no
es una manera muy eficiente o cmoda. Una prctica mucho ms comn es
escribir '$a = $a + 3'. '$a + 3' evala al valor de $a ms 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 ms abreviada, lo que con el
tiempo se podra convertir en una forma ms clara y rpida de entenderlo. Aadir
3 al valor actual de $a puede ser escrito '$a += 3'. Esto significa exactamente
"toma el valor de $a, adele 3 y asgnalo de nuevo a $a". Adems de ser ms
corto y claro, tambin resulta en una ejecucin ms rpida. El valor de '$a += 3',
al igual que el valor de una asignacin normal, es el valor asignado. Observe que
NO es 3, sino el valor combinado de $a ms 3 (ste es el valor que es asignado
a $a). Se puede usar cualquier operador compuesto de dos partes en este modo
de operador-asignacin, por ejemplo '$a -= 5' (restar 5 del valor de $a), '$b *= 7'
(multiplicar el valor de $b por 7), etc.
Existe una expresin ms 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 subexpresin es TRUE (no es cero), se evala la segunda
subexpresin, y se ser el resultado de la expresin condicional. Si no, se evala
la tercera subexpresin, y se ser el valor.
El siguiente ejemplo debera 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 despus
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 asignacin (24) es
asignado despus a $h, y $h finaliza tambin con el
valor 24. */
?>
Algunas expresiones pueden considerarse como sentencias. En este caso, una
sentencia tiene la forma 'expr ;', es decir, una expresin seguida de un punto y
coma. En '$b = $a = 5;', '$a = 5' es una expresin vlida, pero no es una
sentencia en s. Sin embargo, '$b = $a = 5;' es una sentencia vlida.
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 especfico de la expresin, sino slo si el valor significa TRUE o FALSE.
Las constantes TRUE y FALSE (insensible a maysculas-minsculas) son los dos
valores booleanos posibles. Cuando es necesario, una expresin es convertida
automticamente al tipo boolean. Vase la seccin sobre conversin de tipos para
ms detalles.
PHP proporciona una implementacin completa y potente de expresiones, y
documentarla por completo va ms all del mbito de este manual. Los ejemplos
de arriba deberan darle una buena idea de lo que son las expresiones y cmo
construir expresiones tiles. Durante el resto de este manual se escribir expr para
indicar cualquier expresin de PHP vlida.



Operadores
Un operador es algo que toma uno ms valores (o expresiones, en jerga de
programacin) y produce otro valor (de modo que la construccin en si misma se
convierte en una expresin).
Los operadores se pueden agrupar de acuerdo con el nmero de valores que
toman. Los operadores unarios toman slo un valor, por ejemplo ! (eloperador
lgico de negacin) o ++ (el operador de incremento). Los operadores binarios
toman dos valores, como los familiares operadores aritmticos + (suma) y -
(resta), y la mayora de los operadores de PHP entran en esta categora.
Finalmente, hay slo un operador ternario, ? :, el cual toma tres valores;
usualmente a este se le refiere simplemente como "el operador ternario" (aunque
podra tal vez llamarse ms correctamente como el operador condicional).
Una lista completa de operadores de PHP sigue en la seccin Precedencia de
Operadores. La seccin tambin explica la precedencia y asociatividad de los
operadores, las cuales gobiernan exactamente cmo son evaluadas expresiones
que contienen varios diferentes operadores.
Precedencia de operadores
La precedencia de un operador indica qu tan "estrechamente" se unen dos
expresiones juntas. Por ejemplo, en la expresin 1 + 5 * 3 , la respuesta es 16 y
no 18 porque el operador de multiplicacin ("*") tiene una precedencia mayor que
el operador de adicin ("+"). Los parntesis pueden ser usados para forzar la
precedencia, si es necesario. Por ejemplo: (1 + 5) * 3 se evala como 18.
Cuando los operaadores tienen igual precedencia su asociatividad decide cmo se
agrupan. Por ejemplo "-" tiene asociatividad a izquierda, as 1 - 2 - 3 se agrupa
como (1 - 2) - 3 y se evala a -4. "=", por otra parte, tiene asociatividad a
derecha, as $a = $b = $c se agrupa como $a = ($b = $c).
Los operadores de igual predecencia que no son asociativos no pueden usarse
unos junto a otros, por ejemplo, 1 < 2 > 1 es ilegal en PHP. La expresin 1 <= 1
== 1, por otro lado, es legal, ya que el operador == tiene menos precedencia que
el operador <=.
El uso de parntesis, incluso cuando no es estrictamente necesario, a menudo
puede aumentar la legibilidad del cdigo haciendo grupos explcitamente en lugar
de confiar en la predencia y asociatividad implcitas del operador.
La siguiente tabla enumera los operadores en orden de precendencia, con los de
ms alta precedencia al inicio. Los operadores en la misma lnea tienen igual
precedencia, en cuyo caso la asociatividad decide el agrupamiento.
Precedencia de operadores


Asociatividad Operadores Informacin 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 ! lgico
izquierda * / % aritmtica
izquierda + - . aritmtica y string
izquierda << >> bit a bit
no asociativo < <= > >= comparacin
no asociativo == != === !== <> comparacin
izquierda & bit a bit y referencias
izquierda ^ bit a bit
izquierda | bit a bit
izquierda && lgico
izquierda || lgico
izquierda ? : ternario
derecha
= += -= *= /= .= %= &= |=
^= <<= >>= =>
asignacin


Precedencia de operadores
Asociatividad Operadores Informacin adicional
izquierda and lgico
izquierda xor lgico
izquierda or lgico
izquierda , muchos usos
Ejemplo #1 Asociatividad
<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
// la asociatividad del operador ternario difiere de C/C++
$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
?>
La precedencia y asociatividad de los operadores solamente determinan cmo se
agrupan las expresiones, no especifican un orden de evaluacin. PHP no especifica
(en general) el orden en que se evala una expresin y se debera evitar el cdigo
que se asume un orden especfico de evaluacin, ya que puede cambiar entre
versiones de PHP sin previo aviso.
Ejemplo #2 Orden de evaluacin no definido
<?php
$a = 1;
echo $a + $a++; // podra mostrar 2 o 3

$i = 1;
$array[$i] = $i++; // podra establecer el ndice a 1 o 2
?>
Nota:


Aunque = tiene una precedencia menor que la mayora de los dems operadores,
PHP aun permitir expresiones similares a lo siguiente: if (!$a = foo()), en cuyo
caso el valor devuelto de foo() es puesto en $a.
Operadores aritmticos
Recuerda la aritmtica bsica de la escuela? Estos funcionan igual que aquellos.
Operadores aritmticos
Ejemplo Nombre Resultado
-$a Negacin Opuesto de $a.
$a + $b Adicin Suma de $a y $b.
$a - $b Sustraccin Diferencia de $a y $b.
$a * $b Multiplicacin Producto de $a y $b.
$a / $b Divisin Cociente de $a y $b.
$a % $b Mdulo Resto de $a dividido por $b.
El operador de divisin ("/") devuelve un valor flotante a menos que los dos
operandos sean integers (o strings que se conviertan a integers) y los nmeros
sean divisibles, en cuyo caso ser devuelto un valor integer.
Los operandos del mdulo se convierten en integers (por extraccin de la parte
decimal) antes del procesamiento.
El resultado del operador mdulo % 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

?>


Operadores de asignacin
El operador bsico de asignacin es "=". Se podra 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 expresin de la derecha (es decir, "se define
como").
El valor de una expresin de asignacin 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 asignacin.
Adems del operador bsico de asignacin, existen "operadores combinados" para
todos los de aritmtica binaria, unin de arrays y operadores de strings que
permiten usar un valor en una expresin y entonces establecer su valor como el
resultado de esa expresin. 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!";

?>
Observe que la asignacin copia la variable original en la nueva (asignacin por
valor), por lo que los cambios en una no afectarn a la otra. Esto tambin puede
tener relevancia si se necesita copiar algo como un gran array dentro de un bucle
estrecho.
Una excepcin al comportamiento usual de la asignacin por valor en PHP ocurre
con objects los cuales son asignados por referencia en PHP 5. Los objetos pueden
ser explcitamente copiados por medio de la palabra clave clone.
Asignacin por referencia
La asignacin por referencia tambin est soportada, utilizando la sintaxis "$var =
&$othervar;". Asignacin por referencia significa que ambas variables terminan
apuntando a los mismos datos y nada es copiado en ninguna parte.


Ejemplo #1 Asignacin 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 tambin, dado que $b es una referencia para $a, la cu
al ha
// sido cambiada
?>
Desde PHP 5, el operador new retorna una referencia automticamente, as que
asignar el resultado de new por referencia, resulta en un mensajeE_DEPRECATED en
PHP 5.3 y posteriores y un mensaje E_STRICT en versiones anteriores.
Por ejemplo, ste cdigo resultar en una advertencia:
<?php
class C {}

/* La siguiente lnea genera el siguiente mensaje de error:
* Deprecated: Assigning the return value of new by reference is deprecated in..
.
*/
$o = &new C;
?>
Ms informacin sobre referencias y sus usos potenciales se puede encontrar en la
seccin del manual Referencias Explicadas
Operadores bit a bit
Los operadores bit a bit permiten la evaluacin y la manipulacin de bits
especficos dentro de un integer.
Operadores bit a bit
Ejemplo Nombre Resultado
$a & $b And (y)
Los bits que estn activos en


Operadores bit a bit
Ejemplo Nombre Resultado
ambos $a y $b son activados.
$a | $b Or (o inclusivo)
Los bits que estn activos ya sea en $a o
en $b son activados.
$a ^ $b Xor (o exclusivo)
Los bits que estn activos en $a o en $b,
pero no en ambos, son activados.
~ $a Not (no)
Los bits que estn activos en $a son
desactivados, y viceversa.
$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 aritmtico. 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 parntesis para garantizar la precedencia deseada. Por ejemplo, $a & $b
== true evala la equivalencia y luego el bit a bit, mientras que ($a & $b) ==
true evala el bit a bit y luego la equivalencia.
Sea consciente de las conversiones de tipos de datos. Si tanto los parmetros de la
izquierda como los de la derecha son cadenas, el operador bit a bit operar en los
valores ASCII de los caracteres.
La configuracin error_reporting del PHP ini utiliza valores de bit a
bit,
lo que ofrece una demostracin del mundo real de desactivar
bits. Para mostrar todos los errores, a excepcin 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 estn activados en slo el primer valor o
en el otro:
E_ALL ^ E_NOTICE

error_reporting tambin se puede utilizar para demostrar la activacin
de bits.
La forma para mostrar slo 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 seccin superior,
* es slo el formateado para hacer la salida ms 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 estn 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 sera:
--------- --------- -- ---------
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 estn 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 iz
quierdo');

$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
ms 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 izquierd
o');

$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
ms 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, incluye
ndo 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 sera:

--- 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 ms 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 ms 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 sera:

--- 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 ms 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 ms 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
Advertencia
No desplazar a la derecha ms de 32 bits en sistemas de 32 bits. No desplazar a la
izquierda en caso de que resulte en un nmero ms largo de 32 bits. Usar


funciones de la extensin gmp para manipulacin bit a bit sobre nmeros ms all
de PHP_INT_MAX.
Ver
tambin pack(), unpack(), gmp_and(), gmp_or(), gmp_xor(), gmp_testbit(), gmp
_clrbit()
Operadores de comparacin
Los operadores de comparacin, como su nombre lo indica, permiten comparar dos
valores. Puede tambin estar interesado en ver las tablas de comparacin de tipos,
ya que muestran ejemplos de las varias comparaciones relacionadas con tipos.
Operadores de comparacin
Ejemplo Nombre Resultado
$a == $b Igual
TRUE si $a es igual a $b despus de la manipulacin
de tipos.
$a ===
$b
Idntico TRUE si $a es igual a $b, y son del mismo tipo.
$a != $b Diferente
TRUE si $a no es igual a $b despus de la
manipulacin de tipos.
$a <> $b Diferente
TRUE si $a no es igual a $b despus de la
manipulacin de tipos.
$a !== $b No idntico
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
TRUE si $a es mayor o igual que $b.


Operadores de comparacin
Ejemplo Nombre Resultado
que
Si se compara un nmero con un string o la comparacin implica strings
numricos, entonces cada string es convertido en un nmero y la comparacin
realizada numricamente. Estas reglas tambin se aplican a la sentencia switch. La
conversin de tipo no tiene lugar cuando la comparacin 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 comparacin se realiza de acuerdo a la siguiente tabla (en
orden).
La comparacin con varios tipos
Tipo de operando 1 Tipo de operando 2 Resultado
null o string string
Convierte NULL en "",
comparacin numrica o
lxica
bool o null cualquiera
Convierte
en bool, FALSE < TRUE


La comparacin con varios tipos
Tipo de operando 1 Tipo de operando 2 Resultado
object object
Las clases internas pueden
definir su propia comparacin,
diferentes clases son
incomparables, la misma clase
- comparan propiedades en la
misma forma que los arrays
(PHP 4), PHP 5 tiene su
propia explicacin
string,resource onumber string,resource onumber
Traducir las cadenas y
recursos a nmeros,
matemtica 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 Transcripcin de la comparacin estndar de arrays
<?php
// Arrays son comparados de esta forma con los operadores de comparacin estnda
r
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 tambin strcasecmp(), strcmp(), operadores de array, y la seccin del manual
sobre tipos.
Advertencia
Comparacin de nmeros de punto flotante
Debido a la forma en que son representados internamente los floats, no se deben
probar por igualdad dos floats.
Ver la documentacin de float para ms informacin.
Operador ternario
Otro operador condicional es el operador "?:" (o ternario).
Ejemplo #2 Asignacin de un valor predeterminado
<?php
// Ejemplo de uso para: Operador Ternario
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];

// Lo anterior es idntico a esta sentencia if/else
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}

?>
La expresin (expr1) ? (expr2) : (expr3) evala a expr2 si expr1 se evala
como TRUE y a expr3 si expr1 se evala como FALSE.
A partir de PHP 5.3, es posible dejar de lado la parte media del operador ternario.
La expresin expr1 ?: expr3 retorna expr1 si expr1 se evala
como TRUE y expr3 si es de otra manera.


Nota: Por favor note que el operador ternario es una sentencia, y que no evala 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 funcin 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 ms 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 evalan de izquierda a derech
a

// la siguiente es una versin ms obvia del mismo cdigo anterior
echo ((true ? 'true' : false) ? 't' : 'f');

// aqu, se puede ver que la primera expresin es evaluada como 'true', que
// a su vez se evala como (bool)true, retornando as la rama verdadera de la
// segunda expresin ternaria.
?>
Operadores de control de errores
PHP soporta un operador de control de errores: el signo de arroba (@). Cuando se
antepone a una expresin en PHP, cualquier mensaje de error que pueden ser
generado por esa expresin ser ignorado.
Si se ha establecido una funcin controladora de errores personalizada
con set_error_handler() entonces todava 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 expresin 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 expresin, no solo con funciones:
$value = @$cache[$key];
// no producir una anotacin si el ndice $key no existe.

?>
Nota: El operador @ trabaja slo 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 funcin o
clase, ni a estructuras condicionales como if y foreach, y as sucesivamente.
Ver tambin error_reporting() y la seccin del manual sobre funciones de Manejo
de Errores y Registros.
Advertencia
En la actualidad, el operador de prefijo "@" para control de errores deshabilitar
incluso el reporte de errores en casos de fallos crticos que terminarn la ejecucin
del script. Entre otras cosas, esto quiere decir que si se usa "@" para eliminar los
errores de una cierta funcin y sta no se encuentra disponible o ha sido escrita de
forma incorrecta, el script se detendr en ese punto sin indicacin de por qu.
Operadores de ejecucin
PHP soporta un operador de ejecucin: 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 idntico 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 tambin la seccin del manual sobre funciones de ejecucin de
programas, popen() proc_open() y Usando PHP desde la lnea de comandos.
Operadores de incremento/decremento
PHP soporta operadores estilo C de pre- y post-incremento y decremento.
Nota: Los operadores de incremento/decremento solamente afectan a nmeros y
strings. Los arrays, objects y resources no se ven afectados. Decrementar
valores NULL tampoco tiene efecto, pero incrementarlos entonces resulta en 1.
Operadores de incremento/decremento
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 convencin de Perl cuando trabaja con operaciones aritmticas 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).
Ntese que las variables de caracteres pueden ser incrementadas pero no
decrementadas y aun as slo caracteres y dgitos de ASCII puro (a-z, A-Z y 0-9)
estn soportados. Incrementar o decrementar otras variables de caracteres no
tiene efecto, el string original no se modifica.
Ejemplo #1 Operaciones aritmticas sobre variables de caracteres
<?php
echo '== Letras ==' . PHP_EOL;
$s = 'W';
for ($n=0; $n<6; $n++) {
echo ++$s . PHP_EOL;
}
// Los caracteres de dgitos tienen un comportamiento diferente
echo '== Dgitos ==' . PHP_EOL;
$d = 'A8';
for ($n=0; $n<6; $n++) {
echo ++$d . PHP_EOL;
}
$d = 'A08';
for ($n=0; $n<6; $n++) {
echo ++$d . PHP_EOL;
}
?>
El resultado del ejemplo sera:
== Letras ==
X
Y
Z
AA
AB
AC
== Dgitos ==
A9
B0
B1
B2
B3
B4
A09
A10
A11
A12
A13


A14
Incrementar o decrementar booleanos no tiene efecto.
Operadores lgicos
Operadores lgicos
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 razn 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 lgicos ilustrados
<?php

// --------------------
// foo() nunca ser llamado ya que los operadores estn 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 expresin (false || true) es asignado a $e
// Acta como: ($e = (false || true))
$e = false || true;



// La constante false es asignada a $f y entonces true es ignorado
// Acta como: (($f = false) or true)
$f = false or true;

var_dump($e, $f);

// --------------------
// "&&" tiene una precedencia mayor que "and"

// El resultado de la expresin (true && false) es asignado a $g
// Acta como: ($g = (true && false))
$g = true && false;

// La constante true es asignada a $h y entonces false es ignorado
// Acta como: (($h = true) and false)
$h = true and false;

var_dump($g, $h);
?>
El resultado del ejemplo sera algo similar a:
bool(true)
bool(false)
bool(false)
bool(true)
Operadores para strings
Existen dos operadores para datos tipo string. El primero es el operador de
concatenacin ('.'), el cual retorna el resultado de concatenar sus argumentos
derecho e izquierdo. El segundo es el operador de asignacin sobre concatenacin
('.='), el cual aade el argumento del lado derecho al argumento en el lado
izquierdo. Por favor consulte Operadores de asignacin para ms informacin.
<?php
$a = "Hello ";
$b = $a . "World!"; // ahora $b contiene "Hello World!"

$a = "Hello ";
$a .= "World!"; // ahora $a contiene "Hello World!"
?>
Ver tambin las secciones del manual sobre el tipo string y las funciones de
strings.
Operadores para arrays
Operadores para arrays


Ejemplo Nombre Resultado
$a + $b Unin Unin 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 idntica a $b.
El operador + devuelve el array del lado derecho aadido al array del lado
izquierdo; para las claves que existan en ambos arrays, sern utilizados los
elementos del array de la izquierda y sern 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; // Unin de $a y $b
echo "Union of \$a and \$b: \n";
var_dump($c);

$c = $b + $a; // Unin de $b y $a
echo "Union of \$b and \$a: \n";
var_dump($c);
?>
Cuando sea ejecutado, este script producir la siguiente salida:
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 comparacin 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 tambin las secciones del manual sobre el tipo array y funciones de arrays.
Operadores de tipo
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 sera:
bool(true)
bool(false)


instanceof tambin 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 sera:
bool(true)
bool(true)
Para comprobar si un objeto no es una instancia de una clase, se puede usar
el operador lgico 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 sera:
bool(true)
Finalmente, instanceof tambin se puede utilizar para determinar si una variable
es un objeto instanciado de una clase que implementa unainterface:
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 sera:
bool(true)
bool(true)
Aunque instanceof se utiliza generalmente con un nombre de clase literal,
tambin 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 sera:
bool(true)
bool(true)
bool(false)
instanceof no lanza ningn 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 sera:
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 versin de PHP
5.1.0, instanceof llamara a __autoload() si el nombre de clase no exista.
Adems, si la clase no estaba cargada, un error fatal ocurrira. Esto se puede
solucionar mediante una referencia de clase dinmica o una variable string que
contenga el nombre de la clase:
Ejemplo #7 Evitando bsquedas 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 sera:
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 tambin get_class() y is_a().
Estructuras de Control
Introduccin
Todo script PHP est construido en base a una serie de sentencias. Una sentencia
puede ser una asignacin, una llamada de funcin, un ciclo, una sentencia
condicional o incluso una sentencia que no hace nada (una sentencia vaca). Las
sentencias generalmente finalizan con un punto y coma. Adicionalmente, las
sentencias pueden agruparse en un conjunto de sentencias, encapsulndolas entre


corchetes. Un grupo de sentencias es una sentencia por s misma tambin. Los
diferentes tipos de sentencias son descritos en este captulo
if
(PHP 4, PHP 5)
El constructor if es una de las caractersticas ms importantes de muchos
lenguajes, incluido PHP. Permite la ejecucin condicional de fragmentos de cdigo.
PHP dispone de una estructura if que es similar a la de C:
if (expr)
sentencia
Como se describe en la seccin sobre expresiones , la expresin es evaluada a su
valor booleano. Si la expresin se evala como TRUE, PHP ejecutar la sentencia y
si se evala como FALSE la ignorar. Ms informacin sobre qu valores evalan
como FALSE se puede encontrar en la seccin 'Convirtiendo a booleano'.
El siguiente ejemplo mostrara 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 ms de una sentencia para ser ejecutada
condicionalmente. Por supuesto, no hay necesidad de envolver cada sentencia con
una clusula if. En cambio, se pueden agrupar varias sentencias en un grupo de
sentencias. Por ejemplo, este cdigo mostrara a es mayor que b si $a es mayor
que $b y entonces asignara 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 ejecucin condicional de diferentes partes
del programa.
else
(PHP 4, PHP 5)


Con frecuencia se desea ejecutar una sentencia si una determinada condicin se
cumple y una sentencia diferente si la condicin no se cumple. Esto es para lo que
sirve else. El else extiende una sentencia if para ejecutar una sentencia en caso
que la expresin en la sentencia if se evale comoFALSE. Por ejemplo, el siguiente
cdigo 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";
}
?>
La sentencia else slo es ejecutada si la expresin if es evaluada como FALSE y si
hay algunas expresiones elseif - slo se ejecuta si tambin todas son evaluadas
como FALSE (ver elseif).
elseif/else if
(PHP 4, PHP 5)
elseif, como su nombre lo sugiere, es una combinacin de if y else. Del mismo
modo que else, extiende una sentencia if para ejecutar una sentencia diferente en
caso que la expresin if original se evale como FALSE. Sin embargo, a diferencia
de else, esa expresin alternativa slo se ejecutar si la expresin condicional
del elseif se evala como TRUE. Por ejemplo, el siguiente cdigo 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
expresin elseif (si hay alguna) que se evale como TRUE sera ejecutada. En PHP
tambin se puede escribir 'else if' (en dos palabras) y el comportamiento sera
idntico al de 'elseif' (en una sola palabra). El significado sintctico es ligeramente
diferente (si se est familiarizado con C, este es el mismo comportamiento) pero la
conclusin es que ambos resultaran tener exactamente el mismo comportamiento.


La sentencia elseif es ejecutada solamente si la expresin if precedente y
cualquiera de las expresiones elseif precedentes son evaluadas comoFALSE, y la
expresin elseif actual se evala como TRUE.
Nota: Tenga en cuenta que elseif y else if sern considerados exactamente
iguales slamente 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

/* Mtodo incorrecto: */
if($a > $b):
echo $a." es mayor que ".$b;
else if($a == $b): // No compilar
echo "La lnea anterior provoca un error del interprete.";
endif;


/* Mtodo correcto: */
if($a > $b):
echo $a." es mayor que ".$b;
elseif($a == $b): // Tenga en cuenta la combinacin de las palabras.
echo $a." igual ".$b;
else:
echo $a." no es ni mayor que ni igual a ".$b;
endif;

?>
Sintaxis alternativa de estructuras de control
(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 bsica 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 mostrara
solamente si $a es igual a 5.


La sintaxis alternativa tambin 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.
Vase tambin while, for e if para ms ejemplos.
while
(PHP 4, PHP 5)
Los bucles while son el tipo ms sencillo de bucle en PHP. Se comportan igual que
su contrapartida en C. La forma bsica de una sentencia whilees:
while (expr)
sentencia
El significado de una sentencia while es simple. Le dice a PHP que ejecute las
sentencias anidadas, tanto como la expresin while se evale comoTRUE. El valor
de la expresin es verificado cada vez al inicio del bucle, por lo que incluso si este
valor cambia durante la ejecucin de las sentencias anidadas, la ejecucin no se
detendr hasta el final de la iteracin (cada vez que PHP ejecuta las sentencias
contenidas en el bucle es una iteracin). A veces, si la expresin while se evala
como FALSE desde el principio, las sentencias anidadas no se ejecutarn 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 idnticos y ambos presentan los nmeros del 1 al 10:
<?php
/* ejemplo 1 */

$i = 1;
while ($i <= 10) {
echo $i++; /* el valor presentado sera
$i antes del incremento
(post-incremento) */
}

/* ejemplo 2 */

$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;
?>
do-while
(PHP 4, PHP 5)
Los bucles do-while son muy similares a los bucles while, excepto que la
expresin verdadera es verificada al final de cada iteracin en lugar que al
principio. La diferencia principal con los bucles while es que est garantizado que
corra la primera iteracin de un bucle do-while (la expresin verdadera slo es
verificada al final de la iteracin), mientras que no necesariamente va a correr con
un bucle while regular (la expresin verdadera es verificada al principio de cada
iteracin, si se evala como FALSE justo desde el comienzo, la ejecucin del bucle
terminara inmediatamente).
Hay una sola sintaxis para bucles do-while:
<?php
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
El bucle de arriba se ejecutara exactamente una sola vez, ya que despus de la
primera iteracin, cuando la expresin verdadera es verificada, se evala
como FALSE ($i no es mayor que 0) y termina la ejecucin del bucle.


Los usuarios avanzados de C pueden estar familiarizados con un uso distinto del
bucle do-while, para permitir parar la ejecucin en medio de los bloques de
cdigo, mediante el encapsulado con do-while (0), y utilizando la
sentencia break. El siguiente fragmento de cdigo 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 'caracterstica'. Desde PHP
5.3.0, es posible utilizar el operador goto en lugar de este hack.
for
(PHP 4, PHP 5)
Los bucles for son los ms complejos en PHP. Se comportan como sus homlogos
en C. La sintaxis de un bucle for es:
for (expr1; expr2; expr3)
sentencia
La primera expresin (expr1) es evaluada (ejecutada) una vez incondicionalmente
al comienzo del bucle.
En el comienzo de cada iteracin, se evala expr2. Si se evala como TRUE, el
bucle contina y se ejecutan la/sy sentencia/s anidada/s. Si se evala como FALSE,
finaliza la ejecucin del bucle.
Al final de cada iteracin, se evala (ejecuta) expr3.
Cada una de las expresiones puede estar vaca o contener mltiples 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 vaca


significa que el bucle debera ser corrido indefinidamente (PHP implcitamente lo
considera como TRUE, como en C). Esto puede no ser tan intil como se pudiera
pensar, ya que muchas veces se debe terminar el bucle usando una sentencia
condicional break en lugar de utilizar la expresin verdadera del for.
Considere los siguientes ejemplos. Todos ellos muestran los nmeros 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 quizs el cuarto), pero se
puede observar que la posibilidad de usar expresiones vacas en los
bucles for resulta til en muchas ocasiones.
PHP tambin admite la sintaxis alternativa de los dos puntos para bucles for.
for (expr1; expr2; expr3):
sentencia


...
endfor;
Es una cosa comn 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 cdigo anterior puede ser lento, debido a que el tamao del array se capta en
cada iteracin. Dado que el tamao nunca cambia, el bucle ser fcilmente
optimizado mediante el uso de una variable intermedia para almacenar el tamao
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);
}
?>
foreach
(PHP 4, PHP 5)
El constructor foreach proporciona un modo sencillo de iterar sobre
arrays. foreach funciona slo 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 (expresin_array as $valor)


sentencias
foreach (expresin_array as $clave => $valor)
sentencias
La primera forma recorre el array dado por expresin_array. En cada iteracin,
el valor del elemento actual se asigna a $valor y el puntero interno del array
avanza una posicin (as en la prxima iteracin se estar observando el siguiente
elemento).
La segunda forma adems asigna la clave del elemento actual a la
variable $clave en cada iteracin.
Tambin es posible personalizar la iteracin de objetos.
Nota:
Cuando foreach inicia su ejecucin, el puntero interno del array se pone
automticamente en el primer elemento del array. Esto significa que no es
necesario llamar la funcin 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 porreferencia.
<?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 slo es posible si el array iterado puede ser referenciado (es
decir, si es una variable). El siguiente cdigo no funcionar:
<?php
foreach (array(1, 2, 3, 4) as &$valor) {
$valor = $valor * 2;
}
?>
Advertencia
La referencia del $valor y el ltimo elemento del array permanecen an despus
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
idnticas:
<?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 tambin son funcionalmente idnticas:
<?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 ms para demostrar su uso:
<?php
/* Ejemplo 1 de foreach: slo 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 notacin de acceso manual impreso con fin
es ilustrativos) */

$a = array(1, 2, 3, 17);



$i = 0; /* slo 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 dinmicos */

foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>
Utilizando arrays anidados con list()
(PHP 5 >= 5.5.0)
PHP 5.5 aade 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 sera:
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 sern 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 sera:
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 sera:

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:
break
(PHP 4, PHP 5)
break termina la ejecucin de la estructura actual for, foreach, while, do-
while o switch.
break acepta un argumento numrico 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 tambin 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; /* Slo sale del switch. */
case 10:
echo "En 10; saliendo<br />\n";
break 2; /* Sale del switch y del while. */


default:
break;
}
}
?>
Registro de cambios para break
Versin Descripcin
5.4.0
break 0; ya no es vlido. 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 numrico.
continue
(PHP 4, PHP 5)
continue se utiliza dentro de las estructuras iterativas para saltar el resto de la
iteracin actual del bucle y continuar la ejecucin en la evaluacin de la condicin,
y luego comenzar la siguiente iteracin.
Nota: Tenga en cuenta que en PHP la sentencia switch se considera una
estructura iterativa para los propsitos de continue.
continue acepta un argumento numrico opcional, que indica a cuntos niveles de
bucles encerrados se ha de saltar al final. El valor por omisin es1, 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 despus del continue puede llevar a confusin. 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 esperara que el resultado fuera:
0
1
3
4
pero la salida de este script ser:
2
debido a que continue print "$i\n"; se evala completo como una sola
expresin, y as print se llama solamente cuando $i == 2 es verdadero. (El valor
de retorno de print es pasado a continue como el argumento numrico.)
Registro de cambios para continue
Versin Descripcin
5.4.0
continue 0; ya no es vlido. 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;


Registro de cambios para continue
Versin Descripcin
continue $num;) como el argumento numrico.
switch
(PHP 4, PHP 5)
La sentencia switch es similar a una serie de sentencias IF en la misma expresin.
En muchas ocasiones, es posible que se quiera comparar la misma variable (o
expresin) con muchos valores diferentes, y ejecutar una parte de cdigo distinta
dependiendo de a que valor es igual. Para esto es exactamente la
expresin switch.
Nota: Cabe sealar que a diferencia de algunos otros lenguajes, la
sentencia continue se aplica a switch y acta de manera similar a break. Si se
tiene un switch dentro de un bucle y se desea continuar a la siguiente iteracin 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 cmo la sentencia switch es ejecutada con el fin de evitar
errores. La sentencia switch ejecuta lnea por lnea (en realidad, sentencia por
sentencia). Al principio, ningn cdigo es ejecutado. Slo 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 contina 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 ejecutara todas las sentencias echo! Si $i es igual a 1,
PHP ejecutara las ltimas dos sentencias echo. Se obtendra el comportamiento
esperado (se mostrara 'i es igual a 2') slo 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 propsito bajo determinadas circunstancias).
En una sentencia switch, la condicin es evaluada slo una vez y el resultado es
comparado con cada una de las sentencias case. En una sentenciaelseif, la


condicin es evaluada otra vez. Si la condicin es ms complicada que una simple
comparacin y/o est en un bucle estrecho, un switchpuede ser ms rpido.
La lista de sentencias para un caso tambin puede estar vaca, 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 expresin case puede ser cualquier expresin que se evala como un tipo
simple, es decir, entero o nmeros 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 ms informacin, 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 despus de un caso
como:
<?php
switch($beer)
{
case 'tuborg';
case 'carlsberg';
case 'heineken';
echo 'Buena eleccin';
break;
default;
echo 'Por favor haga una nueva seleccin...';
break;
}
?>
declare
(PHP 4, PHP 5)
El constructor declare es usado para fijar directivas de ejecucin para un bloque
de cdigo. La sintaxis de declare es similar a la sintaxis de otros constructores de
control de flujo:
declare (directive)
statement
La seccin directive permite que el comportamiento de declare sea configurado.
Actualmente, slo dos directivas estn reconocidas: ticks (Ver abajo para ms
informacin sobre la directiva ticks) y encoding (Ver abajo para ms informacin
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 ejecucin puede depender de la directiva
fijada en el bloque directive.
El constructor declare tambin se puede utilizar en el alcance global, afectando a
todo el cdigo que le sigue (sin embargo, si el archivo con eldeclare 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
?>
Ticks
Un tick es un evento que ocurre para cada sentencia tickable N de bajo nivel
ejecutada por el intrprete dentro del bloque declare. El valor para Nse especifica
usando ticks=N dentro del bloque de declare de la seccin directive.
No todas las sentencias son tickable. Por lo general, expresiones de condicin 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 ms detalles. Tener en
cuenta que ms de un evento puede ocurrir por cada tick.
Ejemplo #1 Ejemplo de uso del tick
<?php

declare(ticks=1);

// Una funcin 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();

?>
Vase tambin register_tick_function() y unregister_tick_function().
Encoding
Una codificacin 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');
// cdigo aqu
?>
Precaucin
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 anlisis 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 tambin zend.script_encoding.
return
(PHP 4, PHP 5)
Si se llama desde una funcin, la sentencia return inmediatamente termina la
ejecucin de la funcin actual, y devuelve su argumento como el valor de la
llamada a la funcin. return tambin pondr fin a la ejecucin de una
sentencia eval() o a un archivo de script.
Si se llama desde el mbito global, entonces la ejecucin del script actual se
termina. Si el archivo script actual fue incluido o requerido con include orequire,
entonces el control es pasado de regreso al archivo que hizo el llamado. Adems,
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 ejecucin del
script. Si el archivo script actual fue nombrado por las opciones de
configuracin auto_prepend_file oauto_append_file en php.ini, entonces se
termina la ejecucin de ese archivo script.
Para ms informacin, ver Retornando valores.
Nota: Cabe sealar que dado que return es un constructor del lenguaje y no una
funcin, los parntesis que rodean su argumentos no son necesarios. Es comn no
utilizarlos, y en realidad se debera hacer as a fin de que PHP tenga menos trabajo
que hacer en este caso.
Nota: Si no se suministra un parmetro, entonces el parntesis debe omitirse
y NULL ser retornado. Llamadas a return con parntesis pero sin argumentos
resultarn en un error del intrprete.
Nota: Nunca se deben usar parntesis al rededor de la variable de retorno
cuando se retorna por referencia, ya que esto no funcionar. Slo 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 expresin ($a) (el cual es, por supuesto, el valor de $a).
require
(PHP 4, PHP 5)


require es idntico 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 slo emitir una advertencia (E_WARNING) lo cual permite continuar el
script.
Vase la documentacin de include para ms informacin.
include
(PHP 4, PHP 5)
La sentencia include incluye y evala el archivo especificado.
La siguiente documentacin tambin 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
elinclude_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 unerror 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 ms informacin sobre como PHP maneja la inclusin de archivos y la ruta de
accesos para incluir, ver la documentacin de include_path.
Cuando se incluye un archivo, el cdigo que contiene hereda el mbito de las
variables de la lnea en la cual ocurre la inclusin. Cualquier variable disponible en
esa lnea 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 bsico 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 inclusin ocurre al interior de una funcin dentro del archivo que hace el
llamado, entonces todo el cdigo contenido en el archivo llamado se comportar
como si hubiera sido definida dentro de esa funcin. Por lo tanto, seguir el mbito
de las variables de esa funcin. Una excepcin a esta regla son las constantes
mgicas las cuales son evaluadas por el intrprete antes que ocurra la inclusin.
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 intrprete abandona el modo PHP e ingresa al
modo HTML al comienzo del archivo objetivo y se reanuda de nuevo al final. Por
esta razn, cualquier cdigo al interior del archivo objetivo que deba ser ejecutado
como cdigo PHP, tendr que ser encerrado dentro de etiquetas vlidas de
comienzo y terminacin de PHP.
Si las "envolturas URL include" estn activadas en PHP, se puede especificar el
archivo a ser incluido usando una URL (va 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
cdigo PHP, las variables se pueden pasar al archivo incluido usando una string de


peticin 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.
Advertencia
Versiones de PHP para Windows anteriores a 4.3.0, no soportan el acceso remoto
a archivos para esta funcin, 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 arch
ivos
* .php y no archivos .txt. Adems, aqu 'Funciona' quiere decir que las variable
s
* $foo y $bar estn 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.

?>
Advertencia
Advertencia de seguridad
El archivo remoto puede ser procesado en el servidor remoto (dependiendo de la
extensin del archivo y del hecho de si el servidor remoto corre PHP o no) pero
aun as tiene que producir un script PHP vlido, 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 funcin para usar. De lo
contrario, debe tenerse especial cuidado para asegurar que el script remoto
produce un cdigo vlido y deseado.


Ver tambin Archivos remotos, fopen() y file() para informacin 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. Adems, es posible retornar valores desde los archivos
incluidos. Se puede tomar el valor de la llamada "include" de la misma forma como
se hara con una funcin normal. Esto no es, sin embargo, posible si se incluyen
archivos remotos, a menos que la salida del archivo remoto tenga unas etiquetas
vlidas de inicio y terminacin de PHP (igual que con cualquier archivo local). Se
pueden declarar las variables necesarias dentro de esas etiquetas y sern
introducidas en cualquiera sea el punto del archivo en el cual fue incluido.
Debido a que include es un constructor especial del lenguaje, los parntesis 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. Ntese 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 despus. 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
despus 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 automtica dentro de scripts, vase tambin
las opciones de configuracin auto_prepend_file andauto_append_file en php.ini.


Nota: Puesto que esto es una construccin del lenguaje y no una funcin, no
puede ser llamada usando funciones variables.
Ver
tambin require, require_once, include_once, get_included_files(), readfile(), virtu
al() y include_path.
require_once
(PHP 4, PHP 5)
La sentencia require_once es idntica 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 documentacin de include_once para informacin sobre el comportamiento
de _once, y como difiere de sus hermanos no _once.
include_once
(PHP 4, PHP 5)
La sentencia include_once incluye y evala el fichero especificado durante la
ejecucin del script. Es un comportamiento similar al de la sentenciainclude,
siendo la nica diferencia que si el cdigo del fichero ya ha sido incluido, no se
volver a incluir. Como su nombre lo indica, ser incluido slo una vez.
include_once puede ser usado en casos donde el mismo fichero podra ser
incluido y evaluado ms de una vez durante una ejecucin particular de un script,
as que en este caso, puede ayudar a evitar problemas como la redefinicin de
funciones, reasignacin de valores de variables, etc.
Ver la documentacin de include para informacin sobre como trabaja esta
funcin.
Nota:
Con PHP 4, la funcionalidad _once difiere entre sistemas operativos insensibles a
maysculas y minsculas (como Windows) as que por ejemplo:
Ejemplo #1 include_once con un SO insensible a maysculas y
minsculas en PHP 4
<?php
include_once "a.php"; // esto incluir a.php
include_once "A.php"; // esto incluir a.php otra vez! (slo 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.phpsea identificado igual
que C:\Program Files\a.php y el fichero sea incluido slo una vez.
goto
(PHP 5 >= 5.3.0)
El operador goto puede ser usado para saltar a otra seccin en el programa. El
punto de destino es especificado mediante una etiqueta seguida de dos puntos y la
instruccin 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 funcin o mtodo, 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 comn 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 sera:
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 sera:
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 sera:
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 lnea 2)
Nota:
El operador goto est disponible a partir de PHP 5.3.

Imagen cortesa de xkcd
Funciones definidas por el usuario
Una funcin puede ser definida usando una sintaxis como la siguiente:
Ejemplo #1 Pseudo cdigo para demostrar el uso de funciones
<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
echo "Funcin de ejemplo.\n";
return $valordevuelto;
}
?>
Cualquier cdigo PHP vlido puede aparecer dentro de una funcin, incluso otras
funciones y definiciones de clases.
Los nombres de las funciones siguen las mismas reglas que otras etiquetas de
PHP. Un nombre de funcin vlido comienza con una letra o guin bajo, seguido de


cualquier nmero de letras, nmeros, o guiones bajos. Como expresin regular se
expresara as: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Sugerencia
Vea tambin Guia de Entorno de Usuario para Nombres.
Las funciones no necesitan ser definidas antes de que se
referencien, excepto cuando una funcin est condicionalmente definida como se
muestra en los dos ejemplos de abajo.
Cuando una funcin 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 an,
pero podemos llamar a bar() */

bar();

if ($haceralgo) {
function foo()
{
echo "No existo hasta que la ejecucin 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 an 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 funcin 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 maysculas-minsculas, por
lo que es una buena idea llamar a las funciones tal y como aparecen en sus
declaraciones.
El nmero variable de argumentos y los argumentos predeterminados estn
soportados por las funciones. Vea tambin las referencias de funciones
para func_num_args(), func_get_arg(), y func_get_args() para ms informacin.
En PHP es posible llamar a funciones recursivas. Sin embargo, evite las llamadas a
funciones/mtodos recursivos con ms de 100-200 niveles de recursividad ya que
pueden agotar la pila y causar la terminacin del script actual.
Ejemplo #4 Funciones recursivas
<?php
function recursividad($a)
{
if ($a < 20) {
echo "$a\n";
recursividad($a + 1);
}
}
?>


Argumentos de funciones
La informacin 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 tambin estn soportadas, vea tambin las referencias de funciones
para func_num_args(), func_get_arg(), yfunc_get_args() para ms informacin.
Ejemplo #1 Pasar arrays a funciones
<?php
function tomar_array($entrada)
{
echo "$entrada[0] + $entrada[1] = ".$entrada[0]+$entrada[1];
}
?>
Hacer que los argumentos sean pasados por referencia
Por defecto, los argumentos de las funciones son pasados por valor (por lo que si
el valor del argumento dentro de la funcin se cambia, no se cambia fuera de la
funcin). Para permitir a una funcin modificar sus argumentos, stos deben
pasarse por referencia.
Para hacer que un argumento a una funcin sea siempre pasado por referencia
hay que poner delante del nombre del argumento el signo 'ampersand' (&) en la
definicin de la funcin:
Ejemplo #2 Pasar parmetros de una funcin por referencia
<?php
function aadir_algo(&$cadena)
{
$cadena .= 'y algo ms.';
}
$cad = 'Esto es una cadena, ';
aadir_algo($cad);
echo $cad; // imprime 'Esto es una cadena, y algo ms.'
?>
Valores de argumentos predeterminados
Una funcin puede definir valores predeterminados al estilo C++ para argumentos
escalares como sigue:
Ejemplo #3 Uso de parmetros 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 sera:
Hacer una taza de capuchino.
Hacer una taza de .
Hacer una taza de espresso.
PHP tambin 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 expresin constante, no (por ejemplo) una
variable, un miembro de una clase o una llamada a una funcin.
Observe que cuando se usan argumentos predeterminados, cualquiera de ellos
debera estar a la derecha de los argumentos no predeterminados; si no, las cosas
no funcionarn como se esperaba. Considere el siguiente trozo de cdigo:
Ejemplo #5 Uso incorrecto de argumentos predeterminados en una
funcin
<?php
function haceryogur($tipo = "acidfilo", $sabor)
{
return "Hacer un tazn de yogur $tipo de $sabor.\n";
}

echo haceryogur("frambuesa"); // no funcionar como se esperaba
?>
El resultado del ejemplo sera:


Warning: Missing argument 2 in call to haceryogur() in
/usr/local/etc/httpd/htdocs/phptest/functest.html on line 41
Hacer un tazn de yogur frambuesa de .
Ahora compare el ejemplo de arriba con este:
Ejemplo #6 Uso correcto de argumentos predeterminados en una
funcin
<?php
function haceryogur($sabor, $tipo = "acidfilo")
{
return "Hacer un tazn de yogur $tipo de $sabor.\n";
}

echo haceryogur("frambuesa"); // funciona como se esperaba
?>
El resultado del ejemplo sera:
Hacer un tazn de yogur acidfilo de frambuensa.
Nota: A partir de PHP 5, los argumentos que son pasados por referencia pueden
tener un valor predeterminado.
Listas de argumentos de longitud variable
PHP tiene soporte para listas de argumentos de longitud variable en funciones
definidas por el usuario. Esto realmente es bastante fcil 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 an puede ser
proporcionada explcitamente con definiciones de funciones, y se comportar con
normalidad.
Devolver valores
Los valores son devueltos usando la sentencia opcional return. Se puede devolver
cualquier tipo, incluidos arrays y objetos. Esto causa que la funcin finalice su
ejecucin inmediatamente y pase el control de nuevo a la lnea desde la que fue
llamada. Vase return para ms informacin.
Nota:
Si se omite return ser devuelto el valor NULL.
Ejemplo #1 Uso de return
<?php
function cuadrado($nm)
{


return $nm * $nm;
}
echo cuadrado(4); // imprime '16'.
?>
Una funcin no puede devolver mltiples valores, pero se pueden obtener
resultados similares devolviendo un array.
Ejemplo #2 Devolver un array para obtener mltiples valores
<?php
function nmeros_pequeos()
{
return array (0, 1, 2);
}
list ($cero, $uno, $dos) = nmeros_pequeos();
?>
Para devolver una referencia desde una funcin use el operador de referencia &,
en la declaracin de la funcin y cuando se asigne el valor devuelto a una variable:
Ejemplo #3 Devolver una referencia desde una funcin
<?php
function &devolver_referencia()
{
return $algunaref;
}

$nuevaref =& devolver_referencia();
?>
Para ms informacin sobre referencias, por favor, lea las Referencias Explicadas.
Funciones variables
PHP soporta el concepto de funciones variables. Esto significa que si un nombre de
variable tiene parntesis anexos a l, PHP buscar una funcin 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 funcionarn 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 funcin variable


<?php
function foo() {
echo "En foo()<br />\n";
}

function bar($arg = '')
{
echo "En bar(); el argumento era '$arg'.<br />\n";
}

// Esta es una funcin 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 mtodos de objetos tambin puede ser llamados con la sintaxis de funciones
variables.
Ejemplo #2 Ejemplo de mtodo variable
<?php
class Foo
{
function Variable()
{
$nombre = 'Bar';
$this->$nombre(); // Esto llama al mtodo Bar()
}

function Bar()
{
echo "Esto es Bar";
}
}

$foo = new Foo();
$nombrefunc = "Variable";
$foo->$nombrefunc(); // Esto llama a $foo->Variable()



?>
Cuando se llaman a mtodos estticos, la llamada a la funcin es ms fuerte que
el operador de propiedad static:
Ejemplo #3 Ejemplo de mtodo variable con propiedades estticas
<?php
class Foo
{
static $variable = 'propiedad esttica';
static function Variable()
{
echo 'Mtodo Variable llamado';
}
}

echo Foo::$variable; // Esto imprime 'propiedad esttica'. No necesita una $vari
able en este mbito.
$variable = "Variable";
Foo::$variable(); // Esto llama a $foo-
>Variable() leyendo $variable en este mbito.

?>
Vase tambin is_callable(), call_user_func(), variables
variables y function_exists().
Funciones internas (incluidas)
PHP se estandariza con muchas funciones y construcciones. Tambin existen
funciones que necesitan extensiones especficas de PHP compiladas, si no,
aparecern errores fatales "undefined function" ("funcin no definida"). Por
ejemplo, para usar las funciones de image tales comoimagecreatetruecolor(), PHP
debe ser compilado con soporte para GD. O para usar mysql_connect(), PHP debe
ser compilado con soporte paraMySQL. Hay muchas funciones de ncleo que est
incluidas en cada versin de PHP, tales como las funciones de string y de variable.
Una llamada aphpinfo() o get_loaded_extensions() mostrar las extensiones que
estn cargadas en PHP. Observe tambin que muchas extensiones estn
habilitadas por defecto y que el manual de PHP est dividido por extensiones.
Vase configuracin, instalacin, y captulos individuales de extensiones para ms
informacin sobre cmo configurar PHP.
Interpretar y comprender un prototipo de una funcin est explicado dentro de la
seccin del manual titulada cmo interpretar la definicin de una funcin. Es
importante comprender lo que devuelve una funcin o si una funcin funciona
directamente con un valor pasado. Por ejemplo,str_replace() devolver la cadena
modificada mientras que usort() funciona con la variable actual pasada. Cada


pgina del manual tambin tiene informacin especfica para cada funcin, como
informacin sobre parmetros de funciones, cambios de comportamiento, valores
devueltos en caso de xito o fallo, e informacin de disponibilidad. Conocer estas
importantes diferencias (a menudo imperceptibles) es crucial para escribir cdigo
de PHP correcto.
Nota: Si los parmetros dados a una funcin no son los que se esperaban, como
pasar un array donde se esperaba un string, el valor devuelto de la funcin ser
indefinido. En este caso lo ms probable es que devuelva NULL pero esto es slo
una convencin, y no se puede confiar en ello.
Vase tambin function_exists(), la referencia de
funciones, get_extension_funcs(), y dl().
Funciones annimas
Las funciones annimas, tambin conocidas como clausuras (closures), permiten
la creacin de funciones que no tienen un nombre especificado. Son ms tiles
como valor de los parmetros de llamadas de retorno, pero tienen muchos otros
usos.
Ejemplo #1 Ejemplo de funcin annima
<?php
echo preg_replace_callback('~-([a-z])~', function ($coincidencia) {
return strtoupper($coincidencia[1]);
}, 'hola-mundo');
// imprime holaMundo
?>
Las clausuras tambin se pueden usar como valores de variables; PHP
automticamente convierte tales expresiones en instancias de la clase
internaClosure. Se asume que una clausura a una variable usa la misma sintaxis
que cualquier otra asignacin, incluido el punto y coma final:
Ejemplo #2 Ejemplo de asignacin de variable de una funcin annima
<?php
$saludo = function($nombre)
{
printf("Hola %s\r\n", $nombre);
};

$saludo('Mundo');
$saludo('PHP');
?>
Las clausuras tambin pueden heredar variables del mbito padre. Cualquier
variable de estas debe ser declarada en la cabecera de la funcin. 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
funcin se est ejecutando. El mbito padre de una clausura es la funcin en la
que la clausura fue declarado (no necesariamente la funcin desde la que se
llam). Vea el siguiente ejemplo:
Ejemplo #3 Clausuras y mbito
<?php
// Un carro de compras bsico que contiene una lista de productos aadidos
// y la cantidad de cada producto. Incluye un mtodo que
// calcula el precio total de los artculos 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 aadir($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;

// Aadir algunos artculos al carro
$mi_carro->aadir('mantequilla', 1);
$mi_carro->aadir('leche', 3);
$mi_carro->aadir('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 annimas son implementadas usando la clase Closure.
Historial de cambios
Versin Descripcin
5.4.0 $this puede ser usado en funciones annimas.
5.3.0 Las funciones annimas se encuentran disponibles.
Notas
Nota: Es posible usar func_num_args(), func_get_arg(), y func_get_args() desde
dentro de una clausura.
Clases y Objetos
Introduccin
A partir de PHP 5, el modelo de objetos ha sido reescrito para permitir un mejor
rendimiento y con ms caractersticas. Este fue un cambio importante a partir de
PHP 4. PHP 5 tiene un modelo de objetos completo.
Entre las caractersticas de PHP 5 estn la inclusin de la visibilidad, las
clases abstractas y clases y mtodos finales, mtodos
mgicos adicionales,interfaces, clonacin 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
Sugerencia
Vea tambin Guia de Entorno de Usuario para Nombres.


Lo bsico
class
La definicin bsica 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 mtodos pertenecientes a la clase.
El nombre de clase puede ser cualquier etiqueta vlida que no sea una palabra
reservada de PHP. Un nombre vlido de clase comienza con una letra o un guin
bajo, seguido de la cantidad de letras, nmeros o guiones bajos que sea. Como
una expresin regular, se expresara 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 "mtodos").
Ejemplo #1 Definicin simple de una clase
<?php
class SimpleClass
{
// Declaracin de la propiedad
public $var = 'a default value';

// Declaracin del mtodo
public function displayVar() {
echo $this->var;
}
}
?>
La pseudo-variable $this est disponible cuando un mtodo es invocado dentro del
contexto de un objeto. $this es una referencia del objeto que invoca (usualmente
el objeto al que el mtodo pertenece, pero posiblemente sea otro objeto, si el
mtodo es llamado estticamente 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 lnea arrojar un Warning si E_STRICT est habilit
ada.
A::foo();
}
}

$a = new A();
$a->foo();

// Nota: la siguiente lnea arrojar un Warning si E_STRICT est habilitada.
A::foo();
$b = new B();
$b->bar();

// Nota: la siguiente lnea arrojar un Warning si E_STRICT est habilitada.
B::bar();
?>
El resultado del ejemplo sera:
$this est definida (A)
$this no est definida.
$this est definida (B)
$this no est definida.
new
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 unconstructor que arroje
una excepcin en caso de error. Las clases deberan ser definidas antes de la
instanciacin (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 Creacin de una instancia
<?php
$instance = new SimpleClass();

// Esto tambin 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 funcin. Una copia de un
objeto ya creado se puede lograr a travs de laclonacin de la misma.
Ejemplo #4 Asignacin 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 sera:
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 sera:
bool(true)
bool(true)
bool(true)
extends
Una clase puede heredar los mtodos y propiedades de otra clase al utilizar la
palabra clave extends en la declaracin de la clase. No es posible extender
mltiples clases; una clase slo puede heredar de una clase base.
Los mtodos y propiedades heredados pueden ser sobrescritos con la redeclaracin
de stos utilizando el mismo nombre que en la clase parent. Sin embargo, si la
clase parent defini un mtodo como final, ste no podr ser sobrescrito. Es
posible acceder a los mtodos sobrescritos o propiedades estticas
referencindolos con parent::.
Cuando se sobrescriben mtodos, la cantidad y disposicin de los parmetros
debera ser la misma o PHP generar un error a nivel de E_STRICT. Esto no se aplica
a los constructores, que permiten la sobrescritura con diferentes parmetros.
Ejemplo #6 Herencia simple de clases
<?php
class ExtendClass extends SimpleClass
{
// Redefinicin del mtodo parent
function displayVar()
{
echo "Clase extendida\n";
parent::displayVar();
}
}

$extended = new ExtendClass();
$extended->displayVar();
?>


El resultado del ejemplo sera:
Clase extendida
un valor por defecto
::class
Desde PHP 5.5, la palabra clave class tambin se usa para la resolucin de
nombres de clases. Se puede obtener un string con un nombre completamente
cualificado de la clase NombreClase usando NombreClase::class. Esto es
particularmete til con clases con espacios de nombres.
Ejemplo #7 Resolucin de nombres de clases
<?php
namespace NS {
class NombreClase {
}

echo NombreClase::class;
}
?>
El resultado del ejemplo sera:
NS\NombreClase
Propiedades
Las variables pertenecientes a clases se llaman "propiedades". Tambin se les
puede llamar usando otros trminos como "atributos" o "campos", pero para los
propsitos de esta referencia se va a utilizar "propiedades". stas se definen
usando una de las palabras clave public, protected, oprivate, seguido de una
declaracin normal de variable. Esta declaracin puede incluir una inicializacin,
pero esta inicializacin debe ser un valor constante, es decir, debe poder ser
evaluada en tiempo de compilacin y no debe depender de informacin en tiempo
de ejecucin para ser evaluada.
Vase Visibilidad para ms informacin sobre el significado de public, protected,
y private.
Nota:
Con el fin de mantener la compatibilidad con PHP 4, PHP 5 continuar aceptando el
uso de la palabra clave var en la declaracin de propiedades en lugar de (o
adems de) public, protected, o private. Sin embargo, var ya no es necesaria.
Entre las versiones 5.0 y 5.1.3 de PHP, el uso de var fue considerado obsoleto y
emita una advertencia de nivel E_STRICT, pero a partir de PHP 5.1.3 ya no est
obsoleta y no emitir la advertencia.
Si se declara una propiedad utilizando var en lugar de public, protected,
o private, PHP tratar dicha propiedad como si hubiera sido definida como public.


Dentro de los mtodos de una clase, las propiedades no estticas pueden ser
accedidas utilizando -> (el operador de objeto): $this-
>propiedad(donde propiedad es el nombre de la propiedad). Las propiedades
estticas pueden ser accedidas utilizando ::: self::$propiedad. Vase la palabra
clave 'static' para ms informacin sobre la diferencia entre propiedades estticas
y no estticas.
La pseudo-variable $this est disponible dentro de cualquier mtodo de clase
cuando ste es invocado dentro del contexto de un objeto. $this es una referencia
al objeto que se invoca (usualmente el objeto al que pertenece el mtodo, pero
posiblemente sea otro objeto, si el mtodo es llamado estticamente desde el
contexto de un objeto secundario).
Ejemplo #1 Declaracin de propiedades
<?php
class ClaseSencilla
{
// Declaraciones de propiedades invlidas:
public $var1 = 'hola ' . 'mundo';
public $var2 = <<<EOD
hola mundo
EOD;
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
public $var5 = $myVar;

// Declaraciones de propiedades vlidas:
public $var6 = myConstant;
public $var7 = array(true, false);

// Esto se permite slo en PHP 5.3.0 y posteriores.
public $var8 = <<<'EOD'
hola mundo
EOD;
}
?>
Nota:
Existen varias funciones interesantes para manipular clases y objetos. Quiz pueda
ser interesante echar un vistazo a las Funciones de clases/objetos.
A diferencia de heredocs, nowdocs puede ser utilizado en cualquier contexto de
datos estticos, incluyendo la declaracin de propiedades.
Ejemplo #2 Ejemplo del uso de nowdoc para inicializar una propiedad
<?php
class foo {


// A partir de PHP 5.3.0
public $bar = <<<'EOT'
bar
EOT;
}
?>
Nota:
El soporte para nowdoc fue agregado en PHP 5.3.0.
Autocarga de clases
Muchos desarrolladores que escriben aplicaciones orientadas a objetos crean un
fichero fuente PHP para cada definicin de clase. Una de las mayores molestias es
tener que hacer una larga lista de includes al comienzo de cada script (uno por
cada clase).
En PHP 5 esto ya no es necesario. Se puede definir una funcin __autoload() que
es automticamente invocada en caso de que se est intentando utilizar una
clase/interfaz que todava no haya sido definida. Al invocar a esta funcin el motor
de scripting da una ltima oportunidad para cargar la clase antes que PHP falle con
un error.
Sugerencia
spl_autoload_register() proporciona una alternativa ms flexible para la carga
automtica de clases. Por esta razn, el uso de__autoload() no se recomienda y
puede quedar obsoleta o ser eliminada en el futuro.
Nota:
Antes de 5.3.0, las excepciones lanzadas en la funcin __autoload no podan ser
capturadas en el bloque catch y resultaba en un error fatal. Desde 5.3.0+ las
excepciones lanzadas en la funcin __autoload pueden ser capturadas en el
bloque catch, con una consideracin. Si se lanza una excepcin personalizada, la
clase de dicha excepcin debe estar disponible. La funcin __autoload puede
usarse recursivamente para autocargar la clase de la excepcin personalizada.
Nota:
La autocarga no est disponible si se utiliza PHP en el modo interactivo CLI.
Nota:
Si el nombre de la clase se utiliza, por ejemplo, en call_user_func(), puede
contener algunos caracteres peligrosos tales como ../. Se recomienda no utilizar la


entrada del usuario en tales funciones, o al menos verificar dicha entrada
en __autoload().
Ejemplo #1 Ejemplo de autocarga
Este ejemplo intenta cargar las clases MiClase1 y MiClase2 desde los
ficheros MiClase1.php y MiClase2.php respectivamente.
<?php
function __autoload($nombre_clase) {
include $nombre_clase . '.php';
}

$obj = new MiClase1();
$obj2 = new MiClase2();
?>
Ejemplo #2 Otro ejemplo de autocarga
Este ejemplo intenta cargar la interfaz ITest.
<?php

function __autoload($nombre) {
var_dump($nombre);
}

class Foo implements ITest {
}

/*
string(5) "ITest"

Fatal error: Interface 'ITest' not found in ...
*/
?>
Ejemplo #3 Autocarga con manejo de excepciones para 5.3.0+
Este ejemplo lanza una excepcin y demuestra los bloques try/catch.
<?php
function __autoload($nombre) {
echo "Intentando cargar $nombre.\n";
throw new Exception("Imposible cargar $nombre.");
}

try {
$obj = new ClaseNoCargable();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>


El resultado del ejemplo sera:
Intentando cargar ClaseNoCargable.
Imposible cargar ClaseNoCargable.
Ejemplo #4 Autocarga con manejo de excepciones para 5.3.0+ -
Excepcin personalizada ausente
Este ejemplo lanza una excepcin para una excepcin personalizada no cargable.
<?php
function __autoload($nombre) {
echo "Intentando cargar $nombre.\n";
throw new ExcepcinAusente("Imposible cargar $nombre.");
}

try {
$obj = new ClaseNoCargable();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
El resultado del ejemplo sera:
Intentando cargar ClaseNoCargable.
Intentando cargar ExcepcinAusente.

Fatal error: Class 'ExcepcinAusente' not found in testExcepcionAusente.php on
line 4
Ver tambin
unserialize()
unserialize_callback_func
spl_autoload()
spl_autoload_register()
Constructores y destructores
Constructor
void __construct ([ mixed $args [, $... ]] )
PHP 5 permite a los desarrolladores declarar mtodos constructores para las
clases. Aquellas que tengan un mtodo constructor lo invocarn en cada nuevo
objeto creado, lo que lo hace idneo para cualquier inicializacin que el objeto
pueda necesitar antes de ser usado.
Nota: Constructores parent no son llamados implcitamente si la clase child define
un constructor. Para ejecutar un constructor parent, se requiere invocar
a parent::__construct() desde el constructor child. Si el child no define un
constructor, entonces se puede heredar de la clase padre como un mtodo de
clase normal (si no fue declarada como privada).


Ejemplo #1 Utilizacin de nuevos constructores unificados
<?php
class BaseClass {
function __construct() {
print "En el constructor BaseClass\n";
}
}

class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "En el constructor SubClass\n";
}
}

class OtherSubClass extends BaseClass {
// heredando el constructor BaseClass
}

// En el constructor BaseClass
$obj = new BaseClass();

// En el constructor BaseClass
// En el constructor SubClass
$obj = new SubClass();

// In BaseClass constructor
$obj = new OtherSubClass();
?>
Por motivos de compatibilidad, si PHP 5 no puede encontrar una
funcin __construct() para una determinada clase y la clase no hered uno de una
clase padre, buscar el viejo estilo de la funcin constructora, mediante el nombre
de la clase. Efectivamente, esto significa que en el nico caso en el que se tendra
compatibilidad es si la clase tiene un mtodo llamado __construct() que fuese
utilizado para diferentes propsitos.
A diferencia con otros mtodos, PHP no generar un mensaje de error a nivel
de E_STRICT cuando __construct() es sobrescrito con diferentes parmetros que los
mtodos padre __construct() tienen.
A partir de PHP 5.3.3, los mtodos con el mismo nombre que el ltimo elemento
de una clase en un nombre de espacios no sern ms tratados como un
constructor. Este cambio no afecta a clases sin espacio de nombres.
Ejemplo #2 Constructores en clases pertenecientes a un nombre de
espacios


<?php
namespace Foo;
class Bar {
public function Bar() {
// Tratado como constructor en PHP 5.3.0 - 5.3.2
// Tratado como mtodo regular a partir de PHP 5.3.3
}
}
?>
Destructor
void __destruct ( void )
PHP 5 introduce un concepto de destructor similar al de otros lenguajes orientados
a objetos, tal como C++. El mtodo destructor ser llamado tan pronto como no
hayan otras referencias a un objeto determinado, o en cualquier otra circunstancia
de finalizacin.
Ejemplo #3 Ejemplo de Destructor
<?php
class MyDestructableClass {
function __construct() {
print "En el constructor\n";
$this->name = "MyDestructableClass";
}

function __destruct() {
print "Destruyendo " . $this->name . "\n";
}
}

$obj = new MyDestructableClass();
?>
Como los constructores, los destructores padre no sern llamados implcitamente
por el motor. Para ejecutar un destructor padre, se deber llamar explcitamente
a parent::__destruct() en el interior del destructor. Tambin como los
constructores, una clase child puede heredar el destructor de los padres si no
implementa uno propio.
El destructor ser invocado an si la ejecucin del script es detenida usando exit().
Llamar a exit() en un destructor evitar que se ejecuten las rutinas restantes de
finalizacin.
Nota:


Los destructores invocados durante la finalizacin del script tienen los headers
HTTP ya enviados. El directorio de trabajo en la fase de finalizacin del script
puede ser diferente con algunos SAPIs (por ej., Apache).
Nota:
Intentar lanzar una excepcin desde un destructor (invocado en la finalizacin del
script) causa un error fatal.
Visibilidad
La visibilidad de una propiedad o mtodo se puede definir anteponiendo una de las
palabras claves public, protected o private en la declaracin. Miembros de
clases declarados como public pueden ser accedidos de cualquier lado. Miembros
declarados como protected, slo de la clase misma, por herencia y clases parent.
Aquellos definidos como private, nicamentede la clase que los defini.
Visibilidad de Propiedades
Las propiedades de clases deben ser definidas como public, private, o protected. Si
se declaran usando var, sern definidas como public.
Ejemplo #1 Declaracin de propiedades
<?php
/**
* Definicin de MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';

function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}

$obj = new MyClass();
echo $obj->public; // Funciona
echo $obj->protected; // Error Fatal
echo $obj->private; // Error Fatal
$obj->printHello(); // Muestra Public, Protected y Private




/**
* Definicin de MyClass2
*/
class MyClass2 extends MyClass
{
// Se puede redeclarar los mtodos public y protected, pero no el private
protected $protected = 'Protected2';

function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}

$obj2 = new MyClass2();
echo $obj2->public; // Funciona
echo $obj2->private; // Undefined
echo $obj2->protected; // Error Fatal
$obj2->printHello(); // Muestra Public, Protected2, Undefined

?>
Nota: La forma de declaracin de una variable de PHP 4 con la palabra
clave var todava es soportado (como un sinnimo de public) por razones de
compatibilidad. En PHP 5 antes de 5.1.3, su uso genera un Warning E_STRICT.
Visibilidad de Mtodos
Los mtodos de clases pueden ser definidos como public, private, o protected.
Aquellos declarados sin ninguna palabra clave de visibilidad explcita sern
definidos como public.
Ejemplo #2 Declaracin de mtodos
<?php
/**
* Definicin de MyClass
*/
class MyClass
{
// Declaracin de un constructor public
public function __construct() { }

// Declaracin de un mtodo public
public function MyPublic() { }

// Declaracin de un mtodo protected


protected function MyProtected() { }

// Declaracin de un mtodo private
private function MyPrivate() { }

// Esto es public
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}

$myclass = new MyClass;
$myclass->MyPublic(); // Funciona
$myclass->MyProtected(); // Error Fatal
$myclass->MyPrivate(); // Error Fatal
$myclass->Foo(); // Public, Protected y Private funcionan


/**
* Definicin de MyClass2
*/
class MyClass2 extends MyClass
{
// Esto es public
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // Error Fatal
}
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); // Funciona
$myclass2->Foo2(); // Public y Protected funcionan, pero Private no

class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}

public function testPublic() {
echo "Bar::testPublic\n";


}

private function testPrivate() {
echo "Bar::testPrivate\n";
}
}

class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}

private function testPrivate() {
echo "Foo::testPrivate\n";
}
}

$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>
Visibilidad desde otros objetos
Los objetos del mismo tipo tendrn acceso a los miembros private y protected
entre ellos aunque no sean de la misma instancia. Esto es porque los detalles
especficos de implementacin ya se conocen cuando se encuentra dentro de estos
objetos.
Ejemplo #3 Accediendo a miembros private del mismo tipo de objeto
<?php
class Test
{
private $foo;

public function __construct($foo)
{
$this->foo = $foo;
}

private function bar()
{
echo 'Mtodo private accedido.';
}

public function baz(Test $other)
{


// Se puede cambiar la propiedad private:
$other->foo = 'hola';
var_dump($other->foo);

// Tambin se puede invocar al mtodo private:
$other->bar();
}
}

$test = new Test('test');

$test->baz(new Test('other'));
?>
El resultado del ejemplo sera:
string(5) "hola"
Mtodo private accedido.
Herencia de Objetos
La herencia es un principio de programacin bien establecido y PHP hace uso de l
en su modelado de objetos. Este principio afectar la manera en que muchas
clases y objetos se relacionan unas con otras.
Por ejemplo, cuando se extiende una clase, la subclase hereda todos los mtodos
pblicos y protegidos de la clase padre. A menos que una clase sobrescriba esos
mtodos, mantendrn su funcionalidad original.
Esto es til para la definicin y abstraccin de la funcionalidad y permite la
implementacin de funcionalidad adicional en objetos similares sin la necesidad de
reimplementar toda la funcionalidad compartida.
Nota:
A menos que la carga automtica sea utilizada, entonces las clases deben ser
definidas antes de ser usadas. Si una clase se extiende a otra, entonces la clase
padre debe ser declarada antes de la estructura de clase hija. Esta regla se aplica
a las clases que heredan de otras clases e interfaces.
Ejemplo #1 Ejemplo de herencia
<?php

class foo
{
public function printItem($string)
{
echo 'Foo: ' . $string . PHP_EOL;
}



public function printPHP()
{
echo 'PHP is great.' . PHP_EOL;
}
}

class bar extends foo
{
public function printItem($string)
{
echo 'Bar: ' . $string . PHP_EOL;
}
}

$foo = new foo();
$bar = new bar();
$foo->printItem('baz'); // Salida: 'Foo: baz'
$foo->printPHP(); // Salida: 'PHP is great'
$bar->printItem('baz'); // Salida: 'Bar: baz'
$bar->printPHP(); // Salida: 'PHP is great'

?>
Operador de Resolucin de mbito (::)
El Operador de Resolucin de mbito (tambin denominado Paamayim
Nekudotayim) o en trminos simples, el doble dos-puntos, es un token que
permite acceder a elementos estticos, constantes, y sobrescribir propiedades o
mtodos de una clase.
Cuando se hace referencia a estos items desde el exterior de la definicin de la
clase, se utiliza el nombre de la clase.
A partir de PHP 5.3.0, es posible hacer referencia a una clase usando una variable.
El valor de la variable no puede ser una palabra clave (por
ej.,self, parent y static).
Paamayim Nekudotayim podra, en un principio, parecer una extraa eleccin para
bautizar a un doble dos-puntos. Sin embargo, mientras se escriba el Zend Engine
0.5 (que utiliz PHP 3), asi es como el equipo Zend decidi bautizarlo. En realidad,
significa doble dos-puntos - en Hebreo!
Ejemplo #1 :: desde el exterior de la definicin de la clase
<?php
class MyClass {
const CONST_VALUE = 'Un valor constante';
}



$classname = 'MyClass';
echo $classname::CONST_VALUE; // A partir de PHP 5.3.0

echo MyClass::CONST_VALUE;
?>
Las tres palabras claves especiales self, parent y static son utilizadas para acceder
a propiedades y mtodos desde el interior de la definicin de la clase.
Ejemplo #2 :: desde el interior de la definicin de la clase
<?php
class OtherClass extends MyClass
{
public static $my_static = 'variable esttica';

public static function doubleColon() {
echo parent::CONST_VALUE . "\n";
echo self::$my_static . "\n";
}
}

$classname = 'OtherClass';
echo $classname::doubleColon(); // A partir de PHP 5.3.0

OtherClass::doubleColon();
?>
Cuando una clase extendida sobrescribe la definicin parent de un mtodo, PHP no
invocar al mtodo parent. Depende de la clase extendida el hecho de llamar o no
al mtodo parent. Esto tambin se aplica a definiciones de mtodos Constructores
y Destructores, Sobrecarga, y Mgicos.
Ejemplo #3 Invocando a un mtodo parent
<?php
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}

class OtherClass extends MyClass
{
// Sobrescritura de definicin parent
public function myFunc()
{
// Pero todava se puede llamar a la funcin parent
parent::myFunc();


echo "OtherClass::myFunc()\n";
}
}

$class = new OtherClass();
$class->myFunc();
?>
Vase tambin algunos ejemplos de trucos de llamadas estticas .
La palabra clave 'static'
Sugerencia
Esta pgina describe el uso de la palabra clave static para definir mtodos y
propiedades estticos. static tambin se puede usar para definir variables
estticas y para enlaces estticos en tiempo de ejecucin. Por favor, consulte estas
pginas para ms informacin sobre estos sifnificados de static.
Declarar propiedades o mtodos de clases como estticos los hacen accesibles sin
la necesidad de instanciar la clase. Una propiedad declarada como static no puede
ser accedida con un objeto de clase instanciado (aunque un mtodo esttico s lo
puede hacer).
Por motivos de compatibilidad con PHP 4, si no se utiliza ninguna declaracin
de visibilidad, se tratar a las propiedades o mtodos como si hubiesen sido
definidos como public.
Debido a que los mtodos estticos se pueden invocar sin tener creada una
instancia del objeto, la pseudo-variable $this no est disponible dentro de los
mtodos declarados como estticos.
Las propiedades estticas no pueden ser accedidas a travs del objeto utilizando el
operador flecha (->).
Invocar mtodos no estticos estticamente genera una advertencia de
nivel E_STRICT.
Como cualquier otra variable esttica de PHP, las propiedades estticas slo
pueden ser inicializadas utilizando un string literal o una constante; las
expresiones no estn permitidas. Por tanto, se puede inicializar una propiedad
esttica con enteros o arrays (por ejemplo), pero no se puede hacer con otra
variable, con el valor de devolucin de una funcin, o con un objeto.
A partir de PHP 5.3.0, es posible hacer referencia a una clase usando una variable.
El valor de la variable no puede ser una palabra clave
(p.ej., self,parent y static).
Ejemplo #1 Ejemplo de propiedad esttica


<?php
class Foo
{
public static $mi_static = 'foo';

public function valorStatic() {
return self::$mi_static;
}
}

class Bar extends Foo
{
public function fooStatic() {
return parent::$mi_static;
}
}


print Foo::$mi_static . "\n";

$foo = new Foo();
print $foo->valorStatic() . "\n";
print $foo->mi_static . "\n"; // "Propiedad" mi_static no definida

print $foo::$mi_static . "\n";
$nombreClase = 'Foo';
print $nombreClase::$mi_static . "\n"; // A partir de PHP 5.3.0

print Bar::$mi_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>
Ejemplo #2 Ejemplo de mtodo esttico
<?php
class Foo {
public static function unMtodoEsttico() {
// ...
}
}

Foo::unMtodoEsttico();
$nombreClase = 'Foo';
$nombreClase::unMtodoEsttico(); // A partir de PHP 5.3.0
?>


Abstraccin de clases
PHP 5 introduce clases y mtodos abstractos. Las clases definidas como abstract
seguramente no son instanciadas y cualquier clase que contiene almenos un
mtodo abstracto debe ser definida como abstract. Los mtodos definidos como
abstractos simplemente declaran la estructura del mtodo, pero no pueden definir
la implementacin.
Cuando se hereda de una clase abstracta, todos los mtodos definidos como
abstract en la definicin de la clase parent deben ser redefinidos en la clase child;
adicionalmente, estos mtodos deben ser definidos con la misma visibilidad (o con
una menos restrictiva). Por ejemplo, si el mtodo abstracto est definido como
protected, la implementacin de la funcin puede ser redefinida como protected o
public, pero nunca como private. Por otra parte, las estructuras de los mtodos
tienen que coincidir; es decir, la implicacin de tipos y el nmero de argumentos
requeridos deben ser los mismos. Por ejemplo, si la clase derivada define un
parmetro opcional, mientras que el mtodo abstracto no, no habra conflicto con
la estructura del mtodo. Esto tambin aplica a los constructores de PHP 5.4.
Antes de PHP 5.4 las estructuras del constructor podan ser diferentes.
Ejemplo #1 Ejemplo de clase abstracta
<?php
abstract class AbstractClass
{
// Forzando la extensin de clase para definir este mtodo
abstract protected function getValue();
abstract protected function prefixValue($prefix);

// Mtodo comn
public function printOut() {
print $this->getValue() . "\n";
}
}

class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}

public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}

class ConcreteClass2 extends AbstractClass
{
public function getValue() {


return "ConcreteClass2";
}

public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";
?>
El resultado del ejemplo sera:
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
Ejemplo #2 Ejemplo de clase abstracta
<?php
abstract class AbstractClass
{
// El mtodo abstracto slo necesita definir los parmetros requeridos
abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{

// La clase derivada puede definir parmetros opcionales que no estn en la
estructura del prototipo
public function prefixName($name, $separator = ".") {
if ($name == "Pacman") {
$prefix = "Mr";
} elseif ($name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$prefix}{$separator} {$name}";
}
}



$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>
El resultado del ejemplo sera:
Mr. Pacman
Mrs. Pacwoman
Cdigos antiguos que no tengan clases o funciones definidas por el usuario
llamadas 'abstract' deberan ejecutarse sin modificaciones.
Interfaces de objetos
Las interfaces de objetos permiten crear cdigo con el cual especificamos qu
mtodos deben ser implementados por una clase, sin tener que definir cmo estos
mtodos son manipulados.
Las interfaces son definidas utilizando la palabra clave interface, de la misma
forma que con clases estndar, pero sin mtodos que tengan su contenido
definido.
Todos los mtodos declarados en una interfaz deben ser public, ya que sta es la
naturaleza de una interfaz.
implements
Para implementar una interfaz, se utiliza el operador implements. Todos los
mtodos en una interfaz deben ser implementados dentro de la clase; el no
cumplir con esta regla resultar en un error fatal. Las clases pueden implementar
ms de una interfaz si se deseara, separndolas cada una por una coma.
Nota:
Antes de PHP 5.3.9, una clase no puede implementar dos interfaces que
especifiquen un mtodo con el mismo nombre, ya que podra causar ambigedad.
Las versiones ms recientes de PHP permiten esto siempre y cuando los mtodos
duplicados tengan la misma firma.
Nota:
Las interfaces se pueden extender al igual que las clases utilizando el
operador extends.
Nota:


La clase que implemente una interfaz debe utilizar exactamente las mismas
estructuras de mtodos que fueron definidos en la interfaz. De no cumplir con esta
regla, se generar un error fatal.
Constantes
Es posible tener constantes dentro de las interfaces. Las constantes de interfaces
funcionan como las constantes de clases excepto porque no pueden ser
sobrescritas por una clase/interfaz que las herede.
Ejemplos
Ejemplo #1 Ejemplo de interfaz
<?php

// Declarar la interfaz 'iTemplate'
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}

// Implementar la interfaz
// sto funcionar
class Template implements iTemplate
{
private $vars = array();

public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}

public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}

return $template;
}
}
// sto no funcionar
// Error fatal: La Clase BadTemplate contiene un mtodo abstracto
// y por lo tanto debe declararse como abstracta (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
private $vars = array();



public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
}
?>
Ejemplo #2 Interfaces extensibles
<?php
interface a
{
public function foo();
}

interface b extends a
{
public function baz(Baz $baz);
}

// sto s funcionar
class c implements b
{
public function foo()
{
}

public function baz(Baz $baz)
{
}
}

// sto no funcionar y resultar en un error fatal
class d implements b
{
public function foo()
{
}

public function baz(Foo $foo)
{
}
}
?>
Ejemplo #3 Herencia mltiple de interfaces
<?php
interface a
{


public function foo();
}

interface b
{
public function bar();
}

interface c extends a, b
{
public function baz();
}

class d implements c
{
public function foo()
{
}

public function bar()
{
}

public function baz()
{
}
}
?>
Ejemplo #4 Interfaces con constantes
<?php
interface a
{
const b = 'Interface constant';
}

// Imprime: Interface constant
echo a::b;


// Sin embargo sto no funcionar ya que no est permitido
// sobrescribir constantes
class b implements a
{
const b = 'Class constant';
}
?>


Una interfaz, junto con type-hinting, proveen una buena forma de asegurarse que
determinado objeto contiene mtodos particulares. Vea el
operador instanceof y type hinting.
Traits
Desde PHP 5.4.0, PHP implementa una metodologa de reutilizacin de cdigo
llamada Traits.
Los traits (rasgos) son un mecanismo de reutilizacin de cdigo en lenguajes de
herencia simple, como PHP. El objetivo de un trait es el de reducir las limitaciones
propias de la herencia simple permitiendo que los desarrolladores reutilicen a
voluntad conjuntos de mtodos sobre varias clases independientes y
pertenecientes a clases jerrquicas distintas. La semntica a la hora combinar
Traits y clases se define de tal manera que reduzca su complejidad y se eviten los
problemas tpicos asociados a la herencia mltiple y a los Mixins.
Un Trait es similar a una clase, pero con el nico objetivo de agrupar
funcionalidades muy especficas y de una manera coherente. No se puede
instanciar directamente un Trait. Es por tanto un aadido a la herencia tradicional,
y habilita la composicin horizontal de comportamientos; es decir, permite
combinar miembros de clases sin tener que usar herencia.
Ejemplo #1 Ejemplo de Trait
<?php
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}

class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>
Precedencia
Los miembros heredados de una clase base se sobrescriben cuando se inserta otro
miembro homnimo desde un Trait. De acuerdo con el orden de precedencia, los
miembros de la clase actual sobrescriben los mtodos del Trait, que a su vez
sobrescribe los mtodos heredados.


Ejemplo #2 Ejemplo de Orden de Precedencia
Se sobrescribe un miembro de la clase base con el mtodo insertado en
MiHolaMundo a partir del Trait DecirMundo. El comportamiento es el mismo para
los mtodos definidos en la clase MiHolaMundo. Segn el orden de precedencia los
mtodos de la clase actual sobrescriben los mtodos del Trait, a la vez que el Trait
sobrescribe los mtodos de la clase base.
<?php
class Base {
public function decirHola() {
echo 'Hola ';
}
}

trait DecirMundo {
public function decirHola() {
parent::decirHola();
echo 'Mundo!';
}
}

class MiHolaMundo extends Base {
use DecirMundo;
}

$o = new MiHolaMundo();
$o->decirHola();
?>
El resultado del ejemplo sera:
Hola Mundo!
Ejemplo #3 Ejemplo de Orden de Precedencia #2
<?php
trait HolaMundo {
public function decirHola() {
echo 'Hola Mundo!';
}
}

class ElMundoNoEsSuficiente {
use HolaMundo;
public function decirHola() {
echo 'Hola Universo!';
}
}

$o = new ElMundoNoEsSuficiente();
$o->decirHola();
?>


El resultado del ejemplo sera:
Hola Universo!
Multiples Traits
Se pueden insertar mltiples Traits en una clase, mediante una lista separada por
comas en la sentencia use.
Ejemplo #4 Uso de Mltiples Traits
<?php
trait Hola {
public function decirHola() {
echo 'Hola ';
}
}

trait Mundo {
public function decirMundo() {
echo 'Mundo';
}
}

class MiHolaMundo {
use Hola, Mundo;
public function decirAdmiracin() {
echo '!';
}
}

$o = new MiHolaMundo();
$o->decirHola();
$o->decirMundo();
$o->decirAdmiracin();
?>
El resultado del ejemplo sera:
Hola Mundo!
Resolucin de Conflictos
Si dos Traits insertan un mtodo con el mismo nombre, se produce un error fatal,
siempre y cuando no se haya resuelto explicitamente el conflicto.
Para resolver los conflictos de nombres entre Traits en una misma clase, se debe
usar el operador insteadof para elejir unvocamente uno de los mtodos
conflictivos.


Como esto slo permite excluir mtodos, se puede usar el operador as para
permitir incluir uno de los mtodos conflictivos bajo otro nombre.
Ejemplo #5 Resolucin de Conflictos
En este ejemplo, Talker utiliza los traits A y B. Como A y B tienen mtodos
conflictos, se define el uso de la variante de smallTalk del trait B, y la variante de
bigTalk del traita A.
Aliased_Talker hace uso del operador as para poder usar la implementacin de
bigTalk de B, bajo el alias adicional talk.
<?php
trait A {
public function smallTalk() {
echo 'a';
}
public function bigTalk() {
echo 'A';
}
}

trait B {
public function smallTalk() {
echo 'b';
}
public function bigTalk() {
echo 'B';
}
}

class Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
}

class Aliased_Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
B::bigTalk as talk;
}
}
?>
Modificando la Visibilidad de los Mtodos
Al usar el operador as, se puede tambin ajustar la visibilidad del mtodo en la
clase exhibida.


Ejemplo #6 Modificar la Visibilidad de un Mtodo
<?php
trait HolaMundo {
public function decirHola() {
echo 'Hola Mundo!';
}
}

// Cambiamos visibilidad de decirHola
class MiClase1 {
use HolaMundo { decirHola as protected; }
}

// Mtodo alias con visibilidad cambiada
// La visibilidad de decirHola no cambia
class MiClase2 {
use HolaMundo { decirHola as private miPrivadoHola; }
}
?>
Traits Compuestos de Traits
Al igual que las clases, los Traits tambin pueden hacer uso de otros Traits. Al usar
uno o ms traits en la definicin de un trait, ste puede componerse parcial o
completamente de miembros de finidos en esos otros traits.
Ejemplo #7 Traits Compuestos de Traits
<?php
trait Hola {
public function decirHola() {
echo 'Hola ';
}
}

trait Mundo {
public function decirMundo() {
echo 'Mundo!';
}
}

trait HolaMundo {
use Hola, Mundo;
}

class MiHolaMundo {
use HolaMundo;
}



$o = new MiHolaMundo();
$o->decirHola();
$o->decirMundo();
?>
El resultado del ejemplo sera:
Hola Mundo!
Miembros Abstractos de Traits
Los traits soportan el uso de mtodos abstractos para imponer requisitos a la clase
a la que se exhiban.
Ejemplo #8 Expresar Resquisitos con Mtodos Abstractos
<?php
trait Hola {
public function decirHolaMundo() {
echo 'Hola'.$this->obtenerMundo();
}
abstract public function obtenerMundo();
}

class MiHolaMundo {
private $mundo;
use Hola;
public function obtenerMundo() {
return $this->mundo;
}
public function asignarMundo($val) {
$this->mundo = $val;
}
}
?>
Miembros Estticos en Traits
Los mtodos de un trait pueden referenciar a variables estticas, pero no puede
ser definido en el trait. Los traits, sin embargo, pueden definir mtodo estticos a
la clase a la que se exhiben.
Ejemplo #9 Variables estticas
<?php
trait Contador {
public function inc() {
static $c = 0;
$c = $c + 1;
echo "$c\n";
}


}

class C1 {
use Contador;
}

class C2 {
use Contador;
}

$o = new C1(); $o->inc(); // echo 1
$p = new C2(); $p->inc(); // echo 1
?>
Ejemplo #10 Mtodos Estticos
<?php
trait EjemploEstatico {
public static function hacerAlgo() {
return 'Hacer algo';
}
}

class Ejemplo {
use EjemploEstatico;
}

Ejemplo::hacerAlgo();
?>
Propiedades
Los traits tambin pueden definir propiedades.
Ejemplo #11 Definir Propiedades
<?php
trait PropiedadesTrait {
public $x = 1;
}

class EjemploPropiedades {
use PropiedadesTrait;
}

$ejemplo = new EjemploPropiedades;
$ejemplo->x;
?>


Si un trait define una propiedad una clase no puede definir una propiedad con el
mismo nombre, si no se emitir un error.ste de tipo E_STRICT si la definicin de la
clase es compatible (misma visibilidad y valor inicial) o de otro modo un error
fatal.
Ejemplo #12 Resolucin de Conflictos
<?php
trait PropiedadesTrait {
public $misma = true;
public $diferente = false;
}

class EjemploPropiedades {
use PropiedadesTrait;
public $misma = true; // Estndares estrictos
public $diferente = true; // Error fatal
}
?>
Sobrecarga
La sobrecarga en PHP ofrece los medios para "crear" dinmicamente propiedades y
mtodos. Estas entidades dinmicas se procesan por los mtodos mgicos que se
pueden establecer en una clase para diversas acciones.
Se invoca a los mtodos de sobrecarga cuando se interacta con propiedades o
mtodos que no se han declarado o que no son visibles en el mbito activo. A lo
largo de esta seccin usaremos los trminos "propiedades inaccesibles" y
"mtodos inaccesibles" para referirnos a esta combinacin de declaracin y
visibilidad.
Todos los mtodos sobrecargados deben definirse como public.
Nota:
No se puede pasar ninguno de los parmetros de estos mtodos mgicos por
referencia.
Nota:
La interpretacin de PHP de "overloading" es distinta de la mayora de los
lenguajes orientados a objetos. La sobrecarga tradicionalmente ofrece la capacidad
de tener mltiples mtodos con el mismo nombre, pero con un tipo o un nmero
distinto de parmetros.


Historial de cambios
Versin Descripcin
5.3.0
Se aade __callStatic. Se aadieron advertencias para hacer cumplir la visibilidad public
e impedir la declaracin static.
5.1.0 Aadidos los mtodos __isset y __unset.
Sobrecarga de propiedades
public void __set ( string $name , mixed $value )
public mixed __get ( string $name )
public bool __isset ( string $name )
public void __unset ( string $name )
__set() se ejecuta al escribir datos sobre propiedades inaccesibles.
__get() se utiliza para consultar datos a partir de propiedades inaccesibles.
__isset() se lanza al llamar a isset() o a empty() sobre propiedades inaccesibles.
__unset() se invoca cuando se usa unset() sobre propiedades inaccesibles.
El parmetro $name es el nombre de la propiedad con la que se est
interactuando. En el mtodo __set() el parmetro $value especifica el valor que se
debe asignar a la propiedad $name.
La sobrecarga de propiedades slo funciona en contextos de objetos. Estos
mtodos mgicos no se lanzarn en contextos estticos. Por esa razn, no se
deben declarar como estticos. Desde PHP 5.3.0, se emite un aviso si alguno de
los mtodos de sobrecarga es declarado como static.
Nota:
Debido a la forma en que PHP procesa el operador de asignacin, el valor que
devuelve __set() se ignora. Del mismo modo, nunca se llama a__get() al
encadenar asignaciones como sta:
$a = $obj->b = 8;
Ejemplo #1 Sobrecarga de propiedades mediante los
mtodos __get(), __set(), __isset() y __unset()
<?php
class PropertyTest
{


/** Localizacin de los datos sobrecargados. */
private $data = array();

/** La sobrecarga no se usa en propiedades declaradas. */
public $declared = 1;

/** La sobre carga slo funciona aqu al acceder desde fuera de la clase.
*/
private $hidden = 2;

public function __set($name, $value)
{
echo "Estableciendo '$name' a '$value'\n";
$this->data[$name] = $value;
}

public function __get($name)
{
echo "Consultando '$name'\n";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}

$trace = debug_backtrace();
trigger_error(
'Propiedad indefinida mediante __get(): ' . $name .
' en ' . $trace[0]['file'] .
' en la lnea ' . $trace[0]['line'],
E_USER_NOTICE);
return null;
}

/** Desde PHP 5.1.0 */
public function __isset($name)
{
echo "Est definido '$name'?\n";
return isset($this->data[$name]);
}

/** Desde PHP 5.1.0 */
public function __unset($name)
{
echo "Eliminando '$name'\n";
unset($this->data[$name]);
}

/** No es un mtodo mgico, esta aqu para completar el ejemplo. */
public function getHidden()


{
return $this->hidden;
}
}


echo "<pre>\n";

$obj = new PropertyTest;

$obj->a = 1;
echo $obj->a . "\n\n";

var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";

echo $obj->declared . "\n\n";

echo "Vamos a probar con la propiedad privada que se llama 'hidden':\n";
echo "Las propiedades privadas pueden consultarse en la clase, por lo que no se
usa __get()...\n";
echo $obj->getHidden() . "\n";
echo "Las propiedades privadas no son visibles fuera de la clase, por lo que se
usa __get()...\n";
echo $obj->hidden . "\n";
?>
El resultado del ejemplo sera:
Estableciendo 'a' a '1'
Consultando 'a'
1

Est definido 'a'?
bool(true)
Eliminando 'a'
Est definido 'a'?
bool(false)

1

Vamos a probar con la propiedad privada que se llama 'hidden':
Las propiedades privadas pueden consultarse en la clase, por lo que no se usa
__get()...
2
Las propiedades privadas no son visibles fuera de la clase, por lo que se usa
__get()...
Consultando 'hidden'




Notice: Propiedad indefinida mediante __get(): hidden en <file> en la lnea 69
in <file>en la lnea 28
Sobrecarga de mtodos
public mixed __call ( string $name , array $arguments )
public static mixed __callStatic ( string $name , array $arguments )
__call() es lanzado al invocar un mtodo inaccesible en un contexto de objeto.
__callStatic() es lanzado al invocar un mtodo inaccesible en un contexto esttico.
El parmetro $name corresponde al nombre del mtodo al que se est llamando.
El parmetro $arguments es un array enumerado que contiene los parmetros que
se han pasado al mtodo $name.
Ejemplo #2 Sobrecarga de mtodos mediante los
mtodos __call() and __callStatic()
<?php
class MethodTest
{
public function __call($name, $arguments)
{
// Nota: el valor $name es sensible a maysculas.
echo "Llamando al mtodo de objeto '$name' "
. implode(', ', $arguments). "\n";
}

/** Desde PHP 5.3.0 */
public static function __callStatic($name, $arguments)
{
// Nota: el valor $name es sensible a maysculas.
echo "Llamando al mtodo esttico '$name' "
. implode(', ', $arguments). "\n";
}
}

$obj = new MethodTest;
$obj->runTest('en contexto de objeto');

MethodTest::runTest('en contexto esttico'); // Desde PHP 5.3.0
?>
El resultado del ejemplo sera:
Llamando al mtodo de objeto 'runTest' en contexto de objeto
Llamando al mtodo esttico 'runTest' en contexto esttico


Iteracin de objetos
PHP 5 ofrece una manera para que los objetos sean definidos por lo que es posible
iterar a travs de una lista de elementos, con, por ejemplo, una sentencia foreach.
Por defecto, todas las propiedades visibles sern utilizados para la iteracin.
Ejemplo #1 Iteracin simple de objeto
<?php
class MyClass
{
public $var1 = 'value 1';
public $var2 = 'value 2';
public $var3 = 'value 3';

protected $protected = 'protected var';
private $private = 'private var';

function iterateVisible() {
echo "MyClass::iterateVisible:\n";
foreach($this as $key => $value) {
print "$key => $value\n";
}
}
}

$class = new MyClass();

foreach($class as $key => $value) {
print "$key => $value\n";
}
echo "\n";


$class->iterateVisible();

?>
El resultado del ejemplo sera:
var1 => value 1
var2 => value 2
var3 => value 3

MyClass::iterateVisible:
var1 => value 1
var2 => value 2
var3 => value 3
protected => protected var
private => private var


Como se muestra en la salida, el foreach itera a travs de todas las
propiedades visibles que se puedan acceder.
Para dar un paso ms, se puede implementar la interfaz Iterator. Esto permite al
objeto decidir cmo ser iterado y qu valores estarn disponibles en cada
iteracin.
Ejemplo #2 Iteracin de objeto implementando Iterator
<?php
class MyIterator implements Iterator
{
private $var = array();

public function __construct($array)
{
if (is_array($array)) {
$this->var = $array;
}
}

public function rewind()
{
echo "rewinding\n";
reset($this->var);
}

public function current()
{
$var = current($this->var);
echo "current: $var\n";
return $var;
}

public function key()
{
$var = key($this->var);
echo "key: $var\n";
return $var;
}

public function next()
{
$var = next($this->var);
echo "next: $var\n";
return $var;
}

public function valid()


{
$key = key($this->var);
$var = ($key !== NULL && $key !== FALSE);
echo "valid: $var\n";
return $var;
}

}

$values = array(1,2,3);
$it = new MyIterator($values);

foreach ($it as $a => $b) {
print "$a: $b\n";
}
?>
El resultado del ejemplo sera:
rewinding
valid: 1
current: 1
key: 0
0: 1
next: 2
valid: 1
current: 2
key: 1
1: 2
next: 3
valid: 1
current: 3
key: 2
2: 3
next:
valid:
La interface IteratorAggregate se puede usar como alternativa para implementar
todos los mtodos de Iterator. IteratorAggregate solamente requiere la
implementacin de un nico mtodo, IteratorAggregate::getIterator(), el cual
debera devolver una instancia de una clase que implementeIterator.
Ejemplo #3 Iteracin de objeto implementando IteratorAggregate
<?php
class MyCollection implements IteratorAggregate
{
private $items = array();
private $count = 0;

// Se requiere la definicin de la interfaz IteratorAggregate
public function getIterator() {


return new MyIterator($this->items);
}

public function add($value) {
$this->items[$this->count++] = $value;
}
}

$coll = new MyCollection();
$coll->add('value 1');
$coll->add('value 2');
$coll->add('value 3');

foreach ($coll as $key => $val) {
echo "key/value: [$key -> $val]\n\n";
}
?>
El resultado del ejemplo sera:
rewinding
current: value 1
valid: 1
current: value 1
key: 0
key/value: [0 -> value 1]

next: value 2
current: value 2
valid: 1
current: value 2
key: 1
key/value: [1 -> value 2]

next: value 3
current: value 3
valid: 1
current: value 3
key: 2
key/value: [2 -> value 3]

next:
current:
valid:
Nota:
Para ms ejemplos de iteradores, vea la extensin SPL.
Nota:


Los usuarios de PHP 5.5 y posteriores pueden investigar los generadores, que
posibilitan una forma alternativa de definir iteradores.
Mtodos mgicos
Los nombres de
mtodo __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __is
set(), __unset(), __sleep(), __wakeup(),__toString(), __invoke(), __set_state() y
__clone() son mgicos en las clases PHP. No se puede tener mtodos con estos
nombres en cualquiera de las clases a menos que desee la funcionalidad mgica
asociada a estos.
Precaucin
PHP se reserva todos los nombres de los mtodos que comienzan con __ como
mgicos. Se recomienda que no utilice los nombres de mtodos con __ en PHP a
menos que desee alguna funcionalidad mgica documentada.
__sleep() y __wakeup()
public array __sleep ( void )
void __wakeup ( void )
serialize() comprueba si la clase tiene un mtodo con el nombre mgico __sleep().
Si es as, el mtodo se ejecuta antes de cualquier serializacin. Se puede limpiar el
objeto y se supone que devuelve un array con los nombres de todas las variables
de el objeto que se va a serializar. Si el mtodo no devuelve nada,
entonces NULL es serializado y un error E_NOTICE es emitido.
Nota:
No es posible para __sleep() devolver nombres de propiedades privadas en las
clases padres. Hacer esto resultara un nivel de error E_NOTICE. En su lugar, puede
utilizar la interfaz Serializable.
El uso para el que est destinado __sleep() consiste en confirmar datos pendientes
o realizar tareas similares de limpieza. Adems, el mtodo es til si tiene objetos
muy grandes que no necesitan guardarse por completo.
Por el contrario, unserialize() comprueba la presencia de un mtodo con el nombre
mgico __wakeup(). Si est presente, este mtodo puede reconstruir cualquier
recurso que el objeto pueda tener.
El uso para el que est destinado __wakeup() es restablecer las conexiones de
base de datos que se puedan haber perdido durante la serializacin y realizar otras
tareas de reinicializacin.
Ejemplo #1 Sleep y wakeup


<?php
class Connection
{
protected $link;
private $server, $username, $password, $db;

public function __construct($server, $username, $password, $db)
{
$this->server = $server;
$this->username = $username;
$this->password = $password;
$this->db = $db;
$this->connect();
}

private function connect()
{
$this->link = mysql_connect($this->server, $this->username, $this-
>password);
mysql_select_db($this->db, $this->link);
}

public function __sleep()
{
return array('server', 'username', 'password', 'db');
}

public function __wakeup()
{
$this->connect();
}
}
?>
__toString()
public string __toString ( void )
El mtodo __toString() permite a una clase decidir cmo comportarse cuando se le
trata como un string. Por ejemplo, lo que echo $obj; mostrara. Este mtodo debe
devolver un string, si no se emitir un nivel de error fatal E_RECOVERABLE_ERROR.
Advertencia
No se puede lanzar una excepcin desde dentro un mtodo __toString(). Hacerlo
resultar en un error fatal.
Ejemplo #2 Ejemplo simple


<?php
// Declarar una clase simple
class TestClass
{
public $foo;

public function __construct($foo)
{
$this->foo = $foo;
}

public function __toString()
{
return $this->foo;
}
}

$class = new TestClass('Hola Mundo');
echo $class;
?>
El resultado del ejemplo sera:
Hola Mundo
Antes de PHP 5.2.0 el mtodo __toString() se llama slo cuando se combina
directamente con echo o print. Desde PHP 5.2.0, se le llama en cualquier contexto
de string (e.j. en printf() con el modificador %s) pero no en el contexto de otros
tipos (e.j. con el modificador %d). Desde PHP 5.2.0, la conversin de los objetos
sin el mtodo __toString() a string podra causar E_RECOVERABLE_ERROR.
__invoke()
mixed __invoke ([ $... ] )
El mtodo __invoke() es llamado cuando un script intenta llamar a un objeto como
si fuera una funcin.
Nota:
Esta caracterstica est disponible desde PHP 5.3.0.
Ejemplo #3 Uso de __invoke()
<?php
class CallableClass
{
public function __invoke($x)
{
var_dump($x);
}


}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>
El resultado del ejemplo sera:
int(5)
bool(true)
__set_state()
static object __set_state ( array $properties )
Este mtodo static es llamado para las clases exportadas por var_export(), desde
PHP 5.1.0.
El nico parmetro de este mtodo es un array que contiene las propiedades
exportadas en la forma array('property' => value, ...).
Ejemplo #4 Uso de __set_state() (desde PHP 5.1.0)
<?php

class A
{
public $var1;
public $var2;

public static function __set_state($an_array) // A partir de PHP 5.1.0
{
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';

eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(
// 'var1' => 5,
// 'var2' => 'foo',
// ));
var_dump($b);

?>


El resultado del ejemplo sera:
object(A)#2 (2) {
["var1"]=>
int(5)
["var2"]=>
string(3) "foo"
}
Palabra clave Final
PHP 5 introduce la nueva palabra clave final, que impide que las clases hijas
sobrescriban un mtodo, antecediendo su definicin con final. Si la propia clase se
define como final, entonces no se podr heredar de ella.
Ejemplo #1 Ejemplo de mtodos Final
<?php
class BaseClass {
public function test() {
echo "llamada a BaseClass::test()\n";
}

final public function moreTesting() {
echo "llamada a BaseClass::moreTesting()\n";
}
}

class ChildClass extends BaseClass {
public function moreTesting() {
echo "llamada a ChildClass::moreTesting()\n";
}
}
// Devuelve un error Fatal: Cannot override final method BaseClass::moreTesting(
)
?>
Ejemplo #2 Ejemplo de clase Final
<?php
final class BaseClass {
public function test() {
echo "llamada a BaseClass::test()\n";
}

// Aqu no importa si definimos una funcin como final o no
final public function moreTesting() {
echo "llamada a BaseClass::moreTesting()\n";
}
}



class ChildClass extends BaseClass {
}
// Devuelve un error Fatal: Class ChildClass may not inherit from final class (B
aseClass)
?>
Nota: Las propiedades no pueden declararse como final. Slo pueden las clases y
los mtodos.
Clonacin de Objetos
No siempre se desea crear una copia de un objeto replicando todas sus
propiedades completamente. Un buen ejemplo que ilustra la necesidad de contar
con un constructor de copias, sera si tuviramos un objeto que represente una
ventana en GTK y el objeto almacene los recursos de esta ventana GTK, de forma
que cuando creas un duplicado el comportamiento esperado sera una nueva
ventana con las mismas propiedades, y que el nuevo objeto referencie a los
recursos de la nueva ventana. Otro ejemplo es si un objeto hace referencia a otro
objeto necesario, de forma que cuando se realiza una rplica del objeto principal,
se espera que se cree una nueva instancia de este otro objeto, de forma que la
rplica tenga su propia copia
Para crear una copia de un objeto se utiliza la palabra clave clone (que invoca, si
fuera posible, al mtodo __clone() del objeto). No se puede llamar al
mtodo __clone() de un objeto directamente.
$copia_de_objeto = clone $objeto;
Cuando se clona un objeto, PHP5 llevar a cabo una copia superficial de las
propiedades del objeto. Las propiedades que sean referencias a otras variables,
mantendrn las referencias.
void __clone ( void )
Una vez que la clonacin ha finalizado, se llamar al mtodo __clone() del nuevo
objeto (si el mtodo __clone() estuviera definido), para permitirle realizar los
cambios necesarios sobre sus propiedades.
Ejemplo #1 Clonacin de un objeto
<?php
class SubObject
{
static $instances = 0;
public $instance;

public function __construct() {
$this->instance = ++self::$instances;
}



public function __clone() {
$this->instance = ++self::$instances;
}
}

class MyCloneable
{
public $object1;
public $object2;

function __clone()
{
// Forzamos la copia de this->object, si no
// har referencia al mismo objeto.
$this->object1 = clone $this->object1;
}
}

$obj = new MyCloneable();

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

$obj2 = clone $obj;


print("Objeto Original:\n");
print_r($obj);

print("Objeto Clonado:\n");
print_r($obj2);

?>
El resultado del ejemplo sera:
Objeto Original:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 1
)

[object2] => SubObject Object
(
[instance] => 2
)

)


Objeto Clonado:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 3
)

[object2] => SubObject Object
(
[instance] => 2
)

)
Comparacin de Objetos
En PHP 5, la comparacin de objetos es ms complicada que en PHP 4, y en mayor
concordancia con lo que cabe esperar de un Lenguaje Orientado a Objetos (tenga
en cuenta que PHP lo es).
Al utilizar el operador de comparacin (==), se comparan de una forma sencilla
las variables de cada objeto, es decir: Dos instancias de un objeto son iguales si
tienen los mismos atributos y valores, y son instancias de la misma clase.
Por otra parte, cuando se utiliza el operador identidad (===), las variables de un
objeto son idnticas s y slo s hacen referencia a la misma instancia de la misma
clase.
Un ejemplo aclarar estas reglas.
Ejemplo #1 Ejemplo de comparacin de objetos en PHP 5
<?php
function bool2str($bool)
{
if ($bool === false) {
return 'FALSO';
} else {
return 'VERDADERO';
}
}

function compararObjetos(&$o1, &$o2)
{
echo 'o1 == o2 : ' . bool2str($o1 == $o2) . "\n";
echo 'o1 != o2 : ' . bool2str($o1 != $o2) . "\n";
echo 'o1 === o2 : ' . bool2str($o1 === $o2) . "\n";
echo 'o1 !== o2 : ' . bool2str($o1 !== $o2) . "\n";
}



class Bandera
{
public $bandera;

function Bandera($bandera = true) {
$this->bandera = $bandera;
}
}

class OtraBandera
{
public $bandera;

function OtraBandera($bandera = true) {
$this->bandera = $bandera;
}
}

$o = new Bandera();
$p = new Bandera();
$q = $o;
$r = new OtraBandera();

echo "Dos instancias de la misma clase\n";
compararObjetos($o, $p);

echo "\nDos referencias a la misma instancia\n";
compararObjetos($o, $q);

echo "\nInstancias de dos clases diferentes\n";
compararObjetos($o, $r);
?>
El resultado del ejemplo sera:
Dos instancias de la misma clase
o1 == o2 : VERDADERO
o1 != o2 : FALSO
o1 === o2 : FALSO
o1 !== o2 : VERDADERO

Dos referencias a la misma instancia
o1 == o2 : VERDADERO
o1 != o2 : FALSO
o1 === o2 : VERDADERO
o1 !== o2 : FALSO

Instancias de dos clases diferentes
o1 == o2 : FALSO
o1 != o2 : VERDADERO
o1 === o2 : FALSO


o1 !== o2 : VERDADERO
Nota:
Las extensiones pueden definir sus propias reglas para la comparacin de sus
objetos (==).
Implicacin de Tipos
Desde PHP 5 se incorpora la implicacin de tipos. Ahora, las funciones pueden
obligar a sus parmetros a que sean objetos (especificando el nombre de la clase
en el prototipo de la funcin), interfaces, arrays (desde PHP 5.1) o
tipos callable (despe PHP 5.4). Sin embargo, si se usa NULLcomo el valor
predeterminado del parmetro, estar permitido como un argumento para
cualquier llamada posterior.
Si se especifica una clase o una interfaz como tipo implicado, tambin estarn
permitidos todos sus hijos o implementaciones.
La implicacin de tipos no puede usarse con tipos escalares como int o string.
Tampoco estn permitidos los Resources y Traits are not allowed either.
Ejemplo #1 Ejemplos de Implicacin de Tipos
<?php
// Una clase de ejemplo
class MiClase
{
/**
* Una funcin de prueba
*
* El primer parmetro debe ser un objeto del tipo OtraClase
*/
public function prueba(OtraClase $otraclase) {
echo $otraclase->var;
}


/**
* Otra funcin de prueba
*
* El primer parmetro debe ser un array
*/
public function prueba_array(array $array_entrada) {
print_r($array_entrada);
}

/**
* El primer parmetro debe ser un iterador


*/
public function prueba_interface(Traversable $iterador) {
echo get_class($iterador);
}

/**
* El primer parmetro debe ser de tipo callable
*/
public function prueba_callable(callable $llamada_retorno, $datos) {
call_user_func($llamada_retorno, $datos);
}
}

// Otra clase de ejemplo
class OtraClase {
public $var = 'Hola Mundo';
}
?>
Si no se satisface la implicacin de tipos, se produce un error fatal capturable
<?php
// Una instancia de cada clase
$miclase = new MiClase;
$otraclase = new OtraClase;

// Error Fatal: El argumento 1 debe ser un objeto de la clase OtraClase
$miclase->prueba('hola');

// Error Fatal: El argumento 1 debe ser una instancia de OtraClase
$foo = new stdClass;
$miclase->prueba($foo);

// Error fatal: El argumento 1 no puede ser null
$miclase->prueba(null);

// Funciona: Muestra en pantalla Hola Mundo
$miclase->prueba($otraclase);

// Error Fatal: El argumento 1 debe ser un array
$miclase->prueba('un string');

// Funciona: Muestra en pantalla el array
$miclase->prueba(array('a', 'b', 'c'));

// Funciona: Muestra en pantalla ArrayObject
$miclase->prueba_interface(new ArrayObject(array()));

// Funciona: Muestra en pantalla int(1)


$miclase->prueba_callable('var_dump', 1);
?>
La implicacin de tipos tamben se pueden usar con funciones:
<?php
// Una clase de ejemplo
class MiClase {
public $var = 'Hola Mundo';
}

/**
* Una funcin de prueba
*
* El primer parmetro debe ser un objeto del tipo MiClase
*/
function miFuncin (MiClase $foo) {
echo $foo->var;
}

// Funciona
$miclase = new MiClase;
miFuncin($miclase);
?>
La implicacin de tipos acepta valores NULL:
<?php

/* Se acepta el valor NULL */
function prueba(stdClass $obj = NULL) {

}

prueba(NULL);
prueba(new stdClass);

?>
Enlace esttico en tiempo de ejecucin
Desde PHP 5.3.0, PHP incorpora una nueva funcionalidad llamada enlace esttico
en tiempo de ejecucin que permite hacer referencias a la clase en uso dentro de
un contexto de herencia esttica.
De forma ms precisa, un enlace esttico en tiempo de ejecucin para funcionar
almacena el nombre de clase de la ltima llamada que no tenga "propagacin". En
el caso de las llamadas a mtodos estticos, se trata de la clase a la que se llam
explcitamente (normalmente, la que precede al operador ::); en los casos de
llamadas a mtodos que no son estticos, se resolvera a la clase del objeto. Una


"llamada con propagacin" es una llamada esttica que est precedida
por self::, parent::, static::, o, si seguimos la jerarqua de
clases, forward_static_call(). La funcinget_called_class() puede utilizarse para
obtener un string con el nombre de la clase que realiza la llamada,
y static:: revela cul es su alcance.
Se le ha llamado "enlace esttico en tiempo de ejecucin" teniendo en cuenta un
punto de vista interno. "Enlace en tiempo de ejecucin" viene del hecho de
que static:: ya resuelve a la clase en la que se defini el mtodo, sino que en su
lugar se resolver utilizando informacin en tiempo de ejecucin debido a que se
puede utilizar (entre otras cosas) para las llamadas de mtodos estticos, se le
llam tambin "enlace esttico".
Limitaciones de self::
Las referencias estticas que hay dentro de la clase en uso,
como self:: o __CLASS__, se resuelven empleando el nombre de la clase a la que
pertenece la funcin:
Ejemplo #1 Uso de self::
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
self::who();
}
}

class B extends A {
public static function who() {
echo __CLASS__;
}
}

B::test();
?>
El resultado del ejemplo sera:
A
Uso de Enlace Esttico en Tiempo de ejecucin
Los enlaces estticos en tiempo de ejecucin tratan de resolver estas limitaciones
empleando una palabra clave que haga referencia a la clase que realiz la llamada
en tiempo de ejecucin. Es decir, una palabra clave que en el ejemplo anterior
permita hacer referencia desde test() a B. Se decidi no crear una nueva palabra
clave, por lo que en su lugar se ha utilizado la palabra reservada static.


Ejemplo #2 Uso bsico de static::
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // He aqu el enlace esttico en tiempo de ejecucin
}
}

class B extends A {
public static function who() {
echo __CLASS__;
}
}

B::test();
?>
El resultado del ejemplo sera:
B
Nota:
En contextos no estticos, la clase que realiza la llamada ser la clase del objeto
instanciado. Dado que $this-> tratar de invocar mtodos privados en su mismo
mbito, el uso de static:: puede provocar diferents resultados. Otra diferencia es
que static:: slo puede hacer referencia a propiedades estticas.
Ejemplo #3 Uso de static:: en un contexto no esttico
<?php
class A {
private function foo() {
echo "exito!\n";
}
public function test() {
$this->foo();
static::foo();
}
}

class B extends A {
/* foo() se copiar en B, por lo tanto su mbito seguir siendo A
* y la llamada tendr xito */
}

class C extends A {


private function foo() {
/* se reemplaza el mtodo original; el mbito del nuevo es ahora C */
}
}

$b = new B();
$b->test();
$c = new C();
$c->test(); //falla
?>
El resultado del ejemplo sera:
exito!
exito!
exito!


Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php
on line 9
Nota:
En una llamada que se resuelva como esttica, la resolucin de enlaces estticos
en tiempo de ejecucin se dentendr sin propagarse. Por otra parte, las llamadas
estticas que utilicen palabras clave como parent:: o self:: s propagarn la
informacin.
Ejemplo #4 Llamadas que propagan y que no propagan
<?php
class A {
public static function foo() {
static::who();
}

public static function who() {
echo __CLASS__."\n";
}
}

class B extends A {
public static function test() {
A::foo();
parent::foo();
self::foo();
}

public static function who() {
echo __CLASS__."\n";
}


}
class C extends B {
public static function who() {
echo __CLASS__."\n";
}
}

C::test();
?>
El resultado del ejemplo sera:
A
C
C
Objetos y referencias
Uno de los puntos clave de la POO de PHP 5 que a menudo se menciona es que
"por omisin los objetos se pasan por referencia". Esto no es completamente
cierto. Esta seccin rectifica esa creencia general, usando algunos ejemplos.
Una referencia en PHP es un alias, que permite a dos variables diferentes escribir
sobre un mismo valor. Desde PHP 5, una variable de tipo objeto ya no contiene el
objeto en s como valor. nicamente contiene un identificador del objeto que le
permite localizar al objeto real. Cuando se pasa un objeto como parmetro, o se
devuelve como retorno, o se asigna a otra variable, las distintas variables no son
alias: guardan una copia del identificador, que apunta al mismo objeto.
Ejemplo #1 Referencias y Objetos
<?php
class A {
public $foo = 1;
}

$a = new A;
$b = $a; // $a y $b son copias del mismo identificador
// ($a) = ($b) = <id>
$b->foo = 2;
echo $a->foo."\n";


$c = new A;
$d = &$c; // $c y $d son referencias
// ($c,$d) = <id>

$d->foo = 2;
echo $c->foo."\n";




$e = new A;

function foo($obj) {
// ($obj) = ($e) = <id>
$obj->foo = 2;
}

foo($e);
echo $e->foo."\n";

?>
El resultado del ejemplo sera:
2
2
2
Serializacin de objetos
serializacin de objetos - objetos en sesiones
La funcin serialize() devuelve un string que contiene un flujo de bytes que
representa cualquier valor que se pueda almacenar en PHP. Por otra
parte, unserialize() puede restaurar los valores originales a partir de dicho string.
Al utilizar serialize para guardar un objeto, almacenar todas las variables de dicho
objeto. En cambio los mtodos no se guardarn, slo el nombre de la clase.
Para poder deserializar ( unserialize()) un objeto, debe estar definida la clase de
ese objeto. Es decir, si se tiene un objeto de la clase A, y lo serializamos, se
obtendr un string que haga referencia a la clase A y contenga todas las variables
que haya en esta clase. Si se desea deseralizar en otro fichero, antes debe estar
presente la definicin de la clase A. Esto se puede hacer, por ejemplo, escribiendo
la definicin de la clase A en un fichero, para despus o bien incluirlo, o bien hacer
uso de la funcin spl_autoload_register().
<?php
// classa.inc:

class A {
public $one = 1;

public function show_one() {
echo $this->one;
}
}

// page1.php:

include("classa.inc");



$a = new A;
$s = serialize($a);
// almacenamos $s en algn lugar en el que page2.php puede encontrarlo.
file_put_contents('store', $s);

// page2.php:

// se necesita para que unserialize funcione correctamente.
include("classa.inc");

$s = file_get_contents('store');
$a = unserialize($s);

// now use the function show_one() of the $a object.
$a->show_one();
?>
Si una aplicacin est usando sesiones, y utiliza session_register() para registrar
objetos, estos objetos se serializarn automticamente al final de cada pgina
PHP, y se deserializan tambin automticamente en cada una de las siguientes
peticiones. Esto significa que, una vez que formen parte de la sesin, estos objetos
se podrn utilizar en cualquier pgina de la aplicacin. Sin embargo, la
funcin session_register(): ha sido borrada a partir de PHP 5.4.0
Si una aplicacin serializa objetos para su uso posterior, se recomienda
encarecidamente que se incluya la definicin de la clase en toda la aplicacin. Si
no se hiciera, se deserializara el objeto sin una definicin de clase, lo cual dara
como resultado que PHP definiera al objeto con la
clase__PHP_Incomplete_Class_Name, que no tiene mtodos, haciendo que el
objeto no fuera til.
Por tanto, si en el ejemplo anterior $a se guardara en una sesin
mediante session_register("a"), sera necesario incluir el fichero classa.inc en
todas las pginas, no slo en page1.php y page2.php.
Ms all del consejo de arriba, observe que tambin se puede conectar con
eventos de serializacin y deserializacin sobre un objeto usando los
mtodos __sleep() y __wakeup(). El uso de __sleep() tambin permite serializar
nicamente un subconjunto de propiedades de objetos.
Registro de cambios de POO
Aqu se registran los cambios del modelo de POO de PHP 5. Las descripciones y
otras notas respecto a estas nuevas funcionalidades estn documentadas dentro
de la documentacin de POO 5.


Versin Descripcin
5.4.0
Cambiado: Si una clase abstracta define una firma para el constructor
ahora se har cumplir.
5.3.3
Cambiado: Los mtodos con el mismo nombre que el ltimo elemento de
un nombre de clase perteneciente a un espacio de nombres ya no sern
tratado como un constructor. Este cambio no afecta a las clases que no
pertenecen a un espacio de nombres.
5.3.0
Cambiado: Ya no es necesario que los valores por omisin de los
mtodos de una clase que implemente un interfaz coincidan con los
valores por omisin de los prototipos de la interfaz.
5.3.0
Cambiado: Ahora es posible hacer referencia a la clase utilizando una
variable (p.ej., echo $nombreclase::constante;). La variable no
puede contener como valor una palabra clave
(p.ej., self, parent o static).
5.3.0
Cambiado: Se emite un error de nivel E_WARNING si al sobrecargar un
mtodo mgico se le declara como esttico. Adems, hace necesario que
tengan visibilidad pblica.
5.3.0
Cambiado: Antes de 5.3.0, las excepciones lanzadas en la
funcin __autoload() no podan capturarse en el bloque catch, y
provocaban un error fatal. Ahora, las excepciones lanzadas dentro de la
funcin __autoload pueden capturarse en el bloque catch, con una nica
salvedad. Si se lanza una excepcin definida por el usuario, entonces
esta excepcin debera estar disponible. Se puede utilizar
recursivamente la funcin __autoload para cargar automticamente la
clase de la excepcin definida por el usuario.
5.3.0 Aadido: El mtodo __callStatic.
5.3.0
Aadido: Soporte heredoc y nowdoc para constantes de clase y
definicin de propiedades. Nota: los valores heredoc deben seguir las
mismas reglas que las cadenas de dobles comillas (p.ej., no contener
variables).
5.3.0 Aadido: Enlaces estticos en tiempo de ejecucin.


Versin Descripcin
5.3.0 Aadido: El mtodo __invoke().
5.2.0
Cambiado: Al mtodo __toString() slo se le invocaba cuando se le
combinaba con echo o con print. Pero ahora, se le invoca en cualquier
contexto de strings (p.ej, en printf() con el modificador %s) pero no en
contextos de otro tipo (p.ej. con el modificador %d). Desde PHP 5.2.0,
convertir objetos a string sin el mtodo __toString emitir un error de
nivel E_RECOVERABLE_ERROR.
5.1.3
Cambiado: En versiones anteriores de PHP 5, se consideraba obsoleto el
uso de var y emita un error de nivel E_STRICT. Ya no est obsoleto, y
por tanto no emite el error.
5.1.0
Cambiado: Ahora se invoca al mtodo esttico __set_state() en las
clases exportadas por var_export().
5.1.0 Aadido: Los mtodos __isset() y __unset().
Visin general de los espacios de nombres
(PHP 5 >= 5.3.0)
Qu son los espacios de nombres? En su definicin ms amplia los espacios de
nombres son una manera de encapsular elementos. Se puede ver como un
concepto abstracto en muchos aspectos. Por ejemplo, en cualquier sistema
operativo los directorios sirven para agrupar archivos relacionados, y actan como
espacios de nombres para los archivos que hay en ellos. Como ejemplo, el
archivo foo.txt puede existir en los directorios /home/greg y /home/otro, pero
no pueden existir dos copias de foo.txt en el mismo directorio. Adems, para
acceder al archivofoo.txt fuera del directorio /home/greg se debe aadir el
nombre del directorio delante del nombre del archivo usando el separador de
directorios para obtener /home/greg/foo.txt. Este mismo principio se extiende
a los espacios de nombres en el mundo de la programacin.
En el mundo de PHP, los espacios de nombres estn diseados para solucionar dos
problemas que los autores de bibliotecas y aplicaciones se encuentran cuando
crean elementos de cdigo reusable tales como clases o funciones:
1. El conflicto de nombres entre el cdigo que se crea y las
clases/funciones/constantes internas de PHP o las
clases/funciones/constantes de terceros.


2. La capacidad de apodar (o abreviar) Nombres_Extra_Largos diseado para
aliviar el problema en primer lugar, mejorando la legibilidad del cdigo
fuente.
Los espacios de nombres en PHP proporcionan una manera para agrupar clases,
interfaces, funciones y constantes relacionadas. Un ejemplo de la sintaxis de los
espacios de nombres de PHP:
Ejemplo #1 Ejemplo de sintaxis de espacios de nombres
<?php
namespace mi\nombre; // vase la seccin "Definir Espacios de Nombres"

class MiClase {}
function mifuncin() {}
const MICONSTANTE = 1;

$a = new MiClase;
$c = new \mi\nombre\MiClase; // vase la seccin "Espacio Global"

$a = strlen('hola'); // vase la seccin "Usar espacios de nombres: una alternat
iva a
// funciones/constantes globales"

$d = namespace\MICONSTANTE; // vase la seccin "El operador namespace y
// la constante __NAMESPACE__"
$d = __NAMESPACE__ . '\MICONSTANTE';
echo constant($d); // vase la seccin "Espacios de Nombres y caractersticas di
nmicas del lenguaje"
?>
Nota:
Los nombres de espacio de nombres PHP y php, y los nombres compuestos a
partir de estos nombres (como PHP\Classes) estn reservados para el uso del
lenguaje interno y no deben ser utilizados en el cdigo.
Definir espacios de nombres
(PHP 5 >= 5.3.0)
Aunque cualquier cdigo de PHP vlido puede estar contenido dentro de un espacio
de nombres, slo son afectados por los espacios de nombres cuatro tipos de
cdigo: clases, interfaces, funciones y constantes.
Los espacios de nombres se declaran usando la palabra clave namespace. Un
archivo que contiene un espacio de nombres debe declararlo al inicio del archivo,
antes que cualquier otro cdigo - con una excepcin: la palabra clave declare.


Ejemplo #1 Declarar un nico espacio de nombres
<?php
namespace MiProyecto;

const CONECTAR_OK = 1;
class Conexin { /* ... */ }
function conectar() { /* ... */ }

?>
La nica construccin de cdigo permitida antes de la declaracin de un espacio de
nombres es la sentencia declare, para declarar la codificacin de un archivo
fuente. Adems, algo que no sea cdigo de PHP no puede preceder a la declaracin
del espacio de nombres, incluyendo espacios en blanco extra:
Ejemplo #2 Declarar un nico espacio de nombres
<html>
<?php
namespace MiProyecto; // error fatal -
el espacio de nombres debe ser la primera sentencia del script
?>
Adems, a diferencia de otras construcciones de PHP, se puede definir el mismo
espacio de nombres en mltiples archivos, permitiendo la separacin de contenido
de espacios de nombres a travs del sistema de archivos.
Declarar subespacios de nombres
(PHP 5 >= 5.3.0)
Al igual que los directorios y archivos, los espacios de nombres de PHP tambin
tienen la capacidad de especificar una jerarqua de nombres de espacios de
nombres. As, un nombre de un espacio de nombres se puede definir con
subniveles:
Ejemplo #1 Declarar un nico espacio de nombres con jerarqua
<?php
namespace MiProyecto\Sub\Nivel;

const CONECTAR_OK = 1;
class Conexin { /* ... */ }
function conectar() { /* ... */ }

?>


El ejemplo de arriba crea la constante MiProyecto\Sub\Nivel\CONECTAR_OK,
la clase MiProyecto\Sub\Nivel\Conexin y la
funcinMiProyecto\Sub\Nivel\conectar.
Definir mltiples espacios de nombres en el mismo archivo
(PHP 5 >= 5.3.0)
Tambin se pueden declarar mltiples espacios de nombres en el mismo archivo.
Hay dos sintaxis permitidas.
Ejemplo #1 Declarar mltiples espacios de nombres, sintaxis de
combinacin simple
<?php
namespace MiProyecto;

const CONECTAR_OK = 1;
class Conexin { /* ... */ }
function conectar() { /* ... */ }

namespace OtroProyecto;

const CONECTAR_OK = 1;
class Conexin { /* ... */ }
function conectar() { /* ... */ }
?>
No se recomienda esta sintaxis para combinar espacios de nombres en un nico
archivo. En su lugar se recomienda usar la sintaxis de llaves alternativa.
Ejemplo #2 Declarar mltiples espacios de nombres, sintaxis de llaves
<?php
namespace MiProyecto {

const CONECTAR_OK = 1;
class Conexin { /* ... */ }
function conectar() { /* ... */ }
}

namespace OtroProyecto {

const CONECTAR_OK = 1;
class Conexin { /* ... */ }
function conectar() { /* ... */ }
}
?>


Se desaconseja encarecidamente, como prctica de cdigo, el combinar mltiples
espacios de nombres en el mismo archivo. El caso de uso principal es combinar
mltiples scripts de PHP en el mismo archivo.
Combinar cdigo global que no es de espacio de nombres con cdigo que s lo es,
slo est soportado mediante la sintaxis de llaves. El cdigo global debera estar
encerrado en una declaracin de espacio de nombres sin nombre de espacio de
nombres:
Ejemplo #3 Declarar mltiples espacios de nombres y cdigo que no es
de espacio de nombres
<?php
namespace MiProyecto {

const CONECTAR_OK = 1;
class Conexin { /* ... */ }
function conectar() { /* ... */ }
}

namespace { // cdigo global
session_start();
$a = MiProyecto\conectar();
echo MiProyecto\Conexin::iniciar();
}
?>
No puuede existir cdigo de PHP fuera de las llaves del espacio de nombres
excepto para una sentencia de apertura declare.
Ejemplo #4 Declarar mltiples espacios de nombres y cdigo que no es
de espacio de nombres
<?php
declare(encoding='UTF-8');
namespace MiProyecto {

const CONECTAR_OK = 1;
class Conexin { /* ... */ }
function conectar() { /* ... */ }
}

namespace { // cdigo global
session_start();
$a = MiProyecto\conectar();
echo MiProyecto\Conexin::iniciar();
}
?>


Usar espacios de nombres: Lo bsico
(PHP 5 >= 5.3.0)
Antes de hablar del uso de los espacios de nombres es importante entender cmo
sabe PHP qu elemento del cdigo del espacio de nombre se requiere. Se puede
hacer una simple analoga entre los espacios de nombres de PHP y el sistema de
archivos. Existen tres maneras de acceder a un archivo en el sistema de archivos:
1. Nombre de archivo relativo como foo.txt. Esto se resuelve
con directorioactual/foo.txt donde directorioactual es el directorio
actualmente ocupado. Por lo que si el directorio actual es /home/foo, el
nombre se resuelve con /home/foo/foo.txt.
2. Nombre de ruta relativa como subdirectorio/foo.txt. Esto se resuelve
con directorioactual/subdirectorio/foo.txt.
3. Nombre de ruta absoluto como /main/foo.txt. Esto se resuelve
con /main/foo.txt.
Se puede aplicar el mismo principio a los elementos del espacio de nombres de
PHP. Por ejemplo, se puede hacer referencia a un nombre de una clase de tres
maneras:
1. Nombre no cualificado, o nombre de clase sin prefijo como $a = new
foo(); o foo::mtodoesttico();. Si el espacio de nombres actual
esespaciodenombresactual, esto se resuelve
con espaciodenombresactual\foo. Si el cdigo es global, no es de
espacio de nombres, esto se resuelve con foo. Una advertencia: los
nombres no cualificados para funciones y constantes se resolvern con
funciones y constantes globales si la funcin o la constante del espacio de
nombres no est definida. Vase Usar espacios de nombres: una alternativa
a funciones/constantes globales para ms detalles.
2. Nombre cualificado, o un nombre de clase con prefijo como $a = new
subespaciodenombres\foo(); osubespaciodenombres\foo::mtodoe
sttico();. Si el espacio de nombres actual es espaciodenombresactual,
esto se resuelve
conespaciodenombresactual\subespaciodenombres\foo. Si el cdigo
es global, no es de espacio de nombres, esto se resuelve
consubespaciodenombres\foo.
3. Nombre completamente cualificado, o un nombre con prefijo con el
operador de prefijo global como $a = new
\espaciodenombresactual\foo(); o \espaciodenombresactual\foo::
mtodoesttico();. Esto siempre se resuelve con nombre literal
especificado en el cdigo, espaciodenombresactual\foo.
Aqu hay un ejemplo de los tres tipos de sintaxis en cdigo real:
archivo1.php


<?php
namespace Foo\Bar\subespaciodenombres;

const FOO = 1;
function foo() {}
class foo
{
static function mtodoesttico() {}
}
?>
archivo2.php
<?php
namespace Foo\Bar;
include 'archivo1.php';

const FOO = 2;
function foo() {}
class foo
{
static function mtodoesttico() {}
}

/* Nombre no cualificado */
foo(); // se resuelve con la funcin Foo\Bar\foo
foo::mtodoesttico(); // se resuelve con la clase Foo\Bar\foo, mtodo mtodoest
tico
echo FOO; // se resuelve con la constante Foo\Bar\FOO

/* Nombre cualificado */
subespaciodenombres\foo(); // se resuelve con la funcin Foo\Bar\subespaciodenom
bres\foo
subespaciodenombres\foo::mtodoesttico(); // se resuelve con la clase Foo\Bar\s
ubespaciodenombres\foo,
// mtodo mtodoesttico
echo subespaciodenombres\FOO; // se resuelve con la constante Foo\Bar\subespacio
denombres\FOO

/* Nombre conmpletamente cualificado */
\Foo\Bar\foo(); // se resuelve con la funcin Foo\Bar\foo
\Foo\Bar\foo::mtodoesttico(); // se resuelve con la clase Foo\Bar\foo, mtodo
mtodoesttico
echo \Foo\Bar\FOO; // se resuelve con la constante Foo\Bar\FOO
?>


Observe que para acceder a cualquier clase, funcin o constante globales, se
puede usar un nombre completamente cualificado,
como \strlen() o\Exception o \INI_ALL.
Ejemplo #1 Acceder a clases, funciones y constantes globales desde un
espacio de nombres
<?php
namespace Foo;

function strlen() {}
const INI_ALL = 3;
class Exception {}

$a = \strlen('hola'); // llama a la funcin global strlen
$b = \INI_ALL; // accede a la constante global INI_ALL
$c = new \Exception('error'); // instancia a la clase global Exception
?>
Espacios de Nombres y caractersticas dinmicas del
lenguaje
(PHP 5 >= 5.3.0)
La implementacin de PHP de los espacios de nombres est influenciada por su
naturaleza dinmica como lenguaje de programacin. As, para convertir cdigo
como el del siguiente ejemplo en cdigo de espacios de nombres:
Ejemplo #1 Acceder dinmicamente a elementos
ejemplo1.php:
<?php
class nombreclase
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function nombrefunc()
{
echo __FUNCTION__,"\n";
}
const nombreconst = "global";

$a = 'nombreclase';
$obj = new $a; // imprime nombreclase::__construct
$b = 'nombrefunc';
$b(); // imprime nombrefunc


echo constant('nombreconst'), "\n"; // imprime global
?>
Se debe usar el nombre completamente cualificado (nombre de clase con prefijo
de espacio de nombres). Observe que ya que no hay diferencia entre un nombre
cualificado y uno completamente cualificado dentro de un nombre de clase,
funcin, o constante dinmicas, no es necesario la barra invertida inicial.
Ejemplo #2 Acceder dinmicamente a elementos de un espacio de
nombres
<?php
namespace nombreespaciodenombres;
class nombreclase
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function nombrefunc()
{
echo __FUNCTION__,"\n";
}
const nombreconst = "de espacio de nombres";

include 'ejemplo1.php';

$a = 'nombreclase';
$obj = new $a; // imprime nombreclase::__construct
$b = 'nombrefunc';
$b(); // imprime nombrefunc
echo constant('nombreconst'), "\n"; // imprime global

/* observe que si se usan comillas dobles, se debe usar "\\nombreespaciodenombre
s\\nombreclase" */
$a = '\nombreespaciodenombres\nombreclase';
$obj = new $a; // imprime nombreespaciodenombres\nombreclase::__construct
$a = 'nombreespaciodenombres\nombreclase';
$obj = new $a; // tambin imprime nombreespaciodenombres\nombreclase::__construc
t
$b = 'nombreespaciodenombres\nombrefunc';
$b(); // imprime nombreespaciodenombres\nombrefunc
$b = '\nombreespaciodenombres\nombrefunc';
$b(); // tambin imprime nombreespaciodenombres\nombrefunc
echo constant('\nombreespaciodenombres\nombreconst'), "\n"; // imprime de espaci
o de nombres
echo constant('nombreespaciodenombres\nombreconst'), "\n"; // tambin imprime de


espacio de nombres
?>
Asegrese de leer la nota sobre escapar nombres de espacios de nombres en
cadenas.
La palabra clave namespace y la constante
__NAMESPACE__
(PHP 5 >= 5.3.0)
PHP soporta dos formas de acceder de manera abstracta a elementos dentro del
espacio de nombres actual, la constante mgica __NAMESPACE__, y la palabra
clave namespace.
El valor de __NAMESPACE__ es una cadena que contiene el nombre del espacio de
nombres actual. En cdigo global, cdigo que no es de espacio de nombres,
contiene una cadena vaca.
Ejemplo #1 Ejemplo de __NAMESPACE__, cdigo de espacio de nombres
<?php
namespace MiProyecto;

echo '"', __NAMESPACE__, '"'; // imprime "MiProyecto"
?>
Ejemplo #2 Ejemplo de __NAMESPACE__, cdigo global
<?php

echo '"', __NAMESPACE__, '"'; // imprime ""
?>
La constante __NAMESPACE__ es til para construir nombres dinmicamente, por
ejemplo:
Ejemplo #3 usar __NAMESPACE__ para la construccin dinmica de
nombres
<?php
namespace MiProyecto;

function obtener($nombreclase)
{
$a = __NAMESPACE__ . '\\' . $nombreclase;
return new $a;
}
?>


La palabra clave namespace se puede usar para solicitar explcitamente un
elemento del espacio de nombres o subespacio de nombres actual. Es el espacio
de nombres equivalente al operador self de las clases.
Ejemplo #4 El operador namespace, dentro de un espacio de nombres
<?php
namespace MiProyecto;

use blah\blah as mo; // vase "Usar espacios de nombres: Apodar/Importar"

blah\mo(); // llama a la funcin MiProyecto\blah\mo()
namespace\blah\mo(); // llama a la funcin MiProyecto\blah\mo()

namespace\func(); // llama a la funcin MiProyecto\func()
namespace\sub\func(); // llama a la funcin MiProyecto\sub\func()
namespace\nombrec::mtodo(); // llama al mtodo esttico "mtodo" de la clase Mi
Proyecto\nombrec
$a = new namespace\sub\nombrec(); // instancia un objeto de la clase MiProyecto\
sub\nombrec
$b = namespace\CONSTANTE; // asigna el valor de la constante MiProyecto\CONSTANT
E a $b
?>
Ejemplo #5 El operador namespace, en cdigo global
<?php

namespace\func(); // llama a la funcin func()
namespace\sub\func(); // llama a la funcin sub\func()
namespace\nombrec::mtodo(); // llama al mtodo esttico "mtodo" de la clase no
mbrec
$a = new namespace\sub\nombrec(); // instancia un objeto de la clase sub\nombrec
$b = namespace\CONSTANTE; // asigna el valor de la constante CONSTANTE a $b
?>
Usar espacios de nombres: Apodar/Importar
(PHP 5 >= 5.3.0)
La capacidad de referirse a un nombre completamente cualificado externo con un
alias, o importar, es una caracterstca importante de los espacios de nombres. Esto
es similar a la capacidad de los sistemas de archivos basados en Unix de crear
enlaces simblicos a un archivo o directorio.
Los espacios de nombres de PHP soportan tres tipos de poner alias o importar:
apodar un nombre de clase, apodar un nombre de interfaz, y apodar un nombre de
espacio de nombres. Observe que importar una funcin o una constante no est
soportado.


En PHP, apodar se lleva a cabo con el operador use. Aqu hay un ejemplo que
muestra los tres tipos de importacin:
Ejemplo #1 Importar/apodar con el operador use
<?php
namespace foo;
use Mi\Completo\NombreDeClase as Otra;

// esto es lo mismo que usar Mi\Completo\NombreEN as NombreEN
use Mi\Completo\NombreEN;

// importar una clase global
use ArrayObject;

$obj = new namespace\Otra; // instancia un objeto de la clase foo\Otra
$obj = new Otra; // instancia un objeto de la clase class Mi\Completo\NombreDeCl
ase
NombreEN\suben\func(); // llama a la funcin Mi\Completo\NombreEN\subes\func
$a = new ArrayObject(array(1)); // instancia un objeto de la clase ArrayObject
// sin el "use ArrayObject" instanciaramos un objeto de la clase foo\ArrayObjec
t
?>
Observe que para los nombres de espacios de nombres (nombres de espacios de
nombres completamente cualificados que contienen el separador de espacios de
nombres, como Foo\Bar en oposicin a los nombres globales que no lo contienen,
como FooBar), no es necesaria y no est recomendada la barra invertida inicial,
ya que los nombres importados deben ser completamente cualificados, y no son
procesados en relacin al espacio de nombres actual.
PHP soporta adicionalmente un atajo apropiado para poner mltiples sentencias
use en la misma lnea
Ejemplo #2 Importar/apodar con el operador use, mltiples sentencias
use combinadas
<?php
use Mi\Completo\NombreDeClase as Otra, Mi\Completo\NombreEN;

$obj = new Otra; // instancia un objeto de la clase Mi\Completo\NombreDeClase
NombreEN\suben\func(); // llama a la funcin Mi\Completo\NombreEN\suben\func
?>
La importacin se realiza en tiempo de compilacin, y al hacerlo no afecta a los
nombres de clases, funciones o constantes.
Ejemplo #3 La importacin y los nombres dinmicos


<?php
use Mi\Completo\NombreDeClase as Otra, Mi\Completo\NombreEN;

$obj = new Otra; // instancia un objeto de la clase Mi\Completo\NombreDeClase
$a = 'Otra';
$obj = new $a; // instancia un objeto de la clase Otra
?>
Adems, la importacin slo afecta a los nombres no cualificados y cualificados.
Los nombres completamente cualificados son absolutos, y no son afectados por la
importacin.
Ejemplo #4 La importacin y los nombres completamente cualificados
<?php
use Mi\Completo\NombreDeClase as Otra, Mi\Completo\NombreEN;

$obj = new Otra; // instancia un objeto de la clase Mi\Completo\NombreDeClase
$obj = new \Otra; // instancia un objeto de la clase Otra
$obj = new Otra\cosa; // instancia un objeto de la clase Mi\Completo\NombreDeCla
se\cosa
$obj = new \Otra\cosa; // instancia un objeto de la clase Otra\cosa
?>
Reglas de mbito para la importacin
La palabra clave use debe ser declarada en el mbito exterior de un fichero (el
mbito global) o dentro de declaraciones de espacios de nombres. Esto es porque
la importacin se realiza en tiempo de compilacin y no en tiempo de ejecucin,
por lo que no puede ser delimitada en bloque. El siguiente ejemplo mostrar un
uso ilegal de la palabra clave use:
Ejemplo #5 Regla de importacin ilegal
<?php
namespace Languages;

class Greenlandic
{
use Languages\Danish;

...
}
?>
Nota:
Las reglas de importacin tiene una base por fichero, lo que significa que los
archivos incluidos NO heredarn las reglas de importacin del padre.


Espacio global
(PHP 5 >= 5.3.0)
Sin ninguna definicin de espacios de nombres, todas las definiciones de clases y
funciones son colocadas en el espacio global - como si lo estuvieran antes de que
PHP soportara los espacios de nombres. Prefijar un nombre con \ especificar que
el nombre es requerido desde el espacio global incluso en el contexto del espacio
de nombres.
Ejemplo #1 Usar la especificacin de espacio global
<?php
namespace A\B\C;

/* Esta funcin es A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // llamar a fopen global
return $f;
}
?>
Reglas de resolucin de nombres
(PHP 5 >= 5.3.0)
Aqu hay algunas definiciones importantes para los propsitos de estas reglas de
resolucin:
Definiciones de nombres de espacios de nombres
Nombre no cualificado
Es un identificador sin un separador de espacios de nombres, como Foo
Nombre cualificado
Es un identificador con un separador de espacios de nombres,
como Foo\Bar
Nombre completamente cualificado
Es un identificador con un separador de espacios de nombres que comienza
con un separador de espacios de nombres,
como \Foo\Bar.namespace\Foo tambin es un nombre completamente
cualificado.
Los nombres se resuelven siguiendo estas reglas de resolucin:


1. Las llamadas a clases, funciones o constantes completamente
cualificadas se resuleven en tiempo de compilacin. Por
ejemplo new \A\B se resuelve con la clase A\B.
2. Todos los nombres no cualificados y cualificados (no los
completamente cualificados) se traducen durante la
compilacin segn las reglas de importacin actuales. Por
ejemplo, si el espacio de nombres A\B\C se importa como C,
una llamada a C\D\e() se traduce a A\B\C\D\e().
3. Dentro de un espacio de nombres, todos los nombres
cualificados no traducidos segn la reglas de importacin
tienen aadido al inicio el espacio de nombres actual. Por
ejemplo, si una llamada a C\D\e() se lleva a cabo dentro del
espacio de nombres A\B, es traduce aA\B\C\D\e().
4. Los nombres de clases no cualificados se traducen durante la
compilacin segn las reglas de importacin actuales (el
nombre completo sustituido por el nombre abreviado
importado). Por ejemplo, si el espacio de nombres A\B\C se
importa como C, new C() se traduce a new A\B\C().
5. Dentro de un espacio de nombres (digamos A\B), las llamdas
a funciones no cualificadas se resuelven en tiempo de
ejecucin. Aqu se muestra cmo se resuelve una llamada a la
funcin foo():
1. Se busca una funcin desde el espacio de nombres
actual: A\B\foo().
2. Se intenta encontrar y llamar a la funcin global foo().
6. Dentro de un espacio de nombres (digamos A\B), las
llamadas a nombres de clases no cualificados o cualificados
(no los completamente cualificados) se resuelve en tiempo de
ejecucin. Aqu se muestra cmo se resuelve una llamada
a new C() o a new D\E(). Para new C():
1. Se busca una clase desde el espacio de nombres
actual: A\B\C.
2. Se intenta autocargar A\B\C.
Para new D\E():
3. Se busca una clase aadiendo al inicio el espacio de
nombres actual: A\B\D\E.
4. Se intenta autocargar A\B\D\E.
Para referenciar cualquier clase global en el espacio de
nombres global, se debe usar su nombre completamente
cualificado new \C().
Ejemplo #1 Las resoluciones de nombres ilustradas
<?php
namespace A;
use B\D, C\E as F;



// llamadas a funciones

foo(); // primero se intenta llamar a "foo" definida en el esp
acio de nombres "A"
// despus se llama a la funcin global "foo"

\foo(); // se llama a la funcin "foo" definidia en el mbito g
lobal

mi\foo(); // se llama a la funcin "foo" definida en el espacio d
e nombres "A\mi"

F(); // primero se intenta llamar a "F" definida en el espac
io de nombres "A"
// despus se llama a la funcin global "F"

// referecias a clases

new B(); // crea un objeto de la clase "B" definida en el espaci
o de nombres "A"
// si no se encuentra, se intenta autocargar la clase "
A\B"

new D(); // usando las reglas de importacin, se crea un objeto
de la clase "D" definida en el
// espacio de nombres "B"
// si no se encuentra, se intenta autocargar la clase "
B\D"

new F(); // usando las reglas de importacin, se crea un objeto
de la clase "E" definida en el
// espacio de nombres "C"
// si no se encuentra, se intenta autocargar la clase "
C\E"

new \B(); // crea un objeto de la clase "B" definida en el mbito
global
// si no se encuentra, se intenta autocargar la clase "
B"

new \D(); // crea un objeto de la clase "D" definida en el mbito
global
// si no se encuentra, se intenta autocargar la clase "
D"

new \F(); // crea un objeto de la clase "F" definida en el mbito
global
// si no se encuentra, se intenta autocargar la clase "


F"

// mtodos estticos/funciones de espacio de nombres desde otro esp
acio de nombres

B\foo(); // se llama a la funcin "foo" desde el espacio de nomb
res "A\B"

B::foo(); // se llama al mtodo "foo" de la clase "B" definidia e
n el espacio de nombres "A"
// si no se encuentra la clase "A\B", se intenta autoca
rgar la clase "A\B"

D::foo(); // usando las reglas de importacin, se llama al mtodo
"foo" de la clase "D"
// definida en el espacio de nombres "B"
// si no se encuentra la clase "B\D", se intenta autoca
rgar la clase "B\D"

\B\foo(); // se llama a la funcin "foo" desde el espacio de nomb
res "B"

\B::foo(); // se llama al mtodo "foo" de la clase "B" desde el m
bito global
// si no es encuentra la clase "B", se intenta autocarg
ar la clase "B"

// mtodos estticos/funciones de espacio de nombres del espacio de
nombres actual

A\B::foo(); // se llama al mtodo "foo" de la clase "B" desde el
espacio de nombres "A\A"
// si no se encuentra la clase "A\A\B", se intenta au
tocargar la clase "A\A\B"

\A\B::foo(); // se llama al mtodo "foo" de la clase "B" desde el
espacio de nombres "A"
// si no se encuentra la clase "A\B", se intenta auto
cargar la clase "A\B"
?>


FAQ: cosas que se necesitan saber sobre los espacios de nombres
Usar espacios de nombres: una alternativa a funciones/constantes
globales


FAQ: cosas que se necesitan saber sobre los espacios de
nombres
(PHP 5 >= 5.3.0)
Esta FAQ est dividida en dos secciones: preguntas comunes, y algunas
especificaciones de implementacin que son tiles para comprenderlos
completamente.
Primero, las preguntas comunes.
1. Si no utilizo espacios de nombres, debera preocuparme por algo de esto?
2. Cmo uso clases internas o globales en un espacio de nombres?
3. Cmo uso clases, funciones o constantes de espacios de nombres en su
propio espacio de nombres?
4. Cmo se resuelve un nombre como \mi\nombre o \nombre?
5. Cmo se resuelve un nombre como mi\nombre?
6. Cmo se resuelve un nombre de clase no cualificado como nombre?
7. Cmo se resuelve un nombre de funcin o de constante no cualifcado
como nombre?
Existen unos pocos detalles de implementacin de las implementaciones de
espacios de nombres que son tiles para enterderlos.
1. Importar nombres no entra en conflicto con las clases definidas en el mismo
archivo.
2. Los espacios de nombres anidados no estn permitidos.
3. Ni las funciones ni las constantes se pueden importar mediante la
sentencia use.
4. Los nombres de espacios de nombres dinmicos (identificadores entre
comillas) deberan escaparse con una barra invertida.
5. Las Constantes No Definidas referenciadas usando cualquier barra invertida
mueren con un error fatal
6. No se pueden sobrescribir las constantes especiales NULL, TRUE, FALSE,
ZEND_THREAD_SAFE o ZEND_DEBUG_BUILD
Si no utilizo espacios de nombres, debera preocuparme por algo
de esto?
No. Los espacios de nombres no afectan a ningn cdigo existente de ninguna
manera, o a ningn cdigo todava por escribir que no contenga espacios de
nombres. Se puede escribir este cdigo si se desea:
Ejemplo #1 Acceder a clases globales fuera de un espacio de nombres
<?php
$a = new \stdClass;
?>


Esto es funcionalmente equivalente a:
Ejemplo #2 Acceder a clases globales fuera de un espacio de nombres
<?php
$a = new stdClass;
?>
Cmo uso clases internas o globales en un espacio de nombres?
Ejemplo #3 Acceder a clases internas en espacios de nombres
<?php
namespace foo;
$a = new \stdClass;

function probar(\ArrayObject $ejemploalusinatipo = null) {}

$a = \DirectoryIterator::CURRENT_AS_FILEINFO;

// extender una clase interna o global
class MiExcepcin extends \Exception {}
?>
Cmo uso clases, funciones o constantes de espacios de nombres
en su propio espacio de nombres?
Ejemplo #4 Acceder a clases, funciones o constantes internas en un
espacio de nombres
<?php
namespace foo;

class MiClase {}

// usar una clase desde el espacio de nombres actual como una alusin a tipo
function probar(MiClase $ejemploalusinatipo = null) {}
// otra manera de usar una clase desde el espacio de nombres actual una alusin
a tipo
function probar(\foo\MiClase $ejemploalusinatipo = null) {}

// extender una clase desde el espacio de nombres actual
class Extendida extends MiClase {}

// acceder a una funcin global
$a = \funcglobal();

// acceder a una constante global
$b = \INI_ALL;
?>


Cmo se resuelve un nombre como \mi\nombre o \nombre?
Los nombres que comienzan con una \ siempre se resuelven a aquello que
parecen, as \mi\nombre de hecho es mi\nombre, y \Exception esException.
Ejemplo #5 Nombres Completamente Cualificados
<?php
namespace foo;
$a = new \mi\nombre(); // instancia a la clase "mi\nombre"
echo \strlen('hola'); // llama a la funcin "strlen"
$a = \INI_ALL; // $a est establecida al valor de la constante "INI_ALL"
?>
Cmo se resuelve un nombre como mi\nombre?
Los nombres que contienen una barra invertida pero no comienzan con una barra
invertida como mi\nombre pueden resolverse de 2 formas diferentes.
Si hay una sentencia de importacin que apode a otro nombre como mi, el alias de
importacin se aplica a mi en mi\nombre.
De otro modo, al nombre del espacio de nombres actual se le aade al
inicio mi\nombre.
Ejemplo #6 Nombres Cualificados
<?php
namespace foo;
use blah\blah as foo;

$a = new mi\nombre(); // instancia a la clase "foo\mi\nombre"
foo\bar::nombre(); // llama a mtodo esttico "nombre" de la clase "blah\blah\ba
r"
mi\bar(); // llama a la funcin "foo\mi\bar"
$a = mi\BAR; // establece $a al valor de la constante "foo\mi\BAR"
?>
Cmo se resuelve un nombre de clase no cualificado
como nombre?
Los nombres de clases que no contienen una barra invertida como nombre se
pueden resolver de 2 formas diferentes.
Si hay una sentencia de importacin que apode a otro nombre como nombre, se
aplica el alias de importacin.
De otro modo, al nombre del espacio de nombres actual se le aade al
inicio nombre.


Ejemplo #7 Nombres de clases no cualificados
<?php
namespace foo;
use blah\blah as foo;

$a = new nombre(); // instancia a la clase "foo\nombre"
foo::nombre(); // llama al mtodo esttico "nombre" de la clase "blah\blah"
?>
Cmo se resuelve un nombre de funcin o de constante no
cualifcado como nombre?
Los nombres de funciones o de constantes que no contienen una barra invertida
como nombre se pueden resolver de 2 formas diferentes.
Primero, al nombre del espacio de nombres actual se le aade al inicio nombre.
Finalmente, si el nombre de la constante o de la funcin no existe en el espacio
de nombres actual, se usa un nombre de constante o funcin global si es que
existe.
Ejemplo #8 Nombres de funciones o constantes no cualificados
<?php
namespace foo;
use blah\blah as foo;

const FOO = 1;

function mi() {}
function foo() {}
function sort(&$a)
{
\sort($a); // invoca a la funcin global "sort"
$a = array_flip($a);
return $a;
}

mi(); // calls "foo\mi"
$a = strlen('hola'); // llama a la funcin global "strlen" ya que "foo\strlen" n
o existe
$matriz = array(1,3,2);
$b = sort($matriz); // llama a la funcin "foo\sort"
$c = foo(); // llama a la funcin "foo\foo" - la importacin no se aplica

$a = FOO; // establece $a al valor de la constante "foo\FOO" -
la importacin no se aplica
$b = INI_ALL; // establece $b al valor de la constante "INI_ALL"
?>


Importar nombres no entra en conflicto con las clases definidas en
el mismo archivo.
Las siguientes combinaciones de scripts est permitidas:
archivo1.php
<?php
namespace mis\cosas;
class MiClase {}
?>
otro.php
<?php
namespace otro;
class cosa {}
?>
archivo2.php
<?php
namespace mis\cosas;
include 'archivo1.php';
include 'otro.php';

use otro\cosa as MiClase;
$a = new MiClase; // instancia a la clase "cosa" desde el espacio de nombres otr
o
?>
No existe conflicto entre nombres, aunque la clase MiClase exista dentro del
espacio de nombres mis\cosas, porque la definicin de MiClase est en otro
archivo. Sin embargo, el siguiente ejemplo causa un error fatal con conflicto de
nombres ya que MiClase est definida en el mismo archivo que el de la sentencia
use.
<?php
namespace mis\cosas;
use otro\cosa as MiClase;
class MiClase {} // error fatal: MiClase entra en conflicto con la sentencia de
importacin
$a = new MiClase;
?>
Los espacios de nombres anidados no estn permitidos.
PHP no permite los espacios de nombres anidados


<?php
namespace mis\cosas {
namespace anidado {
class foo {}
}
}
?>
Sin embargo, es fcil simular los espacios de nombres anidados, de la siguiente
manera:
<?php
namespace mis\cosas\anidado {
class foo {}
}
?>
Ni las funciones ni las constantes se pueden importar mediante la
sentencia use.
Los nicos elementos que son afectados por la sentencia use son los espacios de
nombres y los nombres de clases. Para abreviar una constante o funcin largas,
importe el espacio de nombres que la contiene
<?php
namespace mo;
use nombre\en\ultra\largo;

$a = largo\CONSTANT;
largo\func();
?>
Los nombres de espacios de nombres dinmicos (identificadores
entre comillas) deberan escaparse con una barra invertida.
Es muy importante darse cuenta de que ya que la barra invertida se usa como
carcter de escape dentro de cadenas, se deberan usar dobles cuando se utilizan
dentro de cadenas. Si no, existe el riesgo de obtener consecuencias inesperadas:
Ejemplo #9 Peligros de usar nombres de espacios de nombres dentro de
una cadena entre comillas dobles
<?php
$a = new "peligro\nombre"; // \n es una nueva lnea dentro de las cadenas entre
comillas dobles!
$obj = new $a;

$a = new 'sin\peligro\alguno'; // aqu sin problemas.


$obj = new $a;
?>
Dentro de una cadena entre comillas dobles, es ms seguro usar la secuencia de
escape de la barra invertida, pero an se recomienda como prctica escapar las
barras invertidas en todas las cadenas.
Las Constantes No Definidas referenciadas usando cualquier barra
invertida mueren con un error fatal
Cualquier constante no definida que no es cualificada como FOO producir una
aviso explicando que PHP asume que FOO es el valor de la constante. Cualquier
constante, cualificada o completamente cualificada, que contenga una barra
invertida producir un error fatal si no es encontrada.
Ejemplo #10 Constantes no definidas
<?php
namespace bar;
$a = FOO; // produce un aviso -
constante no definida "FOO" se asume que es "FOO";
$a = \FOO; // error fatal, constante FOO del espacio de nombres no definida
$a = Bar\FOO; // error fatal, constante bar\Bar\FOO del espacio de nombres no de
finida
$a = \Bar\FOO; // error fatal, constante Bar\FOO del espacio de nombres no defin
ida
?>
No se pueden sobrescribir las constantes especiales NULL, TRUE,
FALSE, ZEND_THREAD_SAFE o ZEND_DEBUG_BUILD
Cualquier intento de definir una constante de espacio de nombres que sea
especial, constante interna, resultar en un error fatal
Ejemplo #11 Constantes no definidas
<?php
namespace bar;
const NULL = 0; // error fatal;
const true = 'estpido'; // tambin error fatal;
// etc.
?>
Excepciones
Tabla de contenidos
Ampliar las Excepciones


PHP 5 tiene un modelo de excepciones similar al de otros lenguajes de
programacin. Una excepcin puede ser lanzada (thrown), y atrapada
("catched") dentro de PHP. El cdigo puede estar dentro de un bloque try, para
facilitar la captura de excepciones potenciales. Cada bloque trydebe tener al
menos un bloque catch correspondiente. Se pueden usar mltiples
bloques catch para atrapar diferentes clases de excepciones. La ejecucin normal
(cuando no es lanzada ninguna excepcin dentro del bloque try, o cuando un
bloque catch que coincide con la clase de la excepcin lanzada no est presente)
continuar despus del ltimo bloque catch definido en la sencuencia. Las
excepciones pueden ser lanzadas(o relanzadas) dentro de un bloque catch.
Cuando una excepcin es lanzada, el cdigo siguiente a la declaracin no ser
ejecutado, y PHP intentar encontrar el primer bloque catchconicidente. Si una
excepcin no es capturada, se emitir un Error Fatal de PHP con un mensaje
"Uncaught Exception ..." ("Excepcin No Capturada"), a menos que se haya
definido un gestor con set_exception_handler().
En PHP 5.5 y posteriores, se puede utilizar un bloque finally despus de los
bloques catch. El cdigo de dentro del bloque finally siempre se ejecutar
despus de los bloques try y catch, independientemente de que se haya lanzado
una excepcin o no, y antes de que el flujo normal de ejecucin contine.
El objeto lanzado debe ser una instancia de la clase Exception o de una subclase
de Exception. Intentar lanzar un objeto que no lo es resultar en un Error Fatal de
PHP.
Nota:
Las funciones internas de PHP utilizan principalmente Informacin de Errores, slo
las extensiones Orientadas a objetos modernas utilizan excepciones. Sin embargo,
los errores se pueden traducir a excepciones simplemente con ErrorException.
Sugerencia
Standard PHP Library (SPL) - (Biblioteca PHP Estndar) proporciona un buen
nmero de excepciones internas.
Ejemplo #1 Lanzar una Excepcin
<?php
function inverso($x) {
if (!$x) {
throw new Exception('Divisin por cero.');
}
return 1/$x;
}

try {
echo inverso(5) . "\n";
echo inverso(0) . "\n";


} catch (Exception $e) {
echo 'Excepcin capturada: ', $e->getMessage(), "\n";
}

// Continuar la ejecucin
echo 'Hola Mundo\n';
?>
El resultado del ejemplo sera:
0.2
Excepcin capturada: Divisin por cero.
Hola Mundo
Ejemplo #2 Manejo de excepciones con un bloque finally
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Divisin por cero.');
}
return 1/$x;
}

try {
echo inverse(5) . "\n";
} catch (Exception $e) {
echo 'Excepcin capturada: ', $e->getMessage(), "\n";
} finally {
echo "Primer finally.\n";
}

try {
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Excepcin capturada: ', $e->getMessage(), "\n";
} finally {
echo "Segundo finally.\n";
}

// Continuar ejecucin
echo 'Hola Mundo\n';
?>
El resultado del ejemplo sera:
0.2
Primer finally.
Excepcin capturada: Divisin por cero.
Segundo finally.
Hola Mundo
Ejemplo #3 Excepciones Anidadas


<?php

class MiExcepcin extends Exception { }

class Prueba {
public function probar() {
try {
try {
throw new MiExcepcin('foo!');
} catch (MiExcepcin $e) {
// relanzarla
throw $e;
}
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}

$foo = new Prueba;
$foo->probar();

?>
El resultado del ejemplo sera:
string(4) "foo!"
Ampliar las Excepciones
Una clase de Excepcin definida por el usuario puede ser definida ampliando la
clase Exception interna. Los miembros y las propiedades de abajo muestran lo que
es accesible dentro de la clase hija que deriva de la clase Exception interna.
Ejemplo #1 La clase Exception Interna
<?php
class Exception
{
protected $message = 'Unknown exception'; // mensaje de excepcin
private $string; // cach de __toString
protected $code = 0; // cdigo de excepcin definido
por el usuario
protected $file; // nombre de archivo fuente de l
a excepcin
protected $line; // lnea fuente de la excepcin
private $trace; // determinacin del origen
private $previous; // excepcin previa si la excepc
in est anidada



public function __construct($message = null, $code = 0, Exception $previous
= null);

final private function __clone(); // Inhibe la clonacin de excepc
iones.

final public function getMessage(); // mensaje de excepcin
final public function getCode(); // cdigo de excepcin
final public function getFile(); // nombre de archivo fuente
final public function getLine(); // lnea fuente
final public function getTrace(); // un array de backtrace()
final public function getPrevious(); // excepcin anterior
final public function getTraceAsString(); // string formateado del seguimi
ento del origen

// Sobrescribible
public function __toString(); // string formateado para mostra
r
}
?>
Si una clase extiende la clase Exception interna y redefine el constructor, se
recomienda encarecidamente que tambin llame a parent::__construct()para
asegurarse que toda la informacin disponible haya sido asignada apropiadamente.
El mtodo __toString() puede ser sobrescrito para proporcionar una salida
personalizada cuando el objeto es presentado como un string.
Nota:
Las excepciones no se pueden clonar. Intentar clonar una Excepcin resultar en
un error E_ERROR fatal.
Ejemplo #2 Extender la clase Exception (PHP 5.3.0+)
<?php
/**
* Definir una clase de excepcin personalizada
*/
class MiExcepcin extends Exception
{
// Redefinir la excepcin, por lo que el mensaje no es opcional
public function __construct($message, $code = 0, Exception $previous = null)
{
// algo de cdigo

// asegrese de que todo est asignado apropiadamente
parent::__construct($message, $code, $previous);
}



// representacin de cadena personalizada del objeto
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}

public function funcinPersonalizada() {
echo "Una funcin personalizada para este tipo de excepcin\n";
}
}


/**
* Crear una clase para probar la excepcin
*/
class ProbarExcepcin
{
public $var;

const THROW_NONE = 0;
const THROW_CUSTOM = 1;
const THROW_DEFAULT = 2;

function __construct($avalue = self::THROW_NONE) {

switch ($avalue) {
case self::THROW_CUSTOM:
// lanzar la excepcin personalizada
throw new MiExcepcin('1 no es un parmetro vlido', 5);
break;

case self::THROW_DEFAULT:
// lanzar la predeterminada.
throw new Exception('2 no est permitido como parmetro', 6);
break;

default:
// No hay excepcin, el objeto se crear.
$this->var = $avalue;
break;
}
}
}


// Ejemplo 1
try {
$o = new ProbarExcepcin(ProbarExcepcin::THROW_CUSTOM);
} catch (MiExcepcin $e) { // Ser atrapada


echo "Atrapada mi excepcin\n", $e;
$e->funcinPersonalizada();
} catch (Exception $e) { // Skipped
echo "Atrapada la Excepcin Predeterminada\n", $e;
}

// Continuar la ejecucin
var_dump($o); // Null
echo "\n\n";


// Ejemplo 2
try {
$o = new ProbarExcepcin(ProbarExcepcin::THROW_DEFAULT);
} catch (MiExcepcin $e) { // Este tipo no coincide
echo "Atrapada mi excepcin\n", $e;
$e->funcinPersonalizada();
} catch (Exception $e) { // Will be caught
echo "Atrapada la Excepcin Predeterminada\n", $e;
}

// Continuar la ejecucin
var_dump($o); // Null
echo "\n\n";


// Ejemplo 3
try {
$o = new ProbarExcepcin(ProbarExcepcin::THROW_CUSTOM);
} catch (Exception $e) { // Ser atrapada
echo "Atrapada la Excepcin Predeterminada\n", $e;
}

// Continuar la ejecucin
var_dump($o); // Null
echo "\n\n";


// Ejemplo 4
try {
$o = new ProbarExcepcin();
} catch (Exception $e) { // Saltado, sin excepcin
echo "Atrapada la Excepcin Predeterminada\n", $e;
}

// Continuar la ejecucin
var_dump($o); // ProbarExcepcin


echo "\n\n";
?>
Nota:
Las versiones de PHP 5, anteriores a PHP 5.3.0, no soportan excepciones
anidadas. El siguiente fragmento de cdigo se puede usar para reemplazar la clase
MiExcepcin si se desea ejecutar este ejemplo.
<?php
/**
* Definir una clase de excepcin personalizada
*/
class MiExcepcin extends Exception
{
// Redefinir la excepcin, por lo que el mensaje no es opcional
public function __construct($message, $code = 0) {
// algo de cdigo

// asegrese de que todo est asignador apropiadamente
parent::__construct($message, $code);
}

// representacin de cadena personalizada del objeto
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}

public function funcinPersonalizada() {
echo "Una funcin personalizada para este tipo de excepcin\n";
}
}
?>
Generadores
Informacin general
(PHP 5 >= 5.5.0)
Los generadores proporcionan un modo fcil de implementar iteradores simples sin
la sobrecarga o complejidad de implementar una clase que implemente la
interfaz Iterator.
Un generador permite escribir cdigo que utilice foreach para iterar sobre un
conjunto de datos sin que sea necesario cargar el array en memoria, lo que puede
ocasionar que se exceda el lmite de memoria, o requiera una cantidad
considerable de tiempo de procesado para generarse. En su lugar, se puede
escribir una funcin generadora, que es igual que una funcin normal, con la
salvedad de que en vez de hacer un solo return, un generador puede


invocar yield tantas veces como necesite para proporcionar valores por los que
iterar.
Un ejemplo simple de esto es reimplementar la funcin range() como un
generador. La funcin estndar range() tiene que generar un array con cada uno
de los valores y devolverlo, lo que puede resultar en arrays grandes: por ejemplo,
llamar range(0, 1000000) resultar en ms de 100 MB de memoria utilizada.
Como alternativa, se puede implementar un generador xrange(), que slo
necesitar memoria para crear un objeto Iterator y controlar el estado actual del
generador de manera interna, lo que no ocupa ms de 1 kilobyte.
Ejemplo #1 Implementando range() como generador
<?php
function xrange($start, $limit, $step = 1) {
if ($start < $limit) {
if ($step <= 0) {
throw new LogicException('Step tiene que ser +ve');
}

for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
} else {
if ($step >= 0) {
throw new LogicException('Step tiene que ser -ve');
}

for ($i = $start; $i >= $limit; $i += $step) {
yield $i;
}
}
}

/*
* Obsereve que tanto range() como xrange() producen la misma
* salida a continuacin.
*/

echo 'Nmeros impares de una cifra de range(): ';
foreach (range(1, 9, 2) as $number) {
echo "$number ";
}
echo "\n";

echo 'Nmeros impares de una cifra de xrange(): ';
foreach (xrange(1, 9, 2) as $number) {
echo "$number ";


}
?>
El resultado del ejemplo sera:
Nmeros impares de una cifra de range(): 1 3 5 7 9
Nmeros impares de una cifra de xrange(): 1 3 5 7 9
Generator syntax
Una funcin generadora es igual que una funcin normal, con la diferencia de que
en vez de devolver un valor, un generador invoca yield tantas veces como
necesita.
Cuando se llama a una funcin generadora, devuelve un objeto que puede ser
iterado. Cuando se itera sobre ese objeto (por ejemplo, con un bucleforeach), PHP
llamar a la funcin generadora cada vez que necesite un valor, y guardar el
estado del generador cuando este provea un valor con yield para que ese estado
pueda ser recuperado cuando el prximo valor sea requerido.
Cuando no hay ms valores que se puedan proporcionar, la funcin generadora
puede simplemente terminar, y el cdigo desde el que se la llama continuar como
si un array se hubiera quedado sin valores.
Nota:
Un generador no puede retornar un valor: hacerlo resultara en un error de
compilacin. Un return vaco es vlido en cuanto a sintaxis dentro de un
generador y terminar el generador.
yield keyword
La clave de una funcin generadora es la palabra reservada yield. En su forma
ms simple, la sentencia yield es parecida a la sentencia return, excepto en que en
vez de detener la ejecucin de la funcin y devolver un valor, yield facilita el valor
al bucle que itera sobre el generador y pausa la ejecucin de la funcin
generadora.
Ejemplo #1 Ejemplo sencillo de facilitar valores con yield
<?php
function gen_one_to_three() {
for ($i = 1; $i <= 3; $i++) {
// Observe que $i es preservado entre yields
yield $i;
}
}

$generator = gen_one_to_three();
foreach ($generator as $value) {
echo "$value\n";


}
?>
El resultado del ejemplo sera:
1
2
3
Nota:
Internamente, las claves enteras secuenciales sern asociadas con los valores
sobre los que se usa yield, como un array no asociativo.
Precaucin
Si se utiliza yield en el contexto de una expresin (por ejemplo, en el lado derecho
de una asignacin), se debe poner la sentencia yield entre parntesis. Por ejemplo,
esto es vlido:
$data = (yield $value);
Pero esto no lo es, y resultar en un error del intrprete:
$data = yield $value;
Esta sintaxis podra usarse junto con el mtodo Generator::send().
Utilizar yield para facilitar valores con claves
PHP soporta arrays asociativos, y los generadores no son menos. Adems de
facilitar valores simples, como se muestra arriba, tambin se puede facilitar una
clave al mismo tiempo.
La sintaxis para facilitar un par clave-valor es muy similar a la utilizada para definir
un array asociativo, como se muestra a continuacin.
Ejemplo #2 Facilitar un par clave-valor
<?php
/*
* La entrada son campos separados por punto y coma, con el primer
* campo siendo la ID utilizada como clave.
*/

$input = <<<'EOF'
1;PHP;Likes dollar signs
2;Python;Likes whitespace
3;Ruby;Likes blocks
EOF;



function input_parser($input) {
foreach (explode("\n", $input) as $line) {
$fields = explode(';', $line);
$id = array_shift($fields);

yield $id => $fields;
}
}

foreach (input_parser($input) as $id => $fields) {
echo "$id:\n";
echo " $fields[0]\n";
echo " $fields[1]\n";
}
?>
El resultado del ejemplo sera:
1:
PHP
Likes dollar signs
2:
Python
Likes whitespace
3:
Ruby
Likes blocks
Precaucin
Como en el ejemplo anterior, facilitar un par clave-valor en contexto de expresin
requiere que la sentencia yield sea puesta entre parntesis:
$data = (yield $key => $value);
Facilitar valores nulos
Yield puede ser invocado sin argumentos para facilitar un valor NULL con una clave
automtica.
Ejemplo #3 Yielding NULLs
<?php
function gen_three_nulls() {
foreach (range(1, 3) as $i) {
yield;
}
}

var_dump(iterator_to_array(gen_three_nulls()));
?>


El resultado del ejemplo sera:
array(3) {
[0]=>
NULL
[1]=>
NULL
[2]=>
NULL
}
Facilitar por referencia
Las funciones generadoras son capaces de facilitar valores por referencia igual que
lo hacen por valor. Esto se hace de la misma forma quedevolviendo referencias
desde funciones: poniendo un ampersand (signo &) delante del nombre de la
funcin.
Ejemplo #4 Facilitar valores por referencia
<?php
function &gen_reference() {
$value = 3;

while ($value > 0) {
yield $value;
}
}

/*
* Observe que es posible cambiar $number desde dentro del bucle, y
* dado que el generador est facilitando referencias, $value
* dentro de gen_reference() cambia.
*/
foreach (gen_reference() as &$number) {
echo (--$number).'... ';
}
?>
El resultado del ejemplo sera:
2... 1... 0...
Objetos Generator
Cuando una funcin generadora es invocada por primera vez, un objeto de la clase
interna Generator es devuelto. Este objeto implementa la interfaz Iterator en
prcticamente el mismo modo que lo hara un iterador unidireccional.


Comparacin entre generadores y objetos Iterator
La principal ventaja de los generadores es su simplicadad. Se ha de escribir mucho
menos cdigo repetitivo en comparacin con el necesario para implementar una
clase Iterator, y el cdigo es generalmente mucho ms legible. Por ejemplo, la
siguiente funcin y clase son equivalentes:
<?php
function getLinesFromFile($fileName) {
if (!$fileHandle = fopen($fileName, 'r')) {
return;
}

while (false !== $line = fgets($fileHandle)) {
yield $line;
}

fclose($fileHandle);
}

// Contra...

class LineIterator implements Iterator {
protected $fileHandle;

protected $line;
protected $i;

public function __construct($fileName) {
if (!$this->fileHandle = fopen($fileName, 'r')) {
throw new RuntimeException('Couldn\'t open file "' . $fileName . '"'
);
}
}

public function rewind() {
fseek($this->fileHandle, 0);
$this->line = fgets($this->fileHandle);
$this->i = 0;
}

public function valid() {
return false !== $this->line;
}

public function current() {
return $this->line;
}



public function key() {
return $this->i;
}

public function next() {
if (false !== $this->line) {
$this->line = fgets($this->fileHandle);
$this->i++;
}
}

public function __destruct() {
fclose($this->fileHandle);
}
}
?>
La flexibilidad, sin embargo, tiene un coste: los generadores son iteradores
unidireccionales, y no pueden ser rebobinados una vez la iteracin ha empezado.
Esto tambin significa que se puede iterar sobre el mismo generador varias veces:
el generador necesitar ser o bien reconstruido llamando a la funcin generadora
de nuevo, o bien clonado a travs de la palabra clave clone.
Qu son las Referencias?
Las Referencias en PHP son medios de acceder al mismo contenido de una variable
mediante diferentes nombres. No son como los punteros de C; por ejemplo, no se
puede realizar aritmtica de punteros con ellas, realmente no son direcciones de
memoria, etc. Vase Qu NO son las Referencias?para ms informacin. Las
referencias son alias de la tabla de smbolos. Observe que en PHP el nombre de la
variable y el contenido de la variable son cosas diferentes, por lo que el mismo
contenido puede tener diferentes nombres. La analoga ms prxima es con los
archivos y los nombres de archivos de Unix - los nombres de variables son
entradas de directorio, mientras que el contenido de las variables es el archivo en
s. Las referencias se pueden vincular a enlaces duros en sistemas de archivos
Unix.
Qu hacen las referencias?
Hay tres operaciones bsicas que se realizan usando referencias: asignar por
referencia, pasar por referencia, y devolver por referencia. En esta seccin se dar
una introduccin a estas operaciones, con enlaces para una lectura
complementaria.


Asignar por Referencia
En la primera de estas operaciones, las referencias de PHP permiten hacer que dos
variables hagan referencia al mismo contenido. Es decir, cuando se hace:
<?php
$a =& $b;
?>
significa que $a y $b apuntan al mismo contenido.
Nota:
$a y $b aqu son completamente iguales. $a no est apuntando a $b o
viceversa. $a y $b estn apuntando al mismo lugar.
Nota:
Si se asigna, pasa, o devuelve una variable no definida por referencia, la variable
se crear.
Ejemplo #1 Usar referencias con variables no definidas
<?php
function foo(&$var) { }

foo($a); // $a es "creada" y asignada a null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
Se puede usar la misma sintaxis con funciones que devuelven referencias y con el
operador new (desde PHP 4.0.4 y anterior a PHP 5.0.0):
<?php
$foo =& find_var($bar);
?>
Desde PHP 5, new devuelve una referencia automticamente, por lo que
usar =& en este contexto es obsoleto y produce un mensaje E_DEPRECATEDen PHP
5.3 y posteriores, y un mensaje E_STRICT en versiones anteriores. (Tcnicamente,
la diferencia es que, en PHP 5, las variables de objetos, como los recursos, son
meros punteros a la informacin del objeto actual, por lo que estas referencias a


objetos no son "referencias" en el mismo sentido usado antes (alias). Para ms
informacin, vase Objetos y referencias.)
Advertencia
Si se asigna una referencia a una varible declarada global dentro de una funcin,
la referencia ser visible slo dentro de la funcin. Se puede evitar esto usando la
matriz $GLOBALS.
Ejemplo #2 Refenciar variables globales dentro de funciones
<?php
$var1 = "Variable de ejemplo";
$var2 = "";

function referencias_globales($usar_globals)
{
global $var1, $var2;
if (!$usar_globals) {
$var2 =& $var1; // visible slo dentro de la funcin
} else {
$GLOBALS["var2"] =& $var1; // visible tambin en el contexto global
}
}

referencias_globales(false);
echo "var2 est establecida a '$var2'\n"; // var2 est establecida a ''
referencias_globales(true);
echo "var2 est establecida a '$var2'\n"; // var2 est establecida a 'Variable d
e ejemplo'
?>
Piense en global $var; como simplificacin de $var =& $GLOBALS['var'];. De
este modo, al asignar otra referencia a $varslo cambia la referencia de la
variable local.
Nota:
Si se asigna un valor a una variable con referencias en una sentencia foreach,
tambin se modifican las referencias.
Ejemplo #3 Referencias y la sentencia foreach
<?php
$ref = 0;
$fila =& $ref;
foreach (array(1, 2, 3) as $fila) {
// hacer algo
}


echo $ref; // 3 - ltimo elemento de la matriz iterada
?>
Mientras que no sea estrictamente una asignacin por referencia, las expresiones
creadas con el constructor de lenguaje array() tambin pueden comportarse
como tales prefijando & al elemento del array a aadir. Ejemplo:
<?php
$a = 1;
$b = array(2, 3);
$arr = array(&$a, &$b[0], &$b[1]);
$arr[0]++; $arr[1]++; $arr[2]++;
/* $a == 2, $b == array(3, 4); */
?>
Observe, sin embargo, que las referencias dentro de arrays son potencialmente
peligrosas. Realizar una asignacin normal (no por referencia) con una referencia
en el lado derecho no convierte el lado izquierdo en una referencia, pero las
referencias dentro de arrays son conservadas en estas asignaciones normales.
Esto tambin se aplica a las llamadas a funciones donde el array es pasado por
valor. Ejemplo:
<?php
/* Asignacin de variables escalares */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c no es una referencia; no cambia $a o $b

/* Asignacin de variables de array */
$arr = array(1);
$a =& $arr[0]; // $a y $arr[0] son el mismo conjunto de referencias
$arr2 = $arr; // no es una asignacin por referencia!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* El contenido de $arr se cambia incluso si no es una referencia! */
?>
En otras palabras, el comportamiento de las referencias de arrays est definido en
una base elemento-por-elemento; el comportamiento de las referencias de
elementos individuales est desasociado del estado de la referencia del array
contenedor.
Pasar por Referencia
Lo segundo que hacen las referencias es pasar variables por referencia. Esto se
lleva a cabo haciendo que una variable local en una funcin y una variable en el
mbito de la llamada referencien al mismo contenido. Ejemplo:


<?php
function foo(&$var)
{
$var++;
}

$a=5;
foo($a);
?>
har que $a sea 6. Esto sucede porque en la funcin foo la variable $var hace
referencia al mismo contenido que $a. Para ms informacin sobre esto, lea la
seccin pasar por referencia.
Devolver por Referencia
Lo tercero que hacen las referncias es devolver por referencia.
Qu NO son las Referencias?
Como se dijo antes, las referencias no son punteros. Es decir, la siguiente
construccin no har lo que se esperaba:
<?php
function foo(&$var)
{
$var =& $GLOBALS["baz"];
}
foo($bar);
?>
Lo que sucede es que $var en foo ser ligada con $bar en la llamada, pero
entonces ser religada con $GLOBALS["baz"]. No hay forma de ligar $baren el
mbito de la llamada a otra cosa usando el mecanismo de referencia, ya
que $bar no est disponible en la funcin foo (est representada por$var,
pero $var slo tiene el contenido de la variable y no la vinculacin nombre-a-valor
en la tabla de smbolos de llamada). Se puede usar devolver referencias para
referencias variables seleccionadas por la funcin.
Pasar por Referencia
Se puede pasar una variable por referencia a una funcin y as hacer que la
funcin pueda modificar la variable. La sintaxis es la siguiente:
<?php
function foo(&$var)
{
$var++;


}

$a=5;
foo($a);
// $a es 6 aqu
?>
Nota: No existe ningn signo de referencia en una llamada a una funcin - slo en
la definicin de la funcin. Las definiciones de funciones por s solas son suficientes
para pasar correctamente el argumento por referencia. A partir de PHP 5.3.0, se
obtendr una advertencia diciendo que "call-time pass-by-reference" (pasar por
referencia en tiempo de llamada) est obsoleto cuando se use & en foo(&$a);. A
partir de PHP 5.4.0, el paso por referencia en tiempo de llamada ha sido eliminado,
por lo que su uso emitir un error fatal.
Se puede pasar por referencia lo siguiente:
Variables, esto es, foo($a)
Nuevas declaraciones, esto es, foo(new foobar())
Referencias devueltas desde funciones, esto es:
<?php
function foo(&$var)
{
$var++;
}
function &bar()
{
$a = 5;
return $a;
}
foo(bar());
?>
Vea ms sobre devolver por referencia.
Ninguna otra expresin debera pasarse por referencia, ya que el resultado no est
definido. Por ejemplo, los siguientes ejemplos de pasar por referencia no son
vlidos:
<?php
function foo(&$var)
{
$var++;
}
function bar() // Observe que falta el &
{
$a = 5;


return $a;
}
foo(bar()); // Produce un error fatal a partir de PHP 5.0.5

foo($a = 5); // Expresin, no una variable
foo(5); // Produce un error fatal
?>
Estos requerimientos son para PHP 4.0.4 y posterior.
Devolver Referencias
Devolver por referencia es til cuando se quiere usar una funcin para encontrar a
qu variable debera estar vinculada una referencia. No use devolver por
referencia para aumentar el rendimiento. El motor optimizar automticamente
esto por s mismo. Hay que devolver referencias slo cuando se tenga una razn
tcnicamente vlida para hacerlo. Para devolver referencias use esta sintaxis:
<?php
class foo {
public $valor = 42;

public function &obtenerValor() {
return $this->valor;
}
}

$obj = new foo;
$miValor = &$obj->obtenerValor(); // $miValor es una referencia a $obj-
>valor, que es 42.
$obj->valor = 2;
echo $miValor; // imprime el nuevo valor de $obj-
>valor, esto es, 2.
?>
En este ejemplo, la propiedad del objeto devuelto por la
funcin obtenerValor debera estar establecida, no la copia, como si estuviera sin
usar la sintaxis de referencia.
Nota: A diferencia de pasar un parmetro, aqu se tiene que usar & en ambos
lugares - para indicar que se quiere devolver por referencia, no una copia, y para
indicar que la vinculacin por referencia, en vez de la asignacin normal, debera
ser hecha para $miValor.
Nota: Si se intenta devolver una referencia desde una funcin con la
sintaxis: return ($this->valor);, no funcionar ya que se est intentando
devolver el resultado de una expresin, y no de una variable, por referencia. Slo
se puede devolver variables por referencia desde una funcin - nada ms. Desde


PHP 4.4.0 en la rama PHP 4, y PHP 5.1.0 en la rama PHP 5, se emite un
error E_NOTICE si el cdigo intenta devolver una expresin dinmica o un resultado
del operador new.
Para usar la referencia retornada, se debe usar la asignacin por referencia:
<?php
function &collector() {
static $collection = array();
return $collection;
}
$collection = &collector();
$collection[] = 'foo';
?>
Para pasar la referencia retornada a otra funcin que espera una referencia se
puede usar la siguiente sintaxis:
<?php
function &collector() {
static $collection = array();
return $collection;
}
array_push(collector(), 'foo');
?>
Nota: Observe que array_push(&collector(), 'foo'); no funcionar, resultar
en un error fatal.
Destruir Referencias
Cuando se destruye una referencia, se rompe el vnculo entre el nombre de la
variable y el contenido de la variable. Esto no significa que el contenido de la
variable sea destruida. Por ejemplo:
<?php
$a = 1;
$b =& $a;
unset($a);
?>
no destruir $b, slo $a.
De nuevo, podra ser til pensar en esto como anlogo a una llamada a unlink de
Unix.


Ubicar las Referencias
Muchas construcciones sintcticas de PHP estn implementadas mediante el
mecanismo de referencia, por lo que todo lo mencionado aqu sobre la vinculacin
de referencias tambin se aplica a estas construcciones. Algunas construcciones,
como pasar y devolver por referencia, han sido mencionadas antes. Otras
construcciones que usan referencias son:
Referencias globales
Cuando se declara una variable como global $var, de hecho se est creando una
referencia a una variable global. Es decir, esto es lo mismo que:
<?php
$var =& $GLOBALS["var"];
?>
Esto tambin significa que al destruir $var no se destruir la variable global.
$this
En un mtodo de un objeto, $this es siempre una referencia al objeto que realiza
la llamada.
Variables predefinidas
PHP proporciona una gran cantidad de variables predefinidas para todos los
scripts. Las variables representan de todo, desde variables externashasta variables
de entorno incorporadas, desde los ltimos mensajes de error hasta los ltimos
encabezados recuperados.
Vase tambin la pregunta frecuente titulada "Cmo me afecta register_globals?"
Superglobals
Superglobals Superglobals son variables internas que estn disponibles siempre
en todos los mbitos
Descripcin
Algunas variables predefinidas en PHP son "superglobales", lo que significa que
estn disponibles en todos los mbitos a lo largo del script. No es necesario
emplear global $variable; para acceder a ellas dentro de las funciones o
mtodos.
Las variables superglobals son:


$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
Historial de cambios
Versin Descripcin
4.1.0
Las superglobals son aadidas a
PHP.
Notas
Nota: Disponibilidad de variables
Por defecto, todas las superglobals estn disponibles pero hay directivas que
afectan a su disponibilidad. Para ms informacin, vase la documentacion
de variables_order.
Nota: Tratando con register_globals
Si la directiva obsoleta register_globals tiene el valor on entonces las variables
estn tambien disponibles en el mbito global del cdigo. Por
ejemplo, $_POST['foo'] tambien existir como $foo.
Para informacin relacionada, consulte el FAQ titulado "Cmo puede afectarme
register_globals?"
Nota: Variables variables
Las variables superglobals no pueden ser usadas como variables variables dentro
de funciones o mtodos de clase.
Ver tambin
mbito de las variables
La directiva variables_order
La extensin filter
$GLOBALS


(PHP 4, PHP 5)
$GLOBALS Hace referencia a todas las variables disponibles en el mbito global
Descripcin
Es un array asociativo que contiene las referencias a todas la variables que estn
definidas en el mbito global del script. Los nombres de las variables son las claves
del array.
Ejemplos
Ejemplo #1 Ejemplo de $GLOBALS
<?php
function test() {
$foo = "variable local";

echo '$foo en el mbito global: ' . $GLOBALS["foo"] . "\n";
echo '$foo en el mbito simple: ' . $foo . "\n";
}

$foo = "Contenido de ejemplo";
test();
?>
El resultado del ejemplo sera algo similar a:
$foo en el mbito global: Contenido de ejemplo
$foo en el mbito simple: variable local
Notas
Nota:
Esta es una 'superglobal' o una variable automatic global. Significa simplemente
que es una variable que est disponible en cualquier parte del script. No hace falta
hacer global $variable; para acceder a la misma desde funciones o mtodos.
Nota: Disponibilidad de las variables
A diferencia de todas las otras superglobals, $GLOBALS ha estado
esencialmente siempre disponible en PHP. $_SERVER
$HTTP_SERVER_VARS [obsoleto]
(PHP 4 >= 4.1.0, PHP 5)
$_SERVER -- $HTTP_SERVER_VARS [obsoleto] Informacin del entorno del
servidor y de ejecucin


Descripcin
$_SERVER es un array que contiene informacin, tales como cabeceras, rutas y
localizaciones del cdigo. Las entradas en este array son creadas por el servidor
web. No existe garanta que cada servidor web proporcione todas estas entradas,
ya que existen servidores que pueden omitir algunas o proporcionar otras que no
se encuentran recogidas aqu. Un gran nmero de estas variables se encuentran
recogidas en especificacin CGI 1.1, as que al menos debe esperar encontrar
estas entradas.
$HTTP_SERVER_VARS contiene la misma informacin inicial, pero no es una
variable superglobal. (Fijese que $HTTP_SERVER_VARS y$_SERVER son diferentes
variables y que por tanto PHP las trata diferente).
ndices
Puede encontrar o no los siguientes elementos en $_SERVER. Tenga en cuenta que
si ejecuta PHP desde lnea de comando pocos o ninguno de los siguientes
elementos estarn disponibles (o tendrn algn significado).
'PHP_SELF'
El nombre del archivo de script ejecutndose actualmente, relativa al
directorio raz de documentos del servidor. Por ejemplo, el valor
de $_SERVER['PHP_SELF'] en un script ejecutado en la
direccin http://example.com/test.php/foo.bar ser/test.php/foo.bar. La
constante __FILE__ contiene la ruta completa del fichero actual, incluyendo
el nombre del archivo. Si PHP se est ejecutando como un proceso de lnea
de comando, esta variable es el nombre del script desde PHP 4.3.0. En
anteriores versiones no estaba disponible.
'argv'
Array de los argumentos enviados al script. Cuando se ejecuta el script en
lnea de comando se obtiene acceso a los parmetros de lnea de comando
con un estilo parecido a como sera en C. Cuando se ejecuta el script
mediante el mtodo GET, contendr la cadena de la consulta.
'argc'


Contiene el nmero de parmetros de lnea de comando enviados al script
(si se ejecuta en lnea de comando).
'GATEWAY_INTERFACE'
Nmero de revisin de la especificacin CGI que est empleando el
servidor, por ejemplo 'CGI/1.1'.
'SERVER_ADDR'
La direccin IP del servidor donde se est ejecutando actualmente el script.
'SERVER_NAME'
El nombre del host del servidor donde se est ejecutando actualmente el
script. Si el script se ejecuta en un host virtual se obtendr el valor del
nombre definido para dicho host virtual.
'SERVER_SOFTWARE'
Cadena de identificacin del servidor dada en las cabeceras de respuesta a
las peticiones.
'SERVER_PROTOCOL'
Nombre y nmero de revisin del protocolo de informacin a travs del cual
la pgina es solicitada, por ejemplo 'HTTP/1.0'.
'REQUEST_METHOD'
Mtodo de peticin empleado para acceder a la pgina, es decir 'GET',
'HEAD', 'POST', 'PUT'.


Nota:
El script de PHP se considera terminado despus de enviar las cabeceras (es
decir despus de producir cualquier resultado sin emplear buffers para el
resultado) si el mtodo de la peticin empleado era HEAD.
'REQUEST_TIME'
Fecha Unix de inicio de la peticin. Disponible desde PHP 5.1.0.
'REQUEST_TIME_FLOAT'
El timestamp del inicio de la solicitud, con precisin microsegundo.
Disponible desde PHP 5.4.0.
'QUERY_STRING'
Si existe, la cadena de la consulta de la peticin de la pgina.
'DOCUMENT_ROOT'
El directorio raz de documentos del servidor en el cual se est ejecutando
el script actual, segn est definida en el archivo de configuracin del
servidor.
'HTTP_ACCEPT'
Contenido de la cabecera Accept: de la peticin actual, si existe.


'HTTP_ACCEPT_CHARSET'


Contenido de la cabecera Accept-Charset: de la peticin actual, si existe.
Por ejemplo: 'iso-8859-1,*,utf-8'.
'HTTP_ACCEPT_ENCODING'
Contenido de la cabecera Accept-Encoding: de la peticin actual, si existe.
Por ejemplo: 'gzip'.
'HTTP_ACCEPT_LANGUAGE'
Contenido de la cabecera Accept-Language: de la peticin actual, si
existe. Por ejemplo: 'en'.
'HTTP_CONNECTION'
Contenido de la cabecera Connection: de la peticin actual, si existe. Por
ejemplo: 'Keep-Alive'.
'HTTP_HOST'
Contenido de la cabecera Host: de la peticin actual, si existe.
'HTTP_REFERER'
Direccin de la pagina (si la hay) que emplea el agente de usuario para la
pagina actual. Es definido por el agente de usuario. No todos los agentes de
usuarios lo definen y algunos permiten modificar HTTP_REFERER como
parte de su funcionalidad. En resumen, es un valor del que no se puede
confiar realmente.
'HTTP_USER_AGENT'
Contenido de la cabecera User-Agent: de la peticin actual, si existe.
Consiste en una cadena que indica el agente de usuario empleado para
acceder a la pagina. Un ejemplo tpico es: Mozilla/4.5 [en] (X11; U; Linux
2.2.9 i586). Entre otras opciones, puede emplear dicho valor
con get_browser() para personalizar el resultado de la salida de la pgina
en funcin de las capacidades del agente de usuario empleado.
'HTTPS'
Ofrece un valor no vaco si el script es pedido mediante el protocolo HTTPS.
Nota: Tenga en cuenta que si se emplea ISAPI con IIS el valor ser off si la
peticin no se ha realizado a travs del protocolo HTTPS.


'REMOTE_ADDR'
La direccin IP desde la cual est viendo la pgina actual el usuario.
'REMOTE_HOST'
El nombre del host desde el cual est viendo la pgina actual el usuario. La
obtencin inversa del dns est basada en laREMOTE_ADDR del usuario.
Nota: Su servidor web debe estar configurado para crear esta variable. Por
ejemplo en Apache necesita que existaHostnameLookups On dentro
de httpd.conf. Consulte tambien gethostbyaddr().
'REMOTE_PORT'
El puerto empleado por la mquina del usuario para comunicarse con el
servidor web.
'REMOTE_USER'
El usuario autenticado.
'REDIRECT_REMOTE_USER'
El usuario autenticado si la peticin es redirigida internamente.
'SCRIPT_FILENAME'
La ruta del script ejecutndose actualmente en forma absoluta.
Nota:
Si un script se ejecuta mediante CLI como ruta relativa, como por
ejemplo file.php o ../file.php,
entonces$_SERVER['SCRIPT_FILENAME'] contendr la ruta relativa
especificada por el usuario.
'SERVER_ADMIN'
El valor dado a la directiva SERVER_ADMIN (de Apache) en el archivo de
configuracin del servidor web. Si el script se est ejecutando en un host
virtual, el valor dado ser el definido para dicho host virtual.
'SERVER_PORT'


El puerto de la mquina del servidor usado por el servidor web para la
comunicacin. Para las configuraciones por omisin, el valor ser '80'; el
empleo de SSL, por ejemplo, cambiar dicho valor al valor definido para el
puerto HTTP seguro.
Nota: Bajo Apache 2, se debe establecer UseCanonicalName = On, as
como UseCanonicalPhysicalPort = On para poder obtener el puerto fsico
(real), de otro modo, este valor podra ser burlado y podra o no devolver el
valor del puerto fsico. No es seguro confiar en este valor en contextos que
requieran seguridad.
'SERVER_SIGNATURE'
Cadena que contiene la versin del servidor y el nombre del host virtual que
son aadidas a las pginas generadas por el servidor, si esta habilitada esta
funcionalidad.
'PATH_TRANSLATED'
Ruta de acceso basada en el sistema (no en el directorio raz de
documentos del servidor) del script actual, despus de cualquier mapeo de
virtual a real realizada por el servidor.
Nota: A partir de PHP 4.3.2, PATH_TRANSLATED no est definida de forma
implcita en el SAPI de Apache 2, en comparacin a la situacin de Apache
1, donde era necesario establecer el mismo valor que la variable del
servidor SCRIPT_FILENAMEcuando no era proporcionada por Apache. Este
cambio ha sido realizado para cumplir la
especificacin CGI dondePATH_TRANSLATED slo debe existir
si PATH_INFO esta definida. Los usuarios de Apache 2 pueden
emplearAcceptPathInfo = On dentro de httpd.conf para
definir PATH_INFO.
'SCRIPT_NAME'
Contiene la ruta del script actual. Esto es de utilidad para las pginas que
necesiten apuntarse a si mismas. La constante__FILE__ contiene la ruta
absoluta y el nombre del archivo actual incluido.
'REQUEST_URI'
La URI que se emple para acceder a la pgina. Por ejemplo:
'/index.html'.
'PHP_AUTH_DIGEST'


Cuando se hace autenticacin Digest HTTP, esta variable se establece para
el encabezado 'Authorization' enviado por el cliente (el cual se debe
entonces usar para hacer la validacin apropiada).
'PHP_AUTH_USER'
Cuando se hace autenticacin HTTP, esta variable se establece para el
nombre de usuario provisto por el usuario.
'PHP_AUTH_PW'
Cuando se hace autenticacin HTTP, esta variable se establece para la clave
provista por el usuario.
'AUTH_TYPE'
Cuando se hace autenticado HTTP, est variable se establece para el tipo de
autenticacin.
'PATH_INFO'
Contiene cualquier informacin sobre la ruta proporcionada por el cliente a
continuacin del nombre del fichero del script actual pero antecediendo a la
cadena de la peticin, si existe. Por ejemplo, si el script actual se accede a
travs de la
URLhttp://www.example.com/php/path_info.php/some/stuff?foo=bar,
entonces $_SERVER['PATH_INFO'] contendr /some/stuff.
'ORIG_PATH_INFO'
Versin original de 'PATH_INFO' antes de ser procesado por PHP.
Historial de cambios
Versin Descripcin
4.1.0
Se introdujo $_SERVER que
deprecaba $HTTP_SERVER_VARS.
Ejemplos
Ejemplo #1 Ejemplo de $_SERVER


<?php
echo $_SERVER['SERVER_NAME'];
?>
El resultado del ejemplo sera algo similar a:
www.example.com
Notas
Nota:
Esta es una 'superglobal' o una variable automatic global. Significa
simplemente que es una variable que est disponible en cualquier parte
del script. No hace falta hacer global $variable; para acceder a la
misma desde funciones o mtodos.
Ver tambin
Filtrado de datos
$_GET
$HTTP_GET_VARS [obsoleta]
(PHP 4 >= 4.1.0, PHP 5)
$_GET -- $HTTP_GET_VARS [obsoleta] Variables HTTP GET
Descripcin
Un array asociativo de variables pasado al script actual va parmetros URL.
$HTTP_GET_VARS contiene la misma informacin, pero no es una superglobal.
(Note que $HTTP_GET_VARS y $_GET son diferentes variables y que PHP los usa
de forma diferente)
Historial de cambios
Versin Descripcin
4.1.0
Se introduzco $_GET y $HTTP_GET_VARS qued
obsoleto.
Ejemplos
Ejemplo #1 Ejemplo de $_GET


<?php
echo 'Hola ' . htmlspecialchars($_GET["nombre"]) . '!';
?>
Asumiendo que el usuario introduzco http://example.com/?nombre=Hannes
El resultado del ejemplo sera algo similar a:
Hola Hannes!
Notas
Nota:
Esta es una 'superglobal' o una variable automatic global. Significa simplemente
que es una variable que est disponible en cualquier parte del script. No hace falta
hacer global $variable; para acceder a la misma desde funciones o mtodos.
Nota:
Las variables GET son pasadas va urldecode().
Ver tambin
Manejo de variables externas
La extensin filter
$_POST
$HTTP_POST_VARS [obsoleta]
(PHP 4 >= 4.1.0, PHP 5)
$_POST -- $HTTP_POST_VARS [obsoleta] Variables HTTP POST
Descripcin
Un array asociativo de variables pasadas al script actual a travs del mtodo HTTP
POST.
$HTTP_POST_VARS contiene la misma informacin inicial, pero no es
una superglobal. (Ntese que $HTTP_POST_VARS y $_POST son diferentes
variables y que PHP las trata de forma distinta)
Historial de cambios
Versin Descripcin
4.1.0
Se introdujo $_POST y $HTTP_POST_VARS qued


Versin Descripcin
obsoleta.
Ejemplos
Ejemplo #1 Ejemplo de $_POST
<?php
echo 'Hola ' . htmlspecialchars($_POST["nombre"]) . '!';
?>
Asumiendo que el usuario envi por el mtodo POST nombre=Juan
El resultado del ejemplo sera algo similar a:
Hola Juan!
Notas
Nota:
Esta es una 'superglobal' o una variable automatic global. Significa simplemente
que es una variable que est disponible en cualquier parte del script. No hace falta
hacer global $variable; para acceder a la misma desde funciones o mtodos.
Ver tambin
Tratando con variables externas
La extensin filter

$_FILES
$HTTP_POST_FILES [obsoleta]
(PHP 4 >= 4.1.0, PHP 5)
$_FILES -- $HTTP_POST_FILES [obsoleta] Variables de Carga de Archivos HTTP
Descripcin
Una variable tipo array asociativo de elementos cargados al script actual a travs
del mtodo POST.
$HTTP_POST_FILES contiene la misma informacin inicial, pero no es
una superglobal. (Note que $HTTP_POST_FILES y $_FILES son variables diferentes
y que PHP las trata como tal)


Historial de cambios
Versin Descripcin
4.1.0
Se introdujo $_FILES,
haciendo $HTTP_POST_FILES obsoleta.
Notas
Nota:
Esta es una 'superglobal' o una variable automatic global. Significa simplemente
que es una variable que est disponible en cualquier parte del script. No hace falta
hacer global $variable; para acceder a la misma desde funciones o mtodos.
Ver tambin
move_uploaded_file() - Mueve un archivo subido a una nueva ubicacin
Gestin de Carga de Archivos
$_REQUEST
(PHP 4 >= 4.1.0, PHP 5)
$_REQUEST Variables HTTP Request
Descripcin
Un array asociativo que por defecto contiene el contenido
de $_GET, $_POST y $_COOKIE.
Historial de cambios
Versin Descripcin
5.3.0
Se introdujo request_order. Esta directiva afecta al contenido
de $_REQUEST.
4.3.0 Se elimin la informacin $_FILES de $_REQUEST.
4.1.0 Se introdujo $_REQUEST.
Nota:


Esta es una 'superglobal' o una variable automatic global. Significa simplemente
que es una variable que est disponible en cualquier parte del script. No hace falta
hacer global $variable; para acceder a la misma desde funciones o mtodos.
Nota:
Cuando se ejecuta en la lnea de comandos , no se incluirn las
entradas argv y argc; ya que estn presentes en el array $_SERVER
Nota:
Las variables en $_REQUEST se proporcionan al script a travs de los mecanismos
de entrada GET, POST, y COOKIE y por lo tanto pueden ser manipulados por el
usuario remoto y no debe confiar en el contenido. La presencia y el orden de las
variables listadas en este array se definen segn la directiva de configuracin
PHP variables_order.
Ver tambin
import_request_variables() - Importar variables GET/POST/Cookie en el
mbito global
Tratando con variables externas
La extensin filter
$_SESSION
$HTTP_SESSION_VARS [obsoleta]
(PHP 4 >= 4.1.0, PHP 5)
$_SESSION -- $HTTP_SESSION_VARS [obsoleta] Variables de sesin
Report a bug
Descripcin
Es un array asociativo que contiene variables de sesin disponibles para el script
actual. Ver la documentacin de Funciones de sesin para ms informacin sobre
su uso.
$HTTP_SESSION_VARS contiene la misma informacin inicial pero no es
una superglobal. (Ntese que $HTTP_SESSION_VARS y$_SESSION son diferentes
variables y PHP las trata de forma distinta)
Report a bug


Historial de cambios
Versin Descripcin
4.1.0
Se introdujo $_SESSION y $HTTP_SESSION_VARS qued
absoleta.
Report a bug
Notas
Nota:
Esta es una 'superglobal' o una variable automatic global. Significa simplemente
que es una variable que est disponible en cualquier parte del script. No hace falta
hacer global $variable; para acceder a la misma desde funciones o mtodos.
Report a bug
Ver tambin
session_start() - Iniciar una nueva sesin o reanudar la existente
$_ENV
$HTTP_ENV_VARS [obsoleta]
(PHP 4 >= 4.1.0, PHP 5)
$_ENV -- $HTTP_ENV_VARS [obsoleta] Variables de entorno
Report a bug
Descripcin
Una variable tipo array asociativo de variables pasadas al script actual a travs del
mtodo del entorno.
Estas variables son importadas en el espacio de nombres global de PHP desde el
entorno bajo el que est siendo ejecutado el intrprete PHP. Muchas son
entregadas por el intrprete de comandos bajo el que PHP est corriendo y
diferentes sistemas suelen tener diferentes tipos de intrpretes de comandos, una
lista definitiva es imposible. Por favor consulte la documentacin de su intrprete
de comandos para una lista de las variables de entorno que se definen.
Otras variables de entorno incluyen las variables CGI, colocadas all
independientemente de que PHP est siendo ejecutado como mdulo del servidor o
procesador CGI.


$HTTP_ENV_VARS contiene la misma informacin inicial, pero no es
una superglobal. (Note que $HTTP_ENV_VARS y $_ENV son variables diferentes y
que PHP las trata como tal)
Report a bug
Historial de cambios
Versin Descripcin
4.1.0
Se introdujo $_ENV,
haciendo $HTTP_ENV_VARS obsoleta.
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de $_ENV
<?php
echo 'Mi nombre de usuario es ' . $_ENV["USER"] . '!';
?>
Asumiendo que "bjori" ejecuta este script
El resultado del ejemplo sera algo similar a:
Mi nombre de usuario es bjori!
Report a bug
Notas
Nota:
Esta es una 'superglobal' o una variable automatic global. Significa simplemente
que es una variable que est disponible en cualquier parte del script. No hace falta
hacer global $variable; para acceder a la misma desde funciones o mtodos.
Report a bug
Ver tambin
getenv() - Obtiene el valor de una variable de entorno
La extensin filter
$_COOKIE
$HTTP_COOKIE_VARS [obsoleta]
(PHP 4 >= 4.1.0, PHP 5)
$_COOKIE -- $HTTP_COOKIE_VARS [obsoleta] Cookies HTTP


Report a bug
Descripcin
Una variable tipo array asociativo de variables pasadas al script actual a travs de
Cookies HTTP.
$HTTP_COOKIE_VARS contiene la misma informacin inicial, pero no es
una superglobal. (Note que $HTTP_COOKIE_VARS y $_COOKIEson variables
diferentes y que PHP las trata como tal)
Report a bug
Historial de cambios
Versin Descripcin
4.1.0
Se introdujo $_COOKIE,
haciendo $HTTP_COOKIE_VARS obsoleta.
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de $_COOKIE
<?php
echo 'Hola ' . htmlspecialchars($_COOKIE["nombre"]) . '!';
?>
Asumiendo que la cookie "nombre" ha sido definida anteriormente
El resultado del ejemplo sera algo similar a:
Hola Juan!
Report a bug
Notas
Nota:
Esta es una 'superglobal' o una variable automatic global. Significa simplemente
que es una variable que est disponible en cualquier parte del script. No hace falta
hacer global $variable; para acceder a la misma desde funciones o mtodos.
Report a bug
Ver tambin
setcookie() - Enviar una cookie
Gestin de variables externas
La extensin filter


$php_errormsg
(PHP 4, PHP 5)
$php_errormsg El mensaje de error anterior
Report a bug
Descripcin
$php_errormsg es una variable que contiene el texto del ltimo mensaje de error
generado por PHP. Esta variable solo estar disponible dentro del mbito donde
ocurri el error, y solamente funcionar si la opcin de
configuracin track_errors est activada (por defecto es 'off').
Advertencia
Si est definido un gestor de errores ( set_error_handler()), $php_errormsg estar
establecido solamente si el gestor de errores devuelve FALSE
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de $php_errormsg
<?php
@strpos();
echo $php_errormsg;
?>
El resultado del ejemplo sera algo similar a:
Wrong parameter count for strpos()
$HTTP_RAW_POST_DATA
(PHP 4, PHP 5)
$HTTP_RAW_POST_DATA Datos POST sin tratar
Report a bug
Descripcin
$HTTP_RAW_POST_DATA contiene los datos POST sin tratar.
Vase always_populate_raw_post_data
$http_response_header
(PHP 4 >= 4.0.4, PHP 5)


$http_response_header Encabezados de respuesta HTTP
Report a bug
Descripcin
El array $http_response_header es similar a la functin get_headers(). Cuando se
hace uso de HTTP wrapper, $http_response_header ser poblado con los
encabezados de respuesta HTTP. $http_response_header ser creada en el mbito
global.
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de $http_response_header
<?php
function get_contents() {
file_get_contents("http://example.com");
var_dump($http_response_header);
}
get_contents();
var_dump($http_response_header);
?>
El resultado del ejemplo sera algo similar a:
array(9) {
[0]=>
string(15) "HTTP/1.1 200 OK"
[1]=>
string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"
[2]=>
string(29) "Server: Apache/2.2.3 (CentOS)"
[3]=>
string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"
[4]=>
string(27) "ETag: "280100-1b6-80bfd280""
[5]=>
string(20) "Accept-Ranges: bytes"
[6]=>
string(19) "Content-Length: 438"
[7]=>
string(17) "Connection: close"
[8]=>
string(38) "Content-Type: text/html; charset=UTF-8"
}
NULL
$argc
(PHP 4, PHP 5)
$argc El nmero de argumentos pasados a un script


Report a bug
Descripcin
Contiene el nmero de argumentos pasados al script actual cuando se ejecuta
desde la lnea de comandos.
Nota: El nombre del script es pasado siempre como argumento del script, por lo
tanto, el valor mnimo de $argc es 1.
Nota: Esta variable slo est disponible cuando register_argc_argv est activado.
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de $argc
<?php
var_dump($argc);
?>
Cuando se ejecuta el ejemplo con: php script.php arg1 arg2 arg3
El resultado del ejemplo sera algo similar a:
int(4)
$argv
(PHP 4, PHP 5)
$argv Array de argumentos pasados a un script
Report a bug
Descripcin
Contiene un array de todos los argumentos pasados a un script cuando se ejecuta
desde la lnea de comandos.
Nota: El primer argumento $argv[0] siempre es el nombre del fichero que fue
usado para ejecutar el script.
Nota: Esta variable no est disponible si register_argc_argv est deshabilitado.
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de $argv
<?php
var_dump($argv);
?>


Cuando se ejecuta el ejemplo con: php script.php arg1 arg2 arg3
El resultado del ejemplo sera algo similar a:
array(4) {
[0]=>
string(10) "script.php"
[1]=>
string(4) "arg1"
[2]=>
string(4) "arg2"
[3]=>
string(4) "arg3"
}
Report a bug
Ver tambin
getopt() - Obtiene las opciones de la lista de argumentos de la lnea de
comandos
Excepciones predefinidas
Tabla de contenidos
Exception
(PHP 5 >= 5.1.0)
Introduccin
Exception es la clase base para todas las excepciones.
Sinopsis de la Clase
Exception {
/* Propiedades */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* Mtodos */
public __construct ([ string $message = "" [, int $code =
0 [, Exception $previous = NULL ]]] )
final public string getMessage ( void )


final public Exception getPrevious ( void )
final public mixed getCode ( void )
final public string getFile ( void )
final public int getLine ( void )
final public array getTrace ( void )
final public string getTraceAsString ( void )
public string __toString ( void )
final private void __clone ( void )
}
Propiedades
message
El mensaje de la excepcin
code
El cdigo de la excepcin
file
El nombre del fichero donde se origin la excepcin
line
La lnea donde se origin la excepcin
Tabla de contenidos
Exception::__construct Constructor de la excepcin
Exception::getMessage Obtiene el mensaje de
Excepcin
Exception::getPrevious Devuelve la excepcin anterior
Exception::getCode Obtiene el cdigo de Excepcin
Exception::getFile Obtiene el fichero en el que ocurri
la excepcin
Exception::getLine Obtiene la lnea en donde ocurri la
excepcin
Exception::getTrace Obtiene el seguimiento de la pila
Exception::getTraceAsString Obtiene el stack trace
como cadena


Exception::__toString Representacin de la excepcin
en formato cadena
Exception::__clone Clona la excepcin
Exception::__construct
(PHP 5 >= 5.1.0)
Exception::__construct Constructor de la excepcin
Report a bug
Descripcin
public Exception::__construct() ([ string $message = "" [, int $code =
0 [, Exception $previous = NULL ]]] )
Construye la Excepcin.
Report a bug
Parmetros
message
Mensaje de la Excepcin a lanzar.
code
El cdigo de la Excepcin.
previous
La excepcin previa usada por el encadenado de la excepcin.
Report a bug
Historial de cambios
Versin Descripcin


Versin Descripcin
5.3.0
Se aadi el
parmetro previous.
Report a bug
Notas
Nota:
El message NO es seguro binariamente.
Exception::getMessage
(PHP 5 >= 5.1.0)
Exception::getMessage Obtiene el mensaje de Excepcin
Report a bug
Descripcin
final public string Exception::getMessage ( void )
Devuelve el mensaje de Excepcin.
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
Devuelve el mensaje de Excepcin en formato cadena.
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de Exception::getMessage()
<?php
try {
throw new Exception("Algn mensaje de error");
} catch(Exception $e) {
echo $e->getMessage();


}
?>
El resultado del ejemplo sera algo similar a:
Algn mensaje de error
Exception::getPrevious
(PHP 5 >= 5.3.0)
Exception::getPrevious Devuelve la excepcin anterior
Report a bug
Descripcin
final public Exception Exception::getPrevious ( void )
Devuelve la excepcin anterior (el tercer parmetro de Exception::__construct()).
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
Devuelve la Exception anterior si est disponible o NULL en caso contrario.
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de Exception::getPrevious()
Recorre, e imprime, el rastreo de excepciones.
<?php
class MiExcepcinPersonalizada extends Exception {}

function hacerCosas() {
try {
throw new InvalidArgumentException("Lo est haciendo mal!", 112);
} catch(Exception $e) {
throw new MiExcepcinPersonalizada("Ocurri algo", 911, $e);
}
}


try {


hacerCosas();
} catch(Exception $e) {
do {
printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e-
>getMessage(), $e->getCode(), get_class($e));
} while($e = $e->getPrevious());
}
?>
El resultado del ejemplo sera algo similar a:
/home/bjori/ex.php:8 Ocurri algo (911) [MiExcepcinPersonalizada]
/home/bjori/ex.php:6 Lo est haciendo mal! (112) [InvalidArgumentException]
Exception::getCode
(PHP 5 >= 5.1.0)
Exception::getCode Obtiene el cdigo de Excepcin
Report a bug
Descripcin
final public mixed Exception::getCode ( void )
Devuelve el cdigo de Excepcin.
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
Devuelve el cdigo de Excepcin en forma de integer en Exception pero
posiblemente en forma de otros tipos en Exception descendientes (por ejemplo
como string en PDOException).
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de Exception::getCode()
<?php
try {
throw new Exception("Un mensaje de error", 30);
} catch(Exception $e) {
echo "El cdigo de excepcin es: " . $e->getCode();


}
?>
El resultado del ejemplo sera algo similar a:
El cdigo de excepcin es: 30
Exception::getFile
(PHP 5 >= 5.1.0)
Exception::getFile Obtiene el fichero en el que ocurri la excepcin
Report a bug
Descripcin
final public string Exception::getFile ( void )
Obtiene el nombre del fichero desde donde fue creada la excepcin.
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
Devuelve el nombre del fichero en donde fue creada la excepcin.
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de Exception::getFile()
<?php
try {
throw new Exception;
} catch(Exception $e) {
echo $e->getFile();
}
?>
El resultado del ejemplo sera algo similar a:
/home/bjori/tmp/ex.php
Exception::getLine
(PHP 5 >= 5.1.0)


Exception::getLine Obtiene la lnea en donde ocurri la excepcin
Report a bug
Descripcin
final public int Exception::getLine ( void )
Devuelve el nmero de la lnea donde se cre la excepcin.
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
Devuelve el nmero de la lnea donde se cre la excepcin.
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de Exception::getLine()
<?php
try {
throw new Exception("Algn mensaje de error");
} catch(Exception $e) {
echo "La excepcin se cre en la lnea: " . $e->getLine();
}
?>
El resultado del ejemplo sera algo similar a:
La excepcin se cre en la lnea: 3
Exception::getTrace
(PHP 5 >= 5.1.0)
Exception::getTrace Obtiene el seguimiento de la pila
Report a bug
Descripcin
final public array Exception::getTrace ( void )
Devuelve el seguimiento de pila de excepcin.


Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
Devuelve el seguimiento de pila de excepcin como un array.
Report a bug
Ejemplos
Ejemplo #1 Exception::getTrace() example
<?php
function test() {
throw new Exception;
}

try {
test();
} catch(Exception $e) {
var_dump($e->getTrace());
}
?>
El resultado del ejemplo sera algo similar a:
array(1) {
[0]=>
array(4) {
["file"]=>
string(22) "/home/bjori/tmp/ex.php"
["line"]=>
int(7)
["function"]=>
string(4) "test"
["args"]=>
array(0) {
}
}
}
Exception::getTraceAsString
(PHP 5 >= 5.1.0)
Exception::getTraceAsString Obtiene el stack trace como cadena
Report a bug


Descripcin
final public string Exception::getTraceAsString ( void )
Devuelve el stack trace de la Excepcin como cadena.
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
Devuelve el stack trace de la Excepcin como cadena.
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de Exception::getTraceAsString()
<?php
function test() {
throw new Exception;
}

try {
test();
} catch(Exception $e) {
echo $e->getTraceAsString();
}
?>
El resultado del ejemplo sera algo similar a:
#0 /home/bjori/tmp/ex.php(7): test()
#1 {main}
Exception::__toString
(PHP 5 >= 5.1.0)
Exception::__toString Representacin de la excepcin en formato cadena
Report a bug
Descripcin
public string Exception::__toString ( void )
Devuelve la representacin de la excepcin en formato string.


Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
Devuelve la representacin de la excepcin en formato string.
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de Exception::__toString()
<?php
try {
throw new Exception("Some error message");
} catch(Exception $e) {
echo $e;
}
?>
El resultado del ejemplo sera algo similar a:
exception 'Exception' with message 'Some error message' in
/home/bjori/tmp/ex.php:3
Stack trace:
#0 {main}
Exception::__clone
(PHP 5 >= 5.1.0)
Exception::__clone Clona la excepcin
Report a bug
Descripcin
final private void Exception::__clone ( void )
Intenta clonar la Excepcin, lo que resultar en un error Fatal.
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug


Valores devueltos
No devuelve ningn valor.
Report a bug
Errores/Excepciones
Las Excepciones no se pueden clonar.
ErrorException
(PHP 5 >= 5.1.0)
Introduccin
Una excepcin de error.
Sinopsis de la Clase
ErrorException extends Exception {
/* Propiedades */
protected int $severity ;
/* Propiedades heredadas */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* Mtodos */
public __construct ([ string $message = "" [, int $code = 0 [, int $severity =
1 [, string $filename = __FILE__ [, int $lineno =
__LINE__[, Exception $previous = NULL ]]]]]] )
final public int getSeverity ( void )
/* Mtodos heredados */
final public string Exception::getMessage ( void )
final public Exception Exception::getPrevious ( void )


final public mixed Exception::getCode ( void )
final public string Exception::getFile ( void )
final public int Exception::getLine ( void )
final public array Exception::getTrace ( void )
final public string Exception::getTraceAsString ( void )
public string Exception::__toString ( void )
final private void Exception::__clone ( void )
}
Propiedades
severity
La gravedad de la excepcin
Ejemplos
Ejemplo #1 Use set_error_handler() para convertir mensajes de
error en objetos ErrorException.
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

/* Desencadenar la excepcin */
strpos();
?>
El resultado del ejemplo sera algo similar a:
Fatal error: Uncaught exception 'ErrorException' with message 'Wrong
parameter count for strpos()' in /home/bjori/tmp/ex.php:8
Stack trace:
#0 [internal function]: exception_error_handler(2, 'Wrong parameter...',
'/home/bjori/php...', 8, Array)
#1 /home/bjori/php/cleandocs/test.php(8): strpos()
#2 {main}
thrown in /home/bjori/tmp/ex.php on line 8
Tabla de contenidos
ErrorException::__construct Constructor de la Excepcin
ErrorException::getSeverity Obtiene la severidad de la excepcin




ErrorException::__construct Exception::__clone
ErrorException::__construct
(PHP 5 >= 5.1.0)
ErrorException::__construct Constructor de la Excepcin
Report a bug
Descripcin
public ErrorException::__construct() ([ string $message = "" [, int $code =
0 [, int $severity = 1 [, string $filename = __FILE__ [,int $lineno =
__LINE__ [, Exception $previous = NULL ]]]]]] )
Construye la Excepcin.
Report a bug
Parmetros
message
Mensaje de la Excepcin a lanzar.
code
El cdigo de la Excepcin.
severity
Nivel de la severidad de la Excepcin.
filename


Nombre del fichero donde se lanz la Excepcin.
lineno
Nmero de la lnea donde se produjo la excepcin.
previous
La anterior excepcin utilizada para la excepcin de encadenamiento.
Report a bug
Historial de cambios
Versin Descripcin
5.3.0
El parmetro previous fue
aadido.
ErrorException::getSeverity
(PHP 5 >= 5.1.0)
ErrorException::getSeverity Obtiene la severidad de la excepcin
Report a bug
Descripcin
final public int ErrorException::getSeverity ( void )
Devuelve la severidad de la excepcin.
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug


Valores devueltos
Devuelve el nivel de la severidad de la excepcin.
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de ErrorException::getSeverity()
<?php
try {
throw new ErrorException("Exception message", 0, 75);
} catch(ErrorException $e) {
echo "La severidad de la excepcin es: " . $e->getSeverity();
}
?>
El resultado del ejemplo sera algo similar a:
La severidad de la excepcin es: 75
Interfaces y clases predefinidas
La interfaz Traversable
(PHP 5 >= 5.0.0)
Introduccin
Interfaz para detectar si una clase puede ser recorrida mediante foreach.
Una interfaz abstracta base no puede ser implementada sola. En su lugar, debe ser
implementada con IteratorAggregate o con Iterator.
Nota:
Las clases internas que implementan esta interfaz pueden ser usadas en una
construccin foreach y no necesitan implementarIteratorAggregate o Iterator.
Nota:
Este es un motor interno de interfaz que no puede ser implementado en scripts de
PHP. Se debe emplear en su lugar o IteratorAggregate, o bien Iterator. Cuando se
implementa una interfaz que extiende a Traversable, asegrese de
enumerara IteratorAggregate o Iterator antes de su nombre en la clusula de
implementacin.
Sinopsis de la Interfaz
Traversable {


}
Esta interfaz no tiene mtodos; su nico propsito es servir de interfaz base para
todas las clases que se pueden recorrer.
La interfaz Iterator
(PHP 5 >= 5.0.0)
Introduccin
Interfaz para iteradores externos u objetos que pueden ser iterados internamente
por s mismos.
Sinopsis de la Interfaz
Iterator extends Traversable {
/* Mtodos */
abstract public mixed current ( void )
abstract public scalar key ( void )
abstract public void next ( void )
abstract public void rewind ( void )
abstract public boolean valid ( void )
}
Iteradores Predefinidos
PHP ya ofrece un nmero de iteradores para muchas de las tareas del da a da.
Vase la lista de iteradores SPL.
Ejemplos
Ejemplo #1 Uso bsico
Este ejemplo muestra el orden en el que se llaman a los mtodos cuando se
emplea un foreach con un iterator.
<?php
class myIterator implements Iterator {
private $position = 0;
private $array = array(
"firstelement",
"secondelement",
"lastelement",


);

public function __construct() {
$this->position = 0;
}

function rewind() {
var_dump(__METHOD__);
$this->position = 0;
}

function current() {
var_dump(__METHOD__);
return $this->array[$this->position];
}

function key() {
var_dump(__METHOD__);
return $this->position;
}

function next() {
var_dump(__METHOD__);
++$this->position;
}

function valid() {
var_dump(__METHOD__);
return isset($this->array[$this->position]);
}
}

$it = new myIterator;

foreach($it as $key => $value) {
var_dump($key, $value);
echo "\n";
}
?>
El resultado del ejemplo sera algo similar a:
string(18) "myIterator::rewind"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(0)
string(12) "firstelement"

string(16) "myIterator::next"


string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(1)
string(13) "secondelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(2)
string(11) "lastelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"
Tabla de contenidos
Iterator::current Devuelve el elemento actual
Iterator::key Devuelve la clave del elemento actual
Iterator::next Avanza al siguiente elemento
Iterator::rewind Rebobine la Iterator al primer elemento
Iterator::valid Comprueba si la posicin actual es vlido
Iterator::current
(PHP 5 >= 5.0.0)
Iterator::current Devuelve el elemento actual
Report a bug
Descripcin
abstract public mixed Iterator::current ( void )
Devuelve el elemento actual.
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
Puede devolver cualquier tipo.
Iterator::key


(PHP 5 >= 5.0.0)
Iterator::key Devuelve la clave del elemento actual
Report a bug
Descripcin
abstract public scalar Iterator::key ( void )
Devuelve la clave del elemento actual.
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
Devuelve scalar en caso de xito, o NULL en caso de error.
Report a bug
Errores/Excepciones
Muestra un E_NOTICE en caso de error.
Iterator::next
(PHP 5 >= 5.0.0)
Iterator::next Avanza al siguiente elemento
Report a bug
Descripcin
abstract public void Iterator::next ( void )
Avanza la posicin actual al siguiente elemento.
Nota:
El mtodo es llamado despus de cada foreach loop.
Report a bug


Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
El valor devuelto es ignorado.
Iterator::rewind
(PHP 5 >= 5.0.0)
Iterator::rewind Rebobine la Iterator al primer elemento
Report a bug
Descripcin
abstract public void Iterator::rewind ( void )
Rebobina de nuevo al primer elemento de la Iterator.
Nota:
Este es el primer mtodo llamado cuando se inicia un foreach bucle. No va a ser
ejecutado despues foreach bucle.
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
Cualquier valor devuelto se pasa por alto.
Iterator::valid
(PHP 5 >= 5.0.0)
Iterator::valid Comprueba si la posicin actual es vlido
Report a bug


Descripcin
abstract public boolean Iterator::valid ( void )
Este mtodo se llama despus de Iterator::rewind() y Iterator::next() para
comprobar si la posicin actual es vlido.
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
El valor de retorno se debe fundir a boolean y luego evaluar. Devuelve TRUE en
caso de xito o FALSE en caso de error.
La interfaz IteratorAggregate
(PHP 5 >= 5.0.0)
Introduccin
Para crear una interfaz externa Iterator.
Sinopsis de la Interfaz
IteratorAggregate extends Traversable {
/* Mtodos */
abstract public Traversable getIterator ( void )
}
Ejemplo #1 Uso bsico
<?php
class myData implements IteratorAggregate {
public $property1 = "Public property one";
public $property2 = "Public property two";
public $property3 = "Public property three";

public function __construct() {
$this->property4 = "last property";
}



public function getIterator() {
return new ArrayIterator($this);
}
}

$obj = new myData;

foreach($obj as $key => $value) {
var_dump($key, $value);
echo "\n";
}
?>
El resultado del ejemplo sera algo similar a:
string(9) "property1"
string(19) "Public property one"

string(9) "property2"
string(19) "Public property two"

string(9) "property3"
string(21) "Public property three"

string(9) "property4"
string(13) "last property"

Tabla de contenidos
IteratorAggregate::getIterator Recuperar un Iterator externo
IteratorAggregate::getIterator
(PHP 5 >= 5.0.0)
IteratorAggregate::getIterator Recuperar un Iterator externo
Report a bug
Descripcin
abstract public Traversable IteratorAggregate::getIterator ( void )
Devuelve un iterador externo.
Report a bug
Parmetros
Esta funcin no tiene parmetros.


Report a bug
Valores devueltos
Una instancia de un objeto que implementa Iterator o Traversable
Report a bug
Errores/Excepciones
Lanza una Exception en caso de fallo.
La interfaz ArrayAccess
(PHP 5 >= 5.0.0)
Introduccin
Interfaz para proporcionar acceso a objetos como arrays.
Sinopsis de la Interfaz
ArrayAccess {
/* Mtodos */
abstract public boolean offsetExists ( mixed $offset )
abstract public mixed offsetGet ( mixed $offset )
abstract public void offsetSet ( mixed $offset , mixed $value )
abstract public void offsetUnset ( mixed $offset )
}
Ejemplo #1 Uso bsico
<?php
class obj implements arrayaccess {
private $container = array();
public function __construct() {
$this->container = array(
"one" => 1,
"two" => 2,
"three" => 3,
);
}
public function offsetSet($offset, $value) {
if (is_null($offset)) {


$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->container[$offset]);
}
public function offsetUnset($offset) {
unset($this->container[$offset]);
}
public function offsetGet($offset) {
return isset($this->container[$offset]) ? $this-
>container[$offset] : null;
}
}

$obj = new obj;

var_dump(isset($obj["two"]));
var_dump($obj["two"]);
unset($obj["two"]);
var_dump(isset($obj["two"]));
$obj["two"] = "A value";
var_dump($obj["two"]);
$obj[] = 'Append 1';
$obj[] = 'Append 2';
$obj[] = 'Append 3';
print_r($obj);
?>
El resultado del ejemplo sera algo similar a:
bool(true)
int(2)
bool(false)
string(7) "A value"
obj Object
(
[container:obj:private] => Array
(
[one] => 1
[three] => 3
[two] => A value
[0] => Append 1
[1] => Append 2
[2] => Append 3
)

)


Tabla de contenidos
ArrayAccess::offsetExists Comprobar si existe o no un ndice
ArrayAccess::offsetGet Offset para recuperar
ArrayAccess::offsetSet Inicializa un offset
ArrayAccess::offsetUnset Destruye un offset
ArrayAccess::offsetExists
(PHP 5 >= 5.0.0)
ArrayAccess::offsetExists Comprobar si existe o no un ndice
Report a bug
Descripcin
abstract public boolean ArrayAccess::offsetExists ( mixed $offset )
Comprueba si existe o no un ndice.
Este mtodo se ejecuta cuando se utilizan las funciones isset() o empty() sobre los
objetos ArrayAccess.
Nota:
Cuando se utiliza empty() ArrayAccess::offsetGet() se puede llamar y comprobar
si est vaco slo si ArrayAccess::offsetExists()devuelve TRUE.
Report a bug
Parmetros
offset
El ndice a ser comprobado.
Report a bug
Valores devueltos
Devuelve TRUE en caso de xito o FALSE en caso de error.
Nota:
El valor de retorno se debe forzar a boolean si no devuelve un valor boleano.


Report a bug
Ejemplos
Ejemplo #1 Ejemplo de ArrayAccess::offsetExists()
<?php
class obj implements arrayaccess {
public function offsetSet($offset, $value) {
var_dump(__METHOD__);
}
public function offsetExists($var) {
var_dump(__METHOD__);
if ($var == "foobar") {
return true;
}
return false;
}
public function offsetUnset($var) {
var_dump(__METHOD__);
}
public function offsetGet($var) {
var_dump(__METHOD__);
return "value";
}
}

$obj = new obj;

echo "Runs obj::offsetExists()\n";
var_dump(isset($obj["foobar"]));

echo "\nRuns obj::offsetExists() and obj::offsetGet()\n";
var_dump(empty($obj["foobar"]));

echo "\nRuns obj::offsetExists(), *not* obj:offsetGet() as there is nothing
to get\n";
var_dump(empty($obj["foobaz"]));
?>
El resultado del ejemplo sera algo similar a:
Runs obj::offsetExists()
string(17) "obj::offsetExists"
bool(true)

Runs obj::offsetExists() and obj::offsetGet()
string(17) "obj::offsetExists"
string(14) "obj::offsetGet"
bool(false)

Runs obj::offsetExists(), *not* obj:offsetGet() as there is nothing to get


string(17) "obj::offsetExists"
bool(true)
ArrayAccess::offsetGet
(PHP 5 >= 5.0.0)
ArrayAccess::offsetGet Offset para recuperar
Report a bug
Descripcin
abstract public mixed ArrayAccess::offsetGet ( mixed $offset )
Devuelve el valor correspondiente a desplazamiento especificado.
Este mtodo se ejecuta para comprobar si el desplazamiento es empty().
Report a bug
Parmetros
offset
El desplazamiento va a recuperar.
Report a bug
Notas
Nota:
A partir de PHP 5.3.4, el prototipo de los controles se relajaron y es posible
para las implementaciones de este mtodo para devolver por referencia. Esto
hace que las modificaciones indirectas a las dimensiones de los arreglos
sobrecargados de objetos ArrayAccessposibles.
Una modificacin directa es aquella que reemplaza completamente el valor de
la dimensin de el arreglo, como en $obj[6] = 7. Una modificacin indirecta,
por el contrario, slo una parte los cambios de la dimensin, o los intentos de
asignar la dimensin en funcin de otra variable, como en $obj[6][7] =
7 o $var =& $obj[6]. Con incrementos ++ y disminye con -- tambin se
aplican de una manera que requiere la modificacin indirecta.
Si bien la modificacin directa desencadena una llamada
a ArrayAccess::offsetSet(), modificacin indirecta provoca una llamada
aArrayAccess::offsetGet(). En ese caso, la aplicacin


de ArrayAccess::offsetGet() debe ser capaz de volver por la referencia, de
lo contrario un E_NOTICE mensaje es elevado..
Report a bug
Valores devueltos
Puede devolver todos los tipos de valor.
Report a bug
Ver tambin
ArrayAccess::offsetExists() - Comprobar si existe o no un ndice
ArrayAccess::offsetSet
(PHP 5 >= 5.0.0)
ArrayAccess::offsetSet Inicializa un offset
Report a bug
Descripcin
abstract public void ArrayAccess::offsetSet ( mixed $offset , mixed $value )
Asigna un valor a un offset determinado.
Report a bug
Parmetros
offset
El offset al que se asigna el valor.
value
El valor a asignar.
Report a bug


Valores devueltos
No devuelve ningn valor.
Report a bug
Notas
Nota:
El parmetro offset ser inicializado a NULL si otro valor no est
disponible, como en el siguiente ejemplo.
<?php
$arrayaccess[] = "primer valor";
$arrayaccess[] = "segundo valor";
print_r($arrayaccess);
?>
El resultado del ejemplo sera:
Array
(
[0] => primer valor
[1] => segundo valor
)
Nota:
Esta funcin no es invocada al realizar asignaciones por referencias y por
tanto en los cambios de dimensiones en arrays sobrecargados
con ArrayAccess (indirecto en el sentido de que no se hace cambiando la
dimensin directamente, sino cambiando una sub-dimensin o sub-
propiedad o asignando la dimensin del array por referencia en otra
variable). En su lugar, se llama a ArrayAccess::offsetGet(). La operacin
tendr xito si devuelve el valor por referencia, lo cul slo es posible
desde PHP 5.3.4.
ArrayAccess::offsetUnset
(PHP 5 >= 5.0.0)
ArrayAccess::offsetUnset Destruye un offset
Report a bug


Descripcin
abstract public void ArrayAccess::offsetUnset ( mixed $offset )
Destruye un offset.
Nota:
Este mtodo no ser llamado cuando se fuerza un tipo mediante (unset)
Report a bug
Parmetros
offset
El offset a destruir.
Report a bug
Valores devueltos
No devuelve ningn valor.
La interfaz Serializable
(PHP 5 >= 5.1.0)
Introduccin
Interfaz para personalizar la serializacin.
Las clases que implementan esta interfaz no soportan __sleep() ni __wakeup(). El
mtodo serialize se llama cuando una instancia requiere ser serializada. Esto no
invoca __destruct() ni tiene ningn efecto adicional a menos que se programe
dentro del mtodo. Cuando los datos son deserializados, la clase es conocida y el
correspondiente mtodo unserialize() es llamado como constructor en lugar de
llamar al mtodo __construct(). Se puede ejecutar el constructor estndar en el
mtodo si fuera necesario.
Sinopsis de la Interfaz
Serializable {
/* Mtodos */
abstract public string serialize ( void )


abstract public void unserialize ( string $serialized )
}
Ejemplo #1 Uso bsico
<?php
class obj implements Serializable {
private $data;
public function __construct() {
$this->data = "Mis datos privados";
}
public function serialize() {
return serialize($this->data);
}
public function unserialize($data) {
$this->data = unserialize($data);
}
public function getData() {
return $this->data;
}
}

$obj = new obj;
$ser = serialize($obj);

var_dump($ser);

$newobj = unserialize($ser);

var_dump($newobj->getData());
?>
El resultado del ejemplo sera algo similar a:
string(38) "C:3:"obj":23:{s:15:"Mis datos privados";}"
string(15) "Mis datos privados"
Tabla de contenidos
Serializable::serialize Representacin en formato cadena de un objeto
Serializable::unserialize Construye el objeto
Serializable::serialize
(PHP 5 >= 5.1.0)
Serializable::serialize Representacin en formato cadena de un objeto
Report a bug


Descripcin
abstract public string Serializable::serialize ( void )
Devuelve la representacin de un objeto en formato string.
Nota:
Este mtodo acta como el destructor del objeto. El mtodo __destruct() no ser
llamado despus de usar este mtodo.
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
Devuelve la representacin de un objeto o NULL
Report a bug
Errores/Excepciones
Lanza una Exception cuando de devuelen otros tipos aparte de string y NULL
Report a bug
Ver tambin
__sleep()
Serializable::unserialize
(PHP 5 >= 5.1.0)
Serializable::unserialize Construye el objeto
Report a bug
Descripcin
abstract public void Serializable::unserialize ( string $serialized )
Es llamado durante la unserializacin del objeto.
Nota:


Este mtodo actua como el constructor del objeto. El
mtodo __construct() no ser llamado despus de este mtodo.
Report a bug
Parmetros
serialized
La representacin en formato string de un objeto.
Report a bug
Valores devueltos
El valor devuelto por este mtodo es ignorado.
Report a bug
Ver tambin
__wakeup()
La clase Closure
(PHP 5 >= 5.3.0)
Introduccin
Clase usada para representar funciones annimas.
Las funciones annimas, implementadas en PHP 5.3, producan objetos de este
tipo. Este hecho sola ser considerado como un detalle de implementacin, pero
ahora puede confiarse en l. Desde PHP 5.4, esta clase tiene mtodos que
permiten ms control de las funciones annimas despus de que hayan sido
creadas.
Adems de los mtodos listados aqu, esta clase tambin posse un
mtodo __invoke. Esto es por consistencia con otras clases que implementan
la llamada mgica, ya que este mtodo no se usa para llamar a la funcin.
Sinopsis de la Clase
Closure {
/* Mtodos */


__construct ( void )
public static Closure bind ( Closure $closure , object $newthis [, mixed $newscop
e = 'static' ] )
public Closure bindTo ( object $newthis [, mixed $newscope = 'static' ] )
}
Tabla de contenidos
Closure::__construct Constructor que anula la instanciacin
Closure::bind Duplicar un cierre con un objeto vinculado y mbito de
clase especificados
Closure::bindTo Duplicar el cierre con un objeto vinculado y mbito de
clase nuevos
Closure::__construct
(PHP 5 >= 5.3.0)
Closure::__construct Constructor que anula la instanciacin
Report a bug
Descripcin
Closure::__construct ( void )
Este mtodo slo existe para anular la instanciacin de la clase Closure. Los
objetos de esta clase se crean del modo descrito en la pginafunciones annimas.
Report a bug
Parmetros
Esta funcin no tiene parmetros.
Report a bug
Valores devueltos
Este mtodo no tiene un valor de retorno; simplemente emite un error (de
tipo E_RECOVERABLE_ERROR).
Report a bug


Ver tambin
Funciones annimas
Closure::bind
(PHP 5 >= 5.4.0)
Closure::bind Duplicar un cierre con un objeto vinculado y mbito de clase
especificados
Report a bug
Descripcin
public static Closure Closure::bind ( Closure $closure , object $newthis [, mixed $n
ewscope = 'static' ] )
Este mtodo es una versin esttica de Closure::bindTo(). Vase la documentacin
de ese mtodo para ms informacin.
Report a bug
Parmetros
closure
La funcin annima a vincular.
newthis
El objeto al que la funcin annima dada debera ser vinculado, o NULL para
que el cierre sea desvinculado.
newscope
El mbito de clase a la que asociar el cierre, o 'static' para mantener el
actual. Si se da un objeto, el tipo del objeto se usar en su lugar. Esto
determina la visibilidad de mtodos protegidos y privados del objeto
vinculado.


Report a bug
Valores devueltos
Devuelve un nuevo objeto Closure o FALSE en caso de error
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de Closure::bind()
<?php
class A {
private static $sfoo = 1;
private $ifoo = 2;
}
$cl1 = static function() {
return A::$sfoo;
};
$cl2 = function() {
return $this->ifoo;
};

$bcl1 = Closure::bind($cl1, null, 'A');
$bcl2 = Closure::bind($cl2, new A(), 'A');
echo $bcl1(), "\n";
echo $bcl2(), "\n";
?>
El resultado del ejemplo sera algo similar a:
1
2
Report a bug
Ver tambin
Funciones annimas
Closure::bindTo() - Duplicar el cierre con un objeto vinculado
y mbito de clase nuevos
Closure::bindTo
(PHP 5 >= 5.4.0)
Closure::bindTo Duplicar el cierre con un objeto vinculado y mbito de clase
nuevos
Report a bug


Descripcin
public Closure Closure::bindTo ( object $newthis [, mixed $newscope = 'static' ] )
Crea y devuelve una nueva funcin annima con el cuerpo y variables vinculadas
como sta, pero posiblemente con un objeto vinculado diferente y un nuevo
mbito de clase.
El "objeto vinculado" determina el valor que $this tendr en el cuerpo de la
funcin, y el "mbito de clase" representa una clase que determina los miembros
privados y protegidos a los que ser capaz de acceder la funcin annima.
Concretamente, los miembros que sern visibles son los mismos que si la funcin
annima fuese un mtodo de la clase dada como valor del parmetro newscope.
Los cierres estticos no pueden tener ningn objeto vinculado (el valor del
parmetro newthis debera ser NULL), pero esta funcin puede, no obstante, usarse
para cambiar su mbito de clase.
Esta funcin se asegurar de que un cierre no esttico que tenga una instancia
vinculada se le aplique un mbito y viceversa. En este punto, los cierres no
estticos que le son dados un mbito, excepto una instancia NULL, son hechos
estticos, y los cierres no estticos y sin mbito que le son dados una instancia no
nula se les aplica un mbito de clase no especificada.
Nota:
Si solamente se quieren duplicar las funciones annimas, se puede usar cloning en
su lugar.
Report a bug
Parmetros
newthis
El objeto al que la funcin annima dada debera ser vinculado, o NULL para
que el cierre sea desvinculado.
newscope
El mbito de clase a la que asociar el cierre, o 'static' para mantener el
actual. Si se da un objeto, el tipo del objeto se usar en su lugar. Esto
determina la visibilidad de mtodos protegidos y privados del objeto
vinculado.


Report a bug
Valores devueltos
Devuelve el objeto Closure recin creado o FALSE en caso de error
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de Closure::bindTo()
<?php

class A {
function __construct($val) {
$this->val = $val;
}
function getClosure() {
//devuelve el cierre vinculado a este objeto y el mbito
return function() { return $this->val; };
}
}

$ob1 = new A(1);
$ob2 = new A(2);

$cl = $ob1->getClosure();
echo $cl(), "\n";
$cl = $cl->bindTo($ob2);
echo $cl(), "\n";
?>
El resultado del ejemplo sera algo similar a:
1
2
Ver tambin
Funciones annimas
Closure::bind() - Duplicar un cierre con un objeto vinculado y
mbito de clase especificados
The Generator class
(PHP 5 >= 5.5.0)
Introduccin
Generator objects are returned from generators.


Precaucin
Generator objects cannot be instantiated via new.
Sinopsis de la Clase
Generator implements Iterator {
/* Mtodos */
public mixed current ( void )
public mixed key ( void )
public void next ( void )
public void rewind ( void )
public mixed send ( mixed $value )
public void throw ( Exception $exception )
public bool valid ( void )
public void __wakeup ( void )
}
Generator::current
(PHP 5 >= 5.5.0)
Generator::current Get the yielded value
Descripcin
public mixed Generator::current ( void )
Parmetros
Esta funcin no tiene parmetros.
Valores devueltos
Returns the yielded value.
Generator::key
(PHP 5 >= 5.5.0)


Generator::key Get the yielded key
Descripcin
public mixed Generator::key ( void )
Advertencia
Esta funcin no est documentada actualmente, solamente se encuentra
disponible la lista de parmetros.
Parmetros
Esta funcin no tiene parmetros.
Valores devueltos
Returns the yielded key.
Generator::next
(PHP 5 >= 5.5.0)
Generator::next Resume execution of the generator
Descripcin
public void Generator::next ( void )
Parmetros
Esta funcin no tiene parmetros.
Valores devueltos
No devuelve nGenerator::rewind
(PHP 5 >= 5.5.0)
Generator::rewind Rewind the iterator
Descripcin
public void Generator::rewind ( void )
If iteration has already begun, this will throw an exception.


Parmetros
Esta funcin no tiene parmetros.
Valores devueltos
No devuelve ningn valor
Generator::send
(PHP 5 >= 5.5.0)
Generator::send Send a value to the generator
Descripcin
public mixed Generator::send ( mixed $value )
Sends the given value to the generator as the result of the yield expression and
resumes execution of the generator.
Generator::send() allows values to be injected into generator functions while
iterating over them. The injected value will be returned from the yield statement
and can then be used like any other variable within the generator function.
Parmetros
value
Ejemplos
Ejemplo #1 Using Generator::send() to inject values
<?php
function printer() {
while (true) {
$string = yield;
echo $string;
}
}

$printer = printer();
$printer->send('Hello world!');
?>
El resultado del ejemplo sera:
Hello world!


Valores devueltos
Returns the yielded value.
Generator::throw
(PHP 5 >= 5.5.0)
Generator::throw Throw an exception into the generator
Descripcin
public void Generator::throw ( Exception $exception )
Parmetros
exception
Valores devueltos
Returns the yielded value.
Generator::valid
(PHP 5 >= 5.5.0)
Generator::valid Check if the iterator has been closed
Descripcin
public bool Generator::valid ( void )
Parmetros
Esta funcin no tiene parmetros.
Valores devueltos
Returns FALSE if the iterator has been closed. Otherwise returns TRUE.
Generator::__wakeup
(PHP 5 >= 5.5.0)
Generator::__wakeup Serialize callback


Descripcin
public void Generator::__wakeup ( void )
Throws an exception as generators can't be serialized.
Parmetros
Esta funcin no tiene parmetros.
Valores devueltos
No devuelve ningn valor.
Opciones de contexto y parmetros
PHP ofrece varias opciones y parmetros de contexto que pueden ser usados con
todas las envolturas del sistema de archivos y las secuencias. El contexto es
creado con stream_context_create(). Las opciones son definidas
con stream_context_set_option() y los parmetros
constream_context_set_params().
Opciones de contexto de sockets
Opciones de contexto de sockets Listado de opciones de contexto de sockets
Report a bug
Descripcin
Las opciones de contexto de sockets estn disponibles para todas las envolturas
que trabajan sobre sockets, como tcp, http y ftp.
Report a bug
Opciones
bindto
Usada para especificar la direccin IP (ya sea IPv4 o IPv6) y/o el nmero de
puerto que PHP usar para acceder a la red. La sintaxis es ip:puerto para
direcciones IPv4, y [ip]:puerto para direcciones IPv6. Establecer el nmero
IP o de puerto como 0producir que el sistema lo elija por usted.
Nota:


Dado que FTP crea dos conexiones de socket durante la operacin normal,
no es posible especificar el nmero de puerto con esta opcin.
backlog
Usado para limitar el nmero de conexiones pendientes en la cola de
escucha del socket.
Nota:
Solamente se aplica a stream_socket_server().
Report a bug
Historial de cambios
Versin Descripcin
5.1.0 Se agreg bindto.
5.3.3
Se
agreg backlog.
Report a bug
Ejemplos
Ejemplo #1 Ejemplo de uso bsico de bindto
<?php
// conectarse a internet usando la IP '192.168.0.100'
$opciones = array(
'socket' => array(
'bindto' => '192.168.0.100:0',
),
);


// conectarse a internet usando la IP '192.168.0.100' y el puerto '7000
'
$opciones = array(
'socket' => array(
'bindto' => '192.168.0.100:7000',
),
);




// conectarse a internet usando la direccin IPv6 '2001:db8::1'
// y el puerto '7000'
$opciones = array(
'socket' => array(
'bindto' => '[2001:db8::1]:7000',
),
);


// conectarse a internet usando el puerto '7000'
$opciones = array(
'socket' => array(
'bindto' => '0:7000',
),
);


// crear el contexto...
$contexto = stream_context_create($opciones);

// ...y usarlo para recuperar los datos
echo file_get_contents('http://www.example.com', false, $contexto);

?>
Opciones de contexto de HTTP
Opciones de contexto de HTTP Lista de opciones de contexto de HTTP
Report a bug
Descripcin
Opciones de contexto para los transports http:// y https://.
Report a bug
Opciones
method string
GET, POST, o cualquier otro mtodo HTTP que soporte el servidor remoto.
Por omisin, GET.


header string
Cabeceras adicionales que se envan en la peticin. Los valores
sobrescribirn los existentes (como por ejemplo User-agent:,Host:,
o Authentication:).
user_agent string
Valor de la cabecera User-Agent:. Slo se utilizar si el user-agent no se
ha especificado en la opcin de contexto header vista arriba.
por omisin se utiliza el valor del ajuste user_agent en php.ini.
content string
Datos adicionales a enviar tras las cabeceras. Tpicamente se utiliza con
peticiones POST o PUT.
proxy string
URI que define la direccin de un servidor proxy
(p.ej. tcp://proxy.example.com:5100).
request_fulluri boolean
Si vale TRUE, se utilizar toda la URI para construir la peticin. (es
decir, GET http://www.example.com/path/to/file.html HTTP/1.0). A
pesar de que es un formato de peticin no estndar, algunos servidores
proxy requieren que sea as.
Por omisin FALSE.


follow_location integer
Seguir las redirecciones de las cabeceras Location. Establecer a 0 para
deshabilitarlo.
Por omisin 1.
max_redirects integer
Nmero mximo de redirecciones a seguir. Un valor igual o menor
a 1 indica que no se siga ninguna redireccin.
Por omisin 20.
protocol_version float
Versin del protocolo HTTP.
Por omisin 1.0.
Nota:
Las versines de PHP anteriores a la 5.3.0 no implementa decodificacin de
transferencias fragmentadas. Si este valor es1.1, es responsabilidad del
programador cumplir con la versin 1.1.
timeout float
Tiempo de espera de lectura en segundos, especificado por
un float (p.ej. 10.5).
Por omisin se utiliza el valor del ajuste default_socket_timeout de php.ini.


ignore_errors boolean
Captura el contenido incluso con cdigos de estado de error.
Por omisin FALSE.
Historial de cambios
Versin Descripcin
5.3.4 Aadido follow_location.
5.3.0
La opcin protocol_version soporta decodificacin de transferencias fragmentadas
en caso de valer 1.1.
5.2.10 Aadido ignore_errors.
5.2.10 El parmetro header puede ahora ser un array de ndices numricos.
5.2.1 Aadido timeout.
5.1.0 Aadido soporte para HTTPS mediante proxies HTTP.
5.1.0 Aadido max_redirects.
5.1.0 Aadido protocol_version.
Report a bug
Ejemplos
Ejemplo #1 Captura una pgina y enva datos POST
<?php

$postdata = http_build_query(
array(
'var1' => 'contenido',
'var2' => 'doh'
)
);



$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);

$context = stream_context_create($opts);

$result = file_get_contents('http://example.com/submit.php', false, $context);

?>
Ejemplo #2 Ignora las redirecciones per captura las cabeceras y el
contenido
<?php

$url = "http://www.example.org/header.php";

$opts = array('http' =>
array(
'method' => 'GET',
'max_redirects' => '0',
'ignore_errors' => '1'
)
);

$context = stream_context_create($opts);
$stream = fopen($url, 'r', false, $context);

// informacin de cabeceras y meta datos
// sobre el flujo
var_dump(stream_get_meta_data($stream));

// datos reales en $url
var_dump(stream_get_contents($stream));
fclose($stream);
?>
Report a bug
Notas
Nota: Opciones de contexto del flujo de socket subyacente
Hay soporte para opciones de contexto adicionales en el transporte
subyacente Para flujos http://, deben consultarse las opciones de contexto del
transporte tcp://. Para flujos https://, deben consultarse las opciones de
contexto del transporte ssl://.


Nota: Lnea de estado HTTP
Cuando esta envultura sigue una redireccin, el wrapper_data devuelto
por stream_get_meta_data() no contiene necesariamente la lnea de estado HTTP
que realmente se aplica al contenido del ndice 0.
array (
'wrapper_data' =>
array (
0 => 'HTTP/1.0 301 Moved Permantenly',
1 => 'Cache-Control: no-cache',
2 => 'Connection: close',
3 => 'Location: http://example.com/foo.jpg',
4 => 'HTTP/1.1 200 OK',
...
La primera peticin devolvi un 301 (redireccin permanente), de manera que la
envoltura automticamente sigue la redireccin para obtener una respuesta con
cdigo 200 (ndice = 4).
Report a bug
Ver tambin
http://
Opciones de contexto de sockets
Opciones de contexto para SSL
Opciones de contexto para FTP
Opciones de contexto para FTP Listado de opciones de contexto para FTP
Report a bug
Descripcin
Opciones de contexto para transportes ftp:// y ftps://
Report a bug
Opciones
overwrite boolean
Permite sobrescribir archivos ya existentes en el servidor remoto. Se aplica
slo al modo de escritura (subida).
Defaults to FALSE.


resume_pos integer
Desplazamiento de archivo en donde iniciar la transferencia. Se aplica slo
al modo de lectura (descarga).
Por defecto es 0 (inicio del archivo).
proxy string
Peticin FTP al proxy por medio de un servidor proxy http. Se aplica slo a
operaciones de lectura de archivos.
Ejemplo:tcp://squid.example.com:8000.
Report a bug
Historial de cambios
Versin Descripcin
5.1.0 Se aadi proxy.
5.0.0
Se
aadi overwrite y resume_pos.
Report a bug
Notas
Nota: Opciones subyacentes del contexto del flujo del socket
Opciones adicionales de contexto pueden se soportadas por
el transporte subyacente Para flujos ftp://, remitirse a las opciones
de contexto para el transporte tcp://. Para flujos ftps://, remitirse
a las opciones de contexto para el transporte ssl://.
Report a bug
Ver tambin
ftp://
Opciones de contexto de sockets
Opciones de contexto para SSL


Opciones de contexto para SSL
Opciones de contexto para SSL Listado de opciones de contexto para SSL
Report a bug
Descripcin
Opciones de contexto para transportes ssl:// y tls://
Report a bug
Opciones
verify_peer boolean
Requiere verificacin del certificado SSL utilizado.
Por defecto es FALSE.
allow_self_signed boolean
Permite certificados auto-firmados. Requiere verify_peer.
Por defecto es FALSE
cafile string
Ubicacin del archivo de la entidad emisora de certificados en el sistema de
archivos local, la cual debe ser utilizada con la opcin de
contexto verify_peer para autenticar la identidad del par remoto.
capath string


Si no se especfica cafile o si no se encuentra el certificado, el directorio al
que apunta capath sera explorado en busca de un certificado
apropiado. capath debe ser un directorio con el hash correcto.
local_cert string
Ruta hacia el archivo del certificado local en el sistema de archivos. Debe
ser un archivo codificado con PEM el cual contenga el certificado y la llave
privada. Puede, opcionalmente, contener la cadena de los emisores del
certificado.
passphrase string
La frase de contrasea con la cual el archivo local_cert fue codificado.
CN_match string
El nombre comn que se est esperando. PHP realizar comparaciones
limitadas de comodines. Si el nombre comn no coincide con esto, el
intento de conexin fallar.
verify_depth integer
Abortar si la cadena de certificados es demasiado profunda.
Por defecto es no verificarlo.
ciphers string
Establece la lista de sistemas de cifrado disponibles. El formato de la cadena
se describe en ciphers(1).


Por defecto es DEFAULT.
capture_peer_cert boolean
Si se establece en TRUE, una opcin de contexto peer_certificate ser
creada, conteniendo el certificado par.
capture_peer_cert_chain boolean
Si se establece en TRUE, una opcin de
contexto peer_certificate_chain ser creada, conteniendo la cadena del
certificado.
SNI_enabled boolean
Si se establece en TRUE, la indicacin del nombre del servidor se activar.
Activando SNI se permiten mltiples certificados en la misma direccin IP.
SNI_server_name string
Si se establece, entonces este valor se utilizar como nombre del servidor
para la indicacin de nombre de servidor. Si este valor no est establecido,
entonces el nombre del servidor se supone basado en el nombre de host
utilizado cuando se abre el flujo.
disable_compression boolean
Si est establecido, deshabilita la comprensin TLS. Esto puede ayudar a
mitigar el vector de ataque CRIME.
Report a bug


Historial de cambios
Versin Descripcin
5.4.13 Se aadi disable_compression. Requiere OpenSSL >= 1.0.0.
5.3.2 Se aadi SNI_enabled y SNI_server_name.
5.0.0
Se
aadi capture_peer_cert, capture_peer_chain y ciphers.
Report a bug
Notas
Nota: Debido a que ssl:// el es transporte subyacente para las
envolturas https:// y ftps://, cualquier opcin de contexto que aplique
para ssl:// tambin aplica para https:// y ftps://.
Nota: Para que SNI (Server Name Indication) est disponible, entonces PHP
se debe compilar con OpenSSL 0.9.8j o superior. Se
utilizaOPENSSL_TLSEXT_SERVER_NAME para determinar si SNI est soportado.
Report a bug
Ver tambin
Opciones de contexto de sockets
Opciones de contexto para CURL
Opciones de contexto para CURL Listado de opciones de contexto para CURL
Report a bug
Descripcin
Las opciones de contexto para CURL estn disponibles cuando la
extensin CURL fue compilada usando la opcin de configuracin --with-
curlwrappers .
Report a bug
Opciones
method string


GET, POST, o cualquier otro mtodo HTTP soportado por el servidor remoto.
Por defecto es GET.
header string
Cabeceras adicionales a ser enviadas durante la peticin. Los valores de
esta opcin sobrescribirn otros valores (como por ejemplo User-
agent:, Host:, y Authentication:).
user_agent string
Valor a ser enviado con la cabecera User-Agent:.
Por defecto se usa la configuracin user_agent de php.ini.
content string
Datos adicionales para ser enviados despus de las cabeceras. Esta opcin
no se utiliza para peticiones GET o HEAD.
proxy string
URI que especifica la direccin del servidor proxy. (Por
ejemplo tcp://proxy.example.com:5100).
max_redirects integer
El nmero mximo de redirecciones a seguir. Un valor de 1 o menos
significa que no se siguen la redirecciones.


Por defecto es 20.
curl_verify_ssl_host boolean
Verifica el host.
Por defecto es FALSE
Nota:
Esta opcin est disponible tanto para envolturas del protocolo http como
del ftp.
curl_verify_ssl_peer boolean
Requiere verificacin del certificado SSL utilizado.
Por defecto es FALSE
Nota:
Esta opcin est disponible tanto para envolturas del protocolo http como
del ftp.
Ejemplos
Ejemplo #1 Obtener una pgina y enviar datos POST
<?php

$postdata = http_build_query(
array(
'var1' => 'some content',
'var2' => 'doh'
)
);

$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata


)
);

$context = stream_context_create($opts);

$result = file_get_contents('http://example.com/submit.php', false, $context);

?>
Report a bug
Ver tambin
Opciones de contexto de sockets
Opciones de contexto Phar
Opciones de contexto Phar Listado de opciones de contexto Phar
Report a bug
Descripcin
Opciones de contexto para phar:// envoltura.
Report a bug
Opciones
comprimir int
Uno de Constantes de compresin Phar.
metadata mixed
Metadatos Phar. Ver Phar::setMetadata().
Report a bug
Ver tambin
phar://
Envoltura de secuencias Phar


Contexto parmetros
Contexto parmetros Listado de parmetros de contexto
Report a bug
Descripcin
Estos parametros se pueden establecer en un contexto usando el la
funcin stream_context_set_params().
Report a bug
Parmetros
notification callable
Un valor de tipo callable que se llamar cuando se produce un evento en un
flujo.
Vase stream_notification_callback para ms detalles.
Protocolos y Envolturas soportados
PHP incorpora de serie envolturas para distintos protocolos tipo URL para trabajar
junto con funciones del sistema de ficheros,
como fopen(),copy(), file_exists() y filesize(). Adems de estas envolturas, se
pueden definir por el usuario utilizando la funcin stream_wrapper_register().
Nota: La sintaxis de URL que se utiliza para describir una envoltura solo puede
ser scheme://.... Las sintaxis scheme:/ y scheme: no estn soportadas.
file://
file:// Acceso al sistema de ficheros local
Report a bug
Descripcin
El Sistema de Ficheros es la envoltura por omisin de PHP y representa al
sistema de ficheros local. Cuando se proporciona una ruta relativa (esto es, no
comienza con /, \, \\, ni con la letra de un dispositivo Windows) sta se har
usando el directorio de trabajo actual. En muchos casos, se trata del directorio en
el que se aloja el script, a no ser que se haya cambiado explicitamente. Si se
utiliza la sapi CLI, apuntar al directorio desde el que se ejecut el script.


En algunas funciones, como por ejemplo fopen() o file_get_contents(), puede
usarse tambin include_path para localizar ficheros con rutas relativas.
Uso
/ruta/al/fichero.ext
ruta/relativa/al/fichero.ext
ficheroEnDta.ext
C:/ruta/a/ficherowindows.ext
C:\ruta\a\ficherowindows.ext
\\servidorsmb\ruta\compartida\a\ficherowindows.ext
file:///ruta/al/fichero.ext
Opciones
Resumen de la Envoltura
Atributo Permitido
Restringido por allow_url_fopen No
Permite Lecturas S
Permite Escrituras S
Permite Aadir contenidos S
Permite Lecturas y Escrituras
Simultneas
S
Permite usar la funcin stat() S
Permite usar la funcin unlink() S
Permite usar la funcin rename() S
Permite usar la funcin mkdir() S
Permite usar la funcin rmdir() S



Historial de cambios
Versin Descripcin
5.0.0
Aadido file:/
/.
http://
https://
http:// -- https:// Acceso a URLS en HTTP(s)
Report a bug
Descripcin
Permite acceso de lectura a ficheros/recursos mediante HTTP 1.0, utilizando el
mtodo GET de HTTP. Junto con la peticin, se enva una cabecera Host: para as
poder usar hosts virtuales basados en nombres. Si se ha definido
un user_agent en el fichero php.ini o en el contexto del flujo, ste se incluir
tambin en la peticin.
El flujo proporciona acceso al cuerpo del recurso; las cabeceras se guardan en la
variable $http_response_header.
Si fuera importante conocer la URL del recurso del que procede el documento (tras
procesar todas las redirecciones), se debern procesar todas las cabeceras de
respuesta devueltas por el flujo.
Se usar la directiva from en la cabecera From: siempre que est asignado y no
se sobrescriba por Opciones de contexto y parmetros.
Report a bug
Uso
http://ejemplo.com
http://ejemplo.com/fichero.php?var1=val1&var2=val2
http://usuario:contrasea@ejemplo.com
https://ejemplo.com
https://ejemplo.com/fichero.php?var1=val1&var2=val2
https://usuario:contrasea@ejemplo.com
Report a bug


Opciones
Resumen de la Envoltura
Atributo Permitido
Restringido por allow_url_fopen S
Permite Lecturas S
Permite Escrituras No
Permite Aadir contenidos No
Permite Lecturas y Escrituras
Simultneas
N/A
Permite usar la funcin stat() No
Permite usar la funcin unlink() No
Permite usar la funcin rename() No
Permite usar la funcin mkdir() No
Permite usar la funcin rmdir() No
Report a bug
Historial de cambios
Versin Descripcin
4.3.7
Detectado errores en servidores IIS para evitar "SSL: Fatal Protocol
Error".
4.3.0 Aadido https://.
4.0.5 Aadido soporte para las redirecciones.


Report a bug
Ejemplos
Ejemplo #1 Detectar la URL en la que se finaliza tras las redirecciones
<?php
$url = 'http://www.example.com/redirecting_page.php';

$fp = fopen($url, 'r');

$meta_data = stream_get_meta_data($fp);
foreach ($meta_data['wrapper_data'] as $response) {

/* Were we redirected? */
if (strtolower(substr($response, 0, 10)) == 'location: ') {

/* update $url with where we were redirected to */
$url = substr($response, 10);
}

}

?>
Report a bug
Notas
Nota: Slo habr soporte para HTTPS cuando la extensin openssl est habilitada.
Las conexiones HTTP son de slo lectura; no hay soporte para escribir o copiar
datos a un recurso HTTP.
Se pueden enviar peticiones POST y PUT, por ejemplo, con ayuda de
los Contextos HTTP.
Report a bug
Ver tambin
Opciones de contexto de HTTP
$http_response_header
stream_get_meta_data() - Recuperar meta-informacin o de cabecera de
punteros a flujos/archivo
ftp://
ftps://


ftp:// -- ftps:// Acceso a URLs por FTP(s)
Descripcin
Permite tanto lectura de ficheros existentes como la creacin de nuevos ficheros
va FTP. La conexin fallar si el servidor no soporta FTP en modo pasivo.
Se puede tanto leer como escribir ficheros, pero no las dos cosas
simultneamente. Si el fichero remoto ya existiera en el servidor ftp, y se quisiera
abrir en modo escritura sin especificar la opcin de contexto overwrite, tambin
fallar la conexin. Si fuera necesario sobrescribir un fichero ya existente en ftp,
se tendr que especificar la opcin de contexto overwrite antes de abrir el fichero
para su escritura. Alternativamente, puede usarse la extensin FTP.
Si se ha establecido la directiva from en php.ini, se enviar como contrasea para
conexiones de FTP annimo.
Uso
ftp://ejemplo.com/pub/fichero.txt
ftp://usuario:contrasea@example.com/pub/fichero.txt
ftps://ejemplo.com/pub/fichero.txt
ftps://usuario:contrasea@ejemplo.com/pub/fichero.txt
Opciones
Resumen de la Envoltura
Atributos PHP 4 PHP 5
Restringido
porallow_url_fopen
S S
Permite Lecturas S S
Permite Escrituras
S (slo
en
ficheros
nuevos)
S (ficheros nuevos. En los existentes con overwrite)
Permite Aadir
contenidos
No S


Resumen de la Envoltura
Atributos PHP 4 PHP 5
Permite Lecturas y
Escrituras Simultneas
No No
Permite usar la
funcin stat()
No
Desde PHP 5.0.0: slo los
elementos filesize(), filetype(), file_exists(), is_file(), yis_dir().
Desde PHP 5.1.0: filemtime().
Permite usar la
funcinunlink()
No S
Permite usar la
funcinrename()
No S
Permite usar la
funcinmkdir()
No S
Permite usar la
funcinrmdir()
No S
Historial de cambios
Versin Descripcin
4.3.0
Added ftps://
.

Notas
Nota:
Hay soporte para FTPS desde PHP 4.3.0, siempre y cuando se haya compilado con
soporte para openssl.
Si el servidor no soporta SSL, entonces la conexin se restablece a una conexin
ftp regular sin encriptacin.


Nota: Aadiendo contenido
Desde PHP 5.0.0 se puede aadir contenido a los ficheros mediante la envoltura de
URL ftp://. Si se tratara de aadir contenido a un fichero con ftp:// en versiones
anteriores, se provocara un fallo.
Report a bug
Ver tambin
Opciones de contexto para FTP
php://
php:// Acceso a distintos flujos de E/S
Report a bug
Descripcin
PHP ofrece una serie de flujos de E/S generales que permite acceder tanto a los
flujos de entrada y salida de PHP, a la entrada estndar, a descriptores de ficheros
de salida y de errores, a flujos de ficheros temporales en memoria y en disco, y a
filtros para poder manipular otros recursos de ficheros segn se lee o se escribe en
ellos.
php://stdin, php://stdout y php://stderr
php://stdin, php://stdout y php://stderr permiten acceder directamente al
correspondiente flujo de entrada o salida del proceso PHP. El flujo hace referencia
a un descriptor de fichero duplicado, de modo que si se abre php://stdin y ms
tarde se cierra, slo se cerrara la copia del descriptor; el flujo real al que
referencia STDIN no se vera afectado. Tenga en cuenta que PHP mostraba un
comportamiento irregular en este aspcto hasta PHP 5.2.1. Se recomienda utilizar
simplemente las constantes STDIN, STDOUT y STDERR en lugar de abrir flujos
manualmente usando estas envolturas.
php://stdin es de slo lectura, mientras que php://stdout y php://stderr son de
slo escritura.
php://input
php://input es un flujo de slo lectura que permite leer datos del cuerpo solicitado.
En el caso de peticiones POST, es preferible usarphp://input en vez
de $HTTP_RAW_POST_DATA ya que no depende de diretivas php.ini especiales.
Sin embargo, cuando no se genera automticamente $HTTP_RAW_POST_DATA, se
trata de una alternativa que hace un uso menos intensivo de memoria que
activandoalways_populate_raw_post_data. php://input no est disponible
con enctype="multipart/form-data".


Nota: Los flujos que se abren con php://input slo pueden leerse una vez; no hay
soporte para operaciones de bsqueda. Pero, dependiendo de la SAPI, podra ser
posible abrir otro flujo php://input para reiniciar la lectura. Esto slo es posible si
los datos de la peticin se han guardado. Este caso es tpico en peticiones POST,
pero no en otros mtodos de peticin, como por ejemplo PUT o PROPFIND.
php://output
php://output es un flujo de slo lectura que permite escribir en el buffer de salida
tal como lo hacen print y echo.
php://fd
php://fd permite el acceso directo al descriptor de archivo dado. Por
ejemplo, php://fd/3 refiere al descriptor de archivo 3.
php://memory y php://temp
php://memory y php://temp son flujos de lectura-escritura que permiten
almacenar datos temporales en una envoltura similar a un fichero. La nica
diferencia entre las dos es que php://memory siempre almacenar sus datos en
memoria, mientras que php://temputilizar un fichero temporal cuando la cantidad
de datos almacenados superen el lmite predefinido (por omisin, 2 MB). La
ubicacin de este fichero temporal est determinada de la misma manera que la
funcin sys_get_temp_dir(),
El lmite de memoria de php://temp se puede controlar
aadiendo /maxmemory:NN, donde NN es la cantidad en bytes mxima de
datos a almacenar en memoria antes de recurrir a un fichero temporal.
php://filter
php://filter es una especie de meta-envoltura diseada para permitir
aplicar filtros a los flujos en las aperturas. Esto es muy til en las funciones todo
en uno, como readfile(), file(), y file_get_contents() donde, por otra parte, no se
pueden aplicar filtros a los flujos antes de que se lea su contenido.
php://filter acepta los siguientes parmetros como parte de su ruta. Se pueden
especifcar mltiples filtros en una ruta. Por favor, consulte los ejemplos para los
usos concretors de estos parmetros.
parmetros de php://filter
Nombre Descripcin
resource=<flujo a filtrar>
Este parmetro es obligatorio. Especifica el flujo que se desea


parmetros de php://filter
Nombre Descripcin
filtrar.
read=<listra de filtros a
aplicar a la cadena de lectura>
Este parmetro es opcional. Se pueden enumerar uno o ms
filtros, separados por el carcter|.
write=<lista de filtros a
aplicar a la cadena de
escritura>
Este parmetro es opcional. Se puedene enumerar uno o ms
filtros, separados por el carcter|.
<lista de filtros a aplicar a las
dos cadenas>
Cualquier listra de filtros que no est precedida ni por read= ni
por write= se aplicar tanto a las cadenas de lectura como de
escritura segn proceda.
Report a bug
Opciones
Resumen de la Envoltura (Para php://filter, consltese el resumen de la envoltura que se filtra)
Atributo Permitido
Restringido
por allow_url_fope
n
No
Restringido
porallow_url_inclu
de
php://input, php://stdin, php://memory y php://temp solamente.
Permite Lecturas
php://stdin, php://input, php://fd, php://memory y php://temp solamente
.
Permite Escrituras
php://stdout, php://stderr, php://output, php://fd, php://memory y php:/
/tempsolamente.
Permite Aadir php://stdout, php://stderr, php://output, php://fd, php://memory y php:/


Resumen de la Envoltura (Para php://filter, consltese el resumen de la envoltura que se filtra)
Atributo Permitido
contenidos /tempsolamente. (Equivalente a escrituras)
Permite Lecturas
y Escrituras
Simultneas
php://fd, php://memory y php://temp solamente.
Permite usar la
funcin stat()
php://memory y php://temp solamente.
Permite usar la
funcin unlink()
No
Permite usar la
funcinrename()
No
Permite usar la
funcin mkdir()
No
Permite usar la
funcin rmdir()
No
Permite usar la
funcinstream_sel
ect()
php://stdin, php://stdout, php://stderr, php://fd y php://temp solamente.
Report a bug
Historial de cambios
Versin Descripcin
5.3.6 Se aadi php://fd.
5.1.0
Se
aadi php://memory y php://temp.


Versin Descripcin
5.0.0 Se aadi php://filter.
Report a bug
Ejemplos
Ejemplo #1 php://temp/maxmemory
Este parmetro opcional permite establecer el lmite de memoria a partir del
cual php://temp comienza a usar un fichero temporal.
<?php
// Establecer el lmite a 5 MB.
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');

fputs($fp, "hello\n");

// Leer lo que hemos escrito.
rewind($fp);
echo stream_get_contents($fp);
?>
Ejemplo #2 php://filter/resource=<flujo a filtrar>
Este parmetro tiene que ubicarse al final de la especificacin de php://filter y
tiene que apuntar al flujo que se desea filtrar.
<?php
/* Esto es equivalente a:
readfile("http://www.example.com");
dado que no se especifica ningn filtro */

readfile("php://filter/resource=http://www.example.com");
?>
Ejemplo #3 php://filter/read=<lista de filtros a aplicar a la cadena de
lectura>
Este parmetro contiene uno o ms nombres de filtros separados por el caracter |.
<?php
/* Devolver el contenido de
www.example.com en maysculas */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");

/* Har lo mismo que el ejemplo de arriba
pero adems lo codificar en ROT13 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.exam
ple.com");
?>


Ejemplo #4 php://filter/write=<lista de filtros a aplicar a la cadena de
escritura>
Este parmetro contiene uno o ms nombres de filtros separados por el caracter |.
<?php
/* Filtrar el string "Hello World" con
el filtro rot13, y despus lo escribir en
example.txt dentro del directorio actual */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello
World");
?>
zlib://
bzip2://
zip://
zlib:// -- bzip2:// -- zip:// Flujos de compresin
Report a bug
Descripcin
zlib: PHP 4.0.4 - PHP 4.2.3 (slo en sistemas con fopencookie)
compress.zlib:// and compress.bzip2:// PHP 4.3.0 y superior
zlib: funciona como gzopen(), solo que usando el flujo, se puede utilizar
con fread() al igual que con otras funciones del sistema de ficheros. Esto qued
obsoleto en PHP 4.3.0 debido a la ambigedad que surge con los nombres de
fichero que contienen el caracter ':'; en su lugar, debe usarse compress.zlib://.
compress.zlib:// y compress.bzip2:// son equivalentes a gzopen() y
a bzopen() respectivamente, y funcionan incluso en sistemas que no tienen
soporte para fopencookie.
La extensin ZIP registra la envoltura zip:.
Report a bug
Uso
compress.zlib://file.gz
compress.bzip2://file.bz2
zip://archive.zip#dir/file.txt
Report a bug


Opciones
Resumen de la Envoltura
Atributo Permitido
Restringido por allow_url_fopen No
Permite Lecturas S
Permite Escrituras S (excepto zip://)
Permite Aadir contenidos S (excepto zip://)
Permite Lecturas y Escrituras
Simultaneas
No
Permite usar la funcin stat()
No, utilice la envoltura file:// para consultar la informacin
de un fichero.
Permite usar la funcin unlink()
No, utilice la envoltura file:// para eliminar ficheros
comprimidos.
Permite usar la funcin rename() No
Permite usar la funcin mkdir() No
Permite usar la funcin rmdir() No
data://
data:// Data (RFC 2397)
Report a bug
Descripcin
La envoltura del flujo data: ( RFC 2397) est disponible desde PHP 5.2.0.
Report a bug


Uso
data://text/plain;base64,
Report a bug
Opciones
Resumen de la envolutra
Atributo Permitido
Restringido por allow_url_fopen No
Restringido por allow_url_include S
Permite Lecturas S
Permite Escrituras No
Permite Aadir contenido No
Permite Lectura y Escritura
Simultanea
No
Permite usar la funcin stat() No
Permite usar la funcin unlink() No
Permite usar la funcin rename() No
Permite usar la funcin mkdir() No
Permite usar la funcin rmdir() No
Report a bug
Ejemplos
Ejemplo #1 Mostrar contenidos de data://
<?php
// muestra "I love PHP"


echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo=');
?>
Ejemplo #2 Obtener el Tipo de Medio
<?php
$fp = fopen('data://text/plain;base64,', 'r');
$meta = stream_get_meta_data($fp);

// muestra "text/plain"
echo $meta['mediatype'];
?>
glob://
glob:// Encuentra las rutas que coincidan con el patrn
Report a bug
Descripcin
La envoltura del flujo glob: est disponible desde PHP 5.3.0.
Report a bug
Uso
glob://
Report a bug
Opciones
Resumen de la Envoltura
Atributo Permitido
Restringido por allow_url_fopen No
Restringido por allow_url_include No
Permite Lecturas No
Permite Escrituras No
Permite Aadir Contenidos No


Resumen de la Envoltura
Atributo Permitido
Permite Lecturas y Escrituras
Simultneas
No
Permite usar la funcin stat() No
Permite usar la funcin unlink() No
Permite usar la funcin rename() No
Permite usar la funcin mkdir() No
Permite usar la funcin rmdir() No
Report a bug
Ejemplos
Ejemplo #1 Uso bsico
<?php
// Recorrer todos los ficheros *.php del directorio ext/spl/examples/
// y mostrar sus nombres y tamaos
$it = new DirectoryIterator("glob://ext/spl/examples/*.php");
foreach($it as $f) {
printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024);
}
?>
tree.php: 1.0K
findregex.php: 0.6K
findfile.php: 0.7K
dba_dump.php: 0.9K
nocvsdir.php: 1.1K
phar_from_dir.php: 1.0K
ini_groups.php: 0.9K
directorytree.php: 0.9K
dba_array.php: 1.1K
class_tree.php: 1.8K
phar://
phar:// Archivo PHP
Report a bug


Descripcin
La envoltura de flujo phar:// est disponible desde PHP 5.3.0. Para consultar una
descripcin detallada, revise envoltura del flujo Phar.
Report a bug
Uso
phar://
Report a bug
Opciones
Resumen de la Envoltura
Atributo Permitido
Restringido por allow_url_fopen No
Restringido por allow_url_include No
Permite Lecturas S
Permite Escrituras S
Permite Aadir contenidos No
Permite Lectura y Escritura
Simultanea
S
Permite usar la funcin stat() S
Permite usar la funcin unlink() S
Permite usar la funcin rename() S
Permite usar la funcin mkdir() S
Permite usar la funcin rmdir() S


Report a bug
Ver tambin
Opciones de contexto Phar
ssh2://
ssh2:// Secure Shell 2
Report a bug
Descripcin
ssh2.shell:// ssh2.exec:// ssh2.tunnel:// ssh2.sftp:// ssh2.scp:// PHP 4.3.0 y
superior (PECL)
Nota: Esta envoltura no est habilitada por omisin
Para poder usarse la envoltura ssh2.*:// debe instalarase la
extensin SSH2 disponible en PECL.
Adems de permitir hacer un login tradicional en la URI, la envoltura ssh2 tambin
puede reutilizar las conexiones ya abiertas, proporcionando el recurso de conexin
en el apartado host de la URL.
Report a bug
Uso
ssh2.shell://usuario:contrasea@ejemplo.com:22/xterm
ssh2.exec://usuario:contrasea@ejemplo.com:22/usr/local/bin/comando
ssh2.tunnel://usuario:contrasea@ejemplo.com:22/192.168.0.1:14
ssh2.sftp://usuario:contrasea@ejemplo.com:22/ruta/a/fichero
Report a bug
Opciones
Resumen de la Envoltura
Atributo ssh2.shell ssh2.exec ssh2.tunnel ssh2.sftp ssh2.scp
Restringido
por allow_url_fopen
S S S S S
Permite Lecturas S S S S S


Resumen de la Envoltura
Atributo ssh2.shell ssh2.exec ssh2.tunnel ssh2.sftp ssh2.scp
Permite Escrituras S S S S No
Permite Aadir contenidos No No No
S (cuando est
soportado por el
servidor)
No
Permite Lecturas y
Escrituras Simultneas
S S S S No
Permite usar la
funcin stat()
No No No S No
Permite usar la
funcin unlink()
No No No S No
Permite usar la
funcin rename()
No No No S No
Permite usar la
funcin mkdir()
No No No S No
Permite usar la
funcin rmdir()
No No No S No
Opciones de contexto
Nombre Uso Valor por omisin
session Recurso ssh2 preconectado a utilizar
sftp Recurso sftp preubicado a reutilizar
methods
mtodos a usar de entre Key exchange, hostkey, cipher,



Opciones de contexto
Nombre Uso Valor por omisin
compression, y MAC
callbacks
username Nombre de usuario con el que conectar
password Contrasea a utilizar en autenticacin con contrasea
pubkey_fil
e
Nombre del fichero con la clave pblica que se usar
para autenticar

privkey_fil
e
Nombre del fichero con la clave privada que se usar
para autenticar

env
Array asociativo con las variables de entorno que se van
a asignar

term
Tipo de emulacin del terminal a solicitar cuando se
asigne un pty (pseudo terminal)

term_widt
h
Ancho del terminal solicitado cuando se asigne un pty
term_heigh
t
Altura del terminal solicitado cuando se asigne un pty
term_units Unidades a usar con term_width y con term_height
SSH2_TERM_UNIT_CHAR
S
Report a bug
Ejemplos
Ejemplo #1 Abriendo un flujo a partir de una conexin activa
<?php
$session = ssh2_connect('example.com', 22);
ssh2_auth_pubkey_file($session, 'username', '/home/username/.ssh/id_rsa.pub',


'/home/username/.ssh/id_rsa', 'secre
t');
$stream = fopen("ssh2.tunnel://$session/remote.example.com:1234", 'r');
?>
Ejemplo #2 La variable $session debe permanecer disponible!
Para utilizar la envoltura ssh2.*://$session debe mantenerse el
recurso $session disponible. El cdigo siguiente no tendr el efecto deseado:
<?php
$session = ssh2_connect('example.com', 22);
ssh2_auth_pubkey_file($session, 'username', '/home/username/.ssh/id_rsa.pub',
'/home/username/.ssh/id_rsa', 'secre
t');
$connection_string = "ssh2.sftp://$session/";
unset($session);
$stream = fopen($connection_string . "path/to/file", 'r');
?>
unset() cierra la sesin, ya que $connection_string no contiene una referencia a la
variable $session, simplemente una representacin de la cadena derivada de ella.
Esto tambin ocurre cuando unset() va implcito porque se sale del mbito (como
dentro de una funcin).
rar://
rar:// RAR
Report a bug
Descripcin
Esta envoltura se compone de una ruta al fichero RAR (relativa o absoluta)
codificada como URL, un asterisco opcional (*), un signo de nmero opcional (#) y
un nombre de entrada codificado como URL que tambin es opcional, tal como se
almacena en el fichero. Cuando se especifique un nombre de entrada, ser
necesario tambin especificar un signo de nmero; adems, se puede aadir al
final del nombre una barra.
Esta envoltura puede abrir tanto ficheros como directorios. Cuando se abre un
directorio, el signo asterisco obliga a que los nombres de las entradas del
directorio se devuelvan decodificados. Si no se especifica, se devolvern
codificadas como URL esto es as para permitir hacer un uso correcto de la
envoltura con determinadas funcionalidades,
como RecursiveDirectoryIterator cuando se est en presencia de nombres de
ficheros que podran parecen datos codificados como URL.
Si no se proporciona ni un signo de nmero ni tampoco un nmero de entrada, se
mostrar la raz del fichero. La diferencia respecto a directorios convencionales es
que el flujo no contendr determinada informacin, tal como la fecha de
modificacin, dado que el directorio raz no se almacena dentro el fichero


comprimido en de una entrada individual. Para usar la envoltura
con RecursiveDirectoryIterator es necesario que al acceder al raz se incluya el
signo de nmero en la URL, para que as las URLs de los nodos hijo se puedan
construir correctamente.
Nota: Esta envoltura no est habilitada por omisin
Para poder usar la envoltura rar://, debe instalarse la extensin rar disponible
en PECL.
rar:// Disponible desde PECL rar 3.0.0
Report a bug
Uso
rar://<nombre de archivo con codificacin url>[*][#[<nombre de entrada
con codificacin url>]]
Report a bug
Opciones
Resumen de la Envoltura
Atributo Permitido
Restringido por allow_url_fopen No
Restringido por allow_url_include No
Permite Lecturas S
Permite Escrituras No
Permite Aadir contenido No
Permite Lecturas y Escrituras
Simultneas
No
Permite usar la funcin stat() S
Permite usar la funcin unlink() No


Resumen de la Envoltura
Atributo Permitido
Permite usar la funcin rename() No
Permite usar la funcin mkdir() No
Permite usar la funcin rmdir() No
Opciones de contexto
Nombre Uso
Valor
por
omisin
open_password
Si la hubiera, contrasea utilizada para encriptar las cabeceras del
archivo. WinRAR encriptar todos los ficheros con la misma
contrasea que la cabecera siempre que sta est presente, por lo
que se ignorarfile_password en archivos que contengan cabeceras
encriptadas.

file_password
Si la hubiera, contrasea utilizada para encriptar un fichero. Si las
cabeceras estuvieran tambin encriptadas, se ignorara esta opcin
en favor de open_password. El motivo por el que hay dos opciones
es para as cubrir la posibilidad de que haya un archivo con
contraseas diferentes para la cabecera y los ficheros. Tenga en
cuenta que si el archivo no tuviera sus cabeceras encriptadas, se
ignoraraopen_password y tendra que usarse en su lugar esta
opcin.

volume_callbac
k
Llamada de retorno que determina la ruta de las partes que no se
hayan podido capturar. Para ms informacin,
revise RarArchive::open().

Report a bug
Ejemplos
Ejemplo #1 Recorriendo un archivo RAR


<?php

class MyRecDirIt extends RecursiveDirectoryIterator {
function current() {
return rawurldecode($this->getSubPathName()) .
(is_dir(parent::current())?" [DIR]":"");
}
}

$f = "rar://" . rawurlencode(dirname(__FILE__)) .
DIRECTORY_SEPARATOR . 'dirs_and_extra_headers.rar#';

$it = new RecursiveTreeIterator(new MyRecDirIt($f));

foreach ($it as $s) {
echo $s, "\n";
}
?>
El resultado del ejemplo sera algo similar a:
|-allow_everyone_ni [DIR]
|-file1.txt
|-file2_.txt
|-with_streams.txt
\- [DIR]
|-\%2Fempty%2E [DIR]
| \-\%2Fempty%2E\file7.txt
|-\empty [DIR]
|-\file3.txt
|-\file4_.txt
\-\_2 [DIR]
|-\_2\file5.txt
\-\_2\file6_.txt
Ejemplo #2 Abriendo un fichero encriptado (encriptacin de cabeceras)
<?php
$stream = fopen("rar://" .
rawurlencode(dirname(__FILE__)) . DIRECTORY_SEPARATOR .
'encrypted_headers.rar' . '#encfile1.txt', "r", false,
stream_context_create(
array(
'rar' =>
array(
'open_password' => 'samplepassword'
)
)
)
);
var_dump(stream_get_contents($stream));
/* ni la fecha de creacin ni la de ltimo acceso es obligatoria WinRAR,


* por esa razn la mayora de ficheros no lo tendrn */
var_dump(fstat($stream));
?>
El resultado del ejemplo sera algo similar a:
string(34) "Contenido del fichero encriptado 1"
Array
(
[0] => 0
[1] => 0
[2] => 33206
[3] => 1
[4] => 0
[5] => 0
[6] => 0
[7] => 26
[8] => 0
[9] => 1259550052
[10] => 0
[11] => -1
[12] => -1
[dev] => 0
[ino] => 0
[mode] => 33206
[nlink] => 1
[uid] => 0
[gid] => 0
[rdev] => 0
[size] => 26
[atime] => 0
[mtime] => 1259550052
[ctime] => 0
[blksize] => -1
[blocks] => -1
)
ogg://
ogg:// Flujos de audio
Report a bug
Descripcin
Los ficheros que se abran para lectura usando la envoltura ogg:// se utilizan como
codificaciones de audio comprimido usando el cdecOGG/Vorbis. De forma
similar, los ficheros abiertos para escritura o para aadir contenido usando la
envoltura ogg:// se escriben como datos de audio comprimidos. Cuando se use la
funcin stream_get_meta_data() con un fichero OGG/Vorbis abierto para lectura,
se devolvern diversos detalles del flujo, incluyendo la etiqueta vendor,
cualquier comments que se haya aadido, el nmero de canaleschannels, el ratio de
muestreo, y el rango del ratio de codificacin descrito
por: bitrate_lower, bitrate_upper, bitrate_nominal, ybitrate_window.


ogg:// PHP 4.3.0 and up (PECL)
Nota: Esta envoltura no est habilitada por omisin
Para usar la envoltura ogg:// es necesario instalar la
extensin OGG/Vorbis disponible en PECL.
Report a bug
Uso
ogg://soundfile.ogg
ogg:///path/to/soundfile.ogg
ogg://http://www.example.com/path/to/soundstream.ogg
Report a bug
Opciones
Resumen de la Envoltura
Atributo Permitido
Restringido por allow_url_fopen No
Permite Lecturas S
Permite Escrituras S
Permite Aadir contenido S
Permite Lecturas y Escrituras
Simultnea
No
Permite usar la funcin stat() No
Permite usar la funcin unlink() No
Permite usar la funcin rename() No
Permite usar la funcin mkdir() No
Permite usar la funcin rmdir() No


Opciones de contexto
Nom
bre
Uso
Valor por
omisin
Modo
pcm
_mod
e
codificacin PCM que se aplicar en las lecturas, de
entre:OGGVORBIS_PCM_U8, OGGVORBIS_PCM_S8, OGGVORBIS_PCM
_U16_BE,OGGVORBIS_PCM_S16_BE, OGGVORBIS_PCM_U16_LE,
y OGGVORBIS_PCM_S16_LE. (8 o 16 bit, con o sin signo, big o
little endian)
OGGVORBIS
_PCM_S16_L
E
Lectura
rate Ratio de muestreo en datos de entradas, expresado en Hz 44100
Escritur
a/Adici
n
bitra
te
Si es un entero, definir el bitrate fijo al que se codificar. (de
16000 a 131072) Si es un real, definir la calidad del bitrate
variable a usar. (de -1.0 a 1.0)
128000
Escritur
a/Adici
n
chan
nels
El nmero de canales de audio a codificar, normalmente 1
(mono), o 2 (estreo). Puede llegar a 16.
2
Escritur
a/Adici
n
com
ment
s
Un array de strings a codificar en la cabecera de la pista.
Escritur
a/Adici
n
expect://
expect:// Flujos de Interaccin de Procesos
Report a bug
Descripcin
Los flujos que se hayan abierto con la envoltura expect://, darn acceso a stdio,
stdout y stderr (entrada, salida y errores estndar respectivamente) de los
procesos, va PTY.
Nota: Esta envoltura no est habilitada por omisin
Para poder usar la envoltura expect:// se debe instalar la
extensin Expect disponible en PECL.


expect:// PHP 4.3.0 y superior (PECL)
Report a bug
Uso
expect://command
Report a bug
Opciones
Resumen de la Envoltura
Atributo Permitido
Restringido por allow_url_fopen No
Permites Lecturas S
Permite Escrituras No
Permite Aadir contenido S
Permite Lecturas y Escrituras
Simultneas
No
Permite usar la funcin stat() No
Permite usar la funcin unlink() No
Permite usar la funcin rename() No
Permite usar la funcin mkdir() No
Permite usar la funcin rmdir() No





Seguridad
Introduccin
PHP es un potente lenguaje, y su intrprete, bien como mdulo del servidor web o
bien como binario CGI, puede acceder a ficheros, ejecutar comandos o abrir
conexiones de red desde el servidor. Estas propiedades hacen que, por omisin,
sea inseguro todo lo que se ejecute en un servidor web. PHP est diseado
especficamente para ser un lenguaje ms seguro para escribir
aplicaciones CGI que Perl or C. Partiendo de un correcto ajuste de opciones de
configuracin para tiempo de ejecucin y en tiempo de compilacin, y el uso de
prcticas de programacin apropiadas, pueden proporcionarle la combinacin de
libertad y de seguridad que necesita.
Dado que hay muchas vas para ejecutar PHP, existen muchas opciones de
configuracin para controlar su comportamiento. Al haber una extensa seleccin
de opciones se garantiza poder usar PHP para un gran nmero de propsitos, pero
a la vez significa que existen combinaciones que conllevan una configuracin
menos segura.
La flexibilidad de configuracin de PHP rivaliza igualmente con la flexibilidad de su
cdigo. PHP puede ser usado para construir completas aplicaciones de servidor,
con toda la potencia de un usuario de consola, o se puede usar slo desde el lado
del servidor implicando un menor riesgo dentro de un entorno controlado. El cmo
construir ese entorno, y cmo de seguro es, depende del desarrollador PHP.
Este captulo comienza con algunos consejos generales de seguridad, explica las
diferentes combinaciones de opciones de configuracin y las situaciones en que
pueden ser tiles, y describe diferentes consideraciones relacionadas con la
programacin de acuerdo a diferentes niveles de seguridad.
Consideraciones generales
Un sistema completamente seguro es prcticamente un imposible, de modo que el
enfoque usado con mayor frecuencia en la profesin de seguridad es uno que
busque el balance adecuado entre riesgo y funcionalidad. Si cada variable enviada
por un usuario requiriera de dos formas de validacin biomtrica (como rastreo de
retinas y anlisis dactilar), usted contara con un nivel extremadamente alto de
confiabilidad. Tambin implicara que llenar los datos de un formulario
razonablemente complejo podra tomar media hora, cosa que podra incentivar a
los usuarios a buscar mtodos para esquivar los mecanismos de seguridad.
La mejor seguridad con frecuencia es lo suficientemente razonable como para
suplir los requerimientos dados sin prevenir que el usuario realice su labor de
forma natural, y sin sobrecargar al autor del cdigo con una complejidad excesiva.
De hecho, algunos ataques de seguridad son simples recursos que aprovechan las
vulnerabilidades de este tipo de seguridad sobrecargada, que tiende a erosionarse
con el tiempo.


Una frase que vale la pena recordar: Un sistema es apenas tan bueno como el
eslabn ms dbil de una cadena. Si todas las transacciones son registradas
copiosamente basndose en la fecha/hora, ubicacin, tipo de transaccin, etc. pero
la verificacin del usuario se realiza nicamente mediante una cookie sencilla, la
validez de atar a los usuarios al registro de transacciones es mermada
severamente.
Cuando realice pruebas, tenga en mente que no ser capaz de probar todas las
diferentes posibilidades, incluso para las pginas ms simples. Los datos de
entrada que usted puede esperar en sus aplicaciones no necesariamente tendrn
relacin alguna con el tipo de informacin que podra ingresar un empleado
disgustado, un cracker con meses de tiempo entre sus manos, o un gato
domstico caminando sobre el teclado. Es por esto que es mejor observar el
cdigo desde una perspectiva lgica, para determinar en dnde podran
introducirse datos inesperados, y luego hacer un seguimiento de cmo esta
informacin es modificada, reducida o amplificada.
Internet est repleto de personas que tratan de crearse fama al romper la
seguridad de su cdigo, bloquear su sitio, publicar contenido inapropiado, y por lo
dems haciendo que sus das sean ms interesantes. No importa si usted
administra un sitio pequeo o grande, usted es un objetivo por el simple hecho de
estar en lnea, por tener un servidor al cual es posible conectarse. Muchas
aplicaciones de cracking no hacen distinciones por tamaos, simplemente recorren
bloques masivos de direcciones IP en busca de vctimas. Trate de no convertirse
en una.
Ataques posibles
Usar PHP como un binario CGI es una opcin para configuraciones que por alguna
razn no desean integrar PHP como un mdulo dentro del software de servidor
(como Apache), o usarn PHP con diferentes tipos de envoltorios CGI para crear
entornos seguros chroot y setuid para scripts. Esta configuracin usualmente
involucra la instalacin del binario ejecutable de PHP en el directorio cgi-bin del
servidor web. La recomendacin CA-96.11 del CERT recomienda que est en
contra de colocar cualquiera de los intrpretes dentro de cgi-bin. An si el binario
de PHP puede ser usado como un intrprete independiente, PHP est diseado
para prevenir los ataques que esta configuracin hace posible:
Accediendo a los ficheros del sistema: http://mi.servidor/cgi-
bin/php?/etc/passwd La consulta de informacin en una URL despus del
signo de interrogacin (?) es pasado como argumento de la lnea de
comandos al intrprete por la interface del CGI. Usualmente los intrpretes
abren y ejecutan el fichero especificado como el primer argumento en la
lnea de comandos. Cuando es invocado como un binario de CGI, PHP se
rehusa a interpretar los argumentos de lnea de comandos.
Accediendo a cualquier documento web en el
servidor: http://mi.servidor/cgi-bin/php/directorio/secreto/doc.html Parte
de la ruta de informacin de la URL despus del nombre del binario de
PHP, /directorio/secreto/doc.html es convencionalmente utilizado para
especificar el nombre del fichero a ser abierto e interpretado por el


programa CGI. Usualmente las directivas de configuracin de algunos
servidores web (Apache: Accin) son utilizados para redirigir peticiones a
los documentos como http://mi.servidor/directorio/secreto/script.php al
intrprete de PHP. Con esta configuracin, el servidor web revisa primero
los permisos de acceso a los directorios /directorio/secreto, y despus crea
la peticin redirigida http://mi.servidor/cgi-
bin/php/directorio/secreto/script.php. Desafortunadamente, si la peticin es
proporcionada originalmente en esta forma, no se revisan los accesos a los
directorios hechos por el servidor web /directorio/secreto/script.php, sino
solamente al fichero /cgi-bin/php. De esta forma /cgi-bin/php cualquier
usuario est habilitado a acceder a cualquier documento protegido en el
servidor web. En PHP, las directivas de configuracin en tiempo de
ejecucin cgi.force_redirect, doc_root y user_dir pueden ser utilizadas para
prevenir este ataque, si el rbol de documentos del servidor tiene
cualquiera de estos directorios con restricciones de acceso. Vase ms
abajo para una explicacin completa de las diferentes combinaciones.
Caso 1: Ficheros pblicos servidos solamente
Si su servidor no tiene ningn contenido que no est restringido por contrasea o
control de acceso basado en IP, no hay necesidad de estas opciones de
configuracin. Si su servidor web no le permite hacer redirecciones, o el servidor
no tiene una forma de comunicar al binario de PHP que la peticin es una forma
segura de peticin de redireccionamiento, puede especificar la opcin --enable-
force-cgi-redirect para el script de configuracin. Usted todava tiene que
asegurarse que sus scripts de PHP no confan en una forma o en otra para llamar
el script, ni directamentehttp://my.host/cgi-bin/php/dir/script.php ni por
redireccin http://my.host/dir/script.php.
La redireccin puede ser configurada en Apache utilizando directivas Action y
AddHandler (vea ms abajo).
Caso 2: utilizando cgi.force_redirect
La directiva de configuracin cgi.force_redirect previene a cualquiera que llame a
PHP directamente por medio de una URL como estahttp://mi.servidor/cgi-
bin/php/directoriosecreto/script.php. En cambio, PHP solamente lo analizar en
este modo si ste se ha ido a travs de una regla directa del servidor web. Las
versiones de PHP antiguas a la versin 4.2.0 utilizaban --enable-force-cgi-
redirect en opcin de tiempo de compilacin para esto.
Usualmente la redireccin en la configuracin de Apache se hace con las siguientes
directivas:
Action php-script /cgi-bin/php
AddHandler php-script .php
Esta opcin ha sido probada solamente con el servidor web Apache, y se basa en
que en Apache se configure en una variable de entorno no-estndar de


CGI REDIRECT_STATUS para peticiones de redireccin. Si su servidor web no
soporta ninguna forma de decirle si la peticin es directa o redirigida, usted no
puede utilizar esta opcin y debe usar una de las otras formas de ejecutar la
versin CGI aqu documentadas.
Caso 3: Configurando doc_root o user_dir
Para incluir contenido activo, como scripts y ejecutables, en los directorios de
documentos del servidor web es algunas veces considerado una prctica insegura.
Si, por el hecho del algn error de configuracin, los scripts no se ejecutan y son
mostrados como documentos HTML regulares, esto podra resultar en una fuga de
informacin de propiedad intelectual o de informacin de seguridad como las
contraseas. Por lo tanto muchos Administradores de Sistemas preferirn
configurar otra estructura de directorios para scripts que sean accesibles
solamente a travs del CGI de PHP, y por lo tanto siempre interpretado y no
desplegado como tal.
Tambin si el mtodo para asegurar las peticiones no es redirigido, como se
describi en la seccin anterior, no est disponible, es necesario configurar un
script doc_root que sea diferente de la raz del documento web.
Usted puede configurar el script de la raz de documento de PHP en la directiva de
configuracin doc_root en el fichero de configuracin, o puede configurar la
variable de entorno PHP_DOCUMENT_ROOT. Si ste es configurado, la versin
del CGI de PHP siempre construir el nombre del fichero para abrir con
este doc_root y la ruta de informacin en la peticin, de tal forma que pueda estar
seguro que ningn script ser ejecutado fuera de este directorio (excepto
por user_dir que se encuentra ms abajo).
Otra opcin utilizable es esta user_dir. Cuando user_dir no est configurado, lo
nico que controla el fichero abierto es doc_root. Al abrir una URL
como http://mi.servidor/~usuario/documento.php no resulta en la apertura de un
fichero bajo el directorio personal de los usuarios, pero si un fichero
llamado ~usuario/documento.php debajo de doc_root (si, un nombre de directorio
que inicia con una a tilde [~]).
Si user_dir es configurado, por ejemplo public_php, una peticin
como http://mi.servidor/~usuario/doc.php abrir un fichero llamado doc.php bajo
el directorio llamado public_php debajo de el directorio personal del usuario. Si el
directorio personal del usuario es /home/usuario, el fichero ejecutado
ser /home/user/public_php/doc.php.
La expansin de user_dir sucede sin tomar en cuenta la configuracin de doc_root,
as que usted puede controlar el acceso a la raz de los documentos y el directorio
de los usuarios separadamente.


Caso 4: El analizador de PHP fuera del rbol de la web
Una opcin muy segura es poner el binario analizador de PHP en algn lugar fuera
del rbol de ficheros de la web. En /usr/local/bin, por ejemplo. El nico
inconveniente real con esta opcin es que ahora tendr que poner una lnea similar
a:
#!/usr/local/bin/php
como la primera lnea de cualquier fichero que contenga etiquetas de PHP.
Tambin necesitar hacer que el fichero sea ejecutable. Eso significa, tratarlo
exactamente como tratara cualquier otro script de CGI escrito en Perl, sh, bash, o
cualquier otro lenguaje comn de script el cual utilice #!como mecanismo de
ejecucin de si mismo.
Para que PHP maneje la informacin correctamente
de PATH_INFO y PATH_TRANSLATED con esta configuracin, el analizador de PHP
debera ser compilado con la opcin de configuracin --enable-discard-path.
Instalado como mdulo de Apache
Cuando PHP es usado como un mdulo de Apache, hereda los permisos del usuario
de Apache (generalmente los del usuario "nobody"). Este hecho representa varios
impactos sobre la seguridad y las autorizaciones. Por ejemplo, si se est
usando PHP para acceder a una base de datos, a menos que tal base de datos
disponga de un control de acceso propio, se tendr que hacer que la base de datos
sea asequible por el usuario "nobody". Esto quiere decir que un script malicioso
podra tener acceso y modificar la base de datos, incluso sin un nombre de usuario
y contrasea. Es completamente posible que una araa(bot) web pudiera toparse
con la pgina web de administracin de una base de datos, y eliminar todo de la
base de datos. Una proteccin ante este tipo de situaciones es mediante el uso del
mecanismo de autorizacin de Apache, o con modelos de acceso de diseo propio
usando LDAP, archivos .htaccess, etc. e incluir ese cdigo como parte de los
scripts PHP.
Con frecuencia, una vez la seguridad se ha establecido en un punto en donde el
usuario de PHP (en este caso, el usuario de apache) tiene asociada muy poco
riesgo, se descubre que PHP se encuentra ahora imposibilitado de escribir archivos
en los directorios de los usuarios. O quizs se le haya desprovisto de la capacidad
de acceder o modificar bases de datos. Se ha prevenido que pudiera escribir tanto
archivos buenos como malos, o que pudiera realizar transacciones buenas o malas
en la base de datos.
Un error de seguridad cometido con frecuencia en este punto es darle permisos de
administrador (root) a apache, o incrementar las habilidades del usuario de apache
de alguna otra forma.
Incrementar los permisos del usuario de Apache hasta el nivel de administrador es
extremadamente peligroso y puede comprometer al sistema entero, as que el uso


de entornos sudo, chroot, o cualquier otro mecanismo que sea ejecutado como
root no debera ser considerado como una opcin por aquellos que no son
profesionales en seguridad.
Existen otras soluciones ms simples. Mediante el uso de open_basedir se puede
controlar y restringir qu directorios pueden ser usados por PHP. Tambin se
pueden definir reas solo-Apache, para restringir todas las actividades basadas en
web a archivos que no son de usuarios o del sistema.
Seguridad del Sistema de Archivos
Tabla de contenidos
Cuestiones relacionadas a bytes nulos
PHP est sujeto a la seguridad integrada en la mayora de sistemas de servidores
con respecto a los permisos de archivos y directorios. Esto permite controlar qu
archivos en el sistema de archivos se pueden leer. Se debe tener cuidado con los
archivos que son legibles para garantizar que son seguros para la lectura por todos
los usuarios que tienen acceso al sistema de archivos.
Desde que PHP fue diseado para permitir el acceso a nivel de usuarios para el
sistema de archivos, es perfectamente posible escribir un script PHPque le permita
leer archivos del sistema como /etc/passwd, modificar sus conexiones de red,
enviar trabajos de impresin masiva, etc. Esto tiene algunas implicaciones obvias,
es necesario asegurarse que los archivos que se van a leer o escribir son los
apropiados.
Considere el siguiente script, donde un usuario indica que quiere borrar un archivo
en su directorio home. Esto supone una situacin en la que una interfaz web
en PHP es usada regularmente para gestionar archivos, por lo que es necesario
que el usuario Apache pueda borrar archivos en los directorios home de los
usuarios.
Ejemplo #1 Un control pobre puede llevar a ....
<?php
// eliminar un archivo del directorio personal del usuario
$username = $_POST['user_submitted_name'];
$userfile = $_POST['user_submitted_filename'];
$homedir = "/home/$username";

unlink("$homedir/$userfile");

echo "El archivo ha sido eliminado!";
?>
Dado que el nombre de usuario y el nombre del archivo son enviados desde un
formulario, estos pueden representar un nombre de archivo y un nombre de


usuario que pertenecen a otra persona, incluso se podra borrar el archivo a pesar
que se supone que no estara permitido hacerlo. En este caso, usted deseara usar
algn otro tipo de autenticacin. Considere lo que podra suceder si las variables
enviadas son "../etc/" y "passwd". El cdigo entonces se ejecutara efectivamente
como:
Ejemplo #2 ... Un ataque al sistema de archivos
<?php
// elimina un archivo desde cualquier lugar en el disco duro al que
// el usuario de PHP tiene acceso. Si PHP tiene acceso de root:
$username = $_POST['user_submitted_name']; // "../etc"
$userfile = $_POST['user_submitted_filename']; // "passwd"
$homedir = "/home/$username"; // "/home/../etc"

unlink("$homedir/$userfile"); // "/home/../etc/passwd"

echo "El archivo ha sido eliminado!";
?>
Hay dos medidas importantes que usted debe tomar para prevenir estas
cuestiones.
nicamente permisos limitados al usuario web de PHP.
Revise todas las variables que se envan.
Aqu est una versin mejorada del script:
Ejemplo #3 Comprobacin ms segura del nombre de archivo
<?php
// elimina un archivo del disco duro al que
// el usuario de PHP tiene acceso.
$username = $_SERVER['REMOTE_USER']; // usando un mecanismo de autenticacin
$userfile = basename($_POST['user_submitted_filename']);
$homedir = "/home/$username";

$filepath = "$homedir/$userfile";

if (file_exists($filepath) && unlink($filepath)) {
$logstring = "Se ha eliminado $filepath\n";
} else {
$logstring = "No se ha podido eliminar $filepath\n";
}
$fp = fopen("/home/logging/filedelete.log", "a");
fwrite($fp, $logstring);
fclose($fp);

echo htmlentities($logstring, ENT_QUOTES);



?>
Sin embargo, incluso esto no est exento de defectos. Si la autenticacin del
sistema permite a los usuarios crear sus propios inicios de sesin de usuario, y un
usuario eligi la entrada "../etc/", el sistema est expuesto una vez ms. Por esta
razn, puede que prefiera escribir un chequeo ms personalizado:
Ejemplo #4 Comprobacin ms segura del nombre de archivo
<?php
$username = $_SERVER['REMOTE_USER']; // usando un mecanismo de autenticacin
$userfile = $_POST['user_submitted_filename'];
$homedir = "/home/$username";

$filepath = "$homedir/$userfile";

if (!ctype_alnum($username) || !preg_match('/^(?:[a-z0-9_-
]|\.(?!\.))+$/iD', $userfile)) {
die("nombre de usuario o nombre de archivo incorrecto");
}

//etc...
?>
Dependiendo de sus sistema operativo, hay una gran variedad de archivos a los
que debe estar atento, esto incluye las entradas de dispositivos (/dev/ o COM1),
archivos de configuracion (archivos /etc/ y archivos .ini), las muy conocidas
carpetas de almacenamiento (/home/, Mis documentos), etc. Por esta razn, por lo
general es ms fcil crear una poltica en donde se prohba todo excepto lo que
expresamente se permite.
Cuestiones relacionadas a bytes nulos
Como PHP utiliza las funciones de C para operaciones relacionadas al sistema de
archivos, se podra manejar bytes nulos de manera bastante inesperada. Como un
byte nulo denota el fin de una cadena en C, las cadenas que contengan estos no
sern consideradas por completo, sino slo hasta que ocurra un byte nulo. El
siguiente ejemplo muestra un cdigo vulnerable que presenta este problema:
Ejemplo #1 Script vulnerable a bytes nulos
<?php
$file = $_GET['file']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/'.$file.'.php')) {
// file_exists devolver true si el archivo /home/wwwrun/../../etc/passwd ex
iste
include '/home/wwwrun/'.$file.'.php';
// el archivo /etc/passwd se incluir


}
?>
Por lo tanto, cualquier cadena que se utiliza en una operacin de sistema de
archivos siembre deben ser validados correctamente. He aqu una versin
mejorada del ejemplo anterior:
Ejemplo #2 Validando correctamente la entrada
<?php
$file = $_GET['file'];

// Lista blanca de valores posibles
switch ($file) {
case 'main':
case 'foo':
case 'bar':
include '/home/wwwrun/include/'.$file.'.php';
break;
default:
include '/home/wwwrun/include/main.php';
}
?>
Seguridad de Bases de Datos
Tabla de contenidos
Diseando la base de datos
Conectndose a la base de datos
Modelo de almacenamiento encriptado
Inyeccin de SQL
Hoy en da, las bases de datos son componentes cardinales de cualquier aplicacin
basada en la web permitiendo a los sitios web que provean una variedad de
contenido dinmico. Esta informacin muy sensible o secreta puede ser
almacenada en una base de datos, por lo que debe considerar fuertemente
proteger su base de datos.
Para devolver o almacenar cualquier informacin usted necesita conectarse a la
base de datos, enviar una consulta legtima, devolver el resultado, y cerrar la
conexin. Hoy en da, el lenguaje de consultas comunmente utilizado en esta
interaccin es el Lenguaje Estructurado de Consultas (SQL, por sus siglas en
ingls). Vea como un atacante puede entrometerse con una consulta maliciosa de
SQL.
Como puede suponer, PHP no protege su base de datos por s mismo. Las
siguientes secciones piensan ser una introduccin a lo ms bsico de cmo acceder
y manipular base de datos dentro de scripts de PHP.


Tenga en mente esta simple regla: Proteccin en profundidad. En la mayora de
sitios tome la accin de incrementar la proteccin de su base de datos, para una
menor probabilidad de que un atacante tenga xito en exponer o abusar de
cualquier informacin que tenga almacenada. El buen diseo del esquema de la
base de datos y de la aplicacin se ocupar de sus mayores temores.
Diseando la base de datos
El primer paso es siempre crear una base de datos, a menos que quiera utilizar
una de terceras personas. Cuando una base de datos es creada, sta es asignada
a un propietario, el que ha ejecutado la sentencia de creacin. Usualmente, slo el
propietario (o un superusuario) puede hacer cualquier cosa con los objetos en esa
base de datos, y para permitir a otros usuarios que puedan utilizarla, debe
concederles privilegios.
Las aplicaciones nunca deberan conectarse a la base de datos como su propietario
o como superusuario, porque estos usuarios pueden ejecutar cualquier consulta a
su antojo, por ejemplo, modificar el esquema (Ej., eliminar tablas) o borrar su
contenido entero.
Puede crear distintos usuarios de la base de datos para cada aspecto de su
aplicacin con permisos muy limitados a los objetos. La mayora de privilegios que
son requeridos deberan ser solamente otorgados, y as evitar que el mismo
usuario pueda interactuar con la base de datos en diferentes casos y usos. Esto
significa que si los intrusos ganan acceso a su base de datos utilizando las
credenciales de la aplicacin, solamente afecta a los cambios que su aplicacin
permita.
Usted est encarecido a no implementar toda la lgica del negocio en la aplicacin
web (Ej., sus scripts), en su lugar hgalo en el esquema de la base de datos
utilizando vistas, disparadores o reglas. Si el sistema evoluciona, se pensar en
abrir nuevos puertos a la base de datos, y usted tendr que re-implementar la
lgica en cada base de datos del cliente por separado. Al respecto de lo antes
citado, los disparadores pueden ser utilizados para manerjar campos transparentes
y automticamente, lo cual a menudo provee un vistazo al interior cuando hay
problemas de depuracin con su programa o con el sistema de seguimientos de
transacciones de su aplicacin.
Conectndose a la base de datos
Puede ser que quiera establecer las conecciones sobre SSL para encriptar la
comunicacin cliente/servidor para incrementar la seguridad, o tambin puede
usar ssh para encriptar la conexin de red entre los clientes y el servidor de base
de datos. Si alguno de stos es utilizado, el monitoreo de su trfico y la obtencin
de informacin sobre su base de datos ser difcil para un posible atacante.


Modelo de almacenamiento encriptado
SSL/SSH proteje los datos que viajan desde el cliente al servidor: SSL/SSH no
proteje los datos persistentes almacenados en una base de datos. SSL es un
protocolo para proteger los datos mientras viajan en el cable.
Una vez un atacante gana acceso directamente a su base de datos (sobre pasando
el servidor web), los datos sencibles podran ser divulgados o mal utilizados, a
menos que la informacin est protegida en la base de datos por s misma.
Encriptando los datos es una buena forma de mitigar esta amenaza, pero muy
pocas bases de datos ofrecen este tipo de encripcin de datos.
La forma ms fcil para trabajar en este problema, es crear primero su propio
paquete de encripcin, y utilizarlo desde de sus scripts de PHP. PHPpuede guiarle
en esto con muchas extensiones, tales como Mcrypt y Mhash, cubriendo as, una
amplia variedad de algoritmos de encripcin. El script encripta los datos antes de
insertarlos dentro de la base de datos, y los desencripta cuando los devuelve. Vea
las referencias para ejemplos adicionales de como funciona la encripcin.
En caso de datos que deben estar ocultos, si no fuera necesario usar su
representacin real (es decir, que no se mostrarn), quizs convenga utilizar
hashing. El ejemplo ms tpico de hashing es cuando se almacena el hash MD5 de
una contrasea en una base de datos, en lugar de almacenar la contrasea en s
misma. Vea tambin las funciones crypt() y md5().
Ejemplo #1 Utilizando campos de contrasea con hash
<?php

// Almacenando la contrasea con hash
// $random_chars se obtuvo, p.ej., usando /dev/random
$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
pg_escape_string($username),
pg_escape_string(crypt($password, '$2a$07$' . $random_chars . '$')))
;
$result = pg_query($connection, $query);

// Consultando si el usuario envi la contrasea correcta
$query = sprintf("SELECT pwd FROM users WHERE name='%s';",
pg_escape_string($username));
$row = pg_fetch_assoc(pg_query($connection, $query));

if ($row && crypt($password, $row['pwd']) == $row['pwd']) {
echo 'Bienvenido, ' . htmlspecialchars($username) . '!';
} else {
echo 'La autenticacin ha fallado para ' . htmlspecialchars($username) . '.'
;
}



?>
Inyeccin de SQL
Muchos desarrolladores web son desprevendios de cmo las consultas SQL pueden
ser manipuladas, y asumen que una consulta SQL es un comando confiable. Esto
significa que las consultas SQL estn expuestas a que sean malversadas en
controles de acceso, y por lo tanto, sobrepasar las revisiones de autenticacin y
autorizacin estndar, y que algunas veces las consultas SQL an podran permitir
el acceso de comandos a nivel de sistema operativo del ordenador.
Comandos directos de Inyeccin SQL es una tcnica donde un atacante crea o
altera comandos SQL existentes para exponer datos ocultos, sobreponerse a los
que son importantes, o peor an, ejecutar comandos peligrosos a nivel de sistema
en el equipo donde se encuentra la base de datos. Esto se logra a travs de la
aplicacin, tomando la entrada del usuario y combinndola con parmetros
estticos para elaborar una consuta SQL. Los siguientes ejemplos estn basados
en historias reales, desafortunadamente.
Debido a la falta de validacin en la entrada de datos y conectndose a la base de
datos con privilegios de super usuario o de alguien con privilegios que puede crear
usuarios, el atacante podra crear un super usuario en su base de datos.
Ejemplo #1 Dividiendo el conjunto de resultados en pginas ... y
haciendo super usuarios (PostgreSQL)
<?php

$offset = $argv[0]; // Cuidado, no hay validacin en la entrada de datos!
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;"
;
$result = pg_query($conn, $query);

?>
Los usuarios normales dan clic en los enlaces 'siguiente' o 'atras'
donde $offset est codificado en la URL. El script espera que el $offset entrante
sea un nmero dcimal. Sin embargo, qu pasa si alguien intenta irrumpir
aadiendo una funcin urlencode() al formulario de la siguiente URL
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
select 'crack', usesysid, 't','t','crack'
from pg_shadow where usename='postgres';
--


Si esto sucedi, entonces el script podra presentarle un acceso de super usuario al
atacante. Ntese que 0; es para proveer un offset vlido a la consulta original y
para finalizarla.
Nota:
Esta es una tcnica comn para forzar al analizador SQL a que ignore el resto de la
consulta escrita por el desarrollador con dos guines: -- los cuales representan un
comentario en SQL.
Una forma factible de obtener contraseas es burlar las pginas de bsqueda de
resultados. Lo nico que el atacante necesita hacer es ver si hay variables que
hayan sido enviadas y sean usadas en declaraciones SQL las cuales no sean
manejadas apropiadamente. Esos filtros pueden ser puestos comunmente en un
formulario anterior para personalizar las clusulas WHERE, ORDER BY,
LIMIT y OFFSET en las declaracionesSELECT. Si su base de datos soporta el
constructor UNION, el atacante podra intentar aadir una consulta enetera a la
consulta original para listar contraseas de una tabla arbitraria. Utilizar campos de
contrasea encriptadoslds es fuertemente recomendado.
Ejemplo #2 Listando nuestros artculos ... y algunas contraseas (de
cualquier servidor de base de datos)
<?php

$query = "SELECT id, name, inserted, size FROM products
WHERE size = '$size'";
$result = odbc_exec($conn, $query);

?>
La parte esttica de la consulta puede ser combinada con otra
declaracin SELECT la cual revela todas las contraseas:
'
union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from
usertable;
--
Si esta consulta (ejecutndose con ' y --) fuera asignada a una de las variables
utilizadas en $query, la consulta reaccionar bestialmente.
Las consultas de actualizacin de SQL, tambin son susceptibles a ataques. Estas
consultas tambin son amenazadas por acortamiento y adicin en una consulta
completamente nueva a esta. Sin embargo el atacante podra manipularla con la
clusula SET. En este caso, algunos esquemas de informacin deben ser
procesados para manipular la consulta exitosamente. Este puede adquirirse
examinando la forma de nombres de las variables, o simplemente forzarlo con un


ataque de fuerza bruta. No hay muchas convenciones de nombres para campos
que almacenan contraseas o nombres de usuarios.
Ejemplo #3 Desde re-establecer una contrasea ... hasta ganar ms
privilegios (en cualquier servidor de bases de datos)
<?php
$query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";
?>
Pero un usuario malicioso podra enviar el valor ' or uid
like'%admin% a $uid para cambiar la contrasea del administrador, o
simplemente cambiar $pwd a hehehe', trusted=100, admin='yes para obtener
ms privilegios. Entonces, la consulta sera cambiada:
<?php

// $uid: ' or uid like '%admin%
$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%';";

// $pwd: hehehe', trusted=100, admin='yes
$query = "UPDATE usertable SET pwd='hehehe', trusted=100, admin='yes' WHERE
...;";

?>
Un ejemplo horrible de cmo pueden ser accedidos los comandos a nivel de
sistema operativo en algunos hospedadores de bases de datos.
Ejemplo #4 Atacando el sistema operativo que hospeda la base de datos
(Servidor MSSQL)
<?php

$query = "SELECT * FROM products WHERE id LIKE '%$prod%'";
$result = mssql_query($query);

?>
Si un atacante enva el valor a%' exec master..xp_cmdshell 'net user test
testpass /ADD' -- hacia $prod, la consulta $query ser:
<?php

$query = "SELECT * FROM products
WHERE id LIKE '%a%'
exec master..xp_cmdshell 'net user test testpass /ADD' --%'";
$result = mssql_query($query);

?>


El servidor MSSQL ejecuta la sentencia SQL en el lote que incluye un comando
para aadir un usuario nuevo a la base de datos de cuentas locales. Si esta
aplicacin estuviera ejecutndose como sa, y el servicio MSSQLSERVER se est
ejecutando con los privilegios suficientes, el atacante ahora podra tener una
cuenta con la cual tendra acceso a esta mquina.
Nota:
Algunos de los ejemplos de citados arriba estan vinculados a un servidor de base
de datos especfico. Esto no significa que un ataque similar sea imposible en contra
de otros productos. Su servidor de base de datos podra ser vulnerable de forma
similar en otra manera.

Imagen cortesa de xkcd
Tcnicas de evitacin
Pese a que pueda parecer obvio que un atacante debe tener al menos algn
conocimiento de arquitecturas de bases de datos para poder realizar un ataque
con xito, el obtener esta informacin suele ser muy sencillo. Por ejemplo, cuando
la base de datos forma parte de un paquete de software libre, o disponible
pblicamente, con una instalacin predefinida, esta informacin se encuentra
completamente libre y disponible. Esta informacin puede haber sido divulgada en
proyectos de cdigo cerrado - incluso si est codificad, ofuscada o compilada -
incluso por el propio cdigo mediante mensajes de error. Otros mtodos incluyen
el uso de nombres de tablas y columnas frecuentes. Por ejemplo, un formulario de
inicio de sesin que utiliza una tabla 'users' con los nombres de columna 'id',
'username', y 'password'.
Esos ataques estn principalmente basados en explotar el cdigo que no ha sido
escrito teniendo en mente la seguridad. Nunca confes en ningn tipo de entrada,
especialmente la que viene del lado del cliente, an cuando esta venga de una caja
de seleccin, un campo oculto o una cookie. El primer ejemplo muestra que una
inofensiva consulta puede causar desastres.


Nunca se conecte como super usuario o como el propietario de la base de
datos. Siempre utilice usuarios personalizados con privilegios muy
limitados.
Use sentencias preparadas con variables vinculadas. Son proporcionadas
por PDO, MySQLi y otras bibliotecas.
Revise si la entrada proporcionada tiene el tipo de datos que se
espera. PHP tiene un rango amplio de funciones para validar la entrada de
datos, desde las ms simples encontradas en Funciones de variable y
en Funciones de tipo
Caracter (Ej. is_numeric(), ctype_digit()respectivamente) y siguiendo el
apoyo con las Expresiones regulares compatibles con Perl.
Si la expresin espera una entrada numrica, considere verificar los datos
con la funcin ctype_digit(), o silenciosamente cambie su tipo
utilizando settype(), o use su representacin numrica por medio
de sprintf().
Ejemplo #5 Una forma ms segura de redactar una consulta para
paginacin
<?php

settype($offset, 'integer');
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $of
fset;";

// Fjese en %d en el formato de cadena, utilizar %s podra no tener un r
esultado significativo
$query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OF
FSET %d;",
$offset);

?>
Si la capa de la base de datos no admite variables vinculadas, entrecomille
cada valor no numrico proporcionado por el usuario que sea pasado a la
base de datos con la funcin de escapado de cadenas de caracteres
especfica de la base de datos
(p.ej.mysql_real_escape_string(), sqlite_escape_string(), etc.). Las
funciones genricas como addslashes() son tiles solamente en un entorno
muy especfico (p.ej., MySQL en un conjunto de caracteres monobyte
con NO_BACKSLASH_ESCAPES deshabilitada), por lo que es mejor
evitarlas.
No muestre ninguna informacin especfica de la base de datos,
especialmente sobre el esquema, por su correcto significado es como jugar
sucio contra usted mismo. Vea tambin Reporte de errores y Manejo de
errores y funciones de registro.
Podra utilizar procedimientos almacenados y previamente cursores
definidos, para abstraer el acceso a datos para que los usuarios no tengan


acceso directo a las tablas o vistas, para que esta solucin tenga otros
impactos.
Junto a esto, usted se beneficia de tener un registro de las consultas ya sea dentro
de su script o de la base de datos en si misma, si es que esta soporta el registro.
Obviamente, llevar un registro no le previene cualquier intento de dao, pero ste
puede ser til para hacer una retro revisin de cual aplicacin ha sido intervenida.
El registro no es til por s mismo, pero lo es debido a la informacin que contiene.
Ms detalles generalmente es mejor que los pocos.
Reportando errores
Con la seguridad de PHP, hay dos formas para reportar errores. Una es en
beneficio, para incrementar la seguridad, y la otra es para perjudicar.
Una tctica estndar de ataque conlleva a perfilar un sistema; llenndolo de datos
incorrectos, revisando los tipos y contextos de los errores que son devueltos. Esto
le permite al atacante recolectar informacin acerca del servidor, para determinar
posibles debilidades. Por ejemplo, si un atacante ha recogido informacin sobre
una pgina basada en un envo previo, l podra intentar sobrescribir las variables,
o modificarlas:
Ejemplo #1 Atacando variables con una pgina HTML personalizada
<form method="post"
action="objetivodelataque?username=badfoo&amp;password=badfoo">
<input type="hidden" name="username" value="badfoo" />
<input type="hidden" name="password" value="badfoo" />
</form>
Los errores de PHP que normalmente son devueltos, pueden ser muy tiles para el
desarrollador que est intentando depurar un script, indicando qu cosas, como
por ejemplo, qu funcin o qu fichero de PHP fall, y el nmero de lnea en donde
la falla ocurri. Toda esta es la informacin que puede ser explotada. Esto no es
algo raro para un desarrollador de PHP que utilice las
funciones show_source(), highlight_string(), o highlight_file()como una medida de
depuracin, pero en un sitio en escena, esto puede exponer variables ocultas,
sintxis sin revisar, y otra informacin peligrosa. Es especialmente peligroso el
cdigo en ejecucin de fuentes conocidas con manejadores de depuracin
incluidos, o utilizar tcnicas comunes de depuracin. Si los atacantes pueden
determinar qu tcnica en general usted est utilizando, ellos podran tratar de
usar fuerza bruta en una pgina, enviando varias cadenas comunes de depuracin:
Ejemplo #2 Explotando variables comunes de depuracin
<form method="post"
action="objetivodelataque?errors=Y&amp;showerrors=1&amp;debug=1">
<input type="hidden" name="errors" value="Y" />
<input type="hidden" name="showerrors" value="1" />
<input type="hidden" name="debug" value="1" />
</form>


Sin importar el mtodo de manejo de errores, la capacidad de probar errores en
un sistema conlleva a proveer a un atacante con mas informacin.
Por ejemplo, el estilo comn de un error genrico de PHP indica que un sistema
ciertamente est ejecutando PHP. Si un atacante est en una pgina .html, y
quiere probar qu motor hay tras de ese servidor (para buscar debilidades en el
sistema), lo alimenta con datos errneos que lo podran habilitar a que determine
que ese sistema fue construido con PHP.
El error de una funcin puede indicar ya sea, un sistema que puede estar
ejecutando un motor especfico de base de datos, o dar las pistas de cmo una
pgina web puede estar programada o diseada. Esto permite una investigacin
ms profunda dentro de los puertos abiertos de la base de datos, o buscar errores
especficos o debilidades en una pgina web. Pasando diferentes porciones de
datos errneos, por ejemplo, un atacante puede determinar el orden de
autenticacin en un script, (por medio del nmero de lnea de los errores) como
tambin probar exploits que pueden ser utilizados en diferentes ubicaciones del
script.
Un error del sistema de archivos o un error general de PHP puede indicar qu
permisos tiene el servidor web, as tambin la estructura y organizacin de
ficheros en el servidor web. El cdigo de error escrito por el desarrollador puede
agravar este problema, conllevando a la explotacin fcil de la, hasta entonces,
informacin "oculta".
Hay tres grandes soluciones a este problema. La primera consiste en examinar
todas las funciones, e intentar arreglar la mayora de los errores. La segunda es
deshabilitar completamente la notificacin de errores de el cdigo en ejecucin. La
tercera es utilizar las funciones de manejo de error propias de PHP para crear su
propio manejador de errores. Dependiendo de su poltica de seguridad, puede ser
que encuentre que las tres sean aplicables a su situacin.
Una forma de detectar este problema por adelantado es hacer uso de la funcin
propia de PHP error_reporting(), para ayudarle a asegurar su cdigo y encontrar el
uso de variables que podran ser peligrosas. Al probar su cdigo, antes de
distribuirlo, con E_ALL, usted puede encontrar rapidamente reas donde sus
variables pueden ser abiertas para envenenamiento o modificacin en otras
maneras. Una vez usted est listo para distribuirlo, debera deshabilitar
completamente el reporte de errores poniendo el valor de error_reporting() a 0, o
apagar el visor de errores utilizando la opcin display_errors del
fichero php.ini para aislar su cdigo de ataques. Si decide hacer esto ltimo,
tambin debera definir la ruta de acceso a su archivo de registros utilizando la
directiva error_log, y poner log_errors en "on".
Ejemplo #3 Buscando variables peligrosas con E_ALL
<?php
if ($usuario) { // No se ha inicializado o revisado antes de utilizar
$permitir_acceso = 1;
}


if ($permitir_acceso == 1) { // Si la prueba anterior falla, los que no estn in
icializados o comprobados antes de utilizar, tendrn acceso
readfile("/ruta/hacia/datos/altamente/sensibles/index.html");
}
?>
Usando Register Globals
Advertencia
Esta caracterstica ha sido declarada OBSOLETA desde PHP 5.3.0
y ELIMINADA a partir de PHP 5.4.0.
Quizs el cambio ms controversial en PHP fue cuando el valor predeterminado
para la directiva de PHP register_globals pas de ON a OFF en PHP 4.2.0. La
dependencia sobre esta directiva era bastante comn y muchas personas ni
siquiera saba que exista y asuman slo que ese era el modo
como PHP funcionaba. Esta pgina explicar cmo se puede escribir cdigo
inseguro con esta directiva, pero tenga en cuenta que la directiva en si misma no
es insegura sino el uso inapropiado de ella.
Cuando est activada, register_globals inyectar los scripts con todo tipo de
variables, como las de peticiones provenientes de formularios HTML. Esto, unido al
hecho de que PHP no requiere la inicializacin de variables, significa que es muy
fcil escribir cdigo inseguro. Fue una decisin difcil, pero la comunidad
de PHP decidi desactivar esta directiva por defecto. Cuando est activada, las
personas usan variables que en realidad no se sabe a ciencia cierta de dnde
provienen y solo queda asumir. Las variables internas que son definidas en el
script mismo son mezcladas con los datos requeridos enviados por los usuarios y
al deshabilitar register_globals se cambia esto. Vamos a demostrar con un ejemplo
del uso incorrecto de register_globals:
Ejemplo #1 Ejemplo de uso incorrecto con register_globals = on
<?php
// $authorized = true Se define slo si el usuario est autenticado
if (authenticated_user()) {
$authorized = true;
}

// Debido a que no se inicializa $authorized como false, esta podra ser
// definida a travs de register_globals, como desde GET auth.php?authorized=1
// Por lo tanto, cualquier persona puede verse como autenticada!
if ($authorized) {
include "/highly/sensitive/data.php";
}
?>


Cuando est register_globals = on, la lgica anterior podra verse comprometida.
Cuando est deshabilitada, $authorized no puede definirse a travs de peticiones,
as que estar bien, aunque realmente en general es una buena prctica de
programacin inicializar las variables primero. Por ejemplo, en el ejemplo anterior
se puede haber realizado primero algo como $authorized = false. Hacer esto
primero significa que el cdigo anterior podra funcionar con register_globals
activado o desactivado ya que los usuarios de forma predeterminada no seran
autorizados.
Otro ejemplo es aquel de las sesiones. Cuando est register_globals = on, se
puede usar tambin $username en el siguiente ejemplo, pero nuevamente se debe
notar que $username tambin puede provenir de otros medios, tal como GET (a
travs de la URL).
Ejemplo #2 Ejemplo de uso de sesiones con register_globals on u off
<?php
// No se sabra por dnde proviene $username, pero se sabe que $_SESSION es
// para datos de sesin.
if (isset($_SESSION['username'])) {

echo "Hello <b>{$_SESSION['username']}</b>";

} else {

echo "Hello <b>Guest</b><br />";
echo "Would you like to login?";

}
?>
Incluso es posible tomar medidas preventivas para advertir cuando se haga un
intento de falsificacin. Si se sabe previamente con exactitud el lugar de donde
una variable debera provenir, se puede verificar si los datos enviados provienen
de una clase inapropiada de sumisin. Si bien no garantiza que los datos no han
sido falsificados, esto requiere que un atacante adivine el medio apropiado para
falsificar. Si no importa de donde provienen los datos requeridos, se puede
usar $_REQUEST ya que contiene una mezcla de datos GET, POST y COOKIE. Ver
tambin la seccin del manual sobre el uso de variables desde fuentes externas
sources.
Ejemplo #3 Deteccin de envenenamiento simple de variables
<?php
if (isset($_COOKIE['MAGIC_COOKIE'])) {

// MAGIC_COOKIE viene de una cookie.
// Asegrese de validar la informacin de la cookie!

} elseif (isset($_GET['MAGIC_COOKIE']) || isset($_POST['MAGIC_COOKIE'])) {



mail("admin@example.com", "Posible intento de ataque", $_SERVER['REMOTE_ADDR'
]);
echo "Violacin de seguridad, el administrador ha sido alertado.";
exit;

} else {

// MAGIC_COOKIE no se establece a travs de este REQUEST

}
?>
Por supuesto, simplemente deshabilitar register_globals no quiere decir que su
cdigo es seguro. Cada pieza de datos que es remitida, tambin debe ser
verificada de otras formas. Siempre valide los datos de los usuarios e inicialice sus
variables! Para chequear por variables no inicializadas, se puede
usar error_reporting() para mostrar errores de nivel E_NOTICE.
Para obtener informacin sobre la emulacin de register_globals activado o
desactivado, consulte este FAQ.
Nota: Nota de disponibilidad de Superglobals
Los arrays Superglobal como $_GET, $_POST y $_SERVER, etc. estn disponibles
desde PHP 4.1.0. Para ms informacin, lea la seccin del manual en superglobals
Datos Enviados por el Usuario
Las mayores debilidades de muchos programas PHP no son inherentes al lenguaje
mismo, sino simplemente un problema generado cuando se escribe cdigo sin
pensar en la seguridad. Por esta razn, usted debera tomarse siempre el tiempo
para considerar las implicaciones de cada pedazo de cdigo, para averiguar el
posible peligro involucrado cuando una variable inesperada es enviada.
Ejemplo #1 Uso Peligroso de Variables
<?php
// eliminar un archivo del directorio personal del usuario .. o
// quizs de alguien ms?

unlink ($variable_malvada);

// Imprimir el registro del acceso... o quizs una entrada de /etc/passwd?
fwrite ($desc_archivo, $variable_malvada);

// Ejecutar algo trivial.. o rm -rf *?
system ($variable_malvada);
exec ($variable_malvada);

?>


Usted debera examinar siempre, y cuidadosamente su cdigo para asegurarse de
que cualquier variable siendo enviada desde un navegador web sea chequeada
apropiadamente, y preguntarse a s mismo:
Este script afectar nicamente los archivos que se pretende?
Puede tomarse accin sobre datos inusuales o indeseados?
Puede ser usado este script en formas malintencionadas?
Puede ser usado en conjunto con otros scripts en forma negativa?
Sern adecuadamente registradas las transacciones?
Al preguntarse adecuadamente estas preguntas mientras escribe su script, en
lugar de hacerlo posteriormente, usted previene una desafortunada re-
implementacin del programa cuando desee incrementar el nivel de seguridad. Al
comenzar con esta mentalidad, no garantizar la seguridad de su sistema, pero
puede ayudar a mejorarla.
Puede que tambin desee considerar la deshabilitacin de register_globals,
magic_quotes, u otros parmetros convenientes que pueden causar confusin
sobre la validez, fuente o valor de una determinada variable. Trabajar con PHP en
modo error_reporting(E_ALL) tambin puede ayudarle a advertir variables que
estn siendo usadas antes de ser chequeadas o inicializadas (de modo que puede
prevenir que datos inusuales produzcan operaciones inadvertidas).
Comillas Mgicas
Tabla de contenidos
Qu son las Comillas Mgicas?
Por qu usarlas
Por qu no usarlas
Deshabilitar las comillas mgicas
Advertencia
Esta caracterstica ha sido declarada OBSOLETA desde PHP 5.3.0
y ELIMINADA a partir de PHP 5.4.0.
Las comillas mgicas son un procedimiento que automgicamente limpian los
datos de entrada de un script PHP. Es aconsejable trabajar con las comillas
mgicas deshabilitadas y, en su lugar, hacer un filtrado en tiempo de ejecucin y
bajo demanda.
Qu son las Comillas Mgicas?
Advertencia
Esta caracterstica ha sido declarada OBSOLETA desde PHP 5.3.0
y ELIMINADA a partir de PHP 5.4.0.


Cuando estn habilitadas, todos los caracteres ' (comillas simples), " (comillas
dobles), \ (barras) y NULL son "escapados" automticamente con una barra. Este
comportamiento es equivalente al de la funcin addslashes().
Hay tres directivas para las comillas mgicas:
magic_quotes_gpc Afecta a los datos de peticiones HTTP (GET, POST, y
COOKIE). No se puede habilitar en tiempo de ejecucin, y por omisin
vale on en PHP. Vea tambin get_magic_quotes_gpc().
magic_quotes_runtime Si est habilitada, la mayor parte de funciones que
devuelve datos a partir de recursos externos, incluyendo bases de datos y
ficheros de texto, tendrn las comillas escapadas con una barra. Puede
habilitarse en tiempo de ejecucin y por omisin vale off en PHP.Vea
tambin set_magic_quotes_runtime() y get_magic_quotes_runtime().
magic_quotes_sybase Si est habilitada, se escapa cada comilla simple con
otra comilla simple, en lugar de con un caracter barra. Si estuviera
habilitada, anulara por completo a magic_quotes_gpc. Si se tuvieran
habilitadas las dos directivas, slo se escaparan las comillas simples, en la
forma ''. Las comillas dobles, barras y caracteres NULL se mantendran
intactos y sin escapado. Vea tambin ini_get() para consultar su valor.
Por qu usarlas
Advertencia
Esta caracterstica ha sido declarada OBSOLETA desde PHP 5.3.0
y ELIMINADA a partir de PHP 5.4.0.
Dado que se han declarado obsoletas PHP, no hay ninguna razn para
usarlas. Sin embargo, todava estn ah y ayudan a los programadores
noveles a escribir un mejor cdigo (ms seguro). Sin embargo, si trabaja
con cdigo que dependa de este comportamiento, es preferible actualizar el
cdigo a tener que habilitar las comillas mgicas. Entonces por qu
existen? Sencillo, para ayudar a prevenir ataques de Inyeccin SQL. Hoy,
los desarrolladores son ms cuidadosos con la seguridad y acaban
empleando los mecanismos de escapado especficos de cada base de datos
y/o declaraciones preparadas en lugar de depender de funcionalidades
como las comillas mgicas.
Por qu no usarlas
Advertencia
Esta caracterstica ha sido declarada OBSOLETA desde PHP 5.3.0
y ELIMINADA a partir de PHP 5.4.0.
Portabilidad El asumir que estn habilitadas, o no, afecta a su portabilidad.
Para comprobarlo, utilice get_magic_quotes_gpc() para as programar como
corresponda.
Rendimiento Dado que no todos los datos que se escapen se insertarn en
una base de datos, existe un impacto negativo en el rendimiento escapando


todos estos datos. Es ms eficiente llamar a las funciones de escapado
(como addslashes()) en tiempo de ejecucin. A pesar de que en php.ini-
development se habilitan por omisin estas directivas, en php.ini-
production se deshabilitan. El motivo de esta recomendacin es sobre todo
debido a motivos de rendimiento.
Inconvenientes Dado que no todos los datos necesitan escapado, a menudo
resulta molesto ver datos escapados cuando no deberan. Por ejemplo, al
enviar un correo electrnico desde un formulario, y comprobar que hay
varios \' en el correo. Para corregirlo, se necesitar hacer un uso intensivo
de stripslashes().
Deshabilitar las comillas mgicas
Advertencia
Esta caracterstica ha sido declarada OBSOLETA desde PHP 5.3.0. Su uso est
totalmente desaconsejado.
La directiva magic_quotes_gpc slo puede deshabilitarse en el sistema, y no en
tiempo de ejecucin. En otras palabras, no se puede utilizarini_set().
Ejemplo #1 Deshabilitar comillas mgicas en el servidor
Ejemplo que establece un Off a estas directivas en php.ini. Para ms detalles, lea
la seccin del manual titulada Cmo cambiar los ajustes de configuracin.
; Magic quotes
;

; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off
Si no es posible acceder a la configuracin del servidor, tambin puede
usar .htaccess. Por ejemplo:
php_flag magic_quotes_gpc Off
Si tuviera inters en implementar cdigo portable (aqul que funciona en cualquier
entorno), y no pudiera modificar la configuracin en el servidor, aqu hay un
ejemplo de cmo deshabilitar magic_quotes_gpc en tiempo de ejecucin. Este
mtodo es ineficiente por lo que se recomienda establecer los valores apropiados
para las directivas en otro lugar.
Ejemplo #2 Deshabilitar las comillas mgicas en tiempo de ejecucin
<?php
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {


foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
?>
Ocultando PHP
En general, la seguridad por obscuridad es una de las formas ms dbiles de la
seguridad. Pero en algunos casos, cada pequeo elemento extra de seguridad es
deseable.
Unas cuantas tcnicas simples pueden ayudar a ocultar PHP, posiblemente
retrasando a un atacante que est tratando de descubrir debilidades en el sistema.
Al configurar expose_php en off en el archivo php.ini, se reduce la cantidad de
informacin disponible para ellos.
Otra tctica es configurar servidores web como Apache para interpretar diferentes
tipos de archivos por medio de PHP, ya sea con una directiva.htaccess o en el
propio archivo de configuracin de Apache. Entonces se pueden utilizar
extensiones de archivo engaosas:
Ejemplo #1 Ocultando PHP como si fuera otro lenguaje
# Hacer ver el cdigo PHP como si fueran otros tipos de cdigo
AddType application/x-httpd-php .asp .py .pl
U oscurecerlo completamente:
Ejemplo #2 Utilizando tipos desconocidos para extensiones de PHP
# Hacer ver el cdigo PHP como si fueran tipos desconocidos
AddType application/x-httpd-php .bop .foo .133t
U ocultarlo como cdigo HTML, lo cual tiene un pequeo impacto de rendimiento
debido a que todos los archivos HTML sern procesados por el motor de PHP:
Ejemplo #3 Utilizando tipos HTML para extensiones de PHP
# Hacer ver el cdigo PHP como si fueran HTML
AddType application/x-httpd-php .htm .html
Para que esto funcione eficazmente, se debe cambiar el nombre de los
archivos PHP con las extensiones de arriba. Si bien es una forma de seguridad por
oscuridad, es una medida preventiva menor con pocos inconvenientes.


Mantenerse al da
PHP, como cualquier otro sistema de tamao considerable, est bajo constante
escrutinio y remodelacin. Cada nueva versin incluye con frecuencia cambios
mayores y menores para mejorar la seguridad y reparar cualquier fallo, problemas
de configuracin, y otros asuntos que puedan afectar la seguridad y estabilidad
global de su sistema.
Como cualquier lenguaje y programa de scripting del nivel del sistema, el mejor
enfoque es el de actualizar con frecuencia, y mantenerse alerta sobre las ltimas
versiones y sus cambios.
Caractersticas
Autenticacin HTTP con PHP
Es posible usar la funcin header() para enviar un mensaje "Authentication
Required" al navegador del cliente causando que se abra una ventana para
ingresar usuario y password. Una vez se ha llenado el usuario y password, la URL
contenida dentro del script PHP ser llamada nuevamente con las variables
predefinidas PHP_AUTH_USER, PHP_AUTH_PW, y AUTH_TYPE puestas por el
nombre del usuario, password y el tipo de autenticacin respectivamente. Esas
variables predefinidas son encontradas en los
arrays $_SERVER y $HTTP_SERVER_VARS. Ambos mtodos de autenticacin
"Basic" y "Digest" (desde PHP 5.1.0) son soportados. Ver la funcin header() para
ms informacin.
Nota: Nota de la versin de PHP
Superglobals, como $_SERVER, estn disponibles en PHP 4.1.0.
Un fragmento de ejemplo de un script el cual podra forzar la autenticacin en una
pgina es el siguiente:
Ejemplo #1 Ejemplo de Autenticacin HTTP Basic
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Texto a enviar si el usuario pulsa el botn Cancelar';
exit;
} else {
echo "<p>Hola {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>Tu ingresaste {$_SERVER['PHP_AUTH_PW']} como tu password.</p>";
}
?>
Ejemplo #2 Ejemplo de Autenticacin HTTP Digest


Este ejemplo muestra como implementar un script PHP de autenticacin Digest.
Para ms informacin leer RFC 2617.
<?php
$realm = 'Area restringida';

//user => password
$users = array('admin' => 'mypass', 'guest' => 'guest');


if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$realm.
'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');

die('Texto a enviar si el usuario pulsa el botn Cancelar');
}


// analiza la variable PHP_AUTH_DIGEST
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
!isset($users[$data['username']]))
die('Datos Erroneos!');


// Generando una respuesta valida
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce']
.':'.$data['qop'].':'.$A2);

if ($data['response'] != $valid_response)
die('Datos Erroneos!');

// ok, usuario & password validos
echo 'Estas logueado como: ' . $data['username'];


// function to parse the http auth header
function http_digest_parse($txt)
{
// proteger contra datos perdidos
$needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'
=>1, 'uri'=>1, 'response'=>1);
$data = array();
$keys = implode('|', array_keys($needed_parts));

preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $
matches, PREG_SET_ORDER);



foreach ($matches as $m) {
$data[$m[1]] = $m[3] ? $m[3] : $m[4];
unset($needed_parts[$m[1]]);
}

return $needed_parts ? false : $data;
}
?>
Nota: Nota de Compatibilidad
Hay que ser cuidadoso cuando se programan las lneas del HTTP header. Para
garantizar la mayor compatibilidad con todos los clientes, la palabra "Basic" debe
ser escrita con maysculas "B", el string real debe ser encerrado en comillas
dobles (no simples), y exactamente un espacio debe preceder el cdigo 401 en la
lnea del header HTTP/1.0 401. Los parmetros de autenticacin deben ser
separados por comas como se vi en el ejemplo resumido anterior.
En lugar de imprimir simplemente PHP_AUTH_USER y PHP_AUTH_PW, como se
hizo en el ejemplo anterior, se debera chequear el usuario y password para
validar. Talvez enviando una consulta a una base de datos, o buscando el usuario
en un archivo dbm.
Cuidado con errores con el Internet Explorer. Parece ser muy quisquilloso con el
orden de los headers. Enviando el header WWW-Authenticateantes que el
header HTTP/1.0 401 parece ser un truco por ahora.
A partir de PHP 4.3.0, en orden de prevenir que alguien escriba un script el cual
revele el password para una pgina que fu autenticada con un mecanismo
externo tradicional, las variables PHP_AUTH no debern ser colocadas si la
autenticacin externa esta habilitada para esa pgina en particular y si safe
mode esta habilitado. Independientemente, REMOTE_USER puede ser usado para
identificar al usuario autenticado externamente. As, se podr
usar $_SERVER['REMOTE_USER'].
Nota: Nota de configuracin
PHP usa la presencia de una directiva AuthType para determinar si una
autenticacin externa esta en uso.
Ntese, sin embargo, que lo anterior no impide que alguien quien controle una URL
no autenticada pueda robar passwords de URL's autenticadas en el mismo
servidor.
Tanto Netscape Navigator e Internet Explorer borrarn el cach de la ventana de
autenticacin del navegador local despus de recibr una respuesta 401. Esto
puede "desloguear" efectivamente a un usuario, forzandolo a reingresar su usuario


y password. Algunas personas usan esto para "hacer esperar" logueos, o proveer
un botn de "deslogueo".
Ejemplo #3 Ejemplo de Autenticacin HTTP forzando a un nuevo
usuario/password
<?php
function authenticate() {
header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');
echo "Debes ingresar un login ID y password validos para accesar a este recu
rso\n";
exit;
}

if (!isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER']
)) {
authenticate();
} else {
echo "<p>Bienvenido: " . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br
/>";
echo "Anterior: " . htmlspecialchars($_REQUEST['OldAuth']);
echo "<form action='' method='post'>\n";
echo "<input type='hidden' name='SeenBefore' value='1' />\n";
echo "<input type='hidden' name='OldAuth' value=\"" . htmlspecialchars($_SER
VER['PHP_AUTH_USER']) . "\" />\n";
echo "<input type='submit' value='Re Authenticate' />\n";
echo "</form></p>\n";
}
?>
Este comportamiento no es requerido por la autenticacin HTTP Basic estandar,
as que se debera depender de esto. Probando con Lynxmostrar que Lynx no
limpia las credenciales de autenticacin con una respuesta 401 del servidor, asi
que presionando back y luego forward abrir el recurso nuevamente si estos no
han cambiado. Sin embarogo, el usuario puede presionar la tecla '_' para limpiar
su informacin de autenticacin.
Tambin notese que hasta PHP 4.3.3, la autenticacin HTTP no trabajaba usando
Microsoft IIS con la versin CGI de PHP, una limitacin de IIS. Para hacer
funcionar PHP 4.3.3 o mayor, se debe editar la configuracion de IIS "Directory
Security". Hacer click en "Edit" y solo chequear "Anonymous Access", todos los
demas campos dejarlos sin chequear.
Otra limitacin si se esta usando el mdulo IIS (ISAPI) y PHP 4, no se debera usar
las variables PHP_AUTH_* pero en su lugar, la
variableHTTP_AUTHORIZATION esta disponible. Por ejemplo, considerar el


siguiente cdigo: list($user, $pw) = explode(':',
base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
Nota: Nota de IIS:
Para que funcione la Autenticacin HTTP con IIS, la directiva de
PHP cgi.rfc2616_headers debe ser configurada a 0 (el valor por defecto).
Nota:
Si safe mode esta habilitado, el uid del script es agregado a la parte del reino del
header WWW-Authenticate.
Cookies
PHP soporta cookies HTTP de forma transparente. Las Cookies son un mecanismo
por el cul se almacenan datos en el browser remoto y as rastrear o identificar a
usuarios que vuelven. Se pueden configurar Cookies usando la
funcin setcookie() o setrawcookie(). Las Cookies son parte del header HTTP, as
es que setcookie() ser llamada antes que cualquier otra salida sea enviada al
browser. Esta es la misma limitacin que tiene la funcin header(). Se pueden
usar funciones del bffer de salida para retrasar la salida del script hasta que se
halla decidido enviar o no cookies o enviar cualquier otro header.
Algunos envos de cookies desde el cliente sern incluidos automticamente en el
Array auto-global $_COOKIE si variables_order contiene "C". Si se desea asignar
mltiples valores a una cookie, solo se deben agregar [] al nombre de la cookie.
Dependiendo de register_globals, variables regulares de PHP pueden ser creadas a
partir de las cookies. Sin embargo, no se recomienda esta prctica, esta
caracterstica es desactivada por temas de
seguridad. $HTTP_COOKIE_VARS tambin es configurada en versiones anteriores
de PHP cuando se configura la variable track_vars. (Esta configuracin sta desde
PHP 4.0.3).
Para ms detalles, incluyendo notas de bugs de los browsers, ver la
funcin setcookie() y setrawcookie().
Sesiones
El soporte de sesiones en PHP consiste en una manera de guardar ciertos datos a
travs de diferentes accesos web. Esto permite crear aplicaciones ms
personalizadas y mejorar las caractersticas del sitio web. Toda la informacin est
en la seccin. Referencia de sesiones.
Manejo de XForms


XForms define una variacin de los webforms tradicionales los cuales permiten
ser usados en una gran variedad de plataformas y navegadores o inclusive en
medios no tradicionales como los documentos PDF.
La primera diferencia clave con XForms es la forma en que los formularios son
enviados al cliente. XForms for HTML Authors contiene una descripcin
detallada de como crear XForms, para el fin de este tutorial nicamente veremos
un ejemplo simple.
Ejemplo #1 Un formulario simple de bsqueda con XForms
<h:html xmlns:h="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/2002/xforms">
<h:head>
<h:title>Search</h:title>
<model>
<submission action="http://example.com/search"
method="post" id="s"/>
</model>
</h:head>
<h:body>
<h:p>
<input ref="q"><label>Find</label></input>
<submit submission="s"><label>Go</label></submit>
</h:p>
</h:body>
</h:html>
El formulario anterior muestra una caja de texto (llamada q), y un botn submit.
Cuando el botn submit es presionado, el formulario ser enviado a la pgina
referenciada por action.
Aqu es donde comienza a verse diferente desde el punto de vista de la aplicacin
web. En un formulario normal HTML, los datos seran enviados
como application/x-www-form-urlencoded, en el mundo XForms, esta
informacin es enviada como datos formateados enXML.
Si se ha elegido trabajar con XForms, entonces probablemente se quiera esos
datos como XML, en ese caso, ver en $HTTP_RAW_POST_DATAdonde se puede
encontrar el XML generado por el navegador el cual se puede pasar en el
motor XSLT favorito o parseador.
Si no se esta interesado en formatear y solo se desea que la data sea cargada en
la variable tradicional $_POST, se puede instruir al navegador del cliente para
enviarlos como application/x-www-form-urlencoded cambiando el
atributo method a urlencoded-post.
Ejemplo #2 Usando un Xform para rellenar $_POST
<h:html xmlns:h="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/2002/xforms">
<h:head>
<h:title>Busqueda</h:title>


<model>
<submission action="http://example.com/search"
method="urlencoded-post" id="s"/>
</model>
</h:head>
<h:body>
<h:p>
<input ref="q"><label>Buscar</label></input>
<submit submission="s"><label>Ir</label></submit>
</h:p>
</h:body>
</h:html>
Nota: As como esta escrito, muchos navegadores no soportan Xforms.
Compruebe la versin de su navegador si el ejemplo falla.
Manejando la carga de archivos
Carga con el mtodo POST
Esta caracterstica permite que los usuarios envien tanto archivos de texto como
binarios. Con la autenticacin de PHP y las funciones de manipulacin de archivos,
se tiene completo control sobre quin est autorizado a cargar y que hay que
hacer con el archivo una vez que se ha cargado.
PHP es capaz de recibir cargas de archivos de cualquier navegador compatible con
RFC-1867.
Nota: Configuraciones Relacionadas
Ver tambin las
directivas file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size y ma
x_input_time en php.ini
PHP tambin soporta el mtodo PUT para la carga como lo utilizan los
clientes Netscape Composer y Amaya del W3C. Ver el soporte del mtodo PUTpara
ms detalles.
Ejemplo #1 Formulario para la carga de archivos
Una pgina de carga de archivos puede ser construida mediante la creacin de un
formulario especial el cual se vera algo como esto:
<!-- El tipo de codificacin de datos, enctype, se DEBE especificar como a
continuacin -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
<!-- MAX_FILE_SIZE debe preceder el campo de entrada de archivo -->
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<!-- El nombre del elemento de entrada determina el nombre en el array
$_FILES -->
Enviar este archivo: <input name="userfile" type="file" />
<input type="submit" value="Send File" />


</form>
El __URL__ en el ejemplo anterior se debe sustituir y apuntar a un archivo PHP.
El campo oculto MAX_FILE_SIZE (medido en bytes) debe preceder al campo de
entrada de archivo y su valor es el tamao mximo de archivo aceptado por PHP.
Este elemento del formulario se debe usar siempre, ya que evita a los usuarios la
molestia de esperar a que un gran archivo sea transferido slo para descubrir que
era demasiado grande y fall la transferencia. Tener en cuenta: engaar a esta
configuracin en el lado del navegador es muy fcil, as que nunca se debe confiar
en que archivos con un tamao mayor sern bloqueados por esta caracterstica. Es
simplemente una caracterstica de conveniencia para los usuarios en el lado cliente
de la aplicacin. Sin embargo, la configuracin de PHP (en el lado del servidor)
para un mximo de tamao, no puede ser engaada.
Nota:
Asegrese de que el formulario de subida de archivos tiene el
atributo enctype="multipart/form-data" de lo contrario la carga de archivos no
funcionar.
El $_FILES global existe a partir de PHP 4.1.0 (Usar $HTTP_POST_FILES en su
lugar si se utiliza una versin anterior). Este array contendr toda la informacin
sobre el archivo cargado.
El contenido de $_FILES del formulario de ejemplo es el siguiente. Tenga en
cuenta que esto asume la utilizacin del nombre del archivo cargadouserfile, tal
como se utiliza en el script de ejemplo anterior. Este puede ser cualquier nombre.
$_FILES['userfile']['name']
El nombre original del archivo en la mquina cliente.
$_FILES['userfile']['type']
El tipo mime del archivo, si el navegador proporciona esta informacin. Un
ejemplo podra ser "image/gif". Este tipo mime, sin embargo no se
verifica en el lado de PHP y por lo tanto no se garantiza su valor.
$_FILES['userfile']['size']
El tamao, en bytes, del archivo subido.
$_FILES['userfile']['tmp_name']
El nombre temporal del archivo en el cual se almacena el archivo cargado
en el servidor.
$_FILES['userfile']['error']


El cdigo de error asociado a esta carga de archivo. Este elemento fue
aadido en PHP 4.2.0
Los archivos, por defecto se almacenan en el directorio temporal por defecto del
servidor, a menos que otro lugar haya sido dado con la
directivaupload_tmp_dir en php.ini. El directorio por defecto del servidor puede ser
cambiado mediante el establecimiento de la variable de entorno TMPDIRen el
entorno en el cual se ejecuta PHP. Configurarlo usando putenv() desde un script
PHP no funcionar. Esta variable de entorno tambin se puede utilizar para
asegurarse de que las dems operaciones estn trabajando sobre los archivos
cargados.
Ejemplo #2 Validacin de la carga de archivos
Ver tambin las entradas para las
funciones is_uploaded_file() y move_uploaded_file() para ms informacin. El
siguiente ejemplo procesara la carga de archivo que vendra de un formulario.
<?php
// En versiones de PHP anteriores a 4.1.0, $HTTP_POST_FILES debe utilizarse en l
ugar
// de $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "El archivo es vlido y fue cargado exitosamente.\n";
} else {
echo "Posible ataque de carga de archivos!\n";
}

echo 'Aqu hay ms informacin de depurado:';
print_r($_FILES);

print "</pre>";

?>
El script PHP que recibe el archivo cargado, debe implementar cualquier lgica que
sea necesaria para determinar qu se debe hacer con el archivo subido. Se puede,
por ejemplo, utilizar la variable $_FILES['userfile']['size'] para descartar cualquier
archivo que sea demasiado pequeo o demasiado grande. Se podra utilizar la
variable $_FILES['userfile']['type'] para descartar cualquier archivo que no
corresponda con un cierto criterio de tipo, pero usando esto slo como la primera
de una serie de verificaciones, debido a que este valor est completamente bajo el
control del cliente y no se comprueba en el lado de PHP. A partir de PHP 4.2.0, se
puede usar $_FILES['userfile']['error'] y el planear la lgica de acuerdo con
loscdigos de error. Cualquiera que sea la lgica, se debe borrar el archivo del
directorio temporal o moverlo a otra parte.


Si ningn archivo es seleccionado para realizar la carga en el formulario, PHP
devolver $_FILES['userfile']['size'] como 0,
y $_FILES['userfile']['tmp_name'] como ninguno.
El archivo ser borrado del directorio temporal al final de la solicitud si no se ha
movido o renombrado.
Ejemplo #3 Cargando un array de archivos
PHP soporta las funcionalidades array de HTML incluso con archivos.
<form action="" method="post" enctype="multipart/form-data">
<p>Pictures:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Send" />
</p>
</form>
<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name, "data/$name");
}
}
?>
Una barra de progreso de carga de archivos puede ser implementada
mediante Session Upload Progress.
Explicacin de los mensajes de error
A partir de PHP 4.2.0, PHP devuelve un cdigo de error apropiado, junto con el
array del archivo. El cdigo de error se puede encontrar en el segmento error del
array del archivo que PHP crea durante la subida del archivo. En otras palabras, el
error podra encontrarse en$_FILES['userfile']['error'].
UPLOAD_ERR_OK
Valor: 0; No hay error, archivo subido con xito.
UPLOAD_ERR_INI_SIZE
Valor: 1; El archivo subido excede la
directiva upload_max_filesize en php.ini.
UPLOAD_ERR_FORM_SIZE


Valor: 2; El archivo subido excede la directiva MAX_FILE_SIZE que fue
especificada en el formulario HTML.
UPLOAD_ERR_PARTIAL
Valor: 3; El archivo subido fue slo parcialmente cargado.
UPLOAD_ERR_NO_FILE
Valor: 4; Ningn archivo fue subido.
UPLOAD_ERR_NO_TMP_DIR
Valor: 6; Falta la carpeta temporal. Introducido en PHP 4.3.10 y PHP 5.0.3.
UPLOAD_ERR_CANT_WRITE
Valor: 7; No se pudo escribir el archivo en el disco. Introducido en PHP
5.1.0.
UPLOAD_ERR_EXTENSION
Valor: 8; Una extensin de PHP detuvo la carga de archivos. PHP no
proporciona una forma de determinar cual extensin caus la parada de la
subida de archivos; el examen de la lista de extensiones cargadas
con phpinfo() puede ayudar. Introducido en PHP 5.2.0.
Nota:
Estas se convirtieron en constantes de PHP en PHP 4.3.0.
Dificultades comunes
El item MAX_FILE_SIZE no puede especificar un tamao de archivo mayor que el
que ha sido configurado en el upload_max_filesize en el archivophp.ini. Por defecto
es 2 megabytes.
Si hay un lmite de memoria activado, un memory_limit ms grande puede ser
necesario. Asegurarse de configurar un memory_limit lo suficientemente grande.
Si el max_execution_time es demasiado pequeo, la ejecucin del script puede
excederse de este valor. Asegurarse de configurar unmax_execution_time lo
suficientemente grande.
Nota: max_execution_time slo afecta al plazo de ejecucin del propio script.
Todo el tiempo gastado en actividades que tengan lugar por fuera de la ejecucin
del script, tales como las llamadas al sistema usando system(), la funcin sleep(),
las consultas a base de datos, el tiempo que tarda el proceso de subida de


archivos, etc., no se incluye cuando se determina el tiempo mximo que el script
ha estado funcionando.
Advertencia
max_input_time establece el tiempo mximo, en segundos, al script se le permite
recibir informacin, esto incluye la subida de archivos. Para archivos grandes o
mltiples, o usuarios con conexiones ms lentas, el valor predeterminado de 60
segundos puede ser excedido.
Si post_max_size se establece demasiado pequeo, los archivos grandes no
pueden ser cargados. Asegurarse de configurar post_max_size lo
suficientemente grande.
A partir de PHP 5.2.12, la configuracin max_file_uploads controla el nmero
mximo de archivos que se pueden cargar en una peticin. Si ms archivos que
ese lmite son subidos, entonces $_FILES parar de procesar archivos una vez se
alcanza el lmite. Por ejemplo, si max_file_uploads se establece en 10,
entonces $_FILES nunca contendr ms de 10 elementos.
No validar sobre cual archivo se opera puede significar que los usuarios pueden
acceder a informacin sensible en otros directorios.
Por favor tener en cuenta que el CERN httpd parece quitar todo lo que empieza
con primer espacio en blanco en la cabecera de tipo de contenido mime que recibe
desde el cliente. Mientras este sea el caso, el CERN httpd no soportar la
funcionalidad de carga de archivos.
Debido a la gran cantidad de estilos de lista de directorios, no podemos garantizar
que los archivos con nombres exticos (como el que contiene espacios en blanco)
se manejen adecuadamente.
Un desarrollador no debe mezclar los campos input normales con los de carga de
archivos en la misma variable de formulario (mediante un nombre
de input como foo[]).
Subida de mltiples archivos
Mltiples archivos pueden ser subidos utilizando diferentes name para los input.
Tambin es posible subir mltiples archivos simultneamente y tener la
informacin organizada automticamente en arrays. Para ello, es necesario utilizar
la misma sintaxis de sumisin de array en el formulario HTML como se hace con
mltiples selects y checkboxes:
Ejemplo #1 Subida de mltiples archivos
<form action="file-upload.php" method="post" enctype="multipart/form-data">
Enviar estos archivos:<br />
<input name="userfile[]" type="file" /><br />


<input name="userfile[]" type="file" /><br />
<input type="submit" value="Send files" />
</form>
Cuando el formulario de arriba se remite, los
arrays $_FILES['userfile'], $_FILES['userfile']['name'] y $_FILES['userfile']['size']
sern inicializados (as como en $HTTP_POST_FILES para las versiones de PHP
anteriores a 4.1.0). Cuando register_globals est activado, globales para los
archivos subidos tambin se inicializan. Cada uno de estos ser un array indexado
numricamente de los valores correspondientes a los archivos remitidos.
Por ejemplo, suponga que los nombres de
archivo /home/test/review.html y /home/test/xwp.out son remitidos. En este
caso,$_FILES['userfile']['name'][0] contendra el valor review.html,
y $_FILES['userfile']['name'][1] contendra el valor xwp.out. De manera
similar, $_FILES['userfile']['size'][0] contendra el tamao del
archivo review.html y as sucesivamente.
$_FILES['userfile']['name'][0], $_FILES['userfile']['tmp_name'][0], $_FILES['userfi
le']['size'][0], y $_FILES['userfile']['type'][0] tambin son establecidos.
Advertencia
A partir de PHP 5.2.12, la configuracin max_file_uploads acta como un lmite en
el nmero de archivos que se pueden subir en una peticin. Se necesita asegurar
que el formulario no intenta cargar ms archivos que este lmite en una peticin.
Soporte del mtodo PUT
PHP ofrece soporte para el mtodo HTTP PUT utilizado por algunos clientes para
almacenar archivos en un servidor. Las peticiones PUT son mucho ms simples que
una carga de archivos mediante solicitudes POST y se ven algo como esto:
PUT /path/filename.html HTTP/1.1
Esto normalmente significa que el cliente remoto quiere guardar el contenido que
sigue como: /path/filename.html en el rbol web. Obviamente no es una buena
idea para Apache o PHP dejar automticamente a todo el mundo que pueda
sobrescribir cualquier archivo del rbol web. Para manejar esta solicitud se debe
primero decir al servidor web que se desea que cierto script de PHP maneje la
peticin. En Apache se hace esto con la directiva de Script. Se puede colocar casi
en cualquier parte del archivo de configuracin de Apache. Un lugar comn es
dentro de un bloque<Directory> o tal vez dentro de un bloque <VirtualHost>.
Una lnea como sta hara el truco:
Script PUT /put.php
Esto le dice a Apache que enve todas peticiones PUT para URIs que coincidan con
el contexto en el cual se pone esta lnea en el script put.php. Esto asume, por


supuesto, que se tiene habilitado PHP para la extensin .php y que PHP est
activo. El recurso de destino para todas las solicitudes PUT a este script tiene que
ser en propio script, el archivo subido no debe tener un nombre de archivo.
Con PHP entonces se hara algo como lo siguiente en el put.php. Esto copiara el
contenido del archivo subido al archivo myputfile.ext en el servidor. Es probable
que se deseen realizar algunas verificaciones y/o autenticar al usuario antes de
realizar esta copia de archivo.
Ejemplo #1 Guardando archivos HTTP PUT
<?php
/* datos PUT vienen en en el flujo de entrada estndar */
$putdata = fopen("php://input", "r");

/* Abre un archivo para escribir */
$fp = fopen("myputfile.ext", "w");

/* Leer los datos de 1 KB a la vez
y escribir en el archivo */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);

/* Cerrar los flujos */
fclose($fp);
fclose($putdata);
?>
Usando archivos remotos
Siempre que allow_url_fopen este habilitado en php.ini, se pueden usar
URLs HTTP y FTP con la mayora de las funciones que toman un nombre de archivo
como parmetro. Adems, las URLs pueden ser usadas con las
declaraciones include, include_once, require y require_once (desde PHP
5.2.0, allow_url_include debe ser habilitado para esto). Ver Protocolos y
Envolturas soportados para ms informacin de los protocolos soportados por PHP.
Nota:
En PHP 4.0.3 y anteriores, con el fin de usar capas de URL, se requiri de
configurar PHP usando la opcin de configuracin --enable-url-fopen-wrapper .
Nota:
Las versiones Windows de PHP ms nuevas a la PHP 4.3 no soportan acceso
remoto a los archivos por las siguientes
funciones: include,include_once, require, require_once, y las funciones
imagecreatefromXXX en la extensin Funciones de GD e Imgenes


Por ejemplo, se puede usar esto para abrir un archivo en un web server remoto,
analizar la salida de los datos que se quieren, y entonces usar esos datos en una
consulta a la base de datos, o simplemente para mostrarlos en un estilo que
coincida con el resto del sitio web.
Ejemplo #1 Obteniendo el titulo de una pgina remota
<?php
$file = fopen ("http://www.example.com/", "r");
if (!$file) {
echo "<p>Imposible abrir el archivo remoto.\n";
exit;
}
while (!feof ($file)) {
$line = fgets ($file, 1024);
/* Esto solo trabaja si el titulo y sus tags estan en una lnea */
if (preg_match ("@\<title\>(.*)\</title\>@i", $line, $out)) {
$title = $out[1];
break;
}
}
fclose($file);
?>
Tambin se pueden escribir archivos en un servidor FTP (considerando que se esta
conectado como un usuario con los permisos de acceso correctos). Se pueden
crear nicamente archivos nuevos usando este mtodo. Si se intenta sobreescribir
un archivo que ya existe, la llamada a la funcin fopen() fallar.
Para conectarse como un usuario diferente a 'anonymous', se necesita especificar
el usuario (y posiblemente el password) con la URL, tal como
'ftp://user:password@ftp.example.com/path/to/file'. (Se puede usar la
misma sintaxis para accesar archivos va HTTP cuando se requiere autenticacin
bsica).
Ejemplo #2 Almacenando datos en un servidor remoto
<?php
$file = fopen ("ftp://ftp.example.com/incoming/outputfile", "w");
if (!$file) {
echo "<p>Imposible abrir el archivo remoto para escritura.\n";
exit;
}
/* Escribir los datos aqui. */
fwrite ($file, $_SERVER['HTTP_USER_AGENT'] . "\n");
fclose ($file);
?>
Nota:


Se podra tener la idea del ejemplo anterior que se esta usando esta tcnica para
escribir un archivo de log remoto. Desafortunadamente esto no funcionara porque
la funcin fopen() llamada fallar si el archivo remoto ya existe. Para hacer logs
distribuidos como ese, se debera dar un vistazo a syslog().
Manejo de Conexiones
Internamente en PHP se mantiene un estatus de la conexin. Hay 3 posibles