Copyright © 1997 - 2012 por el PHP Documentation Group. Este material puede ser distribuido solamente sujeto a los términos y condiciones establecidos por la licencia de Creative Commons Attribution 3.0 o superior. Una copia de la Licencia de Commons Attribution 3.0 está distribuida con este manual. La versión más reciente está disponible en » http://creativecommons.org/licenses/by/3.0/.
Si está interesado en su redistribución o republicación de este documento completa o parcialmente, con o sin modificaciones, y si tiene alguna pregunta, por favor contacte con los propietarios del Copyright en » doc-license@lists.php.net. Observe que esta dirección está ligada a una lista de correo pública.
PHP, acrónimo de "PHP: Hypertext Preprocessor", es un lenguaje "Open Source" interpretado de alto nivel, especialmente pensado para desarrollos web y el cual puede ser incrustado en páginas HTML. La mayoría de su sintaxis es similar a C, Java y Perl y es fácil de aprender. La meta de este lenguaje es permitir escribir a los creadores de páginas web, páginas dinámicas de una manera rápida y fácil, aunque se pueda hacer mucho más con PHP.
Este manual contiene principalmente una referencia de funciones PHP, también contiene una referencia del lenguaje, explicaciones de algunas de las características importantes de PHP otra información suplementaria.
Este manual se puede conseguir en diferentes formatos en » http://www.php.net/download-docs.php. Más información sobre como este manual es desarrollado puede encontrarse en el apéndice 'Sobre este manual'. Si está interesado en la Historia de PHP, visite el capítulo correspondiente.
Nosotros destacamos a las personas actualmente más activas al frente del manual, pero hay muchos más contribuyentes que nos ayudan en nuestro trabajo o han brindado una gran cantidad de ayuda al proyecto en el pasado. Hay muchísima gente anónima que ayudó con notas de usuarios en las páginas del manual, que continuamente son incluidos en las referencias, labor de la que también estamos muy agradecidos. Todas las listas a continuación están en orden alfabético.
Los siguientes contribuyentes deberían ser reconocidos por el impacto de lo que han hecho y/o continúan haciendo añadiendo contenido al manual: Bill Abt, Jouni Ahto, Alexander Aulbach, Daniel Beckham, Stig Bakken, Nilgün Belma Bugüner, Jesus M. Castagnetto, Ron Chmara, Sean Coates, John Coggeshall, Simone Cortesi, Peter Cowburn, Daniel Egeberg, Markus Fischer, Wez Furlong, Sara Golemon, Rui Hirokawa, Brad House, Pierre-Alain Joye, Etienne Kneuss, Moriyoshi Koizumi, Rasmus Lerdorf, Andrew Lindeman, Stanislav Malyshev, Justin Martin, Rafael Martinez, Rick McGuire, Moacir de Oliveira Miranda Júnior, Kalle Sommer Nielsen, Yasuo Ohgaki, Richard Quadling, Derick Rethans, Rob Richards, Sander Roobol, Egon Schmid, Thomas Schoefbeck, Sascha Schumann, Dan Scott, Masahiro Takagi, Yannick Torres, Michael Wallner, Lars Torben Wilson, Jim Winstead, Jeroen van Wolffelaar y Andrei Zmievski.
Los siguientes contribuyentes han hecho un importante trabajo editando el manual: Stig Bakken, Gabor Hojtsy, Hartmut Holzgraefe y Egon Schmid.
Los mantenedores actualmente más activos son: Daniel Brown, Nuno Lopes, Felipe Pena, Thiago Pojda y Maciek Sokolewicz.
Estas personas también pusieron mucho esfuerzo en la administración de las notas de usuarios: Mehdi Achour, Daniel Beckham, Friedhelm Betz, Victor Boivie, Jesus M. Castagnetto, Nicolas Chaillan, Ron Chmara, Sean Coates, James Cox, Vincent Gevers, Sara Golemon, Zak Greant, Szabolcs Heilig, Oliver Hinckel, Hartmut Holzgraefe, Etienne Kneuss, Rasmus Lerdorf, Matthew Li, Andrew Lindeman, Aidan Lister, Hannes Magnusson, Maxim Maletsky, Bobby Matthis, James Moore, Philip Olson, Sebastian Picklum, Derick Rethans, Sander Roobol, Damien Seguy, Jason Sheets, Tom Sommer, Jani Taskinen, Yasuo Ohgaki, Jakub Vrana, Lars Torben Wilson, Jim Winstead, Jared Wyles y Jeroen van Wolffelaar.
PHP (acrónimo de PHP: Hypertext Preprocessor) es un lenguaje de código abierto muy popular especialmente adecuado para desarrollo web y que puede ser incrustado en HTML.
Una respuesta corta y concisa, pero, ¿qué significa realmente? Un ejemplo nos aclarará las cosas:
Ejemplo #1 Un ejemplo introductorio
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Example</title>
</head>
<body>
<?php
echo "Hola, ¡soy un script PHP!";
?>
</body>
</html>
En lugar de usar muchos comandos para mostar HTML (como en C o Perl),
páginas PHP contienen HTML con código incluido en el mismo que
hace "algo" (en este caso, mostrar "Hola ¡soy un script PHP!).
El código PHP está entre medio de etiquetas de comienzo y
final especiales<?php y ?>
que nos permitirán entrar y salir del "modo PHP".
Lo que distingue a PHP de algo lado-cliente como Javascript, es que el código es ejecutado en el servidor, generando HTML y enviándolo al cliente. El cliente recibirá los resultados de ejecutar el script, sin ninguna posibilidad de determinar qué código ha producido el resultado recibido. El servidor web puede ser incluso configurado para que procese todos los archivos HTML con PHP y entonces no hay manera que los usuarios puedan saber que tienes debajo de la manga.
Lo mejor de usar PHP es que es extremadamente simple para el principiante, pero a su vez, ofrece muchas características avanzadas para los programadores profesionales. No sienta miedo de leer la larga lista de características de PHP, en poco tiempo podrá empezar a escribir sus primeros scripts.
Aunque el desarrollo de PHP está centrado en programación de scripts en lado-servidor, se puede utilizar para muchas otras cosas. Siga leyendo y descubra más sobre PHP en la sección ¿Qué se puede hacer con PHP? o vaya directo al tutorial de introducción si solamente está interesado en programación web.
PHP puede hacer cualquier cosa que se pueda hacer con un script CGI, como procesar la información de formularios, generar páginas con contenidos dinámicos, o enviar y recibir cookies. Y esto no es todo, se puede hacer mucho más.
Existen principalmente tres campos en los que se usan scripts en PHP.
PHP puede ser utilizado en cualquiera de los principales sistemas operativos del mercado, incluyendo Linux, muchas variantes Unix (incluyendo HP-UX, Solaris y OpenBSD), Microsoft Windows, Mac OS X, RISC OS y probablemente alguno más. PHP soporta la mayoría de servidores web de hoy en día, incluyendo Apache, IIS, y muchos otros. Esto incluye cualquier servidor web que pueda utilizar el binario PHP de FastCGI, como lighttpd y nginx. PHP funciona ya sea como un módulo, o como un procesador de CGI.
De modo que, con PHP tiene la libertad de elegir el sistema operativo y el servidor web de su gusto. Además, tiene la posibilidad de utilizar programación por procedimientos, programación orientada a objetos (POO), o una mezcla de ambas.
Con PHP no se encuentra limitado a resultados en HTML. Entre las habilidades de PHP se incluyen: creación de imágenes, archivos PDF e incluso películas Flash (usando libswf y Ming) sobre la marcha. También puede presentar otros resultados, como XHTML y cualquier otro tipo de ficheros XML. PHP puede autogenerar éstos archivos y almacenarlos en el sistema de archivos en vez de presentarlos en la pantalla, creando un caché en el lado-servidor para contenido dinámico.
Una de las características más potentes y destacables de PHP es su soporte para una gran cantidad de bases de datos. Escribir una página web con acceso habilitado a una base de datos es increiblemente simple utilizando una de las extensiones específicas (por ejemplo, para mysql), o utilizar una capa de abstracción como PDO, o conectarse a cualquier base de datos que soporte el estándar de Conexión Abierta a Bases de Datos por medio de la extensión ODBC. Otras bases de datos podrían utilizar cURL o sockets, como lo hace CouchDB.
PHP también cuenta con soporte para comunicarse con otros servicios usando protocolos tales como LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (en Windows) y muchos otros. También se pueden crear sockets puros e interactuar usando cualquier otro protocolo. PHP soporta WDDX para el intercambio de datos entre lenguajes de programación en web. Y hablando de interconexión, PHP puede utilizar objetos Java de forma transparente como objetos de PHP.
PHP tiene útiles características de procesamiento de texto, las cuales incluyen las Expresiones Regulares Compatibles de Perl (PCRE), muchas extensiones, y herramientas para el acceso y análisis de documentos XML. PHP estandardiza todas las extensiones XML sobre el fundamento sólido de libxml2, y extiende este conjunto de características añadiendo soporte para SimpleXML, XMLReader y XMLWriter.
Existen otras extensiones interesantes, las cuales están categorizadas alfabéticamente y por categoría. Hay extensiones adicionales PECL que podrían estar documentadas o no dentro del manual de PHP, tal como » XDebug.
Como puede apreciar, esta página no es suficiente para enumerar todas las características y beneficios que PHP ofrece. Consulte las secciones Instalación de PHP y Referencia de las funciones para una explicación de las extensiones mencionadas aquí.
A continuación, nos gustaría mostrate las bases de PHP en un corto y sencillo tutorial. Este documento explica cómo crear páginas web dinámicas con PHP, aunque PHP no solamente es capaz de crear páginas web. Consulte la sección titulada ¿Qué se puede hacer con PHP? para más información.
Las páginas web que usan PHP se tratan igual que páginas HTML comunes y corrientes, y se pueden crear o editar de la misma manera que normalmente crea páginas HTML.
En este manual asumimos que cuenta con un servidor que soporta PHP y que todos los archivos con la extensión .php son usados por PHP. En la mayoría de servidores, ésta es la extensión que toman los archivos PHP por defecto, pero pregunte al administrador de su servidor para estar seguro. Si su servidor soporta PHP, entonces no necesita hacer nada, solamente crear sus archivos .php y guardarlos en su directorio web y el servidor los analizará por usted. No hay necesidad de compilar nada o instalar otras herramientas. Mírelo de esta manera, los archivos PHP son tan simples como archivos de HTML con el añadido de una nueva familia de etiquetas que permiten todo tipo de cosas. La mayoría de las compañías de hospedaje de páginas web ofrecen el soporte que necesita para usar PHP, pero si por alguna razón ellos no lo hacen, considere leer la sección titulada » Recursos PHP para más información acerca de compañías de hospedaje que soportan PHP.
Digamos que quiere ahorrar preciado ancho de banda y programar en local. En este caso, querrá instalar un servidor web, como » Apache, y por supuesto » PHP. Lo más seguro es que también quiera instalar una base de datos como » MySQL.
Instálelos de forma independientemente o bien puede elegir una manera más sencilla. Nuestro manual contiene Instrucciones de instalación de PHP (asumiendo que tiene algún tipo de servidor web ya configurado). Si tuviera problemas con la instalación, sugerimos que haga sus preguntas en nuestra » lista de correo de instalación. Si elige la manera más sencilla, entonces » localice paquete pre-configurado para su sistema operativo, incluyendo MacOSX, Linux y Windows. En Linux, quizá encuentra que » rpmfind y » PBone le son de ayuda para encontrar los RPMs. Para encontrar paquetes para Debian quizá quiera visitar » apt-get.
Comienze por crear un archivo llamado hola.php y póngalo en el "directorio raíz" (DOCUMENT_ROOT) con el siguiente contenido:
Ejemplo #1 Nuestro primer script PHP: hola.php
<html>
<head>
<title>Ejemplo PHP</title>
</head>
<body>
<?php echo '<p>Hola Mundo</p>'; ?>
</body>
</html>
Utilice su navegador web para acceder al archivo en su servidor, con la URL terminando en /hola.php. Si está programando localmente este URL será algo como http://localhost/hola.php o http://127.0.0.1/hola.php pero esto depende de la configuración de su servidor web. Si todo está configurado correctamente, el fichero será analizado por PHP y el siguiente contenido aparecerá en su navegador:
<html> <head> <title>Ejemplo PHP</title> </head> <body> <p>Hola mundo</p> </body> </html>
Este script es extremadamente simple y no es necesario usar PHP para crear una página como esta. Lo único que muestra es: Hola mundo usando la sentencia de PHP echo. El fichero no debe ser ejecutable o especial de ninguna forma. El servidor reconoce que este fichero debe ser interpretado por PHP porque estamos usando la extensión ".php", el cuál está configurado para enviarlo a PHP. Piensa como si fuera un fichero HTML normal el cual tiene una serie de etiquetas especiales disponibles con las que puedes hacer muchas cosas interesantes.
Si ha intentado usar este ejemplo y no produjo ningún resultado, preguntando si deseaba descargar el archivo, o mostró todo el archivo como texto, lo más seguro es que PHP no se encuentra habilitado en su servidor. Pídale a su administrador que active esta función usando el capítulo titulado Instalación en el manual. Si está trabajando localmente, lea también el capítulo dedicado a la instalación para asegurarse de que todo esté configurado apropiadamente. Asegúrese que está accediendo al fichero vía http a través del servidor para mostrar el resultado. Si está abriendo el archivo desde el sistema de archivos, entonces probablemente no estará siendo analizado por PHP. Si el problema persiste no dude en usar alguna de las múltiples opciones de » Soporte de PHP.
El objetivo de este ejemplo es demostrar cómo puede usar el formato especial de las etiquetas PHP. En este ejemplo usamos <?php para indicar el inicio de la etiqueta PHP. Después indicamos la sentencia y abandonamos el modo PHP usando ?>. Puede salir de PHP y regresar cuantas veces lo desee usando este método. Para más información, puede leer la sección en el manual titulada Sintaxis básica de PHP.
Nota: sobre los avances de línea
Los avances de línia tienen poco sentido en HTML, igualmente sigue siendo buena idea hacer que el código HTML se vea limpio y bien, poniendo avances de línea. PHP automáticamente eliminará los avances de línea puestos inmediatamente después de cerrar ?>. Esto puede ser muy útil si pone muchos bloques de PHP o incluye ficheros que contienen PHP que no se supone que deban mostarar nada. Al mismo tiempo, puede resultar un poco confuso. Se puede poner un espacio después de cerrar ?> para forzar el mostrar un espacio y un avance de línea , o se puede poner un avance de línea explícitamente en el último echo o print dentro de tu bloque en PHP.
Nota: acerca de editores de texto
Hay muchos editores de texto y Entornos Integrados de Desarrollo (IDE por sus siglas en Inglés) que puede usar para crear, editar, y organizar archivos PHP. Puede encontrar una lista parcial de éstos en » Lista de editores de PHP. Si desea recomendar un editor, por favor visite la página mencionada anteriormente, y comunique su recomendación a las personas encargadas del mantenimiento para que lo incluyan en la lista. Contar con un editor que resalte la sintaxis de PHP puede ser de mucha ayuda.
Nota: acerca de los procesadores de texto
Los procesadores de texto como StarOffice Writer, Microsoft word y Abiword no son buenas opciones para editar archivos de PHP. Si desea usar uno de éstos programas para probar sus scripts, primero debe asegurarse de guardar el documento en texto sin formato o PHP no será capaz de leer y ejecutar el script.
Nota: acerca del "Bloc de Notas de Windows"
Si escribe sus archivos PHP usando el "Bloc de Notas de Windows", debe asegurarse de que sus archivos sean guardados con la extensión .php (El Bloc de Notas automáticamente añade la extensión .txt a los archivos a menos que tome los siguientes pasos para prevenirlo). Cuando guarde sus archivos y el programa le pregunte qué nombre le desea dar al archivo, use comillas para indicar el nombre (es decir, "hola.php"). Una alternativa es, en la lista de opciones "Archivos de Texto *.txt", seleccionar la opción "Todos los archivos *.*". Aquí puede escribir el nombre del archivo sin las comillas.
Ahora que ha creado un pequeño script de PHP que funciona correctamente, es hora de trabajar con el script de PHP más famoso; vamos a hacer una llamada a la función phpinfo() para obtener información acerca de su sistema y configuración como las variables predefinidas disponibles, los módulos utilizados por PHP, y las diferentes opciones de configuración. Tomemos algo de tiempo para revisar esta información.
Ejemplo #2 Obtener la información del sistema desde PHP
<?php phpinfo(); ?>
Hagamos ahora algo que puede ser más útil. Vamos a comprobar qué clase de navegador está utilizando el usuario. Para hacerlo, vamos a consultar la información que el navegador nos envía como parte de su petición HTTP. Esta información es guardada en una variable. Las variables siempre comienzan con un signo de dólar ("$") en PHP. La variable que vamos a utilizar en esta situación es $_SERVER['HTTP_USER_AGENT'].
Nota:
$_SERVER es una variable especial reservada por PHP que contiene toda la información del servidor web. Es conocida como Superglobal. Consulte el manual en su sección titulada Superglobales para más información. Éstas variables especiales fueron introducidas en la versión » 4.1.0 de PHP. Antes podíamos usar las arrays $HTTP_*_VARS, tales como $HTTP_SERVER_VARS. Aunque éstas han sido marcadas como obsoletas, tales arrays todavía existen. (También puede echar un vistazo a las notas relacionadas con el código antiguo.)
Para mostrar esta variable, se puede simplemente hacer:
Ejemplo #1 Imprimir una variable (Elemento array)
<?php
echo $_SERVER['HTTP_USER_AGENT'];
?>
Un ejemplo del resultado de esta secuencia de comandos sería:
Hay muchos tipos de variables en PHP. En el ejemplo anterior imprimimos un array. Los arrays pueden ser muy útiles.
$_SERVER es simplemente una variable que se encuentra disponible automáticamente en PHP. Puede encontrar una lista en la sección titulada Variables Reservadas del manual, o puede generar una lista completa creando un archivo como el ejemplo de la sección anterior.
Puede usar más de un declaración PHP dentro de una etiqueta PHP, y crear pequeños segmentos de código que pueden hacer más que un único echo. Por ejemplo, si quisiéramos detectar el uso de Internet Explorer, haríamos algo así:
Ejemplo #2 Ejemplo usando estructuras de control y functiones
<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
echo 'Está usando Internet Explorer.<br />';
}
?>
Un ejemplo del resultado de esta secuencia de comandos sería:
Está usando Internet Explorer.<br />
A continuación introduciremos un par de conceptos nuevos. Tenemos una declaración if. Si está familiarizado con la sintaxis básica del lenguaje C, esto se vera lógico, Pero si no entiende C, u otros lenguajes de programación donde encuentra la sintaxis usada anteriormente, probablemente debería conseguir un libro que le introduzca mejor a PHP, y lea los primeros capítulos, o también puede ver la parte del manual titulada Referencia del lenguaje parte del manual.
El segundo concepto que introducimos fue la función llamada
strstr(). strstr() es una
función integrada de PHP que busca un cadena dentro de otra
cadena. En este caso anterior estamos buscando
'MSIE' (llamado aguja) dentro de
$_SERVER['HTTP_USER_AGENT'] (llamado pajar).
Si la cadena fue encontrada, la función devolverá la posición
de la aguja relativa al inicio del pajar. De lo contrario
devolverá FALSE. Si no devuelve FALSE, la declaración
if se evalúa
a TRUE y el código adentro de las llaves {}
es ejecutado. De lo contrario, el código no será ejecutado. Tómese
la libertad de crear ejemplos similares usando if, else, y otras funciones
como strtoupper() y strlen().
Cada página del manual contiene ejemplos que puede usar. Si no está
seguro sobre el modo de uso éstas funciones, es recomendable que lea las
páginas del manual tituladas Cómo leer
una definición de función y la sección relacionada a Funciones en PHP.
Podemos continuar y demostrar cómo puede saltar adentro y afuera del modo PHP en el medio de un bloque de código:
Ejemplo #3 Mezcla de los modos HTML y PHP
<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
?>
<h3>strpos() debe haber devuelto no falso</h3>
<p>Está usando Internet Explorer</p>
<?php
} else {
?>
<h3>strpos() debió devolver algo diferente de falso</h3>
<p>No está usando Internet Explorer</p>
<?php
}
?>
Un ejemplo del resultado de la secuencia de comandos podría ser:
<h3>strpos() debe haber devuelto falso</h3> <p>Está usando Internet Explorer</p>
En vez de usar una sentencia PHP echo para demostrar algo, saltamos fuera del código PHP y escribimos solamente HTML. Este es un punto muy importante y potente que debemos observar aquí, y es que la fluidez lógica de la secuencia de comandos permanece intacta. Sólamente las partes donde hay bloques HTML serán enviadas al visor dependiendo del resultado que strstr() devuelva. En otras palabras, si la cadena MSIE fue encontrada o no.
Otra de las características más importantes de PHP es que gestiona formularios HTML. El concepto básico que es importante entender es que cualquier elemento de los formularios estará disponible automáticamente en su código PHP. Por favor lea la sección del manual titulada Variables fuera de PHP para más información y ejemplos sobre cómo usar formularios HTML con PHP. Observemos un ejemplo:
Ejemplo #1 Un formulario HTML simple
<form action="accion.php" method="post"> <p>Su nombre: <input type="text" name="nombre" /></p> <p>Su edad: <input type="text" name="edad" /></p> <p><input type="submit" /></p> </form>
No hay nada especial en este formularo, es solamente HTML sin ninguna clase de etiquetas especiales de ningún tipo. Cuando el usuario rellena éste formulario y oprime el botón Submit, una página titulada accion.php es llamada. En este archivo encontrará algo así:
Ejemplo #2 Imprimir información desde nuestro formulario
Hola <?php echo htmlspecialchars($_POST['nombre']); ?>.
Usted tiene <?php echo (int)$_POST['edad']; ?> años de edad.
Un ejemplo del resultado de esta secuencia de comandos puede ser:
Hola José. Usted tiene 22 años de edad.
Aparte de las funciones htmlspecialchars() y (int), debería ser obvio lo que hace el código. htmlspecialchars() se asegura que todos los caracteres que son especiales en html sean codificados adecuadamente de manera que nadie pueda inyectar etiquetas HTML o Javascript en tu página web. El campo edad, como sabemos que es un número, podemos convertirlo en un integer que automáticamente se deshará de cualquier carácter no numérico. También puede hacer lo mismo con PHP con la extensión filter Las variables $_POST['nombre'] y $_POST['edad'] son establecidas automáticamente por PHP. Anteriormente hemos usado la superglobal $_SERVER y ahora estamos apunto de introducirte la superglobal $_POST que contiene todos los datos del POST. Dese cuenta que el método de nuestro formulario es POST. Si usa el método fuera GET entoces los datos del formulario estarían en la superglobal $_GET. en lugar de POST. En su lugar también puedes usar la superglobal $_REQUEST, si no le importa el tipo de datos enviados desde el formulario. Contiene toda la información de GET, POST y COOKIE. Vea también la función import_request_variables().
En PHP, también puede tratar entradas desde formularios XForms; aunque probablemente en un comienzo se sienta a gusto con los formularios de HTML, que están ampliamente respaldados. A pesar de que los XForms no son trabajo de principiantes, es posible que tenga interés en ellos. Si es el caso, en la sección características de la documentación puede encontrarse una pequeña introducción a la manipulación de datos recibidos desde XForms.
Ahora que PHP ha crecido y se ha convertido en un lenguaje popular, hay muchos más repositorios y librerias que contienen código que puede reusar. Los desarrolladores de PHP han tratado en toda medida que sea compatible con versiones anteriores, es decir, si una secuencia de comandos fue escrita para una versión antigua en principio funcionaría (idealmente) sin ningún cambio en una versión reciente de PHP. A la práctica, usualmente algunos cambios son necesarios.
Dos de los cambios mas importantes que afectan el código viejo son:
Con sus nuevos conocimientos debería ser capaz de entender la mayoría del manual y de los diversos scripts de ejemplo disponibles en los archivos. Puede encontrar otros ejemplos en la sección de enlaces de php.net: » http://www.php.net/links.php.
Para ver varias presentaciones que muestra más acerca de lo que puede hacer PHP, visite los diferentes sitios con material relacionado a las conferencias realizadas: » http://talks.php.net/
Antes de empezar con la instalación, primero necesita saber para qué quiere utilizar PHP. Existen tres campos principales donde se puede utilizar PHP tal y como se describe en la sección: ¿Qué se puede hacer con PHP?
Para la primera forma mencionada, que es la más común, se necesitan tres cosas: PHP, un servidor web y un navegador web. Seguramente ya disponga del navegador web y, dependiendo de la configuración del sistema operativo, quizá ya tenga un servidor web (p.ej. Apache en Linux y MacOS X; IIS en Windows). También puede alquilar espacio web en una empresa. De esta forma, no se necesita instalar nada, solo tiene que escribir los scripts de PHP, subirlos al servidor que alquile y ver los resultados en su navegador.
En caso de configurar el servidor y PHP por su cuenta, existen dos opciones para el modo de conectar PHP con el servidor. Para muchos servidores, PHP tiene un módulo de interfaz directo (también llamado SAPI). Entre estos servidores se incluyen Apache, Microsoft Internet Information Server, Netscape y iPlanet. Muchos otros servidores tienen soporte para ISAPI, el módulo de interfaz de Microsoft (OmniHTTPd por ejemplo). Si PHP no tiene soporte para el módulo de su servidor web, siempre puede usarlo como procesador CGI o FastCGI. Esto significa configurar el servidor para usar el CGI ejecutable de PHP para procesar cada una de las peticiones a ficheros PHP en el servidor.
Si también está interesado en usar PHP bajo la línea de comandos (p.ej. escribir scripts que autogeneran imágenes de forma offline, o procesar ficheros de texto dependiendo de los argumentos que se les pasen), siempre necesitará el ejecutable de línea de comandos. Para más información, lea la sección sobre escribir aplicaciones PHP desde la línea de comandos. En este caso, no se necesita ningún servidor o navegador.
Con PHP también se pueden escribir aplicaciones GUI de escritorio usando la extensión PHP-GTK. Este enfoque no tiene nada que ver con escribir páginas web, ya que no se muestra nada de HTML, pero gestiona ventanas y objetos dentro de ellas. Para más información acerca de PHP-GTK, por favor » visite el sitio dedicado a esta extensión. PHP-GTK no está incluido en la distribución oficial de PHP.
De aquí en adelante, esta sección trata de la configuración de PHP para servidores web sobre Unix y Windows con interfaces de módulo de servidor y ejecutables CGI. También se puede encontrar información sobre ejecutables de línea de comandos en las siguientes secciones.
El código fuente de PHP y las distribuciones binarias para Windows pueden encontrarse en » http://www.php.net/downloads.php. Recomendamos elegir un » sitio alternativo cercano para descargar las distribuciones.
Esta sección le guiará a través de la configuración general e instalación de PHP sobre sistemas Unix. Asegúrese de investigar cualquier sección específica a su plataforma o servidor web antes de comenzar el proceso.
Tal como el manual lo esboza en la sección Consideraciones generales de instalación, se está tratando principalmente con configuraciones de PHP centradas en web en esta sección, aunque también se cubrirá el preparar PHP para usarse en línea de comando.
Existen varias maneras de instalar PHP para la plataforma Unix, ya sea con un proceso de compilar y configurar, o a través de varios métodos pre-empaquetados. Esta documentación está enfocada principalmente alrededor del proceso de compilar y configurar PHP. Muchos sistemas estilo Unix tienen algún tipo de sistema de instalación de paquetes. Esto puede ayudar en preparar una configuración standard, pero si se requiere tener un conjunto diferente de características (tales como un servidor seguro, o un manejador diferente de base de datos), podría ser necesario construir PHP y/o el servidor web. Si no se está familiarizado con la construcción y el compilado de su propio software, vale la pena revisar para ver si alguien ya ha construido una versión empaquetada de PHP con las características que se necesitan.
Conocimientos y software necesarios para compilar:
Cuando compile directamente de una fuente SVN sources o después de realizar modificaciones usted necesita también:
El proceso inicial de preparación y configuración de PHP es controlado por el uso de las opciones de línea de comando del script configure. Es posible obtener una lista de todas las opciones disponibles junto con una descripción corta ejecutando ./configure --help. El manual documenta las diferentes opciones por separado. Se encontrarán las opciones principales en el apéndice, mientras que las diferentes opciones específicas de las extensiones se describen en las páginas de referencia.
Cuando PHP está configurado, se está listo para compilar el módulo y/o ejecutables. El comando make debería hacerse cargo de esto. Si falla y no se puede encontrar el porque, véase la sección de problemas.
Esta sección contiene notas y consejos específicos a instalaciones Apache de PHP sobre plataformas Unix. También se tienen instrucciones y notas para Apache 2 en una página por separado.
Se pueden seleccionar argumentos para agregar a configure en la línea 10 debajo de la lista de opciones principales de configure y de opciones específicas a extensiones descritas en sus respectivos lugares en el manual. Los números de versión han sido omitidos aquí, para asegurar que las instrucciones no sean incorrectas. Se necesita reemplazar las 'xxx' aquí con los valores correctos de los ficheros.
Ejemplo #1 Instrucciones de instalación (Versión de módulo compartido de Apache) para PHP
1. gunzip apache_xxx.tar.gz
2. tar -xvf apache_xxx.tar
3. gunzip php-xxx.tar.gz
4. tar -xvf php-xxx.tar
5. cd apache_xxx
6. ./configure --prefix=/www --enable-module=so
7. make
8. make install
9. cd ../php-xxx
10. Ahora, se configura PHP. Aquí es donde se personaliza PHP
con varias opciones, como cuales extensiones se habilitarán. Realizar un
./configure --help para obtener una lista de opciones disponibles. En el ejemplo
se realiza un configure simple con soporte para Apache 1 y MySQL. La
ruta de acceso a apxs puede diferir del ejemplo.
./configure --with-mysql --with-apxs=/www/bin/apxs
11. make
12. make install
Si se decide cambiar las opciones de configure después de la instalación,
solamente se necesita repetir los últimos tres pasos. Sólo hace falta
reiniciar apache para que el nuevo módulo tenga efecto. Una recompilación de
Apache no es necesaria.
Nótese que a menos que se mencione lo contrario, 'make install' también instalará PEAR,
varias herramientas de PHP tales como phpize, instalará la línea de comando (CLI) de PHP, y más.
13. Preparar el fichero php.ini:
cp php.ini-development /usr/local/lib/php.ini
Se puede editar el fichero .ini para fijar las opciones de PHP. Si se prefiere
php.ini en otra ubicación, utilice --with-config-file-path=/some/path en
el paso 10.
Si en vez de ello se elige php.ini-production, asegurarse de leer la lista
de cambios en el interior, ya que éstos afectan como se comporta PHP.
14. Editar httpd.conf para cargar el módulo de PHP. La ruta de acceso al lado derecho
de el enunciado LoadModule debe apuntar a la ruta del módulo de PHP
en su sistema. El make install anterior podría haber agregado esto ya
por usted, pero asegúrese de revisarlo.
LoadModule php5_module libexec/libphp5.so
15. Y en la sección AddModule de httpd.conf, en algún lugar por debajo de
ClearModuleList, agregar esto:
AddModule mod_php5.c
16. Indicar a Apache que procese ciertas extensiones como PHP. Por ejemplo,
hacer que Apache procese la extensión .php como PHP. Se podría
hacer que cualquier extensión o extensiones sean procesadas como PHP simplemente añadiendo más, con
cada una separada por un espacio. Se agregará .phtml para demostrarlo.
AddType application/x-httpd-php .php .phtml
También es común configurar la extensión .phps para mostrar fuentes resaltadas de PHP,
ésto puede hacerse con:
AddType application/x-httpd-php-source .phps
17. Utilice el procedimiento normal para iniciar el servidor Apache. (Se debe
detener y reiniciar el servidor, no sólo causar que el servidor recargue utilizando
una señal HUP o USR1.)
Alternativamente, para instalar PHP como un objeto estático:
Ejemplo #2 Instrucciones de instalación (Instalación de módulo estático para Apache) para PHP
1. gunzip -c apache_1.3.x.tar.gz | tar xf -
2. cd apache_1.3.x
3. ./configure
4. cd ..
5. gunzip -c php-5.x.y.tar.gz | tar xf -
6. cd php-5.x.y
7. ./configure --with-mysql --with-apache=../apache_1.3.x
8. make
9. make install
10. cd ../apache_1.3.x
11. ./configure --prefix=/www --activate-module=src/modules/php5/libphp5.a
(¡La línea anterior es correcta! Sí, ya se sabe que libphp5.a aún no existe en esta
etapa. No se supone que deba. Será creado.)
12. make
(ahora se debe tener un binario httpd que puede ser copiado al directorio bin de Apache si
esta es la primera instalación entonces se necesita dar "make install" también)
13. cd ../php-5.x.y
14. cp php.ini-development /usr/local/lib/php.ini
15. Se puede editar el fichero /usr/local/lib/php.ini para fijar las opciones de PHP.
Editar el fichero httpd.conf o srm.conf y añadir:
AddType application/x-httpd-php .php
Dependiendo de la instalación de Apache y la variante de Unix, hay muchas maneras posibles de detener y reiniciar el servidor. Abajo hay algunas líneas típicas utilizadas para reiniciar el servidor, para diferentes instalaciones apache/unix. Se debe reemplazar /path/to/ con la trayectoria a estas aplicaciones en el sistema.
Ejemplo #3 Comandos de ejemplo para reiniciar Apache
1. Diferentes variantes de Linux y SysV: /etc/rc.d/init.d/httpd restart 2. Utilizando scripts apachectl: /path/to/apachectl stop /path/to/apachectl start 3. httpdctl y httpsdctl (Utilizando OpenSSL), similar a apachectl: /path/to/httpsdctl stop /path/to/httpsdctl start 4. Usando mod_ssl, u otro servidor SSL, que se quiera detener e iniciar manualmente: /path/to/apachectl stop /path/to/apachectl startssl
Las ubicaciones de los binarios apachectl y http(s)dctl varían frecuentemente. Si el sistema tiene los comandos locate o whereis o which, éstos pueden ayudar en encontrar los programas de control del servidor.
Distintos ejemplos de compilaciones de PHP para apache son como sigue:
./configure --with-apxs --with-pgsql
Esto creará una librería compartida libphp5.so que se carga en Apache utilizando una línea LoadModule en el fichero de Apache httpd.conf. El soporte para PostgreSQL está incluido dentro de esta librería.
./configure --with-apxs --with-pgsql=shared
Esto creará una librería compartida libphp5.so para Apache, pero también creará una librería compartida pgsql.so que se carga en PHP ya sea usando la directiva de extensión en el fichero php.ini o cargándola explícitamente en un script utilizando la función dl().
./configure --with-apache=/path/to/apache_source --with-pgsql
Esto creará una librería libmodphp5.a, un mod_php5.c y algunos ficheros acompañantes y cópiese estos dentro del directorio src/modules/php5 en el árbol de fuentes de Apache. Entonces se compila Apache utilizando --activate-module=src/modules/php5/libphp5.a y el sistema de compilación de Apache creará libphp5.a y lo enlazará estáticamente dentro del binario httpd. El soporte para PostgreSQL se incluye directamente dentro de este binario httpd, así que el resultado final aquí es un binario httpd sencillo que incluye todo Apache y todo PHP.
./configure --with-apache=/path/to/apache_source --with-pgsql=shared
Igual que en el anterior, excepto que en vez de incluir soporte para PostgreSQL directamente en el httpd final se obtiene una librería compartida pgsql.so que puede cargarse dentro de PHP desde ya sea el fichero php.ini o directamente utilizando dl().
Cuando se elige compilar PHP de diferentes maneras, se deben considerar las ventajas y desventajas de cada método. Compilar como objeto compartido significará que se puede compilar apache por separado, y no se tiene que recompilar todo cuando se agrega o se cambia algo en PHP. Compilar PHP dentro de apache (método estático) significa que PHP cargará y ejecutará más rápido. Para más información, ver la » página web de Apache sobre soporte DSO.
Nota:
El httpd.conf por omisión de Apache actualmente se distribuye con una sección que se parece a esto:
A menos que se cambie esto a "Group nogroup" o algo como esto ("Group daemon" es también muy común) PHP no será capaz de abrir ficheros.User nobody Group "#-1"
Nota:
Asegúrese de que se especifica la versión instalada de apxs cuando se utiliza --with-apxs=/path/to/apxs . NO se debe utilizar la versión de apxs que está en las fuentes de apache, si no la que en realidad está instalada en el sistema.
Esta sección contiene notas y consejos específicos a las instalaciones de Apache 2.x de PHP sobre sistemas Unix.
No se recomienda utilizar un MPM threaded en producción con Apache 2. Use MPM prefork, que es el MPM por defecto en Apache 2.0 y 2.2. Para información sobre cómo, lea la correspondiente entrada de la FAQ sobre utilizar Apache2 con un MPM threaded
La » Documentación de Apache es la fuente de información más autorizada acerca del servidor Apache 2.x. Ahí se puede encontrar más información acerca de las opciones de instalación.
La versión más reciente de Apache HTTP Server puede obtenerse del » Sitio de descargas de Apache, y una versión apropiada de PHP de los lugares anteriormente mencionados. Esta guía rápida solamente cubre lo básico para comenzar con Apache 2.x y PHP. Para obtener más información lea la » Documentación de Apache. Los números de versión han sido omitidos aquí, para asegurar que las instrucciones no sean incorrectas. En los ejemplos siguientes, 'NN' deberá ser reemplazado con la versión específica de Apache que se está utilizando.
Existen actualmente dos versiones de Apache 2.x - está la 2.0 y la 2.2. Mientras que existen varias razones para elegir cada una, la 2.2 es actualmente la versión más reciente, y la que se recomienda, si es que esa opción está disponible. Sin embargo, las instrucciones aquí funcionarán ya sea para 2.0 ó 2.2.
Obténgase el servidor HTTP Apache de la ubicación listada con anterioridad, y desempáquese:
gzip -d httpd-2_x_NN.tar.gz tar -xf httpd-2_x_NN.tar
De la misma manera, obtener y desempacar las fuentes de PHP:
gunzip php-NN.tar.gz tar -xf php-NN.tar
Compilar e instalar Apache. Consúltese la documentación de instalación de Apache para mayores detalles sobre la compilación de Apache.
cd httpd-2_x_NN ./configure --enable-so make make install
Ahora se tiene Apache 2.x.NN disponible debajo de /usr/local/apache2, configurado con soporte para módulos cargables y con el MPM (Módulo de multiproceso) prefork estándar. Para probar la instalación úsese el procedimiento para iniciar el servidor Apache, por ej.:
/usr/local/apache2/bin/apachectl start
/usr/local/apache2/bin/apachectl stop
Ahora, configure y compile PHP. Aquí es donde se personaliza PHP con varias opciones, como qué extensiones se han de habilitar. Ejecute ./configure --help para obtener una lista de opciones disponibles. En el ejemplo se realiza un simple configure con soporte para Apache 2 y MySQL.
Si se compila Apache a partir de los fuentes, tal como se describe anteriormente, el siguiente ejemplo coincidirá con la trayectoria para apxs, pero si se ha instalado Apache de alguna otra manera, será necesario ajustar la trayectoria a apxs apropiadamente. Nótese que algunas distribuciones pueden renombrar apxs cómo apxs2.
cd ../php-NN ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql make make install
Si se decide a cambiar las opciones de configuración después de la instalación, se deben volver a ejecutar los pasos configure, make, y make install. Solamente se necesita reiniciar apache para que el nuevo módulo tenga efecto. Una recompilación de Apache no es necesaria.
Nótese que a menos que se indique lo contrario, 'make install' también instalará PEAR, varias herramientas de PHP tales como phpize, instalará la interfaz de línea de comando (CLI) de PHP, y más.
Configurar php.ini
cp php.ini-development /usr/local/lib/php.ini
Se puede editar el fichero .ini para fijar las opciones de PHP. Si se prefiere tener php.ini en otra ubicación, utilice --with-config-file-path=/alguna/trayectoria en el paso 5.
Si en vez de eso se elige php.ini-production, asegúrese de leer la lista de cambios al interior, ya que afectan como se comporta PHP.
Edítese httpd.conf para cargar el módulo PHP. La trayectoria a la derecha de la sentencia LoadModule debe apuntar a la trayectoria del módulo PHP en el sistema. El make install anterior podría ya haber agregado esto automáticamente, pero asegúrese de revisar.
LoadModule php5_module modules/libphp5.so
Indicar a Apache que procese ciertas extensiones como PHP. Por ejemplo, hágase que Apache procese ficheros .php como PHP. En vez de solamente utilizar la directiva de Apache AddType, se desea evitar subidas de ficheros potencialmente peligrosas y que ficheros creados tal como exploit.php.jpg sean ejecutados como PHP. Utilizando este ejemplo, se puede hacer que cualquier extensión o extensiones sean procesadas como PHP simplemente añadiéndolas. Se agregará .php para demostrarlo.
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
O, si se deseara permitir que ficheros .php, .php2, .php3, .php4, .php5, .php6, y .phtml fuesen ejecutados como PHP, pero nada más, se utilizaría esto:
<FilesMatch "\.ph(p[2-6]?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
Y para permitir que ficheros .phps sean manejados por el filtro de fuentes de php, y desplegado como código fuente con sintaxis resaltada, se utiliza esto:
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
mod_rewrite puede ser utilizado para permitir que cualquier fichero .php arbitrario sea desplegado como código fuente con sintaxis resaltada, sin tener que renombrarlo o copiarlo a un fichero .phps:
RewriteEngine On RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]
El filtro de código fuente php no debe habilitarse en sistemas de producción, donde podría exponer información confidencial o de alguna otra manera sensible incluida en código fuente.
Utilícese el procedimiento normal para iniciar el servidor Apache, por ej.:
/usr/local/apache2/bin/apachectl start
O
service httpd restart
Siguiendo los pasos anteriores se tendrá corriendo un servidor web Apache2 con soporte para PHP como un módulo SAPI. Por supuesto existen muchas opciones más de configuración disponibles para Apache y PHP. Para más información teclee ./configure --help en el árbol de fuentes correspondiente.
Apache se puede compilar con soporte multihilos seleccionando el worker MPM, en vez del prefork MPM standard, cuando Apache se compila. Esto se realiza agregando la siguiente opción al argumento pasado a ./configure, en el paso 3 anterior:
Esto no debe llevarse a cabo sin ser consciente de las consecuencias de esta decisión, y tener al menos un ligero entendimiento acerca de las implicaciones. La documentación de Apache al respecto de » MPM-Modules discute los MPM en forma mucho más detallada.
Nota:
Las Preguntas frecuentes de Apache MultiViews discute acerca del uso de multiviews con PHP.
Nota:
Para compilar una versión multihilo de Apache, el sistema destino debe soportar hilos. En este caso, PHP también debe compilarse con la opción Zend Thread Safety (ZTS) experimental. Bajo esta configuración, no todas las extensiones se encontrarán disponibles. La configuración recomendada es compilar Apache con el MPM-module prefork por omisión.
Esta sección contiene anotaciones y consejos específicos para la instalación de PHP en Lighttpd 1.4 para sistemas Unix.
Por favor, antes de continuar consulte el » sistema de seguimiento de Lighttpd para saber cómo instalar Lighttpd apropiadamente.
La SAPI recomendada para conectar PHP a Lighttpd es Fastcig. Esta SAPI viene habilitada por omisión en php-cgi PHP 5.3. En versiones anteriores debe configurarse PHP con --enable-fastcgi. Para verificar que PHP tiene fastcgi habilitado, php -v debe contener PHP 5.2.5 (cgi-fcgi) En versiones anteriores a PHP 5.2.3, fastcgi estaba habilitado en el binario de php (no había php-cgi).
Para configurar Lighttpd para que se conecte a php y lance procesos fastcgi, debe editar lighttpd.conf. Se recomienda utilizar sockets para conectar fastcgi a los procesos del sistema local.
Ejemplo #1 Extracto de lighttpd.conf
server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".php" =>
((
"socket" => "/tmp/php.socket",
"bin-path" => "/usr/local/bin/php-cgi",
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "16",
"PHP_FCGI_MAX_REQUESTS" => "10000"
),
"min-procs" => 1,
"max-procs" => 1,
"idle-timeout" => 20
))
)
La directiva bin-path permite a lighttpd lanzar procesos fastcgi dinámicamente. PHP creará nuevos procesos hijos según se especifique en la variable de entorno PHP_FCGI_CHILDREN. La directiva "bin-environment" establece el entorno de los nuevos procesos. Cada vez que se alcance un determinado número de peticiones, determinado por PHP_FCGI_MAX_REQUEST, se matará un proceso. Las directivas "min-procs" y "max-procs" deben, por norma general, evitarse con PHP. PHP gestiona sus propios hijos, de forma que cachés como APC sólo estarán disponibles para los procesos gestionados por PHP. Si se establece "min-procs" a un número superior a 1, el número total de procesos oyentes en php se multiplicará por PHP_FCGI_CHILDREN (2 min-procs * 16 hijos produce 32 oyentes).
Lighttpd contiene el programa spawn-fcgi que facilita lanzar procesos fastcgi.
Pese a que es más laborioso, es posible lanzar procesos sin spawn-fcgi. La variable de entorno PHP_FCGI_CHILDREN controla cuántos procesos hijo de PHP se lanzarán para manejar las peticiones entrantes. PHP_FCGI_MAX_REQUESTS determinará el tiempo de vida (en peticiones) de cada proceso hijo. Aquí se muestra un script en bash que asiste en la creación de procesos php.
Ejemplo #2 Lanzando oyentes FastCGI
#!/bin/sh
# Ubicación del binario php-cgi
PHP=/usr/local/bin/php-cgi
# Ubicación del fichero PID
PHP_PID=/tmp/php.pid
# Enlazando a una dirección
#FCGI_BIND_ADDRESS=10.0.1.1:10000
# Enlazando a un socket de dominio
FCGI_BIND_ADDRESS=/tmp/php.sock
PHP_FCGI_CHILDREN=16
PHP_FCGI_MAX_REQUESTS=10000
env -i PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN \
PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS \
$PHP -b $FCGI_BIND_ADDRESS &
echo $! > "$PHP_PID"
Para poder tener aplicaciones escalables, pueden lanzarse instancias de fastcgi en múltiples equipos remotos.
Ejemplo #3 Conexión a instancias de php-fastcgi remotas
fastcgi.server = ( ".php" =>
(( "host" => "10.0.0.2", "port" => 1030 ),
( "host" => "10.0.0.3", "port" => 1030 ))
)
Esta sección contiene notas y consejos específicos al servidor web Sun Java System, servidor web Sun ONE, instalaciones de servidores iPlanet y Netscape de PHP sobre Sun Solaris.
A partir de PHP 4.3.3 en adelante se pueden utilizar scripts PHP con el módulo NSAPI para generar listados de directorio y páginas de errores personalizados. Funciones adicionales para compatibilidad con Apache también se encuentran disponibles. Para soporte en servidores web actuales, léase la nota sobre subpeticiones.
Se puede encontrar más información acerca de configurar PHP para Netscape Enterprise Server (NES) aquí: » http://benoit.noss.free.fr/php/install-php4.html
Para construir PHP con los servidores web Sun JSWS/Sun ONE WS/iPlanet/Netscape, introduzca el directorio de instalación apropiado para la opción --with-nsapi=[DIR]. El directorio por omisión es comúnmente /opt/netscape/suitespot/. Por favor también léase /php-xxx-version/sapi/nsapi/nsapi-readme.txt.
Instalar los siguientes paquetes de » http://www.sunfreeware.com/ o algún otro sitio de descargas:
export PATH.
gunzip php-x.x.x.tar.gz (si se tiene una distribución .gz,
de lo contrario ir a 4).
tar xvf php-x.x.x.tar
cd ../php-x.x.x
Para el siguiente paso, asegurar que /opt/netscape/suitespot/ sea donde el servidor netscape está instalado. De no ser así, cambiar a la ruta de acceso correcta y ejecutar:
./configure --with-mysql=/usr/local/mysql \ --with-nsapi=/opt/netscape/suitespot/ \ --enable-libgcc
Después de realizar la instalación base y de leer el fichero readme apropiado, es posible que sea necesario realizar algunos pasos adicionales de configuración.
Primeramente quizás sea necesario agregar algunas rutas de acceso al entorno LD_LIBRARY_PATH para que el servidor encuentre todas las librerías compartidas. Esto puede hacerse de mejor manera en el script de arranque del servidor web. El script de arranque se encuentra comúnmente localizado en: /ruta/al/servidor/https-servername/start. Quizás también sea necesario editar los ficheros de configuración que están ubicados en: /ruta/al/servidor/https-servername/config/.
Agregar la siguiente línea a mime.types (se puede hacer esto por medio del servidor de administración):
type=magnus-internal/x-httpd-php exts=php
Editar magnus.conf (para servidores >= 6) u obj.conf (para servidores < 6) y agregar lo siguiente, shlib variará dependiendo del sistema, será algo así como /opt/netscape/suitespot/bin/libphp4.so. Se deben colocar las siguientes líneas después de mime types init.
Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans" shlib="/opt/netscape/suitespot/bin/libphp4.so" Init fn="php4_init" LateInit="yes" errorString="Failed to initialize PHP!" [php_ini="/path/to/php.ini"]
Configurar el objeto por omisión en obj.conf (para clases de servidor virtual [versión 6.0+] en su vserver.obj.conf):
<Object name="default"> . . . .#NOTA esta siguiente línea debería ocurrir después de todos las líneas 'ObjectType' y antes de todas las líneas 'AddLog' Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...] . . </Object>
Esto es sólo necesario si se quiere configurar un directorio que solamente consiste de scripts de PHP (igual que un directorio cgi-bin):
<Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object>
Configuración de la autenticación: La autenticación PHP no puede ser utilizada con ninguna otra autenticación. TODA AUTENTICACION LE ES PASADA AL SCRIPT DE PHP. Para configurar la autenticación de PHP para el servidor entero, agregar la línea siguiente al objeto por omisión:
<Object name="default"> AuthTrans fn=php4_auth_trans . . . </Object>
Para utilizar autenticación de PHP en sólo un directorio, agregar lo siguiente:
<Object ppath="d:\ruta\al\directorio\auntenticado\*"> AuthTrans fn=php4_auth_trans </Object>
Nota:
El tamaño de la pila que utiliza PHP depende de la configuración del servidor web. Si se tienen fallas generales con scripts de PHP muy grandes, se recomienda elevarlo con el servidor de administración (en la sección "MAGNUS EDITOR").
Importante cuando se escriben scripts de PHP, es el hecho de que Sun JSWS/Sun ONE WS/iPlanet/Netscape es un servidor web multihilos. Por ello todas las peticiones se corren en el mismo espacio de proceso (el espacio del servidor web mismo) y este espacio tiene solamente un ambiente. Si se quiere tener variables CGI como PATH_INFO, HTTP_HOST etc. la manera correcta no es intentar esto al viejo estilo de PHP con getenv() o una manera similar (registrar globales al ambiente, $_ENV). Solamente se obtendrá el ambiente del servidor web que se está ejecutando. ¡Sin ninguna variable CGI válida!
Nota:
¿Por qué hay variables CGI (inválidas) en el ambiente?
Respuesta: Esto es por que se inició el proceso del servidor web desde el servidor de administración que ejecuta el script de arranque del servidor web, que se quería iniciar, como un script de CGI (¡Un script de CGI dentro del servidor de administración!). Esto es el porque el ambiente de el servidor web iniciado tiene algunas variables de CGI en él. Se puede probar esto iniciando el servidor web, no desde el servidor de administración. Utilizar la línea de comando como usuario root e iniciarlo manualmente - se verá que no hay variables de ambiente a la CGI.
Simplemente cámbiense los scripts para obtener las variables CGI de la manera correcta para PHP 4.x utilizando la superglobal $_SERVER. Si se tienen scripts más antiguos que usan $HTTP_HOST, etc., se debe activar register_globals en php.ini y cambiar el orden de las variables también (importante: quitar "E" de ésta, porque no se necesita el entorno aquí):
variables_order = "GPCS" register_globals = On
Se puede utilizar PHP para generar páginas de errores para "404 Not Found" o similares. Agregar la siguiente línea al objeto en obj.conf por cada página de error que se quiera sobreescribir:
Error fn="php4_execute" code=XXX script="/path/to/script.php" [inikey=value inikey=value...]
Otra posibilidad es generar listados de directorio personalizados. Solamente creando un script PHP que despliegue un listado de directorio y reemplazando la línea por omisión correspondiente Service por type="magnus-internal/directory" en obj.conf con lo siguiente:
Service fn="php4_execute" type="magnus-internal/directory" script="/path/to/script.php" [inikey=value inikey=value...]
El módulo NSAPI ahora soporta la función nsapi_virtual() (alias: virtual()) para realizar subpeticiones en el servidor web e insertar el resultado en la página web. Esta función utiliza algunas características no documentadas de la librería NSAPI. En Unix el módulo automáticamente busca las funciones necesarias y las utiliza si están disponibles. Si no, se deshabilita nsapi_virtual().
Nota:
Pero se advierte: El soporte para nsapi_virtual() es ¡¡¡EXPERIMENTAL!!!
Por defecto, PHP se construye como un programa CLI y CGI, que puede ser utilizado para el procesamiento de CGI. Si está ejecutando un servidor web PHP tiene soporte para los módulos, por lo general debe irse por esta solución por razones de rendimiento. Sin embargo, la versión CGI permite a los usuarios ejecutar diferentes páginas con PHP bajo diferentes identificadores de usuarios.
Al usar el modo CGI, su servidor esta expuesto a diferentes ataques. Por favor, leer la sección Seguridad con CGI para aprender como defenderse de estos ataques.
Si has construido PHP como un programa CGI, puede probar su construcción escribiendo make test. Siempre es una buena idea probar su construcción. De esta manera usted puede encontrar un problema al principio con PHP en la plataforma, en lugar de tener que luchar con él más adelante.
Algunos servidores suministrando variables de entorno no se definen en las actuales » CGI/1.1 specification. Sólo las siguientes variables no se definen: AUTH_TYPE, CONTENT_LENGTH, CONTENT_TYPE, GATEWAY_INTERFACE, PATH_INFO, PATH_TRANSLATED, QUERY_STRING, REMOTE_ADDR, REMOTE_HOST, REMOTE_IDENT, REMOTE_USER, REQUEST_METHOD, SCRIPT_NAME, SERVER_NAME, SERVER_PORT, SERVER_PROTOCOL, and SERVER_SOFTWARE. Todo lo demás debe ser tratado como "extensiones de proveedor".
Esta sección contiene notas y consejos específicos para instalar PHP sobre sistemas HP-UX.
Existen dos opciones principales para instalar PHP sobre sistemas HP-UX. Ya sea compilarlo, o instalar un binario precompilado.
Los paquetes oficiales precompilados se localizan aquí: » http://software.hp.com/
Hasta que esta sección del manual sea reescrita, la documentación acerca de compilar PHP (y las extensiones relacionadas) sobre sistemas HP-UX ha sido removida. Por ahora, favor de considerar la lectura de los siguientes recursos externos: » Building Apache and PHP on HP-UX 11.11
Esta sección contiene notas y consejos específicos a la instalación de PHP sobre » OpenBSD 3.6.
Utilizar paquetes binarios para instalar PHP sobre OpenBSD es el método más simple y recomendado. El paquete principal ha sido separado de los distintos módulos, y cada uno puede ser instalado removido independientemente de los otros. Los ficheros que se necesitan pueden ser encontrados en el CD de OpenBSD o en el sitio FTP.
El paquete principal que se necesita instalar es php4-core-4.3.8.tgz, que contiene el motor básico (además de gettext e iconv). Seguido, tómese un vistazo a los paquetes de módulos, tales como php4-mysql-4.3.8.tgz o php4-imap-4.3.8.tgz. Se necesita emplear el comando phpxs para activar y desactivar estos módulos en el fichero php.ini.
Ejemplo #1 Ejemplo de instalación de paquete de OpenBSD
# pkg_add php4-core-4.3.8.tgz # /usr/local/sbin/phpxs -s # cp /usr/local/share/doc/php4/php.ini-recommended /var/www/conf/php.ini (agregar mysql) # pkg_add php4-mysql-4.3.8.tgz # /usr/local/sbin/phpxs -a mysql (agregar imap) # pkg_add php4-imap-4.3.8.tgz # /usr/local/sbin/phpxs -a imap (quitar mysql a manera de prueba) # pkg_delete php4-mysql-4.3.8 # /usr/local/sbin/phpxs -r mysql (instalar las librerías de PEAR) # pkg_add php4-pear-4.3.8.tgz
Leer la página del manual » packages(7) para mas información sobre paquetes binarios en OpenBSD.
También se puede compilar PHP a partir de fuentes utilizando el » árbol de portes. Sin embargo, esto sólo se recomienda para usuarios familiarizados con OpenBSD. El porte de PHP 4 está dividido en dos subdirectorios: core y extensions. El directorio extensions genera subpaquetes para todos los módulos soportados de PHP. Si se encuentra que no se desea crear alguno de estos módulos, utilice el sabor o FLAVOR no_*. Por ejemplo, para evitar compilar el módulo imap, fijar el sabor o FLAVOR a no_imap.
Ediciones antiguas de OpenBSD utilizaban el sistema FLAVORS para compilar un PHP enlazado estáticamente. Dado que es difícil generar paquetes binarios utilizando este método, ahora es depreciado. Aún es posible utilizar los viejos árboles estables de ports si así se desea, pero carecen de soporte por parte del equipo de OpenBSD. Si se tiene algún comentario al respecto, el responsable actual del port es Anil Madhavapeddy (avsm arroba openbsd punto org).
Esta sección contiene notas y sugerencias específicas para la instalación de PHP en sistemas Solaris.
La instalacion Solaris carece con frecuencia de los compiladores de C y sus herramientas relacionadas. Lea las preguntas frecuentes para obtener información sobre porqué usar versiones GNU de algunas de estas herramientas.
Para descomprimir la distribución PHP se necesita
Para compilar PHP se necesita
Para compilar extensiones adicionales o hackear el código PHP puede que se necesite también
Se puede simplificar el procesao de intalación de Solaris mediante el uso de pkgadd para instalar la mayoría de sus componentes necesarios. El Sistema de Empaquetado de Imagen (IPS) para Solaris 11 Express contiene también la mayoría de los componentes requeridos para la instalación usando el comando pkg.
Esta sección contiene notas y consejos específicos para instalar PHP sobre » Debian GNU/Linux.
No se ofrece soporte de builds no oficiales de terceros. Cualquier bug debe ser informado al equipo de Debian a no ser que puedan reproducirse usando los últimos builds de nuestra » zona de descargas.
Mientras que las instrucciones para construir PHP sobre Unix se aplican a Debian también, esta página del manual contiene información específica para otras opciones, tales como utilizar ya sea los comandos apt-get o aptitude. En esta página del manual estos dos comandos se pueden utilizar indistintamente.
Primero, nótese que otros paquetes relacionados podrían ser deseables como libapache2-mod-php5 para integración con Apache 2, y php-pear para PEAR.
Segundo, antes de instalar un paquete, es sensato asegurarse de que la lista de paquetes está al día. Típicamente, esto se realiza ejecutando el comando apt-get update.
Ejemplo #1 Ejemplo de Instalación en Debian con Apache 2
# apt-get install php5-common libapache2-mod-php5 php5-cli
APT instalará automáticamente el módulo PHP 5 para Apache 2 junto con todas sus dependencias, y luego lo activará. Apache debería reiniciarse para que los cambios tengan efecto. Por ejemplo:
Ejemplo #2 Deteniendo e iniciando Apache una vez que PHP está instalado
# /etc/init.d/apache2 stop # /etc/init.d/apache2 start
En la sección anterior, PHP se instaló únicamente con los módulos principales. Es muy probable que se deseen módulos adicionales, tales como MySQL, cURL, GD, etc. Estos también pueden ser instalados vía el comando apt-get.
Ejemplo #3 Métodos para listar paquetes relacionados con PHP 5
# apt-cache search php5 # aptitude search php5 # aptitude search php5 |grep -i mysql
Los ejemplos mostrarán una gran cantidad de paquetes incluyendo varios específicos a PHP como php5-cgi, php5-cli y php5-dev. Determine cuales son necesarios e instálelos como cualquier otro ya sea con apt-get o aptitude. Y ya que Debian realiza revisión de dependencias, preguntará por ellos, así que por ejemplo para instalar MySQL y cURL:
Ejemplo #4 Instalar PHP con MySQL, cURL
# apt-get install php5-mysql php5-curl
APT agregará automáticamente las líneas apropiadas a los diferentes ficheros relacionados con php.ini como /etc/php5/apache2/php.ini, /etc/php5/conf.d/pdo.ini, etc. y dependiendo de la extensión, le agregará registros similares a extension=foo.so. De cualquier manera, reiniciar el servidor web (como es Apache) es requerido antes de que estos cambios tengan efecto.
Esta sección contiene notas y sugerencias específicas para la instalación de PHP en Mac OS X. PHP se incluye con Mac, y la compilación es similar a la guía de instalación Unix .
Hay algunas versiones pre-empaquetados y pre-compilados de PHP para Mac OS X. Esto puede ayudar en la creación de una configuración estándar, pero si usted necesita tener un conjunto diferente de características (como un servidor seguro, o un controlador de base de datos diferente), es posible que necesite construir PHP y/o un servidor web. Si no está familiarizado con la construcción y compilación de el software, vale la pena revisar si alguien ya ha construido una versión de PHP con las características que necesita.
Los siguientes recursos ofrecen paquetes facil de instalar y binarios precompilados para PHP en Mac OS:
PHP está incluido en los Macs desde la versión OS X 10.0.0. Habilitar PHP con el servidor web por defecto requiere descomentar unas cuantas líneas en el fichero de configuración de Apache httpd.conf donde CGI y/o CLI están activados por defecto (son fácilmente accesibles a través del programa Terminal).
Siguiendo las instrucciones que se ofrecen a continuación se podrá habilitar PHP de una forma rápida para un entorno de desarrollo local. Es muy recomendable tener siempre actualizado PHP a la última versión. Como casi todo el software vivo, y PHP no es una excepción, se crean nuevas versiones para resolver errores y añadir nuevas funcionalidades. Consulte la documentación de instalación de Mac OS X adecuada para más detalles. Las siguientes instrucciones para obtener una configuración están orientadas a los principiantes que deseen obtener una configuración totalmente operativa. Se anima a todos los usuarios a compilar o instalar una nueva versión ya empaquetada.
La instalación típica es mediante mod_php. Para habilitar el paquete mod_php que viene en el Mac OS X para el servidor web Apache (el servidor web por defecto, al que se puede acceder mediante las Preferencias del Sistema) se requiere efectuar los siguientes pasos:
Nota: Una forma de abrir el fichero es usando un editor de texto basado en UNIX en el Terminal, como por ejemplo nano. Debido a que el fichero pertenece al usuario root se debe emplear el comando sudo para abrirlo (como si fueramos el usuario root). Por ejemplo, teclée lo siguiente en el Terminal (tras lo cual le preguntará por la contraseña): sudo nano /private/etc/apache2/httpd.conf Comandos de nano a tener en cuenta: ^w (buscar), ^o (guardar), and ^x (salir) donde ^ representa la tecla Ctrl.
Nota: Las versiones de Mac OS X anteriores a 10.5 tienen incorporadas versiones antiguas de PHP y Apache. Por ello, es posible que el fichero de configuracion de Apache se encuentre en dichos equipos en /etc/httpd/httpd.conf.
En el editor de texto, descomente las líneas (eliminando el símbolo #) que sean similares a las que se muestran a continuación (a menudo estas líneas se encuentran separadas, asi que tendrá que localizar ambas en el fichero):
# LoadModule php5_module libexec/httpd/libphp5.so # AddModule mod_php5.c
Asegúrese que las extensiones que desee puedan ser interpretadas como PHP (por ejemplo: .php .html y .inc)
Como las siguientes sentencias ya existían en el httpd.conf (desde el Max Panther), una vez se habilite PHP los ficheros .php automáticamente seran interpretados como PHP.
<IfModule mod_php5.c>
# If php is turned on, we respect .php and .phps files.
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
# Since most users will want index.php to work we
# also automatically enable index.php
<IfModule mod_dir.c>
DirectoryIndex index.html index.php
</IfModule>
</IfModule>
Nota:
Con anterioridad a OS X 10.5 (Leopard) se empaquetaba PHP 4 en lugar de PHP 5, en cuyo caso las instrucciones anteriores pueden ser ligeramente diferentes cambiando los 5 por los 4.
La función phpinfo() muestra información sobre PHP. Considere la creación de un fichero en el DocumentRoot que contenga el siguiente código PHP:
<?php phpinfo(); ?>
CLI (o CGI en versiones antiguas) también es llamado de forma correcta php y posiblemente existe como /usr/bin/php. Abra el Terminal, lea la sección de línea de comando del manual de PHP, y ejecute php -v para comprobar la versión de PHP del binario PHP. Una llamada a phpinfo() también le mostrará esta información.
Esta sección se aplica a Windows 98/Me y Windows NT/2000/XP/2003. PHP no funciona en plataformas de 16 bits, como Windows 3.1 y, a veces nos referimos a las plataformas soportadas por Windows como Win32.
Nota:
Windows 98/Me/NT4 ya no se admite a partir de PHP 5.3.0.
Nota:
Windows 95 ya no se admite a partir de PHP 4.3.0.
Hay dos maneras principales de instalar PHP para Windows: de forma manual o mediante el instalador.
Si tiene un entorno de desarrollo como Microsoft Visual Studio, también puede construir PHP desde el código fuente original.
Una vez que haya instalado PHP en su sistema Windows, también puede querer cargar varias extensiones para mayor funcionalidad.
Hay varios instaladores todo-en-uno a través de Internet, pero ninguno de esos son avalados por la PHP.net, ya que creemos que usando uno de los paquetes oficiales de Windows de » http://www.php.net/downloads.php es la mejor opción para que el sistema este seguro y optimizado.
El instalador de Windows de PHP está disponible en la página de descargas en » http://www.php.net/downloads.php. Esta instala la CGI version de PHP y para IIS, PWS, y Xitami, se configura el servidor web también. El instalador no incluye ninguna extensión externas de PHP adicionales (php_*.dll) ya que sólo se encontrará los del paquetes de Windows Zip y descarga de PECL
Nota:
Si bien el instalador de Windows es una manera fácil de trabajar con PHP, es restringido en muchos aspectos como, por ejemplo, la configuración automática de extensiones no es soportada. El uso de la instalación no es un método preferido para la instalación de PHP.
En primer lugar, hay que instalar el servidor web seleccionado HTTP en el sistema, y asegurarse de que funcione.
Ejecute el ejecutable instalador y siga las instrucciones proporcionadas por el asistente de instalación. Dos tipos de instalación son soportadas - estándar, que proporciona los parámetros por defecto para todos las configuraciones que puede, y avanzado, que hace preguntas a medida que avanza.
El asistente de instalación recopila información suficiente para configurar el fichero php.ini y configurar ciertos servidores web para utilizar PHP. Uno de los servidores web que el programa de instalación de PHP no configura es Apache, por lo que tendrás que configurarlo manualmente.
Una vez que haya terminado la instalación, el instalador le informará si se es necesario reiniciar el sistema, reiniciar el servidor, o simplemente empezar a usar PHP.
Tenga en cuenta que esta configuración de PHP no es segura. Si a usted le gustaría tener una segura instalación de PHP, es mejor que vayas en el modo manual, y establecer todos los opción con cuidado. Esta configuración automática disminuiye el trabajo de instalación de PHP, pero no es destinado a ser usado en los servidores en línea.
Para crear el instalador de las últimas versiones de PHP en Windows se ha usado la tecnología MSI en conjunto con Wix Toolkit (» http://wix.sourceforge.net/). Esta aplicación se encarga de instalar y configurar tanto PHP, como las extensiones base y PECL. Además, también permite configurar muchos de los servidores web más extendidos, como IIS, Apache, o Xitami.
En primer lugar, se debe instalar el servidor HTTP (web) deseado, y asegurarse de que funciona. Una vez realizado, puede optarse por alguno de los siguientes métodos de instalación.
Ejecute el instalador MSI y siga las instrucciones que le indica el asistente de instalación. En primer lugar, se le solicitará que seleccione el Servidor Web que desea configurar, junto con algunos detalles de configuración adicionales.
Posteriormente, se le pedirá que indique qué funcionalidades y extensiones desea instalar y habilitar. Podrá indicar si desea instalar o no cada element seleccionando "Instalar en el disco local" ("Will be installed on local hard drive") en el menú desplegable que acompaña a cada uno de ellos. Al marcar "Instalar todas las funcionalidades en el disco local" ("Entire feature will be installed on local hard drive"), podrá instalar todas las subcategorías del elemento seleccionado (por ejemplo, al marcar esta opción en "PDO", se instalarán todos los Drivers PDO).
Se recomienda no instalar todas las extensiones de forma predeterminada, ya que muchas de ellas tienen dependencias con bibliotecas externas a PHP. En lugar de eso, utilize el Modo de Reparación de Instalación (Installation Repair Mode) desde el panel de control de "Agregar o quitar programas". Desde aquí podrá habilitar o deshabilitar a posteriori cualquier extensiones o componente.
Finalmente, el instalador inicializa tanto el fichero php.ini como al propio PHP para funcionar en Windows. También podrá configura algunos servidores web para que utilicen PHP. Actualmente es capaz de configurar IIS, Apache, Xitami y Sambar; si utiliza otro servidor web, deberá configurarlo a mano.
El instalador también permite ser ejecutado en modo silencioso, muy útil para Administradores de Sistemas que desean implantar PHP fácilmente. Para usar el modo silencioso:
msiexec.exe /i php-VERSION-win32-install.msi /q
Puede especificar el directorio de instalación como parámetro al instalador. Por ejemplo, para instalarlo en e:\php:
msiexec.exe /i php-VERSION-win32-install.msi /q INSTALLDIR=e:\php
Puede, del mismo modo, especificar qué componentes instalar. Por ejemplo, para instalar la extensión mysqli y el ejecutable CGI:
msiexec.exe /i php-VERSION-win32-install.msi /q ADDLOCAL=cgi,ext_php_mysqli
La lista actual de componentes para instalar es la siguiente:
MainExecutable - ejecutable php.exe executable ( desde PHP 5.2.10/5.3.0 no está disponible; se incluye por omisión) ScriptExecutable - ejecutable php-win.exe ext_php_* - varias extensiones ( por ejemplo: ext_php_mysql para MySQL ) apache13 - módulo de Apache 1.3 apache20 - módulo de Apache 2.0 apache22 - módulo de Apache 2.2 apacheCGI - Ejecutable CGI de Apache iis4ISAPI - módulo ISAPI de IIS iis4CGI - ejecutable CGI de IIS iis4FastCGI - ejecutable CGI de IIS NSAPI - módulo de servidores Sun/iPlanet/Netscape netserve - ejecutable CGI de Servidores Web NetServe Xitami - ejecutable CGI de Xitami Sambar - módulo ISAPI del Servidor Sambar CGI - ejecutable php-cgi.exe PEAR - instalador PEAR Manual - manual de PHP en formato CHM
Si desea más información sobre instalaciones MSI desde la línea de comandos, consulte » http://msdn.microsoft.com/en-us/library/aa367988.aspx
Para actualizar, debe ejecutar el instalador indistintamente desde la línea de comandos o del entorno gráfico. El instalador comprobará sus opciones de instalación actuales, eliminará la instalación antigua, y reinstalará PHP con las mismas opciones que ya tenía. Se recomienda utilizar este método para mantener PHP actualizado, en lugar de sobrescribir a mano cada fichero del directorio de instalación.
Esta sección contiene instrucciones para instalar y configurar manualmente PHP en Windows de Microsoft. Para las instrucciones sobre cómo utilizar el instalador de PHP para instalar y configurar PHP y un servidor web en Windows, consulte Windows Installer (PHP 5.2 y posteriores).
Descarga la distribución binaria de PHP zip » PHP para Windows: Binarios y Fuentes . Hay varias versiones diferentes del paquete zip - Seleccione por la versión que sea adecuado para el servidor web utilizado:
Si se utiliza PHP con IIS a continuación elija PHP 5.3 VC9 Non Thread Safe o PHP 5.2 VC6 Non Thread Safe;
Si PHP se utiliza con IIS7 o superior y PHP 5.3+, a continuación los archivos binarios VC9 de PHP que se deben utilizar.
Si se utiliza PHP con Apache 1 o Apache 2 a continuación elija PHP 5.3 VC6 o PHP 5.2 VC6.
Nota:
Versiones VC9 se compilan con el compilador de Visual Studio 2008 y tiene mejoras en el rendimiento y estabilidad. Las versiones VC9 requieren que tenga la » Microsoft 2008 C++ Runtime (x86) o la » Microsoft 2008 C++ Runtime (x64) instalado.
Descomprimir el contenido del archivo zip en un directorio de su elección, por ejemplo C:\PHP\. La estructura de directorios y archivos extraídos de del zip se verá de la siguiente manera:
Ejemplo #1 PHP 5 paquete de estructura
c:\php | +--dev | | | |-php5ts.lib -- php5.lib in non thread safe version | +--ext -- extension DLLs for PHP | | | |-php_bz2.dll | | | |-php_cpdf.dll | | | |-... | +--extras -- empty | +--pear -- initial copy of PEAR | | |-go-pear.bat -- PEAR setup script | |-... | |-php-cgi.exe -- CGI executable | |-php-win.exe -- executes scripts without an opened command prompt | |-php.exe -- Command line PHP executable (CLI) | |-... | |-php.ini-development -- default php.ini settings | |-php.ini-production -- recommended php.ini settings | |-php5apache2_2.dll -- does not exist in non thread safe version | |-php5apache2_2_filter.dll -- does not exist in non thread safe version | |-... | |-php5ts.dll -- core PHP DLL ( php5.dll in non thread safe version) | |-...
A continuación se muestra la lista de los módulos y archivos ejecutables incluidos en la distribución del archivo zip de PHP:
go-pear.bat - el script de configuración de PEAR. Consulte » Instalación (PEAR) para más detalles.
php-cgi.exe - ejecutable CGI que se puede utilizar cuando se ejecuta PHP en IIS a través de CGI o FastCGI.
php-win.exe - el ejecutable para la ejecución de scripts en PHP sin necesidad de utilizar una ventana de línea de comandos de PHP (Por ejemplo, las aplicaciones PHP que utilizan Windows GUI).
php.exe - el ejecutable para la ejecución de scripts PHP dentro de una interfaz de línea de comandos (CLI) de PHP.
php5apache2_2.dll - Apache 2.2.X module.
php5apache2_2_filter.dll - Apache 2.2.X filter.
Después de que el contenido del paquete de PHP se ha extraído, copie el php.ini-production en php.ini en la misma carpeta. Si es necesario, también es posible colocar el php.ini en cualquier otro lugar. Pero se requieren pasos adicionales de configuración como se describe en Configuración de PHP.
El fichero php.ini le dice a PHP cómo se configura, y cómo trabajar con el ambiente que se ejecuta. Aquí hay una serie de ajustes para el fichero php.ini PHP que ayudan a trabajar mejor con Windows. Algunos de estos son opcionales. Hay muchas otras directivas que puedan ser relevantes para su ambiente - dirijase lista de directivas php.ini para más información.
Las directivas:
extension_dir = <path to extension directory> - La extension_dir necesidades para indicar el directorio donde las extensiones de PHP se almacenan los ficheros. La ruta puede ser absoluta (i.e. "C:\PHP\ext") o (i.e. ".\ext"). Extensiones que se enumeran más baja en el php.ini ficheros que se encuentra en el extension_dir .
extension = xxxxx.dll - Para cada extensión que desee habilitar, necesita un correspondiente "extension=" directiva que le dice a PHP que las extensiones en el extension_dir para cargar en tiempo de inicio.
log_errors = On - PHP tiene un error de registro de instalación que se puede utilizar para enviar los errores a un fichero, o de un servicio (i.e. syslog) y trabaja en conjunto con el error_log Directiva a continuación. Cuando se ejecuta bajo IIS, la log_errors debe estar habilitado, con una validez error_log .
error_log = <path to the error log file> - El error_log tiene que especificar la ruta de acceso absoluta, o en relación con el archivo donde los errores de PHP debe estar registrado. Este archivo debe tener permisos de escritura para el servidor web. Los lugares más comunes para este archivo en varios directorios TEMP, por ejemplo "C:\inetpub\temp\php-errors.log".
cgi.force_redirect = 0 - La presente Directiva se requiere para ejecutar en IIS. Se trata de una protección de la instalación de la guía necesaria por muchos otros servidores web. Sin embargo, lo que permite que en IIS hacer que el motor de PHP a un error en Windows.
cgi.fix_pathinfo = 1 - Esto le permite acceder a PHP al real path después de la especificación CGI. IIS FastCGI implementa las necesidades de este conjunto.
fastcgi.impersonate = 1 - FastCGI bajo IIS admite la posibilidad de hacerse pasar por tokens de seguridad del cliente que llama. Esto permite que IIS defina el contexto de seguridad que solicita ejecutar.
fastcgi.logging = 0 - FastCGI debe estar deshabilitado en IIS. Si se deja habilitada, los mensajes de cualquier clase son tratados por FastCGI como las condiciones de error que hará que IIS genere una excepción HTTP 500.
Directivas opcionales
max_execution_time = ## - Esta directiva le dice a PHP, el importe máximo de tiempo que puede ejecutar cualquier script determinado. El defecto es 30 segundos. Aumentar el valor de esta directiva, si la aplicación PHP tomar mucho tiempo para ejecutarse.
memory_limit = ###M - La cantidad de memoria disponible para el proceso de PHP, en Megabytes. El valor por defecto es 128, lo cual está bien para la mayoría de las aplicaciones PHP. Algunos de los más complejos puede ser que necesite más.
display_errors = Off - Esta directiva le dice a PHP si se incluyen los mensajes de error en el corriente que devuelve al servidor web. Si se establece en "On", entonces PHP enviará lo que las clases de errores que se define con la error_reporting directiva de nuevo al servidor web como parte de la secuencia de error. Por razones de seguridad, se recomienda "Off" en los servidores de producción con el fin de no revelar ninguna información sensible de la seguridad que a menudo se incluyen en los mensajes de error.
open_basedir = <paths a directorios, separados por semicolon>, por ejemplo, openbasedir="C:\inetpub\wwwroot;C:\inetpub\temp". Esta directiva especifica las rutas de directorio en donde PHP se le permite realizar las operaciones del sistema de archivos. Cualquier operación de fichero fuera de las rutas especificadas se producirá un error. Esta directiva es especialmente útil para bloquear la instalación de PHP en entornos de alojamiento compartido para evitar que scripts PHP de acceso a los archivos fuera del directorio raíz del sitio web.
upload_max_filesize = ###M and post_max_size = ###M - El tamaño máximo permitido de un archivo subido y los datos posteriores, respectivamente. Los valores de estas directivas serán aumenta si las aplicaciones PHP necesita realizar grandes cargas, como por ejemplo fotos o archivos de vídeo.
PHP esta ahora configurado en el sistema. El siguiente paso es elegir un servidor web, a fin de que pueda ejecutar PHP. Elegir un servidor web de la tabla de contenido.
Además de ejecutar PHP a través de un servidor web, PHP puede ejecutar desde la línea de comandos como un script .BAT. Ver PHP línea de comandos de Microsoft Windows para más detalles.
Esta sección contiene instrucciones específicas de la instalación de PHP en Microsoft Internet Information Services (IIS).
Esta sección contiene instrucciones para configurar en forma manual Internet Information Services (IIS) 5.1 y IIS 6.0 para trabajar con PHP en Microsoft Windows XP y Windows Server 2003. Para obtener instrucciones sobre la configuración de IIS 7.0 y versiones posteriores de Windows Vista , Windows Server 2008, Windows 7 y Windows Server 2008 R2 referirse a Microsoft IIS 7.0 y posteriores.
Descarga e instala PHP de acuerdo a las instrucciones descritas en manual detallado de instalación
Nota:
Non-thread-safe build de PHP se recomienda cuando se utiliza IIS. Non-thread-safe builds están disponibles en » PHP para Windows: Binarios y Fuentes.
Configure el CGI- y configure FastCGI-specific en el archivo php.ini como se muestra a continuación:
Ejemplo #1 Configuración CGI y FastCGI en php.ini
fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0
Descargue e instale » Microsoft FastCGI extensión para IIS 5.1 y 6.0. La extensión está disponible para 32-bit y plataformas de 64-bit - seleccionar el paquete de descarga adecuada para la plataforma.
Configure la extensión FastCGI para manejar las solicitudes específicas de PHP ejecutando el comando que se muestra a continuación. Vuelva a colocar el valor de el parámetro "-path" con la ruta absoluta del fichero en el fichero php-cgi.exe.
Ejemplo #2 Configuración de la extensión FastCGI para manejar las solicitudes de PHP
cscript %windir%\system32\inetsrv\fcgiconfig.js -add -section:"PHP" ^ -extension:php -path:"C:\PHP\php-cgi.exe"
Este comando creará un script de mapeo IIS para el fichero de extensión *.php , lo que resultará en todas las URLs que terminan con .php siendo manejado por la extensión FastCGI. Asimismo, se configurará la extensión FastCGI a usar en el ejecutable php-cgi.exe para procesar las solicitudes de PHP.
Nota:
En este punto la necesidad de instalación y configuración de los pasos se han completado. El resto de instrucciones a continuación son opcionales, pero altamente recomendable para lograr una funcionalidad óptima y el rendimiento de PHP en IIS.
Se recomienda habilitar la suplantación FastCGI en PHP cuando este utilizando IIS. Esto es controlado por la directiva fastcgi.impersonate en el fichero php.ini. Cuando suplantación está activado, PHP realizará todas las operaciones de ficheros de sistema en favor de la cuenta de usuario que se ha determinado por la autentificación de IIS. Esta asegura que, incluso si el mismo proceso PHP se comparte entre diferentes sitios web IIS, los scripts PHP en estos sitios web no podrá acceder a los otros fichero ' siempre y cuando use cuentas de usuario diferentes utilizado para la autenticación IIS en cada sitio web.
Por ejemplo IIS 5.1 and IIS 6.0, en su configuración predeterminada, se ha habilitado la autenticación anónima con una función de cuenta de usuario IUSR_<MACHINE_NAME> utilizado como una identidad por defecto. Esto significa que para que IIS puede ejecutar scripts PHP, es necesario concedera la cuenta IIUSR_<MACHINE_NAME> permiso de lectura en estos scripts. Si las aplicaciones PHP necesitan realizar operaciones de escritura sobre determinados ficheros o escribir ficheros en algunas carpetas a continuación la cuenta IUSR_<MACHINE_NAME> debe tener permiso para escribir en ellos.
Para determinar qué cuenta de usuario es utilizado por IIS autenticación anónima, siga estos pasos:
En el menú Inicio de Windows seleccione "Run:", type "inetmgr" y haga clic en "Ok";
Expanda la lista de sitios web en el nodo "Web Sites" en la vista de árbol, haga clic derecho en el sitio web que se está utilizando y seleccionar "Properties";
Haga clic en "Directory Security" tab;
Tome nota de un "User name:" campo en el cuadro de dialogo "Authentication Methods"
Para modificar la configuración de permisos en ficheros y carpetas, utilice la interfaz de usuario de el Explorador de Windows o el comando icacls.
Ejemplo #3 Configuración del fichero de los permisos de acceso
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
Los documentos por defecto de IIS se utilizan para las solicitudes HTTP que no especifican un nombre de documento. Con las aplicaciones PHP, index.php suele actuar como un documento predeterminado. Para añadir index.php a la lista de documentos predeterminados IIS, siga estos pasos:
En el menú Inicio de Windows seleccione "Run:", teclee "inetmgr" y haga clic en "Ok";
Haga clic derecho en el nodo ""Web Sites" de la vista de árbol y seleccione "Properties";
Haga clic en "Documents" tab;
Haga clic en el botón "Add..." y enter en "index.php" para el " Contenido de la página por defecto :".
Configurar la extensión IIS FastCGI para el reciclaje de procesos PHP utilizando los comandos de abajo. Los controles de configuración de FastCGI instanceMaxRequests número de solicitudes que serán procesadas por un solo proceso php-cgi.exe antes de el cierre de la extensión FastCGI. La variable PHP de entorno PHP_FCGI_MAX_REQUESTS controla cuántas peticiones de un único proceso php-cgi.exe se encargará antes de que se recicle así mismo. Asegúrese de que el valor especificado por la configuración FastCGI InstanceMaxRequests es menor o igual al valor especificado para PHP_FCGI_MAX_REQUESTS.
Ejemplo #4 Configuración FastCGI y reciclaje PHP
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -InstanceMaxRequests:10000 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHP_FCGI_MAX_REQUESTS:10000
Aumentar la configuración de tiempo de espera para la extensión FastCGI si hay aplicaciones que llevan mucho tiempo ejecutar scripts PHP. Los dos valores a ajsutar de los controles de tiempos de espera son ActivityTimeout y RequestTimeout. Véase » Configuración de Extensión FastCGI para IIS 6.0 para más información sobre los ajustes.
Ejemplo #5 Configuración de los ajustes de tiempo de espera FastCGI
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -ActivityTimeout:90 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -RequestTimeout:90
PHP busca para el fichero php.ini en varios lugares y es posible cambiar las ubicaciones predeterminadas de el fichero php.ini utilizando la variable de entorno PHPRC. Las instrucciones PHP para cargar el fichero de configuración desde una ubicación personalizada, ejecute el comando que se muestra a continuación. La ruta de acceso absoluta al directorio con el fichero php.ini debe ser especifica con un valor de variable de entorno PHPRC.
Ejemplo #6 Cambiar la ubicación del fichero php.ini
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHPRC:"C:\Some\Directory\"
Esta sección contiene instrucciones para configurar en forma manual Internet Information Services (IIS) 7.0 y posteriores para trabajar con PHP en Microsoft Windows Vista SP1, Windows 7, Windows Server 2008 and Windows Server 2008 R2. Para obtener instrucciones sobre la configuración de IIS 5.1 and IIS 6.0 on Windows XP and Windows Server 2003 refiérase a Microsoft IIS 5.1 and IIS 6.0.
Módulo FastCGI está deshabilitado en la instalación por defecto de IIS. Los pasos para que pueda variar según la versión de Windows se está utilizando.
Para activar el soporte FastCGI en Windows Vista SP1 y Windows 7:
En el menu de inicio de Windows seleccione "Run:", teclee "optionalfeatures.exe" y click "Ok";
En el "Windows Features" cuadro de diálogo "Internet Information Services", "World Wide Web Services", " Caracteristicas Desarrollo de aplicaciones " y luego permitir que el "CGI" checkbox;
Haga clic en Aceptar y espere hasta que se complete la instalación
Para activar el soporte FastCGI en Windows Server 2008 y Windows Server 2008 R2:
En el menú Inicio de Windows elegir "Run:", teclee "CompMgmtLauncher" y click "Ok";
En el "Web Server (IIS)" El rol no está presente en el marco del "Roles" nodo, a continuación, añadir haciendo clic en "Adicionar Roles";
Si la "Web Server (IIS)" role esta presente, entonces haga click "Add Role Services" y luego permitir que el "CGI" casilla de verificación en grupo "Desarrollo de Aplicaciones" ;
Click "Next" y luego "Install" ay espere a que la instalación se complete.
Descargue e instale PHP de acuerdo a las instrucciones descritas en manual installation steps
Nota:
No construir thread-safe de PHP se recomienda cuando IIS utilizando. El no-thread-safe crea están disponibles en » PHP para Windows: binarios y fuentes.
Configure el CGI y la configuración específica de FastCGI php.ini fichero como se muestra a continuación:
Ejemplo #1 CGI y FastCGI en la configuración php.ini
fastcgi.impersonate = 1
fastcgi.logging = 0
cgi.fix_pathinfo=1
cgi.force_redirect = 0
Configurar la asignación de IIS controlador para PHP utilizando la interfaz de usuario Administrador de IIS o una herramienta de línea de comandos.
Siga estos pasos para crear una asignación de controlador de IIS para PHP en la interfaz de usuario Administrador de IIS:
En el menú Inicio de Windows elegir "Run:", escriba "inetmgr" y click "Ok";
En la interfaz de usuario de IIS Manager, seleccione el nodo de servidor en el "Connections" vista de árbol;
En el "Características" Página de abrir el "Handler Mappings" feature;
En el "Actions" haga click en panel "Add Module Mapping...";
En el "Add Module Mapping" diálogo entre lo siguiente:
Haga Click en "Solicitar Restricciones" botón y luego configurar la asignación de invocar controlador sólo si la solicitud se asigna a un archivo o una carpeta;
Haga clic en Aceptar en todos los cuadros de diálogo para guardar la configuración.
Utilice el comando mostrado a continuación para crear un grupo de IIS FastCGI proceso que utilizará php-cgi.exe ejecutable para la tramitación de solicitudes de PHP. Vuelva a colocar el valor del parámetro fullPath con la ruta absoluta al fichero php-cgi.exe.
Ejemplo #2 >Creación del proceso del grupo IIS FastCGI
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI ^
/+[fullPath='c:\PHP\php-cgi.exe']
Configurar IIS PHP para manejar las peticiones concretas de la ejecución del comando que se muestra a continuación. Vuelva a colocar el valor del parámetro scriptProcessor con la ruta de acceso absoluta al fichero php-cgi.exe.
Ejemplo #3 Creación de mapas manejador de peticiones PHP
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers ^
/+[name='PHP_via_FastCGI', path='*.php',verb='*',modules='FastCgiModule',^
scriptProcessor='c:\PHP\php-cgi.exe',resourceType='Either']
Este comando crea una asignación de controlador de IIS para la extensión de archivo *.php, lo que resultará en todas las direcciones URL que terminan con. Php siendo manejado por el módulo FastCGI.
Nota:
En este punto la necesidad de instalación y configuración de los pasos se han completado. Las instrucciones a continuación son opcionales, pero altamente recomendable para lograr una funcionalidad óptima y el rendimiento de PHP en IIS.
Se recomienda habilitar la suplantación en PHP FastCGI cuando IIS utilizando. Esta está controlado por la directiva fastcgi.impersonate en el fichero php.ini. Cuando está habilitada la suplantación, PHP realizará todas las operaciones del sistema de ficheros en nombre de la cuenta de usuario que ha sido determinado por la autentificación de IIS. Esto asegura que, aunque el proceso mismo PHP es compartido a través de diferentes sitios web IIS, los scripts PHP en los sitios web no será capaz de acceder a los demás ficheros, siempre y cuando las cuentas de usuario se utilizan para la autenticación de IIS en cada sitio web.
Por ejemplo IIS 7, en su configuración por defecto, se ha habilitado la autenticación anónima con incorporada IUSR cuenta de usuario utilizada como una identidad por defecto. Esto significa que para que IIS ejecutar scripts PHP, es necesario conceder a la cuenta IUSR permiso de lectura en estos scripts. Si las aplicaciones PHP necesidad de realizar operaciones de escritura de ciertos ficheros o escribir ficheros en una carpetas entonces cuenta IUSR debe tener permiso para escribir en ellos.
Para determinar qué cuenta de usuario se utiliza como una identidad anónima en IIS 7 utilice el siguiente comando. Vuelva a colocar el "Sitio Web predeterminado" con el nombre del sitio Web de IIS que utiliza. En la producción configuración XML aspecto de elemento para el atributo userName.
Ejemplo #4 La determinación de la cuenta utilizada como IIS identidad anónima
%windir%\system32\inetsrv\appcmd.exe list config "Default Web Site" ^
/section:anonymousAuthentication
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="true" userName="IUSR" />
</authentication>
</security>
</system.webServer>
Nota:
Si el atributo userName no está presente en el elemento anonymousAuthentication, o si se establece una cadena vacía, entonces significa que la identidad del grupo de aplicaciones se utiliza como un identidad anónima para ese sitio web.
Para modificar la configuración de permisos de archivos y carpetas, utilice la interfaz de usuario del Explorador de Windows o comando icacls.
Ejemplo #5 Configuración de archivo de los permisos de acceso
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
Los documentos por defecto de IIS se utilizan para las solicitudes HTTP que no se especifica un nombre de documento. Con las aplicaciones PHP,index.php por lo general actúa como un documento predeterminado. Para añadir index.php a la lista de los documentos por defecto de IIS, utilice este comando:
Ejemplo #6 Establecer index.php como un documento predeterminado en IIS
%windir%\system32\inetsrv\appcmd.exe set config ^
-section:system.webServer/defaultDocument /+"files.[value='index.php']" ^
/commit:apphost
Configurar la configuración de IIS FastCGI PHP para el reciclaje de los procesos mediante los comandos de abajo. La configuración FastCGI instanceMaxRequests controla cuántas peticiones se procesado por un solo peoceso php-cgi.exe antes de IIS se cierra. La variable de entorno PHP PHP_FCGI_MAX_REQUESTS controla el número pide una sola proceso php-cgi.exe se encargará antes de que se recicla sí misma. Asegúrese de que el valor especificado para la configuración FastCGI InstanceMaxRequests es menor o igual al valor especificado para PHP_FCGI_MAX_REQUESTS.
Ejemplo #7 Configuración de PHP FastCGI y el reciclaje
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/[fullPath='c:\php\php-cgi.exe'].instanceMaxRequests:10000
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/+"[fullPath='C:\{php_folder}\php-cgi.exe'].environmentVariables.^
[name='PHP_FCGI_MAX_REQUESTS',value='10000']"
Aumentar el tiempo de espera para la configuración de FastCGI si se espera tener a largo ejecutar scripts PHP. Los dos valores que los tiempos de espera de control activityTimeout y requestTimeout. Utilice los comandos siguientes para cambiar la configuración de tiempo de espera. Asegúrese de sustituir el valor en el parámetro a fullPath contendrá la ruta absoluta a el fichero php-cgi.exe.
Ejemplo #8 Configuración de los ajustes de tiempo de espera FastCGI
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/[fullPath='C:\php\php-cgi.exe',arguments=''].activityTimeout:"90" /commit:apphost
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/[fullPath='C:\php\php-cgi.exe',arguments=''].requestTimeout:"90" /commit:apphost
PHP busca el fichero php.ini en varios lugares y es posible cambiar las ubicaciones predeterminadas del fichero php.ini utilizando variable de entorno PHPRC. Encomendar a PHP para cargar el archivo de configuración desde una ubicación personalizada, ejecute el comando se muestra a continuación. La ruta de acceso absoluta al directorio con el fichero php.ini debe ser especifica como un valor de variable de entorno PHPRC.
Ejemplo #9 Cambiar la ubicación del fichero php.ini
appcmd.exe set config -section:system.webServer/fastCgi ^
/+"[fullPath='C:\php\php.exe',arguments=''].environmentVariables.^
[name='PHPRC',value='C:\Some\Directory\']" /commit:apphost
Esta sección contiene notas y sugerencias específicas para Apache 1.3.x instaladas con PHP en sistemas Microsoft Windows. También hay instrucciones y notas para Apache 2 en una nueva página.
Nota:
Por favor lea primero el manual de instalación
Hay dos formas de configurar PHP para trabajar con Apache 1.3.x en Windows. La primera es usar CGI binary (php.exe para PHP 4 y php-cgi.exe para PHP 5), la otra es utilizar el módulo DLL de Apache. En ambos casos se necesita editar httpd.conf para configurar Apache para trabajar con PHP, y después reiniciar el servidor.
Vale la pena resaltar, que el módulo SAPI ha sido desarrollado mas estable bajo Windows. Se recomienda su uso más que el binario CGI, ya que es más trasparente y seguro.
Aunque pueden haber algunas variaciones en la configuración de PHP bajo Apache, estas son sencillas para ser utilizados por el principiante. Por favor consulte la documentación de Apache para seguir directivas de configuración.
Después de modificar el archivo de configuración, recuerde que debe reiniciar el servidor, por ejemplo NET STOP APACHE seguido de NET START APACHE, si ejecuta Apache como un servicio de Windows, o si usa los atajos
Nota: Recuerde que cuando agrega rutas como valores en los archivos de configuración de Apache en Windows, todas las barras invertidas tal como c:\directory\file.ext deberían ser convertidas en barras comunes: c:/directory/file.ext. Una barra común al final será necesaria para directorios.
Se deben agregar las siguientes líneas a su archivo de configuración Apache httpd.conf
Ejemplo #1 PHP como módulo de Apache 1.3.x
Se asume que PHP está instalado en c:\php. Ajuste la ruta de acceso si este no es el caso.
Para PHP 4:
# Adicionar al final de la sección LoadModule # No olvidar copiar este ficrero desde el directorio sapi! LoadModule php4_module "C:/php/php4apache.dll" # Adicionar al final de la sección AddModule AddModule mod_php4.c
Para PHP 5:
# Adicionar al final de la sección LoadModule LoadModule php5_module "C:/php/php5apache.dll" # Adicionar al final de la sección AddModule AddModule mod_php5.c
Para ambos :
# Adicionar esta línea dentro de la <IfModule Mod_mime.c> condicional brace AddType application/x-httpd-php .php # Para la sintaxis highlighted .phps files, tambien adicionar AddType application/x-httpd-php-source .phps
Si se ha descomprimido el paquete PHP C:\php\ como se describe en la sección Manual de instalación paso a paso, es necesario insertar estas líneas a su archivo de configuración de Apache para configurar el binario CGI:
Ejemplo #2 PHP y Apache 1.3.x como CGI
ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .php # Para PHP 4 Action application/x-httpd-php "/php/php.exe" # Para PHP 5 Action application/x-httpd-php "/php/php-cgi.exe" # Especifica el directorio donde php.ini esta SetEnv PHPRC C:/php
Al usar el modo CGI, su servidor esta expuesto a diferentes ataques. Por favor, leer la sección Seguridad con CGI para aprender como defenderse de estos ataques.
Si desea presentar archivos de código fuente PHP sintaxis highlighted, no existe la opción más conveniente con la versión de PHP como módulo. Si ha elegido configurar Apache para usar PHP como un binario CGI, tendrá que usar la función highlight_file(). Para ello se necesita crear un script PHP y agregarle el código <?php highlight_file('some_php_script.php'); ?>.
Esta sección contiene notas y sugerencias específicas de Apache 2.x instaladas con PHP en sistemas Microsoft Windows. También hay instrucciones y notas para usuarios de Apache 1.3.x en una nueva página..
Nota:
Por favor lea primero el manual de instalación
Nota: Soporte Apache 2.2
Los usuarios de Apache 2.2 deben tener en cuenta que el archivo DLL para Apache 2.2 es llamado php5apache2_2.dll a cambio de php5apache2.dll y sólo está disponible para PHP 5.2.0 y posteriores. Ver también » http://snaps.php.net/
Se le recomienda consultar la » Documentación de Apache Para obtener un conocimiento básico del servidor Apache 2.x. Tambien considere leer las » notas especificas de Windows para Apache 2.x antes de seguir leyendo aquí.
Apache 2.x está diseñado para ejecutarse en las versiones de Windows designado como servidor de plataforma, tales como Windows NT 4.0, Windows 2000, Windows XP o Windows 7. Aunque Apache 2.x funciona bastante bien en Windows 9x, el soporte en estas plataformas es incompleta, y algunas cosas no funcionan correctamente. No existe un plan para remediar esta situación.
Descargue la versión más reciente de » Apache 2.x y un accesorio de la versión de PHP. Siga los pasos del Manual de Instalación y regrese a continuar con la integración de PHP y Apache.
Hay tres formas de configurar PHP para trabajar con Apache 2.x en Windows. Puede ejecutar PHP como un controlador, como CGI o bajo FastCGI.
Nota: Recuerde que cuando agrega rutas como valores en los archivos de configuración de Apache en Windows, todas las barras invertidas tal como c:\directory\file.ext deberían ser convertidas en barras comunes: c:/directory/file.ext. Una barra común al final será necesaria para directorios.
Es necesario insertar las siguientes líneas en Apache httpd.conf archivo de configuración para cargar el módulo PHP para Apache 2.x:
Ejemplo #1 PHP and Apache 2.x como controlador
# LoadModule php5_module "c:/php/php5apache2.dll" AddHandler application/x-httpd-php .php # Configurar la ruta de php.ini PHPIniDir "C:/php"
Nota: Recuerda sustituir la ruta de acceso actual a PHP para el C:/php/ en los ejemplos anteriores. Tenga cuidado en utilizar ya sea php5apache2.dll o php5apache2_2.dll en la directiva LoadModule y verificar que el fichero de referencia se encuentra localizado en la ruta de fichero que se señala en la presente directiva.
La configuración anterior permite habilitar PHP como controlador de cualquier fichero que tiene una extensión .php, aunque existen otras extensiones de fichero. Por ejemplo, un fichero llamadoexample.php.txt será ejecutado por el controlador de PHP. Para garantizar que sólo los ficheros queterminen en .php son ejecutados, se utiliza la siguiente configuración en su lugar:
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
Se debe consultar la» Documentación de Apache CGI para una comprensión más completa de ejecutar CGI en Apache
Para ejecutar PHP como CGI, tendrás que colocar los ficheros php-cgi en un directorio designado como directorio CGI usando la directiva ScriptAlias.
A continuación, se nesesita insertar una #! línea en los ficheros PHP, apuntando a la ubicación del binario de PHP:
Ejemplo #2 PHP y Apache 2.x como CGI
#!C:/php/php.exe <?php phpinfo(); ?>
Al usar el modo CGI, su servidor esta expuesto a diferentes ataques. Por favor, leer la sección Seguridad con CGI para aprender como defenderse de estos ataques.
Ejecutar PHP bajo FastCGI tiene una serie de ventajas con respecto a ejecutarlo como un CGI. Si lo establece de esta manera es bastante sencillo:
Obtener mod_fcgid de » http://httpd.apache.org/mod_fcgid/. Los binarios de Win32 están disponibles para la descargar en ese sitio. Instalar el módulo de acuerdo con las instrucciones que vienen con él.
Configurar el servidor web como se muestra abajo, teniendo cuidado de ajustar cualquier ruta que refleje como se tiene instalado las cosas en el sistema:
Ejemplo #3 Configurar Apache para ejecutar PHP como FastCGI
LoadModule fcgid_module modules/mod_fcgid.so # Donde está el fichero php.ini? FcgidInitialEnv PHPRC "c:/php" AddHandler fcgid-script .php FcgidWrapper "c:/php/php-cgi.exe" .php
Esta sección contiene anotaciones y consejos específicos de servidores Sun Java System Web Server, Sun ONE Web Server, iPlanet y Netscape en sistemas Windows.
Desde PHP 4.3.3 pueden usarse scripts PHP con el módulo NSAPI para generar listados de directorios y páginas de error personalizadas. También hay funciones adicionales para la compatibilidad con Apache. Para tener soporte con los servidores web actuales consulte las anotaciones sobre subpeticiones.
Para instalar PHP como un manejador CGI, haga lo siguiente:
Realice la asociación de ficheros en la línea de comandos. Introduzca las siguientes líneas:
assoc .php=PHPScript ftype PHPScript=c:\php\php.exe %1 %*
Se pueden encontrar más detalles sobre cómo configurar PHP como ejecutable CGI en » http://benoit.noss.free.fr/php/install-php.html
Para instalar PHP con NSAPI, haga lo siguiente:
Haga la asociación de ficheros en la línea de comandos. Introduzca las siguientes líneas:
assoc .php=PHPScript ftype PHPScript=c:\php\php.exe %1 %*
Edite magnus.conf (para servidores >= 6) o obj.conf (para servidores < 6) e introduzca lo siguiente: Debe ubicar estas líneas tras mime types init.
Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans" shlib="c:/php/sapi/php4nsapi.dll" Init fn="php4_init" LateInit="yes" errorString="Failed to initialise PHP!" [php_ini="c:/path/to/php.ini"]
Configure el objeto por omisión en obj.conf (para clases de servidores virtuales [Sun Web Server 6.0+] en su fichero vserver.obj.conf): En la sección <Object name="default">, añada esta línea tras los 'ObjectType' y antes de las líneas 'AddLog':
Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...]
Esto sólo es necesario si se desea configurar un directorio que consista únicamente en scripts PHP (como en los directorios cgi-bin):
<Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object>
Nota:
Puede consultar más detalles sobre cómo configurar PHP como filtro NSAPI aquí: » http://benoit.noss.free.fr/php/install-php4.html
Nota:
El tamaño de pila de PHP depende de la configuración del servidor web. Si la ejecución de scripts extensos de PHP se detiene, se recomienda que lo propague con Admin Server (en la sección "MAGNUS EDITOR").
Al escribir scripts PHP es importante tener en cuenta que Sun JSWS/Sun ONE WS/iPlanet/Netscape es un servidor web multihebra, ya que todas las peticiones se ejecutan en el espacio del mismo proceso (el espacio del propio servidor web) y este espacio sólo contiene un entorno de ejecución. Si se desea conocer variables CGI como PATH_INFO, HTTP_HOST, etc. no se debe hacer de la forma convencional con getenv() o similares (register globals del entorno, $_ENV). Sólo se obtendrá el entorno del servidor web en ejecución sin ninguna variable CGI válida.
Nota:
¿Pero por qué hay variables CGI (inválidas) en el entorno?
Respuesta: Se debe a que se inició el proceso del servidor web desde el servidor de administración que lanza el script de inicio del servidor web como un script CGI (¡un script CGI dentro del servidor de administración!). Ésta es la razón por la que el entorno del servidor web contiene algunas variables de entorno CGI. Puede comprobarlo iniciando el servidor web de otra forma. Acceda al terminal como administrador y arránquelo a mano - verá que ya no hay variables de entorno CGI.
Deben actualizarse los scripts, para que consulten variables CGI de la forma correcta para PHP 4.X, usando la superglobal $_SERVER. Si se tuvieran scripts antiguos que usaran $HTTP_HOST, etc., debería habilitarse register_globals en php.ini, así como cambiar la variable de orden (importante: elimine la "E", ya que aquí no se necesitan variables de entorno):
variables_order = "GPCS" register_globals = On
Se puede utilizar PHP para generar páginas de error para "404 Not Found" o similar. Debe añadirse la siguiente línea al objeto en obj.conf para cada página de error que se desee redefinir:
Error fn="php4_execute" code=XXX script="/path/to/script.php" [inikey=value inikey=value...]
Otra posibilidad es generar listados de directorios personalizados. Debe crearse un script PHP que liste el contenido de un directorio y reemplace la línea del servicio correspondiente para type="magnus-internal/directory" en obj.conf por lo siguiente:
Service fn="php4_execute" type="magnus-internal/directory" script="/path/to/script.php" [inikey=value inikey=value...]
El módulo NSAPI ahora soporta la función nsapi_virtual() (alias: virtual()) para hacer subpeticiones al sevidor web e insertar el resultado en la página web. El problema es que esta función utiliza algunas funcionalidades no documentadas de la biblioteca NSAPI.
En Unix esto no es un problema, porque el módulo automáticamente busca las funciones necesarias y las usa si estuvieran disponibles. Si no, nsapi_virtual() queda deshabilitado.
En Windows, las limitaciones del manejo de DLL necesitan emplear detección automática del fichero ns-httpdXX.dll más reciente. Se ha probado hasta en servidores versión 6.1. Si se utiliza una versión más reciente del servidor Sun, la detección falla y nsapi_virtual() se deshabilita.
Si este fuera el caso, debe probarse lo siguiente: Añada el siguiente parámetro a php4_init en magnus.conf/obj.conf:
Init fn=php4_init ... server_lib="ns-httpdXX.dll"
Puede comprobar el estado usando la función phpinfo().
Nota:
Pero tenga en cuenta: El soporte para nsapi_virtual() es EXPERIMENTAL.
Esta sección contiene notas y consejos específicos a el » Servidor Sambar para Windows.
Nota:
Debe leer primero los pasos del manual de instalación.
Esta lista describe cómo configurar el módulo ISAPI para trabajar con el servidor Sambar en Windows.
Busque el archivo llamado mappings.ini (en el directorio de configuración) en el directorio de instalación de Sambar.
Abra mappings.ini y adicione la siguiente línea de abajo [ISAPI]:
Ejemplo #1 Configuracion de Sambar ISAPI
#for PHP 4
*.php = c:\php\php4isapi.dll
#for PHP 5
*.php = c:\php\php5isapi.dll
Ahora reinicie el servidor Sambar para que los cambios surtan efecto.
Nota:
Si va a usar PHP para comunicarse con los recursos que se celebran en un equipo diferente en la red, entonces usted tendrá que modificar la cuenta utilizada por los servicios de el servidor Sambar. La cuenta por defecto utilizado por el Servicio del servidor Sambar es LocalSystem que no tendrán acceso a recursos remotos. La cuenta puede ser modificada mediante el uso de la opción de servicios de Windows en el Panel de control de las herramientas de administración.
Esta sección contiene notas y sugerencias específicas para » Xitami en Windows.
Nota:
Debe leer primero los pasos del Manual de instalación.
Esta lista describe cómo configurar el PHP CGI binary para trabajar con Xitami en Windows.
Nota: Importante para los usuarios de CGI
Leer las preguntas frecuentes en cgi.force_redirect para más detalles importantes. Esta directiva se debe establecer a0. Si desea utilizar $_SERVER['PHP_SELF'] tienes que habilitar la directiva cgi.fix_pathinfo.
Al usar el modo CGI, su servidor esta expuesto a diferentes ataques. Por favor, leer la sección Seguridad con CGI para aprender como defenderse de estos ataques.
Asegúrese de que el servidor web está funcionando, y apunte el navegador a la consola de administración xitamis (por lo general http://127.0.0.1/admin), Y haga clic en Configuración.
Navegue a los filtros, y ponga la extensión PHP que debe analizar (es decir, .php) en el campo de las extensiones del fichero(.xxx).
En el comando del filtro o script coloque la ruta y el nombre de el ejecutable PHP CGI es decir, C:\php\php.exe para PHP 4, o C:\php\php-cgi.exe para PHP 5.
Pulse el icono "Guardar".
Reinicie el servidor para reflejar los cambios.
En este capítulo se enseña a compilar PHP a partir de fuentes en Windows, usando Microsoft's tools. Para compilar PHP con cygwin, por favor vaya a Instalación sobre sistemas Unix.
Consulte la documentación del Wiki en: » http://wiki.php.net/internals/windows/stepbystepbuild
Después de instalar PHP y un servidor web en Windows, es probable que desee instalar algunas extensiones para mayor funcionalidad. Puede elegir cuales extensiones desea cargar cuando PHP inicia modificando php.ini. También puede cargar un módulo dinámicamente en el script con dll().
Los DLL para las extensiones PHP tienen el prefijo php_.
Algunas extensiones son construidas dentro de la versión de Windows de PHP. Esto significa que los ficheros DLL adicionales, y la extensión directiva, no se utiliza para cargar estas extensiones. En la tabla de Windows las extensiones PHP son enumeradas las extensiones que se requieren, se utilizan, ficheros PHP DLL adicionales. Aquí hay una lista de extensiones construidas:
En PHP 4 (actualización de PHP 4.3.11): BCMath, Caledar, COM, Ctype, FTP, MySQL, ODBC, Overload, PCRE, Session, Tokenizer, WDDX, XML y Zlib
En PHP 5 (actualización de PHP 5.0.4), existen los siguientes cambios. Contruidos en: DOM, LibXML, Iconv, SimpleXML, SPL y SQLite. Y a continuación se enumeran los no construidos en: MySQL y Overload.
La ubicación predeterminada de las búsquedas PHP para las extensiones es C:\php4\extensions en PHP 4 y C:\php5 en PHP 5. Para cambiar estos parámetros reflejando la configuración de PHP, edite el fichero php.ini:
Tendrá que cambiar los parámetros de la extension_dir para apuntar al directorio donde está la extensión, o donde tenga localizado el fichero php_*.dll. Por ejemplo:
extension_dir = C:\php\extensions
Habilite la extensión(s) en php.ini que desea utilizar descomentando las siguientes líneas extension=php_*.dll en php.ini. Esto se hace mediante el borrado de la cabecera, desde la extensión que desea cargar.
Ejemplo #1 Habilitar la extensión Bzip2 para PHP-Windows
// cambiar la siguiente línea de ... ;extension=php_bz2.dll // ... to extension=php_bz2.dll
Algunas de las extensiones de archivos necesita DLL extras para trabajar. Un par de ellos se puede encontrar en el paquete de distribución, en la carpeta C:\php\dlls\ en PHP 4 o en la carpeta principal en PHP 5, pero algunos, por ejemplo Oracle requieren (php_oci8.dll) ficheros DLL que no se incluyen con el paquete de distribución. Si va a instalar PHP 4, copie el paquete DLL de la carpeta C:\php\dlls a la carpeta principal C:\php. No se olvide de incluir en el sistema C:\php PATH (Este proceso se explica por separado en Preguntas Frecuentes de entrada).
Algunos de estos DLLs no se incluye con la distribución de PHP. Consulta cada página de documentación de las extensiones para más detalles. Además, lea el manual sección titulada Instalación de extensiones PECL para más detalles sobre PECL. Un gran número de extensiones de PHP se encuentran en PECL, y estas extensiones requieren una descarga independiente .
Nota: Si está ejecutando un servidor de la versión de PHP como módulo recuerde reiniciar su servidor web para reflejar los cambios a php.ini.
En la tabla siguiente se describen algunas de las extensiones disponibles y las dlls adicionales.
| Extensión | Descripción | Notas |
|---|---|---|
| php_bz2.dll | Funciones de compresión bzip2 | Nada |
| php_calendar.dll | Funciones de conversión Calendario | Construido a partir de PHP 4.0.3 |
| php_crack.dll | Funciones Crack | Nada |
| php_ctype.dll | Funciones familiares ctype | Construido a partir de PHP 4.3.0 |
| php_curl.dll | Funciones de la libreria cliente URL CURL | Requiere: libeay32.dll, ssleay32.dll(incluido) |
| php_dba.dll | DBA: Funciones de Capa de abstracción de la Base de datos (dbm-style) | Nada |
| php_dbase.dll | Funciones dBase | Nada |
| php_dbx.dll | Funciones dbx | |
| php_domxml.dll | Funciones DOM XML | PHP <= 4.2.0 Requiere: libxml2.dll (incluido) PHP >= 4.3.0 Requiere: iconv.dll (incluido) |
| php_dotnet.dll | Funciones .NET | PHP <= 4.1.1 |
| php_exif.dll | FuncionesEXIF | php_mbstring.dll. y, php_exif.dll se debe cargar después de php_mbstring.dll en php.ini. |
| php_fbsql.dll | Funciones FrontBase | PHP <= 4.2.0 |
| php_fdf.dll | FDF: Formato de datos de formularios de funciones. | Requiere: fdftk.dll (incluido) |
| php_filepro.dll | Funciones filePro | Acceso de sólo lectura |
| php_ftp.dll | Funciones FTP | Incorporado desde PHP 4.0.3 |
| php_gd.dll | Funciones de libreria de imagen GD | Eliminada en PHP 4.3.2. También tenga en cuenta que las funciones de color verdadero no están disponibles en GD1, utilice en su lugar php_gd2.dll. |
| php_gd2.dll | Funciones de libreria de imagen GD | GD2 |
| php_gettext.dll | Funciones Gettext | PHP <= 4.2.0 requiere gnu_gettext.dll (incluido), PHP >= 4.2.3 requiere libintl-1.dll, iconv.dll (incluido). |
| php_hyperwave.dll | Funciones HyperWave | Nada |
| php_iconv.dll | Conversión de caracteres ICONV | Requiere: iconv-1.3.dll (incluido), PHP >=4.2.1 iconv.dll |
| php_ifx.dll | Funciones Informix | Requiere: Librerias Informix |
| php_iisfunc.dll | Funciones de administracion IIS | Nada |
| php_imap.dll | POP3 y Funciones NNTP IMAP | Nada |
| php_ingres.dll | Funciones Ingres | Requiere: Librerias Ingres |
| php_interbase.dll | Funciones InterBase | Requiere: gds32.dll (incluido) |
| php_java.dll | Funciones Java | PHP <= 4.0.6 requiere: jvm.dll (incluido) |
| php_ldap.dll | Funciones LDAP | PHP <= 4.2.0 requiere libsasl.dll (incluido), PHP >= 4.3.0 requiere libeay32.dll, ssleay32.dll (incluido) |
| php_mbstring.dll | Funciones Multi-Byte String | Nada |
| php_mcrypt.dll | Funciones Mcrypt Encryption | Requiere: libmcrypt.dll |
| php_mhash.dll | Funciones Mhash | PHP >= 4.3.0 requiere: libmhash.dll (incluido) |
| php_mime_magic.dll | Funciones Mimetype | Requiere: magic.mime (incluido) |
| php_ming.dll | Funciones para Flash Ming | Nada |
| php_msql.dll | Funciones mSQL | Requiere: msql.dll (incluido) |
| php_mssql.dll | Funciones MSSQL | Requiere: ntwdblib.dll (incluido) |
| php_mysql.dll | Funciones MySQL | PHP >= 5.0.0, requiere libmysql.dll (incluido) |
| php_mysqli.dll | Funciones MySQLi | PHP >= 5.0.0, requiere libmysql.dll (libmysqli.dll en PHP <= 5.0.2) (incluido) |
| php_oci8.dll | Funciones Oracle 8 | Requiere: Librerias cliente Oracle 8.1+ |
| php_openssl.dll | Funciones OpenSSL | Requiere: libeay32.dll (incluido) |
| php_overload.dll | Funciones Object overloading | Construido a partir de PHP 4.3.0 |
| php_pdf.dll | Funciones PDF | Nada |
| php_pgsql.dll | Funciones PostgreSQL | Nada |
| php_printer.dll | Funciones Printer | Nada |
| php_shmop.dll | Funciones Shared Memory | Nada |
| php_snmp.dll | Funciones SNMP | Solo NT ! |
| php_soap.dll | Funciones SOAP | PHP >= 5.0.0 |
| php_sockets.dll | Funciones Socket | Nada |
| php_sybase_ct.dll | Funciones Sybase | Requiere: librerias cliente Sybase |
| php_tidy.dll | Funciones Tidy | PHP >= 5.0.0 |
| php_tokenizer.dll | Funciones Tokenizer | Construido a partir de PHP 4.3.0 |
| php_w32api.dll | Funciones W32api | Nada |
| php_xmlrpc.dll | Funciones XML-RPC | PHP >= 4.2.1 requiere: iconv.dll (incluido) |
| php_xslt.dll | Funciones XSLT | PHP <= 4.2.0 requiere sablot.dll, expat.dll (incluido). PHP >= 4.2.1 requiere sablot.dll, expat.dll, iconv.dll (incluido). |
| php_yaz.dll | Funciones YAZ | Requiere: yaz.dll (incluido) |
| php_zip.dll | Ficheros Zip incluido | Acceso de sólo lectura |
| php_zlib.dll | Funciones de compresión ZLib | Construido a partir de PHP 4.3.0 |
Esta sección contiene notas y sugerencias específicas para conseguir ejecutar PHP en la línea de comandos para Windows.
Nota:
Usted debe leer primero el manual de instalación
Cómo ejecutar PHP desde la línea de comandos sin hacer ningún cambio a Windows.
C:\PHP5\php.exe -f "C:\PHP Scripts\script.php" -- -arg1 -arg2 -arg3
Pero hay algunos pasos sencillos que puede seguir para hacer esto simple. Algunas de estas medidas ya se deberían haber tomado, pero se repiten aquí para ser capaz de proporcionar una completa secuencia paso a paso.
Añada la ubicación del ejecutable de PHP (php.exe, php-win.exe o php-cli.exe dependiendo de su versión de PHP y las preferencias de presentación) a la variable de entorno PATH. Lea más acerca de cómo añadir el directorio de PHP PATH en la entrada correspondiente de preguntas frecuentes.
Adicione la extensión .PHP de la variable de entorno PATHEXT. Esto se puede hacer al mismo tiempo, con la modificación de la variable de entorno PATH. Siga los mismos pasos como se describe en las Preguntas frecuentes pero habría que modificar la variable de entorno PATHEXTen lugar de la variable de entornoPATH.
Nota:
La posición en que se coloca el .PHP determina qué secuencia de comandos o programa se ejecuta cuando hay nombre de archivos coincidentes. Por ejemplo, colocar .PHP antes de .BAT hará que el script se ejecute, en lugar de el archivo por lotes, si hay un fichero por lotes con el mismo nombre.
Asociar la extensión .PHP con un tipo de fichero. Esta se hace ejecutando el siguiente comando:
assoc .php=phpfile
Asociar el tipo de fichero phpfile con el adecuado ejecutable PHP. Esto se hace ejecutando el siguiente comando:
ftype phpfile="C:\PHP5\php.exe" -f "%1" -- %~2
Si sigue estos pasos permitirá ejecutar scripts PHP desde cualquier directorio sin necesidad de escribir el ejecutable PHP o la extensión .PHP y todos los parámetros, será enviada a el script para el procesamiento.
En el ejemplo a continuación se detallan algunos de los cambios de registro que se puede hacer manualmente.
Ejemplo #1 Registro de cambios
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.php] @="phpfile" "Content Type"="application/php" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile] @="PHP Script" "EditFlags"=dword:00000000 "BrowserFlags"=dword:00000008 "AlwaysShowExt"="" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\DefaultIcon] @="C:\\PHP5\\php-win.exe,0" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell] @="Open" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open] @="&Open" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open\command] @="\"C:\\PHP5\\php.exe\" -f \"%1\" -- %~2"
Con estos cambios el mismo comando se puede escribir como:
"C:\PHP Scripts\script" -arg1 -arg2 -arg3
script -arg1 -arg2 -arg3
Nota:
Hay un pequeño problema si tiene intención de utilizar esta técnica y usar scripts PHP como filtro de línea de comandos, como el ejemplo a continuación:
odir | "C:\PHP Scripts\script" -arg1 -arg2 -arg3Es posible que el script simplemente se cuelga y no salga nada. Para hacer esto operacional, es necesario hacer otro cambio en el registro.dir | script -arg1 -arg2 -arg3Información adicional sobre este tema se pueden encontrar en el » artículo de Microsoft: 321788Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer] "InheritConsoleHandles"=dword:00000001
PHP instalará en la nube. A la nube de PHP!
FPM (FastCGI Process Manager) es una implementación alternativa al PHP FastCGI con algunas características adicionales (la mayoría) útiles para sitios web con mucho tráfico.
Estas características incluyen:
Manejo avanzado para detener/arrancar procesos de forma grácil;
Posibilidad de iniciar hilos de procesos con diferentes uid/gid/chroot/environment, escuchar en diferentes puertos y usar distintos php.ini (remplazando); safe_mode
Registro stdout y stderr;
Reinicio de emergencia en caso de destrucción accidental del caché opcode;
Soporte acelerado de subidas;
"slowlog" - scripts de registro de procesos (no sólo sus nombres, sin sus backtraces también, usando ptrace y similares para leer procesos execute_data remotos) que son inusualmente lentos;
fastcgi_finish_request() - Función especial para detener y descargar todos los datos mientras continua haciendo algún proceso más largo (conversión de vídeos, procesamiento de estadísticas, etc.);
Creación dinámico/estático de hilos;
Información básica del status SAPI (similar al mod_status de Apache);
Basado en archivos de configuración php.ini
Para habilitar FPM en la compilación de PHP, debe añadirse --enable-fpm a la línea de configuración-
Hay otras opciones de configuración específicas de FPM (todas ellas optativas):
--with-fpm-user - usuario de FPM (por omisión - nobody).
--with-fpm-group - grupo de FPM (por omisión - nobody).
FPM usa la sintaxis de php.ini para su archivo de configuración - php-fpm.conf.
pid
string
Ruta al archivo PID. Valor por defecto: none.
error_log
string
Ruta al archivo de registro de errores. Default value: #INSTALL_PREFIX#/log/php-fpm.log.
log_level
string
Nivel de registro de errores. Posibles valores: alert, error, warning, notice, debug. Valor por defecto: notice.
emergency_restart_threshold
int
Si este número de procesos termina con SIGSEGV o SIGBUS dentro del intervalo de tiempo establecido por emergency_restart_interval entonces FPM se reiniciará. Un valor de 0 corresponde a 'Off'. Valor por defecto: 0 (Off).
emergency_restart_interval
mixed
Intervalo de tiempo usado por emergency_restart_interval para determinar cuando un reinicio agraciado será realizado. Esto puede ser útil trabajar sobre corrupciones accidentales in en acelerador de memoria compartida. Unidades disponibles:: s(segundos), m(inutos), h(oras), o d(ías). Unidad por defecto: segundos. Valor por defecto: 0 (Off).
process_control_timeout
mixed
Límite de tiempo que un hilo de proceso espera por una señal maestra. Unidades disponibles: s(egundos), m(inutos), h(oras), o d(ías) Unidad por defecto: segundos. Valor por defecto: 0.
daemonize
boolean
Envía a FPM al background. Establezca a 'no' para mantener FPM en foreground para depuración. Valor por defecto: yes.
Con FPM usted puede correr varios grupos de procesos con diferentes ajustes. Estos son los parámetros que pueden ser ajustados por grupo.
listen
string
La dirección sobre la cual desea aceptar peticiones FastCGI. Las sintaxis válidas son: 'ip.add.re.ss:port', 'port', '/path/to/unix/socket'. Estas opciones son obligatorias por cada grupo.
listen.backlog
int
Establece listen(2) backlog. Un valor de '-1' significa ilimitado. Valor por defecto: -1.
listen.allowed_clients
string
Lista de direcciones ipv4 de clientes FastCGI que tienen permiso para conectarse. El equivalente a la variable de entorno FCGI_WEB_SERVER_ADDRS en el PHP FastCGI (5.2.2+) original. Tiene sentido solamente con un socket tcp escuchando. Cada dirección debe ser separada por coma. Si este valor es dejado en blanco, las conexiones serán aceptas desde cualquier dirección ip. Valor por defecto: any.
listen.owner
string
Establece permisos para sockets unix, si uno es usado. En Linux, los permisos de lectura/escritura deben ser puestos a fin de permitir conexiones desde un servidor web. Muchos sistemas derivados de BSD permiten conexiones sin considerar los permisos. Valor por defecto: usuario y grupo son establecidos según el usuario ejecutor, permisos puestos a 0666.
listen.group
string
Ver listen.owner.
listen.mode
string
Ver listen.owner.
user
string
Usuario Unix de procesos FPM. Esta opción es obligatoria.
group
string
Grupo Unix group of FPM processes. Si no es establecido, el grupo del usuario por defecto sera usado.
pm
string
Seleccione cómo el manejador de procesos controlará el número de hilos de procesos. Valores posibles: static, ondemand, dynamic. Esta opción es obligatoria.
static - el número de hilos de proceso es fijo (pm.max_children).
ondemand - el proceso se lanza en demanda (cuando se solicita, al contrario que dynamic, donde pm.start_servers son iniciados cuando el servicio está iniciado.
dynamic - el número de hilos de proceso será basado dinámicamente basado en las siguientes directivas: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.
pm.max_children
int
El número de hilos de procesos a ser creados cuando pm es puesto a static y el máximo número de hilos de proceso a ser creados cuando pm es puesto a dynamic. Esta opción es obligatoria.
Esta opción establece el límite sobre el número de peticiones simultaneas que serán servidas. Equivale a la directiva ApacheMaxClients con mpm_prefork y a la variable de entorno PHP_FCGI_CHILDREN del PHP FastCGI original.
pm.start_servers
in
Número de hilos de procesos creados al inicio. Usado solamente cuando pm es puesto a dynamic. Valor por defecto: min_spare_servers + (max_spare_servers - min_spare_servers) / 2.
pm.min_spare_servers
int
El número mínimo deseado de procesos libres en el servidor. Usado sólo cuando pm es puesto a dynamic. También obligatorio en este caso.
pm.max_spare_servers
int
El número máximo deseado de procesos libres en el servidor. usado sólo cuando pm es puesto a dynamic. También obligatorio en este caso.
pm.max_requests
int
El número de pedidos que cada hilo de proceso debe ejecutar antes de reaparecer. Esto puede ser útil para evitar las fugas de memoria en librerías de terceros. para el procesamiento de solicitudes sin límites especifique '0'. Equivale a PHP_FCGI_MAX_REQUESTS. Valor por defecto: 0.
pm.status_path
string
La dirección URI para ver la página de status FPM. Si este valor no es establecido, ninguna dirección URI será reconocida como una página de status. Valor por defecto: none.
ping.path
string
La dirección URI del ping para llamar a la página de monitor del FPM. Si este valor no es establecido, ninguna dirección URI será reconocida como página del ping. Esto debería ser usado para probar desde el exterior que el FPM está funcionando y respondiendo. Por favor, note que este valor debe empezar con un slash (/).
ping.response
string
Esta directiva puede ser usada para personalizar las peticiones de respuestas a ping. La respuesta es formateada como text/plain con un código de respuesta 200. Valor por defecto: pong.
request_terminate_timeout
mixed
El tiempo de espera para servir una simple petición luego que el proceso worker sea eliminado. Esta opción debe ser usada cuando la opción 'max_execution_time' no detenga la ejecuciuón del script por cualquier razón. Un valor de '0' corresponde a 'Off'. Unidades disponibles: s(egundos)(por defecto), m(inutos), h(horas), or d(ías). Default value: 0.
request_slowlog_timeout
mixed
El tiempo de espera para servir una simple petición después de que un backtrace PHP sea volcado al archivo 'slowlog'. Un valor de '0' corresponde a 'Off'. Unidades disponibles: s(egundos)(por defecto), m(inutos), h(oras), or d(ías). Valor por defecto: 0.
slowlog
string
El archivo de registro para peticiones lentas. Valor por defecto: #INSTALL_PREFIX#/log/php-fpm.log.slow.
rlimit_files
int
Establece el archivo descriptor rlimit. Valor por defecto: definido por el sistema.
rlimit_core
int
Establece el tamaño máximo del rlimit. Valores posibles: 'unlimited' o un entero mayor o igualo a 0. Valor por defecto: definido por el sistema.
chroot
string
Establece el Chroot (enjaulado) a este directorio al inicio. Este valor debe ser definido como una ruta absoluta. Cuando este valor no es establecido, el chroot no es usado.
chdir
string
Establece el Chdir a este directorio al inicio. Este valor debe ser establecido como una ruta absoluta. Valor por defecto: directorio actual o / cuando está en chroot (enjaulado).
catch_workers_output
boolean
Redirige los worker stdout y stderr en el archivo de registro principal. Sí no es establecido, stdout y stderr serán redirigidos a /dev/null de acuerdo a las especificaciones FastCGI. Valor por defecto: no.
Es posible pasar las variables de entorno adicionales y actualizar los ajustes PHP de ciertos grupos. Para ello, se necesita agregar las siguientes opciones a php-fpm.conf
Ejemplo #1 Pasando variables de entorno y ajustando las configuraciones de PHP por grupos
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 32M
Ajustes definidos con php_admin_value and php_admin_flag cannot be anulados con ini_set().
» PECL es un respositorio de extensiones de PHP disponible mediante el sistema de paquetes » PEAR. Esta sección del manual tiene por objetivo ilustrar cómo obtener e instalar extensiones PECL.
Estas instrucciones asumen que la ruta al fuente de su distribución de PHP es /your/phpsrcdir/, y que extname es el nombre de la extensión PECL. Ajuste a sus valores. Estas instruccines, además, asumen conocimientos del » comando pear. La información del manual de PEAR para el comando pear también es aplicable al comando pecl.
Para poder usarse, una extensión compartida se debe construir, instalar, y cargar. Los métodos descritos abajo le proporcionan varias instrucciones para construir e instalar extensiones, pero no se cargarán automáticamente. Éstas se pueden cargar añadiendo una directivaextension. O bien al fichero php.ini, o bien mediante el uso de la función dl().
Al construir un módulo PHP, es importante contar con las versiones correctas de las herramientas requeridas (autoconf, automake, libtool, etc.). Para conocer los detalles de las herramientas requeridas y sus versiones, revise las » Instrucciones del SVN Anónimo.
Existen varias opciones para descargar extensiones PECL, a saber:
Dispone de dos formas para cargar extensiones PHP en Windows: o bien compilándolas en PHP, o bien cargando su DLL. El método recomendado y más sencillo es cargar una extensión pre-compilada.
Para cargar una extensión, debe estar disponible como fichero ".dll" en su sistema. Todas las extensiones son compiladas por el Grupo PHP automática y periódicamente (revise la siguiente sección para realizar descargas).
Para compilar una extensión en PHP, por favor, acceda a la documentación de construcción de la fuente.
Para compilar una extensión independiente (o lo que es lo mismo, un fichero DLL), por favor, revise la documentación de construcción de la fuente. Si el fichero DLL no está disponible ni en su distribución de PHP ni en PECL, deberá compilarla antes de poder comenzar a usarla.
Las extensiones de PHP generalmente se llaman "php_*.dll" (donde el asterisco representa el nombre de la extensión) y se localizan bajo la carpeta "PHP\ext" ("PHP\extensions" en PHP 4).
PHP se distribuye con las extensiones más útiles para la mayoría de desarrolladores. Se les llama extensiones del "núcleo".
En cualquier caso, si necesita una funcionalidad que no proporciona ninguna de las extensiones del núcleo, podrá buscarla en PECL. La Biblioteca de la Comunidad de Extensiones de PHP (PECL) es un repositorio de extensiones PHP, que proporciona un directorio de todas las extensiones conocidas, y aloja utilidades para descargar y desarrollar extensiones de PHP.
Si usted ha desarrollado una extensión para su propio uso, quizá quiera considerar alojarla en PECL, de forma que otros desarrolladores con las mismas necesidades puedan verse beneficiados de su tiempo. Una de las ventajas es que tendrá la oportunidad de recibir colaboración, (ojalá) agradecimientos, informes de errores, e incluso parches/correcciones. Antes de enviar su extensión para ser alojada en PECL, por favor, lea http://pecl.php.net/package-new.php.
A menudo, encontrará varias versiones de cada DLL:
Debe tener en cuenta que los ajustes de su extensión deben coincidir con la configuración del ejecutable de PHP que está utilizando. El siguiente script de PHP le dirá todo sobre sus ajustes de PHP:
Ejemplo #1 llamada a phpinfo()
<?php
phpinfo();
?>
O ejecute desde la línea de comandos:
drive:\\path\to\php\executable\php.exe -i
La forma más común de cargar una extensión PHP consiste en incluirla en el fichero de configuración php.ini. Por favor, tenga en cuenta que ya hay muchas extensiones presentes en el fichero php.ini y que sólo es necesario eliminar el punto y coma para activarlas.
;extension=php_extname.dll
extension=php_extname.dll
Sin embargo, algunos servidores web puede resultar confusos, dado que no utilizan el php.ini ubicado junto al ejecutable de PHP. Para averiguar dónde se localiza el php.ini en uso, consulte su ruta usando phpinfo():
Configuration File (php.ini) Path C:\WINDOWS
Loaded Configuration File C:\Program Files\PHP\5.2\php.ini
Tras activar una extensión, guarde el fichero php.ini, reinicie el servidor web y vuelva a comprobar phpinfo(). La nueva extensión debe ahora tener su propia sección.
Si la extensión no aparece en phpinfo(), compruebe los registro de errores para conocer qué provoca el problema.
Si está utilizando PHP desde la línea de comandos (CLI), podrá leer directamente en pantalla el error en la carga de la extensión.
Si está usando PHP en un servidor web, la localización y formato de los registros vería en función de su software. Por favor, lea la documentación de su servidor web para localizar los registros, dado que esto no lo gestiona el propio ejecutable de PHP.
Los problemas más comunes son la ubicación del fichero DLL, el valor de " extension_dir" en php.ini, y desajustes de configuración en tiempo de compilación.
Si el problema reside en desajustes de configuración en tiempo de compilación, seguramente se deba a que no se ha descargado el fichero DLL correcto. Pruebe a descargar de nuevo la extensión con los ajustes correctos. De nuevo, phpinfo() puede resultar de gran ayuda.
PECL facilita la creación de extensiones PHP compartidas. Usando el » comando pecl, haga lo siguiente:
Esto descargará el código fuente de extname, lo compilará, e instalará extname.so en su extension_dir. Ahora se puede cargar extname.so mediante php.ini
Por omisión, el comando pecl no instalará paquetes marcados en los estados alpha o beta. Si no hay paquetes disponibles en estado stable, podrá instalar un paquete en estado beta utilizando el siguiente comando:
Del mismo modo, podrá también instalar una versión en concreto usando esta variante:
Nota:
Tras activar la extensión en php.ini, será necesario reiniciar el servidor web para hacer efectivos los cambios.
A menudo no es posible utilizar el instalador pecl. Esto se puede deber a que se encuentra tras un cortafuegos, o a que la extensión que trata de instalar no está disponible como paquete compatible con PECL, como por ejemplo extensiones no liberadas desde el SVN. Si necesita construir una extensión de este tipo, puede llevar a cabo esta tarea manualmente utilizando las herramientas de construcción de bajo nivel.
El comando phpize se utiliza para preparar el entorno de compilación de la extensión de PHP. En el siguiente ejemplo, el fuente de una extensión se ubica en un directorio llamado extname:
$ cd extname $ phpize $ ./configure $ make # make install
En caso de que la instalación sea correcta, se creará extname.so y se salvará en el directorio de extensiones de PHP. Quizá necesite ajustar el fichero php.ini y añadir una línea extension=extname.so antes de poder usar la extensión.
Si el sistema no contiene el comando phpize, y se están utilizando paquetes pre-compilados (como RPM), asegúrese de instalar también la versión de desarrollo apropiada del paquete PHP, dado que a menudo incluyen el comando phpize con los ficheros de cabeceras necesarios para construir PHP y sus extensiones.
Ejecute phpize --help para mostrar información de uso adicional.
php-config es una utilidad de consola que permite obtener información sobre la configuración de la instalación de PHP.
A la hora de compilar extensiones, si se tuvieran varias versiones de PHP instaladas, se podrá especificar sobre cuál se va a construir usando el modificador --with-php-config durante la configuración, donde especificaremos la ruta a su respecto script php-config.
En cualquier momento podrá consutlarse la lista de opciones de la utilidad php-config ejecutando php-config con el modificador -h :
Usage: /usr/local/bin/php-config [OPTION] Options: --prefix [...] --includes [...] --ldflags [...] --libs [...] --extension-dir [...] --include-dir [...] --php-binary [...] --php-sapis [...] --configure-options [...] --version [...] --vernum [...]
| Opción | Descripción |
|---|---|
| --prefix | Prefijo del directorio donde PHP está instalado, p.ej. /usr/local |
| --includes | Lista de opciones -I con todos los ficheros incluídos |
| --ldflags | Banderas LD con las que se ha compilado PHP |
| --libs | Bibliotecas extras con las que se ha compilado PHP |
| --extension-dir | Directorio en el que se buscan por omisión las extensiones |
| --include-dir | Prefijo de directorio donde se buscan por omisión los ficheros de cabeceras |
| --php-binary | Ruta completa al binario de php CLI o CGI |
| --php-sapis | Muestra todos los módulos SAPI disponibles |
| --configure-options | Opciones de configuración para recrear la configuración de la instalación actual de PHP |
| --version | Versión de PHP |
| --vernum | Versión de PHP en forma de entero |
Quizá necesite construir una extensión PECL estáticamente en su binario de PHP. Para hacer esto, necesitará ubicar el fuente de la extensión bajo el directorio php-src/ext/ e indicarle al sistema de construcción de PHP que regenere su script de configuración.
$ cd /your/phpsrcdir/ext $ pecl download extname $ gzip -d < extname.tgz | tar -xvf - $ mv extname-x.x.x extname
Esto generará el siguiente directorio:
Desde aquí, fuerce a PHP a regenerar el script de configuración, y entonces construya PHP con normalidad:
Nota: Necesitará autoconf 2.13 y automake 1.4+ para ejecutar el script 'buildconf' (es posible que funcionen versiones más recientes de autoconf, pero no están oficialmente soportadas).
Dependiendo de la extensión, utilizará --enable-extname o --with-extname. Las extensiones que no requieren de bibliotecas externas generalmente utilizan --enable. Para asegurarse, ejecute el siguiente comando después de buildconf:
Algunos problemas son más comunes que otros. Los más comunes están listados en la parte del manual PHP FAQ.
Si sigue bloqueado, seguramente alguien de la lista de correo de la instalación de PHP podrá ayudarle. Se debe consultar el archivo primero, para comprobar si alguien ya haya contestado a otra persona que haya tenido el mismo problema. Los archivos están disponibles desde la página de soporte en » http://www.php.net/support.php. Para subscribirse a la lista de correo de la instalación de PHP (en Inglés), envíe un E-Mail vacío a » php-install-subscribe@lists.php.net. La lista de correo es » php-install@lists.php.net.
Si quiere obtener ayuda de la lista de correo, por favor trate de ser preciso y dar toda la información necesaria a cerca de su entorno (qué sistema operativo, que versión de PHP, que tipo de servidor web, si está usando PHP como GCI o como módulo, safe mode, etc.), y preferiblemente suficiente código para que otras personas sean capaces de reproducir y comprobar su problema.
Si cree que ha encontrado un bug en PHP, por favor informe. Los desarrolladores de PHP probablemente no están informados a cerca del problema y a no ser que lo mencione, es muy provable que no sea solucionado. Puede informar sobre bugs usando el sistema de bug-tracking en » http://bugs.php.net/. Por favor no envie informes de bugs a listas de correos o cartas personales. El sistema de bugs también está capacitado para enviar sugerencias y peticiones.
Lea el documento » Como informar sobre bugs antes de enviar cualquier informe de bugs!
Cuando PHP inicia, lee el fichero de configuración (php.ini). En las versiones en que PHP funciona como módulo de servidor, esto sucede únicamente cuando se arranca el servidor. Para las versiones CGI y CLI, esto ocurre en cada ejecución.
Se trata de encontrar al fichero php.ini en las siguientes localizaciones (en orden):
Si existiera el fichero php-SAPI.ini (donde SAPI es la SAPI en uso, de manera que, por ejemplo, php-cli.ini o php-apache.ini), se usaría éste en lugar de php.ini. Se puede determinar el nombre de la SAPI usando php_sapi_name().
Nota:
El servidor web Apache cambia el directorio al raíz al arrancar, haciendo que PHP intente leer php.ini desde la raíz del sistema de ficheros si éste existe.
Las directivas de php.ini manejadas por extensiones están documentadas en la propia página de cada extensión. Hay una lista de directivas del núcleo disponible en el apéndice. Es posible que no todas las directivas de PHP estén documentadas en el manual. Para consultar una lista completa de las directivas disponibles en tu versión de PHP, por favor, revise la versión de su fichero php.ini que incluye todos los comentarios. Adicionalmente, puede encontrar útil » el último php.ini del SVN.
Ejemplo #1 Ejemplo de php.ini
; todo texto en una línea tras un punto y coma sin comillas (;) será ignorado [php] ; los marcadores de sección (textos entre corchetes) también se ignoran ; Los valores de tipo Boolean puede establecerse a: ; true, on, yes ; o false, off, no, none register_globals = off track_errors = yes ; puedes encerrar tus strings en comillas dobles include_path = ".:/usr/local/lib/php" ; las barras reciben el mismo tratamiento que el resto de caracteres include_path = ".;c:\php\lib"
A partir de PHP 5.1.0, es posible hacer referencia a variables .ini ya existentes desde el propio fichero .ini. Ejemplo: open_basedir = ${open_basedir} ":/new/dir".
A partir de PHP 5.3.0, PHP incluye soporte para ficheros INI tipo .htaccess a nivel de directorios. Estos ficheros solo los procesa la SAPI CGI/FastCGI. Esta funcionalidad deja obsoleta la extensión PECL htscanner. Si está usando Apache, use los ficheros .htaccess para lograr el mismo efecto.
Además del fichero php.ini principal, PHP escanea en busqueda de ficheros INI en cada directorio, empezando por el directorio del fichero PHP solicitado, y continuando hasta el documento raíz actual (tal y como está establecido en $_SERVER['DOCUMENT_ROOT']). En el caso de que el fichero PHP se encuentre fuera del documento raíz, sólo se escaneará su directorio.
En los ficheros INI .user.ini sólo se reconocerán
las cofiguraciones INI que tengan los modos
PHP_INI_PERDIR y
PHP_INI_USER.
Las dos nuevas directivas INI, user_ini.filename y user_ini.cache_ttl controlan el uso de los ficheros INI de usuarios.
user_ini.filename fija el nombre del fichero que PHP buscará en cada directorio; si se fija un string vacío, PHP directamente no realizará ninguna búsqueda. El nombre por omisión es .user.ini.
user_ini.cache_ttl controla con qué frecuencia se reescanean los ficheros INI de usuario. El valor por omisión es 300 segundos (5 minutos).
Estos modos determinan cuándo y dónde se debe o no asignar una directiva PHP, y cada directiva del manual hace referencia a uno de estos modos. Por ejemplo, algunos ajustes pueden establecerse en scripts PHP usando ini_set(), mientras que otros requieren hacerlo en php.ini o en httpd.conf.
Por ejemplo, el ajuste de output_buffering es PHP_INI_PERDIR por tanto no puede establecerse usando ini_set(). Sin embargo, la directiva display_errors es PHP_INI_ALL por tanto se puede establecer en cualquier lugar, incluso con ini_set().
| Modo | Significado |
|---|---|
| PHP_INI_USER | La entrada se puede fijar en scripts de usuario (como con ini_set()) o en el registro de Windows |
| PHP_INI_PERDIR | La entrada se puede fijar en php.ini, .htaccess o en httpd.conf |
| PHP_INI_SYSTEM | La entrada se puede fijar en php.ini o en httpd.conf |
| PHP_INI_ALL | La entrada se puede fijar en cualquier lugar |
Cuando se usa PHP como un módulo de Apache, puede cambiar los ajustes de configuración usando directivas en los ficheros de configuración de Apache (p. ej. httpd.conf) y en los ficheros .htaccess. Necesitará los privilegios "AllowOverride Options" o "AllowOverride All" para poder hacerlo.
Existen varias directivas de Apache que permiten
cambiar la configuración de PHP desde los propios ficheros de configuración
de Apache. Para consultar un listado de qué directivas son
PHP_INI_ALL, PHP_INI_PERDIR,
o PHP_INI_SYSTEM, consulte el apéndice de la
Lista de directivas de php.ini.
php_value
nombre
valor
Fija el valor de la directiva especificada.
Sólo puede usarse con las directivas de tipo PHP_INI_ALL y PHP_INI_PERDIR.
Para dejar en blanco un valor previamente establecido, use none como valor.
Nota: No use
php_valuepara fijar valores boolean. Debe usarse en su lugarphp_flag(ver más abajo).
php_flag
name
on|off
Usado para fijar una directiva de configuración de tipo boolean.
Sólo puede usarse con las directivas de tipo
PHP_INI_ALL y PHP_INI_PERDIR.
php_admin_value
name
value
Fija el valor de la directiva especificada.
Esto no se puede usar en ficheros .htaccess.
Ninguna directiva fijada con php_admin_value
podrá ser sobrescrita por .htaccess o por ini_set().
Para borrar un valor fijado previamente use none como valor.
php_admin_flag
name
on|off
Usado para fijar una directiva de configuración de tipo boolean.
Esto no se puede usar en ficheros .htaccess.
Ninguna directiva fijada con php_admin_flag
podrá ser sobcrescrita por .htaccess o por ini_set().
Ejemplo #1 Ejemplo de configuración de Apache
<IfModule mod_php5.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag engine on </IfModule> <IfModule mod_php4.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag engine on </IfModule>
Las constantes de PHP no existen fuera de PHP. Por ejemplo, en
httpd.conf no puede usar constantes de PHP
tales como E_ALL o E_NOTICE
para fijar la directiva error_reporting
puesto que no tendrán ningún significado y se evaluarán a
0. Use en su lugar la máscara de bits asociada.
Estas constantes sí pueden ser usadas en php.ini
Cuando se ejecuta PHP en Windows, se pueden modificar los valores
de configuración a nivel de directorio usando el registro de Windows.
Los valores de configuración se almacenan en la clave de registro
HKLM\SOFTWARE\PHP\Per Directory Values,
en las sub-claves correspondientes al path. Por ejemplo, los valores
de configuración para el directorio c:\inetpub\wwwroot
se almacenarían en la clave HKLM\SOFTWARE\PHP\Per Directory
Values\c\inetpub\wwwroot. Los ajustes para el directorio
estarían activos para cualquier script dentro de este directorio o
en cualquier de sus subdirectorios. Los valores bajo esta clave
deben tener el nombre de la directiva de configuración de PHP
y su valor. Las constantes de PHP usadas como valor
no serán procesadas. En cualquier aso, únicamente los valores de configuración
modificables presentes en PHP_INI_USER podrán
fijarse con este método, mientras que los valores en PHP_INI_PERDIR no.
Independientemente de cómo ejecute PHP, puede cambiar determinados valores de sus scripts en tiempo de ejecución mediante ini_set(). Consulte la documentación en la página ini_set() para más información.
Si está interesado en una lista completa de los ajustes de configuración en su sistema con sus parámetros actuales, puede ejecutar la función phpinfo(), y consultar la página mostrada. Puede también acceder a los valores de directivas de configuración concretas usando ini_get() o get_cfg_var().
Cualquier cosa fuera del par de etiquetas de apertura y cierre es ignorado por el analizador de PHP, el cual permite los ficheros de PHP tengan contenido mixto. Esto permite que PHP sea embebido en documentos HTML, por ejemplo para crear plantillas.
<p>Esto va a ser ignorado por PHP y mostrado por el navegador.</p>
<?php echo 'Mientras que esto va a ser analizado.'; ?>
<p>Esto también será ignorado por PHP y mostrado por el navegador.</p>
Usar estructuras con condiciones
Ejemplo #1 Advanced escaping using conditions
<?php if ($expresión == true): ?>
Esto se mostrará si la expresión es verdadera.
<?php else: ?>
En caso contrario se mostrará esto.
<?php endif; ?>
Para salir de bloques de texto grandes, es más eficiente abandonar el modo analítico de PHP que enviar todo el texto a través de echo o print.
Existen cuatro tipos de pares de etiquetas de apertura y de fin de bloque que se pueden usar en PHP. Dos de estas, <?php ?> y <script language="php"> </script>, siempre están disponibles. Las otras dos son etiquetas cortas y etiquetas estilo ASP y se pueden activar o desactivar desde el fichero de configuración php.ini Aunque para algunas personas las etiquetas cortas y etiquetas estilo ASP las encuentran más convenientes, son menos portables y generalmente no recomendadas.
Nota:
Observe también que si se está incrustando PHP con XML o XHTML necesitará usar las etiquetas <?php ?> para seguir los estándares.
Ejemplo #2 Etiquetas de apertura y de fin de bloque de PHP
1. <?php echo 'si se quiere mostrar documentos XHTML o XML, debe hacerse así'; ?>
2. <script language="php">
echo 'algunos editores (como FrontPage) no les gusta
las instruciones de proceso';
</script>
3. <? echo 'esta es la forma más simple, una instrución de procesado SGML'; ?>
<?= expression ?> Esto es una forma corta para "<? echo expression ?>"
4. <% echo 'Quizá use de forma opcional etiquetas de estilo ASP'; %>
<%= $variable; # Esto es una forma corta para "<% echo . . ." %>
Las etiquetas vistas en los ejemplos uno y dos están siempre disponibles, el ejemplo uno es el más común y recomendado de los dos.
Las etiquetas cortas (ejemplo tres) están solo disponibles cuando se activan mediante la directiva short_open_tag en el fichero de configuración php.ini o si PHP se configuró con la opción --enable-short-tags .
Las etiquetas de estilo ASP (ejemplo cuatro) están solo disponibles cuando se activan mediante la directiva asp_tags en el fichero de configuración php.ini.
Nota:
El uso de etiquetas cortas debe ser evitado cuando se desarrollan aplicaciones o librerias que están pensadas para su redistribución, o extender en servidores PHP que no están bajo su control, porque quizá las etiquetas cortas no están soportadas en un servidor determinado. Por portabilidad, redistribución de código, asegúrese no usar etiquetas cortas.
Nota:
En PHP 5.2 y anteriores, no se permite que un fichero contenga únicamente la etiqueta de inicio de bloque <?php. En PHP 5.3 si se permite siempre que existan uno o más caracteres espacions en blanco después de la etiqueta de apertura.
Nota:
Desde PHP 5.4, la etiqueta abreviada de echo <?= siempre es reconocida y válida, sin tener en cuenta la configuración de short_open_tag.
Como en C o Perl, PHP requiere que las instrucciones terminen en punto y coma al final de cada declaración. La etiqueta de fin de bloque de PHP automáticamente implica un punto y coma. No se tiene que usar punto y coma para cerrar la última línea de código de PHP. La etiqueta de fin de bloque incluirá de inmediato salto de línea si no está presente.
<?php
echo 'Esto es una prueba';
?>
<?php echo 'Esto es una prueba' ?>
<?php echo 'Hemos omitido la última etiqueta de cerrado';
Nota:
Note: La etiqueta de fin de bloque es opcional al final del archivo y es útil omitirlo cuando se utilizan sentencias include o require, para que no se produzcan espacios en blanco al final de los archivos cuando se quieren mandar cabeceras de http. También sirve cuando se captura la salida con output buffering y no se desean espacios innecesarios al final de partes generadas por archivos incluídos.
PHP Soporta comentarios 'C', 'C++' y Unix estilo de consola (estilo Perl). Por ejemplo:
<?php
echo 'Esto es una prueba'; // Esto es un comentario estilo c++ de una sola línea
/* Esto es un comentario multi-línea
si! otra lína de comentarios */
echo 'Esto es otro test';
echo 'Un test final'; # Esto es un comentario estilo consola de una sola línea
?>
Los comentarios de estilo "una sola línea" solo comentan hasta el final de la línea o del bloque actual de código PHP, lo primero que suceda. Esto implica que el código HTML después de // ... ?> o # ... ?> Imprimirá ?> para salir del modo PHP y volver a HTML, y // o # no influyen. Si la directiva de configuración asp_tags está activada, actúa igual que // %> y # %>. Sin embargo, la etiqueta </script> no rompe el modo PHP en un comentario de una sola línea.
<h1>Esto es un <?php # echo 'simple';?> ejemplo</h1>
<p>El encabezado anterior dirá 'Esto es un ejemplo'.</p>
Los comentarios del estilo 'C' finalizan al primer */ que se encuentre. Asegúrese que no utiliza muchos comentarios del estilo 'C'. Es muy fácil cometer errores cuando trata de comentar un gran bloque de código.
<?php
/*
echo 'Esto es una prueba'; /* Este comentario puede causar un problema*/
*/
?>
PHP soporta ocho tipos primitivos.
Cuatro tipos escalares:
Dos tipos compuestos:
Y finalmente tres tipos especiales:
Este manual introduce también algunos pseudo-tipos por razones de legibilidad:
Y la pseudo-variable $... .
Puede que algunas referencias al tipo "double" aun existan en el manual. Considere al tipo double como el mismo que float; los dos nombres existen sólo por razones históricas.
El tipo de una variable usualmente no es declarado por el programador; en cambio, es decidido en tiempo de ejecución por PHP dependiendo del contexto en el que es usado la variable.
Nota: Para comprobar el tipo y el valor de una expresión, utilice la función var_dump().
Para obtener una representación legible para humanos del tipo para propósitos de depuración, use la función gettype(). Para comprobar un cierto tipo, no use gettype(), si no las funciones is_tipo. Algunos ejemplos:
<?php
$un_bool = TRUE; // un valor booleano
$un_str = "foo"; // una cadena
$un_str2 = 'foo'; // una cadena
$un_int = 12; // un entero
echo gettype($un_bool); // imprime: boolean
echo gettype($un_str); // imprime: string
// Si este valor es un entero, incrementarlo en cuatro
if (is_int($un_int)) {
$un_int += 4;
}
// Si $a_bool es una cadena, imprimirla
// (no imprime nada)
if (is_string($un_bool)) {
echo "Cadena: $un_bool";
}
?>
Para forzar la conversión de una variable a cierto tipo, puede moldear la variable o usar la función settype() sobre ella.
Note que una variable puede ser evaluada con valores diferentes en ciertas situaciones, dependiendo del tipo que posee en cada momento. Para más información, vea la sección sobre Manipulación de Tipos. Las tablas de comparación de tipos pueden resultar útiles también, ya que muestran ejemplos de varias comparaciones relacionadas con tipos.
Este es el tipo más simple. Un boolean expresa un valor de
verdad. Puede ser TRUE or FALSE.
Para especificar un literal boolean, use alguna de las
palabras clave TRUE o FALSE. Ambas son insensibles a mayúsculas y
minúsculas.
<?php
$foo = True; // asigna el valor TRUE a $foo
?>
Usualmente, el resultado de un operador que devuelve un valor boolean es pasado a una estructura de control.
<?php
// == es un operador que prueba por
// igualdad y devuelve un booleano
if ($accion == "mostrar_version") {
echo "La versión es 1.23";
}
// esto no es necesario...
if ($mostrar_separadores == TRUE) {
echo "<hr>\n";
}
// ...porque se puede escribir simplemente:
if ($mostrar_separadores) {
echo "<hr>\n";
}
?>
Para convertir explícitamente un valor a boolean, use el moldeamiento (bool) o (boolean). Sin embargo, en la mayoría de casos no es necesario usar el moldeamiento, ya que un valor será convertido automáticamente si un operador, función o estructura de control requiere un argumento tipo boolean.
Vea también Manipulación de Tipos.
Cuando se realizan conversiones a boolean, los siguientes
valores son considerados FALSE:
FALSE
mismo
Cualquier otro valor es considerado TRUE (incluyendo cualquier resource).
-1 es considerado TRUE, como cualquier otro número
diferente a cero (¡ya sea negativo o positivo!)
<?php
var_dump((bool) ""); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)
?>
Un entero o integer es un número del conjunto ℤ = {..., -2, -1, 0, 1, 2, ...}.
Consulte tambien:
Los integer pueden ser especificados mediante notación decimal (base 10), hexadecimal (base 16), octal (base 8) o binaria (base 2), opcionalmente precedidos por un signo (- o +).
Los literales integer binarios están disponibles desde PHP 5.4.0.
Para usar la notación octal, se antepone al número un 0 (cero). Para usar la notación hexadecimal, se antepone al número un 0x. Para usar la notación binaria, se antepone al número un 0b.
Ejemplo #1 Enteros literales
<?php
$a = 1234; // número decimal
$a = -123; // un número negativo
$a = 0123; // número octal (equivalente a 83 decimal)
$a = 0x1A; // número hexadecimal (equivalente a 26 decimal)
?>
Formalmente, la estructura de integer literales es:
decimal : [1-9][0-9]*
| 0
hexadecimal : 0[xX][0-9a-fA-F]+
octal : 0[0-7]+
binario : 0b[01]+
entero : [+-]?decimal
| [+-]?hexadecimal
| [+-]?octal
| [+-]?binary
El tamaño de un integer depende de la plataforma, aunque un valor máximo
de aproximadamente dos billones es un valor usual (para 32 bits con signo).
Las plataformas de 64-bits normalmente tienen un valor máximo de aproximadamente 9E18. PHP
no admite integers sin signo. El tamaño de los integer
puede ser determinado mediante la constante PHP_INT_SIZE y el valor
máximo mediante la constante PHP_INT_MAX desde
PHP 4.4.0 y PHP 5.0.5.
Si en un integer octal se da un dígito incorrecto (por ejemplo 8 o 9), el resto del número se ignora.
Ejemplo #2 Octal raros
<?php
var_dump(01090); // 010 octal = 8 decimal
?>
Si PHP encuentra un número fuera de los límites de un integer, se interpretará como un float en su lugar. Tambien, una operación cuyo resultado es un número fuera de los límites de un integer devolverá en su lugar un float.
Ejemplo #3 Desbordamiento de enteros en sistemas 32-bits
<?php
$large_number = 2147483647;
var_dump($large_number); // int(2147483647)
$large_number = 2147483648;
var_dump($large_number); // float(2147483648)
$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number); // float(50000000000)
?>
Ejemplo #4 Desbordamiento de enteros en sistemas 64-bits
<?php
$large_number = 9223372036854775807;
var_dump($large_number); // int(9223372036854775807)
$large_number = 9223372036854775808;
var_dump($large_number); // float(9.2233720368548E+18)
$million = 1000000;
$large_number = 50000000000000 * $million;
var_dump($large_number); // float(5.0E+19)
?>
No existe operador de división de integer en PHP. 1/2produce el float 0.5. El valor puede ser forzado a ser un integer redondeando por defecto, o mediante la función round() que permite un mayor control sobre el redondeo.
<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>
Para convertir explicitamente un valor a integer, se puede emplear tanto (int) como (integer). Sin embargo, la mayoría de las veces la conversión no es necesaria, ya que un valor es convertido de forma automática cuando un operador, función o estructura de control necesite un argumento del tipo integer. Un valor tambien puede ser convertido a integer mediante la función intval().
Consulte también: manipulación de tipos.
FALSE produce 0 (cero), y TRUE produce
1 (uno).
Cuando se convierte de un float a un integer, el número será redondeado hacia cero.
Si el float esta por debajo de los límites de un integer (normalmente +/- 2.15e+9 = 2^31 en plataformas de 32 bits y +/- 9.22e+18 = 2^63 en plataformas de 64 bits), el resultado es indefinido, debido a que float no tiene la precisión suficiente para ofrecer el resultado como un integer exacto. No se mostrará ninguna advertencia, ni siquiera un aviso cuando esto ocurre!
Nunca se debe convertir una fracción desconocida a un integer, ya que a veces puede producir resultados inesperados.
<?php
echo (int) ( (0.1+0.7) * 10 ); // muestra 7!
?>
Consulte tambien aviso sobre la precisión de float
Consulte Conversión de cadenas a números
El comportamiento de la conversion de integer a otros tipos es indefinido. No espere que exista un comportamiento esperado, ya que puede cambiar sin previo aviso.
Los números de punto flotante (también conocidos como "flotantes", "dobles" o "números reales") pueden ser especificados usando cualquiera de las siguientes sintaxis:
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>
Formalmente:
LNUM [0-9]+
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})
El tamaño de un flotante depende de la plataforma, aunque un valor común consiste en un máximo de ~1.8e308 con una precisión de aproximadamente 14 dígitos decimales (lo que es un valor de 64 bits en formato IEEE).
Los números de punto flotante tienen una precisión limitada. Aunque depende del sistema, PHP típicamente utiliza el formato de doble precisión IEEE 754, el cual dará un error relativo máximo por aproximación del orden de 1.11e-16. Las operaciones aritméticas elementales no podrán dar grandes errores y por supuesto, los errores por propagación deben ser considerados cuando varias operaciones son compuestas.
Adicionalmente, los numeros racionales que son representables exactamente como números de punto flotante en base 10, como 0.1 o 0.7, no tienen una representación exacta como números de punto flotante en base 2, el cual es usado internamente, sin importar el tamaño de la mantisa. Por lo tanto, no se puede convertir en sus contrapartes binarias internas sin una pequeña pérdida de precisión. Esto puede llevar a confundir resultados: Por ejemplo, floor((0.1+0.7)*10) usualmente retornará 7 en lugar del 8 esperado, ya que la representación interna será algo así como 7.9999999999999991118....
Así que nunca se confía en resultados de números flotantes hasta el último dígito y no se comparan números de punto flotante directamente para igualdad. Si es necesaria una mejor precisión, están disponibles las funciones matemáticas de precisión arbitraria y las funciones gmp.
Para más información sobre las conversiones de string a float, vea Conversión de cadenas a números. Para valores de otros tipos, la conversión es la misma que si el valor hubiese sido convertido a integer y luego a float. Vea Conversión a entero para más información. A partir de PHP 5, una noticia es generada si intenta convertir un objeto a float.
Como se indica en la advertencia anterior, comprobar la igualdad de valores de punto flotante es problemático, debido a la forma en que se representan internamente. Sin embargo, hay maneras de hacer comparaciones de los valores de punto flotante que trabajan rodeando a estas limitaciones.
Para comprobar la igualdad de valores de punto flotante, se utiliza un límite superior en el error relativo debido al redondeo. Este valor se conoce como el epsilon de la máquina o unidad de redondeo y es la menor diferencia aceptable en los cálculos.
$a y $b son iguales a 5 dígitos de precisión.
<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
echo "true";
}
?>
Algunas operaciones numéricas pueden resultar en un valor representado por la constante
NAN. Este resultado representa un valor no definido o
no representable mediante cálculos de coma flotante. Cualquier comparación, ya sea poco
rígida o estricta, de esta valor con cualquier otro valor, incluido él mismo
tenfrá un resultado de FALSE.
Ya que NAN representa cualquier número de diferentes valores,
NAN no debería compararse con otros valores, incluido
él mismo; en su lugar debería comprobarse usando la función is_nan().
Un string es una serie de caracteres donde un caracter es lo mismo que un byte. Esto significa que PHP solo soporta el conjunto de 256 caracteres y por lo tanto no tiene soporte nativo Unicode. Ver detalles del tipo de dato string.
Nota: string puede llegar a alcanzar 2GB de tamaño.
Un string literal puede ser especificado de cuatro formas diferentes:
La manera más sencilla de especificar un string es encerrarlo entre comillas simples (el caracter ').
Para especificar una comilla simple literal, se escapa con una barra invertida (\). Para especificar una barra invertida literal, se duplica (\\). Todas las otras instancias de barras invertidas serán tratadas como una barra invertida literal: esto significa que otras secuencias de escape que se puedan utilizar, tales como \r or \n, serán mostradas literalmente como se especifican en lugar de tener cualquier significado especial
Nota: A diferencia de las sintaxis de comillas dobles y heredoc, las variables y las sentencias de escape para caracteres especiales no se expandirán cuando estén incluidas dentro de un string con comillas simples.
<?php
echo 'Esto es una cadena sencilla';
echo 'Tambien puede incluir nuevas líneas en
cadenas de esta forma ya que es
correcto hacerlo así';
// Resultado: Arnold una vez dijo: "I'll be back"
echo 'Arnold una vez dijo: "I\'ll be back"';
// Resultado: Ha borrado C:\*.*?
echo 'Ha borrado C:\\*.*?';
// Resultado: Ha borrado C:\*.*?
echo 'Ha borrado C:\*.*?';
// Resultado: Esto no se expandirá: \n una nueva línea
echo 'Esto no se expandirá: \n una nueva línea';
// Resultado: Las variables $tampoco se $expandiran
echo 'Las variables $tampoco se $expandiran';
?>
Si un string está encerrado entre comillas dobles ("), PHP interpretará más sentencias de escape como caracteres especiales:
| Sentencia | Significado |
|---|---|
| \n | avance de línea (LF o 0x0A (10) en ASCII) |
| \r | retorno de carro (CR o 0x0D (13) en ASCII) |
| \t | tabulador horizontal (HT o 0x09 (9) en ASCII) |
| \v | tabulador vertical (VT o 0x0B (11) en ASCII) (desde PHP 5.2.5) |
| \e | escape (ESC o 0x1B (27) en ASCII) (desde PHP 5.4.0) |
| \f | avance de página (FF o 0x0C (12) en ASCII) (desde PHP 5.2.5) |
| \\ | barra invertida |
| \$ | signo del dólar |
| \" | comillas dobles |
| \[0-7]{1,3} | la secuencia de caracteres que coincida con la expresión regular es un caracter en notación octal |
| \x[0-9A-Fa-f]{1,2} | la secuencia de caracteres que coincida con la expresión regular es un caracter en notación hexadecimal |
Al igual que en la delimitación de un string mediante comillas simples, escapar cualquier otro caracter puede dar lugar a que se muestre tambien la barra invertida. Antes de PHP 5.1.1, la barra invertida en \{$var} no se mostraba.
La característica más importante de entrecomillar un string mediante comillas dobles es el hecho que los nombres de las variables son expandidas. Consulte string parsing para más detalles.
Una tercera forma de delimitar un string es mediante la sintaxis heredoc: <<<. Después de este operador, se deberá ofrecer un identificador y después una nueva línea. A continuación va el propio string, y para cerrar la notación se pone el mismo identificador.
El identificador de cierre debe empezar en la primera columna de la nueva línea. Asimismo, el identificador debe seguir las mismas reglas de nomenclatura de las etiquetas en PHP: debe contener solo caracteres alfanuméricos y guiones bajos, y debe empezar con un caracter alfabético o un guión bajo.
Es muy importante señalar que la línea con el identificador de cierre no debe contener ningún caracter, excepto posiblemente un punto y coma (;). Esto significa en particular que el identificador no debe usar sangría, y que no deben existir ningún espacio ni tabulación antes o después del punto y coma. Es muy importante darse cuenta que el primer caracter antes del identificador de cierre debe ser un salto de línea definida por el sistema operativo local. En los sistemas UNIX sería \n, al igual que en Mac OS X. El delimitador de cierre (posiblemente seguido de un punto y coma) también debe ser seguido de un salto de línea.
Si se rompe esta regla y el identificador de cierre no está "limpio", no será considerado como un identificador de cierre, y PHP continuará buscando uno. Si no se encuentra ningún identificador de cierre antes del final del fichero, se producirá un error de análisis en la última línea.
Tampoco se puede emplear Heredocs para inicializar las propiedades de una clase. Desde PHP 5.3, esta limitación solo concierne a los heredocs que contengan variables.
Ejemplo #1 Ejemplo no válido
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
El texto heredoc se comporta como un string entre comillas dobles, pero sin tener comillas dobles. Esto significa que las comillas en Heredoc no necesitan ser escapadas, pero los caracteres escapados indicados arriba se pueden seguir empleando. Las variables son expandidas, y se debe tener el mismo cuidado dentro de un Heredoc cuando se quieren expresar variables complejas, al igual que en los string.
Ejemplo #2 Ejemplo de entrecomillado de string Heredoc
<?php
$str = <<<EOD
Ejemplo de una cadena
expandida en varias líneas
empleando la sintaxis heredoc.
EOD;
/* Un ejemplo más complejo con variables. */
class foo
{
var $foo;
var $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MiNombre';
echo <<<EOT
Mi nombre es "$name". Estoy escribiendo un poco de $foo->foo.
Ahora, estoy escribiendo un poco de {$foo->bar[1]}.
Esto debe mostrar una 'A' mayúscula: \x41
EOT;
?>
El resultado del ejemplo sería:
Mi nombre es "MiNombre". Estoy escribiendo un poco de Foo. Ahora, estoy escribiendo un poco de Bar2. Esto debe mostrar una 'A' mayúscula: A
Tambien se puede emplear la sintaxis Heredoc para pasar datos como argumento de una función:
Ejemplo #3 Ejemplo de Heredoc como argumento
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
Desde PHP 5.3.0 es posible inicializar variables estáticas y propiedades/constantes de clase mediante la sintaxis Heredoc:
Ejemplo #4 Usando Heredoc para inicializar valores estáticos
<?php
// Variables estáticas
function foo()
{
static $bar = <<<LABEL
Nada aqui dentro...
LABEL;
}
// Propiedades/Constantes de clase
class foo
{
const BAR = <<<FOOBAR
Ejemplo de constante
FOOBAR;
public $baz = <<<FOOBAR
Ejemplo de propiedad
FOOBAR;
}
?>
PHP 5.3.0 tambien introdujo la posibilidad en Heredoc de emplear las comillas dobles en declaraciones:
Ejemplo #5 Empleando comillas dobles en Heredoc
<?php
echo <<<"FOOBAR"
Hola Mundo!
FOOBAR;
?>
Nowdocs son a las cadenas con comillas simples lo mismo que Heredoc lo es a las comillas dobles. Una cadena nowdoc se especifica de forma análoga a la heredoc, pero no se realiza ningún análisis dentro de nowdoc. Esta construcción es ideal para embeber código PHP o grandes fragmentos de texto sin necesidad de escaparlo. Comparte algunas características comunes con la construcción SGML <![CDATA[ ]]>, donde se declara un fragmento de texto que no debe ser analizado.
Una cadena nowdoc se identifica con la misma sintaxis <<< usada para heredoc, pero el identificador que le sigue esta encerrado entre comillas simples, por ejemplo <<<'EOT'. Todas las reglas para los identificadores heredoc también son aplicables a los identificadores nowdoc, especialmente aquellos que se refieren al empleo del identificador de cierre.
Ejemplo #6 Ejemplo de entrecomillado de string Nowdoc
<?php
$str = <<<'EOD'
Ejemplo de una cadena
expandida en varias líneas
empleando la sintaxis nowdoc.
EOD;
/* Un ejemplo más complejo con variables. */
class foo
{
public $foo;
public $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MiNombre';
echo <<<'EOT'
Mi nombre es "$name". Estoy escribiendo un poco de $foo->foo.
Ahora, estoy escribiendo un poco de {$foo->bar[1]}.
Esto debe mostrar una 'A' mayúscula: \x41
EOT;
?>
El resultado del ejemplo sería:
Mi nombre es "$name". Estoy escribiendo un poco de $foo->foo.
Ahora, estoy escribiendo un poco de {$foo->bar[1]}.
Esto debe mostrar una 'A' mayúscula: \x41Nota:
A diferencia de heredoc, nowdoc puede ser usado en cuaquier contexto de datos estáticos. Un ejemplo típico es la inicialización de propiedades o constantes en una clase:
Ejemplo #7 Ejemplo de datos estáticos
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Nota:
El soporte de Nowdoc se añadió en PHP 5.3.0.
Cuando un string es especificado mediante comillas dobles o mediante sintaxis heredoc, las variables dentro de dicha cadena son analizadas.
Existen dos tipos de sintaxis: una simple y otra compleja. La sintaxis simple es la más empleada y conveniente. Proporciona una forma de incluir una variable, un valor de un array o una propiedad de un object dentro de un string con el mínimo esfuerzo.
La sintaxis compleja puede ser reconocida por las llaves que encierran la expresión.
Si se encuentra un signo de dólar ($), el analizador ávidamente cogerá el mayor número de símbolos para formar un nombre de variable válido. Encerrar el nombre de la variable entre llaves permite especificar explícitamente el final del nombre.
<?php
$jugo = "manzana";
echo "El tomó algo de jugo de $jugo.".PHP_EOL;
// Inválido. "s" es un caracter válido para un nombre de variable, pero la variable es $jugo.
echo "El tomó algo de jugo hecho de $jugos.";
?>
El resultado del ejemplo sería:
El tomó algo de jugo de manzana. El tomó algo de jugo hecho de .
De forma parecida, el índice de un array o la propiedad de un object puede ser analizado. Con los índices de los arrays, el corchete de cierre (]) marca el final del índice. La misma regla se puede aplicar a las propiedades de los objetos y a las variables simples.
Ejemplo #8 Ejemplo de sintaxis simple
<?php
$jugos = array("manzana", "naranja", "koolaid1" => "púrpura");
echo "El tomó algo de jugo de $jugos[0].".PHP_EOL;
echo "El tomó algo de jugo de $jugos[1].".PHP_EOL;
echo "El tomó algo de jugo hecho de $jugo[0]s.".PHP_EOL;// No funcionará
echo "El tomó algo de jugo $jugos[koolaid1].".PHP_EOL;
class people {
public $john = "John Smith";
public $jane = "Jane Smith";
public $robert = "Robert Paulsen";
public $smith = "Smith";
}
$people = new people();
echo "$people->john tomó algo de jugo de $jugos[0].".PHP_EOL;
echo "$people->john entonces dijo hola a $people->jane.".PHP_EOL;
echo "La esposa de $people->john's saludó a $people->robert.".PHP_EOL;
echo "$people->robert saludó a los dos $people->smiths."; // No funcionará
?>
El resultado del ejemplo sería:
El tomó algo de jugo de manzana. El tomó algo de jugo de naranja. El tomó algo de jugo hecho de s. El tomó algo de jugo púrpura. John Smith tomó algo de jugo de manzana. John Smith entonces dijo hola a Jane Smith. La esposa de John Smith's saludó a Robert Paulsen. Robert Paulsen saludó a los dos .
Para casos más complejos se debe emplear la sintaxis compleja.
Esta sintaxis no se llama compleja poque sea compleja de aplicar, sino porque permite el empleo de expresiones complejas.
Cualquier variable escalar, elemento de array o propiedad de objeto con una representación de string puede ser incluido a través de esta sintaxis. Simplemente se escribe la expresión del mismo modo en que debe aparecer por fuera del string, y entonces se encierra ente { y }. Dado que { no puede ser escapado, esta sintaxis será reconocida únicamente cuando el $ siga inmediatamente al {. Utilice {\$ para obtener un {$ literal. Algunos ejemplos para que quede más claro:
<?php
// Muestra todos los errores
error_reporting(E_ALL);
$great = 'fantastico';
// No funciona, resultado: Esto es { fantastico}
echo "Esto es { $great}";
// Funciona, resultado: Esto es fantastico
echo "Esto es {$great}";
echo "Esto es ${great}";
// Funciona
echo "Este cuadrado tiene {$square->width}00 centímetros de lado.";
// Funciona, claves entre comillas sólo funcionan utilizando la sintaxis de llaves
echo "Esto funciona: {$arr['key']}";
// Funciona
echo "Funciona: {$arr[4][3]}";
// No funciona por la misma razón que $foo[bar] es incorrecto fuera de una cadena.
// En otras palabras, funcionaría pero solo porque PHP primero busca por una constante
// llamada foo; un error del nivel E_NOTICE (constante no definida) puede ser lanzado.
echo "No funciona: {$arr[foo][3]}";
// Funciona. Cuando se usan arrays multidimensionales, siempre emplee llaves encerrando
// los arrays cuando se encuentre dentro de una cadena
echo "Funciona: {$arr['foo'][3]}";
// Funciona.
echo "Funciona: " . $arr['foo'][3];
echo "Tambien funciona: {$obj->values[3]->name}";
echo "Este es el valor de la variable llamada $name: {${$name}}";
echo "Este es el valor de la variable llamada por el valor de retorno de getName(): {${getName()}}";
echo "Este es el valor de la variable llamada por el valor de retorno de \$object->getName(): {${$object->getName()}}";
//No funciona, imprime: Esto es el valor de retorno de getName(): {getName ()}
echo "Esto es el valor de retorno de getName(): {getName()}";
?>
También es posible acceder a las propiedades de una clase usando variables dentro de cadenas al emplear ésta sintaxis.
<?php
class foo {
var $bar = 'Soy bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->$baz[1]}\n";
?>
El resultado del ejemplo sería:
Soy bar. Soy bar.
Nota:
Funciones, llamadas a métodos, variables estáticas de clases y constantes de clases dentro de {$} funcionan desde PHP 5. Sin embargo, el valor accedido puede ser interpretado como el nombre de la variable en el ámbito en el que la cadena está definida. Empleando llaves simples ({}) no servirá para acceder al valor de retorno de las funciones o métodos, constantes o variables estáticas de clases.
<?php
// Muestra todos los errores.
error_reporting(E_ALL);
class beers {
const softdrink = 'rootbeer';
public static $ale = 'ipa';
}
$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';
// Funciona; resultado: Me gusta una A & W
echo "Me gusta una {${beers::softdrink}}\n";
// Tambien funciona; resultado: Me gusta una Alexander Keith's
echo "Me gusta una {${beers::$ale}}\n";
?>
Los caracteres dentro de un string pueden ser accedidos y modificados especificando la posición de caracter deseado (en base a la posición cero del primer caracter del string) empleando los corchetes de array, como en $str[42]. Piense en este caso que un string se comporta como un array de caracteres. Las funciones substr() y substr_replace() pueden ser empleados para extraer y reemplazar más de un caracter.
Nota: Los String también pueden accederse utilizando llaves, como en $str{42}, para el mismo propósito.
Escribir fuera del rango es compensado rellenando el string con espacios.
Los tipos que no sean integer son convertidos a integer. Las compensaciones fuera
de rango emiten E_NOTICE. Las compensaciones negativas
emiten E_NOTICE en la escritura pero en la lectura obtienen
una cadena vacía. Sólo se emplea el primer carácter de un string asignado. La
asignación de un string vacío asigna un byte NULL.
Ejemplo #9 Algunos ejemplos de cadenas
<?php
// Obtención del primer caracter de una cadena
$str = 'Esto es un test.';
$first = $str[0];
// Obtención del tercer caracter de una cadena
$third = $str[2];
// Obtención del último caracter de una cadena
$str = 'Esto sigue siendo un test.';
$last = $str[strlen($str)-1];
// Modificación del último caracter de una cadena
$str = 'Mira el mar';
$str[strlen($str)-1] = 'e';
?>
Nota:
El acceso a variables de otros tipos (sin incluir arrays u objetos implementando las interfaces apropiadas) utilizando [] o {} silenciosamente retorna
NULL.
Los string pueden ser concatenados empleando el operador '.' (punto). Fíjese que el operador '+' (suma) no servirá para concatenar. Consulte operadores de string para más información.
Hay una serie de funciones útiles para la manipulación de string.
Consulte la sección de funciones de string para funciones generales, y las funciones de expresiones regulares o las funciones de expresiones regulares compatibles con Perl para funcionalidades avanzadas de búsqueda y sustitución.
Tambien existen funciones para cadenas URL, y funciones para encriptar/desencriptar cadenas (mcrypt y mhash).
Finalmente, tambien existen las funciones para el tipo caracter.
Un valor puede convertirse a una string mediante el forzado (string) o la función strval(). La conversión automática a string tiene lugar en el contexto de una expresióin que necesita un string. Esto ocurre cuando se utilizan las funciones echo o print, o cuando una variables es comparada con un string. Las secciones sobre tipos y Manipulación de tipos pueden ayudarle a enterderlo con más claridad. Consulte tambien la función settype().
El valor TRUE del tipo boolean es convertido en el
string "1". El valor FALSE del tipo
boolean es convertido en el string ""
(la cadena vacía). Esto permite la conversión en ambos sentidos entre los valores de
los tipos boolean y string.
Un integer o float es convertido en un string representando textualmente el número (incluyendo la parte exponencial para los floats. Los números de punto flotante pueden ser convertidos mediante la notación exponencial (4.1E+6).
Nota:
El caracter para el punto decimal se define en el script de configuración regional (categoría LC_NUMERIC). Consulte la función setlocale().
Los arrays siempre se convierten en un string "Array". Debido a esto, tanto echo y print no pueden pos sí mismos mostrar el contenido de un array. Para ver un elemento individualmente, utilice una construcción como echo $arr['foo']. Mire los trucos en la parte inferior para mostrar el contenido por completo.
Los objects en PHP 4 siempre se convierten en un string "Object". Para mostrar los valores de las propiedades de un objeto para depuración, mire los parrafos siguientes. Para obtener el nombre de la clase del objeto emplée la función get_class(). A partir de PHP 5 se puede emplear el método __toString.
Los resources siempre se convierten en strings mediante la estructura "Resource id #1", donde 1 es el número único asignado al resource por PHP en tiempo de ejecución. No debe confiar en esta estructura, ya que está sujeto a cambios. Para obtener el tipo del resource emplee la función get_resource_type().
NULL siempre es convertido a una cadena vacía.
Como se ha indicado anteriormente, la conversión directa de un array, object o resource a un string no proporciona información útil acerca del valor, más allá de su tipo. Consulte las funciones print_r() y var_dump() para obtener maneras más efectivas de inspeccionar el contenido de estos tipos.
La mayoría de los valores de PHP pueden ser convertidos a strings para su almacenamiento permanente. Este método se denomina serialización, y es realizado mediante la función serialize(). Si la máquina PHP está contruida con soporte de WDDX, los valores de PHP tambien pueden ser serializacos como texto XML correctamente formateado.
Cuando una string es evaluada en un contexto numérico, el valor resultante y el tipo se determina como se explica a continuación.
Si el string no contiene ninguno de los caracteres '.', 'e',
o 'E' y el valor numérico está entre los límites del tipo entero (como se
define en PHP_INT_MAX), la string será
evaluada como un integer. En todos los demas casos será
evaluado como un float.
El valor es dado por la parte inicial del string. Si el string empieza con un número válido, éste será el valor usado. De otra forma, el valor será 0 (cero). Se considera número válido a un signo opcional, seguido de uno o más dígitos (opcionalmente puede contener un punto decimal), seguido de un exponente opcional. El exponente es una 'e' o 'E' seguida de uno o más dígitos.
<?php
$foo = 1 + "10.5"; // $foo es float (11.5)
$foo = 1 + "-1.3e3"; // $foo es float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo es integer (1)
$foo = 1 + "bob3"; // $foo es integer (1)
$foo = 1 + "10 Small Pigs"; // $foo es integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo es float (14.2)
$foo = "10.0 pigs " + 1; // $foo es float (11)
$foo = "10.0 pigs " + 1.0; // $foo es float (11)
?>
Para más información sobre esta conversión, consulte la página del manual UNIX correspondiente a strtod(3).
Para probar cualquiera de los ejemplos en esta sección, copie y pegue los ejemplos e incluya la siguiente línea para ver que está ocurriendo:
<?php
echo "\$foo==$foo; tipo es " . gettype ($foo) . "<br />\n";
?>
No espere obtener el código de un caracter convirtiendolo a un entero, como ocurre en C. Emplee las funciones ord() y chr() para convertir entre código ASCII y caracteres.
En PHP, los string se implementan como una matriz de bytes y con un entero que indica la longitud del buffer. No guarda ninguna información sobre cómo traducir esos bytes, relegando esa tarea al programador. No existe ninguna limitación sobre el valor que puede contener un string; en concreto, está permitido colocar un bytes con valor 0 (“bytes NUL”) en cualquier posición del string (existen algunas funciones, marcadas en este manual como que no utilizan "modo binario seguro", podrían rechazar estos strings para aquellas bibliotecas que ignoren los datos preceden a un byte NUL.)
Este comportamiento de los strings justifica el que no exista un tipo de dato "byte" en PHP – los strings se encargan de esto. Las funciones que no devuelvan datos de texto – por ejemplo, cualquier dato leído a partir de un socket de red – devolverán strings.
Dado que PHP no obliga a utilizar ninguna condificación en particular, uno podría preguntarse cómo se codifican los textos literales. Por ejemplo, ¿es el string "á" equivalente a "\xE1" (ISO-8859-1), "\xC3\xA1" (forma en C UTF-8), "\x61\xCC\x81" (forma en D UTF-8) o cualquier otra representación posible? La resuesta es que un string se codifica en cualesquiera forma en que estuviera el fichero de código. Por tanto, si un fichero de código estuviera escrito en ISO-8859-1, el string se codificará en ISO-8859-1, y así. Sin embargo, esto no es aplicable si Zend Multibyte está habilitado; en ese caso, el fichero de código podría estar escrito en cualquier codificación (declarada explícitamente o bien detectada) para después convertirse a una determinada codificación interna, que será entonces la codificación usada para los textos literales. Tenga presente que existen algunas limitaciones sobre la codificación del código fuente (o en la codificación internal, si Zend Multibyte estuviera habilitado) – esto suele significar que se debe usar uan codificación complatible con el conjunto ASCII, como por ejemplo UTF-8 o ISO-8859-1. Por contra, las codificaciones dependientes de estados, donde un mismo byte se puede utilizar en estados de desplazamiento iniciales y no iniciales, podría generar problemas.
Por supuesto, para poder ser útil, las funciones que operen con texto podrán partir de unos supuestos sobre cómo está codificado el string. Desafortunadamente, respecto a esto existen muchas variaciones en la funciones de PHP:
En resumen, esto significa que para escribir programas Unicode de forma correcta hay que evitar cuidadosamente las funciones que pudean fallar y que muy probablemente vuelvan los datos corruptos, y utilizar en su lugar las funciones que se comportan de forma correcta, generalmente de las extensiones intl y mbstring. Sin embargo, el utilizar funciones que puedan manejar codificaciones Unicode es sólo el principio. No importa qué funciones incorpore el lenguaje; es primordial conocer la especificación Unicode. Por ejemplo, un programa que asuma que sólo hay mayúsculas y minúsculas estará haciendo una suposición erronea.
Un array en PHP es realmente un mapa ordenado. Un mapa es un tipo de datos que asocia valores con claves. Este tipo es optimizado para varios usos diferentes; puede ser usado como una matriz real, una lista (vector), una tabla asociativa (una implementación de un mapa), diccionario, colección, pila, cola, y posiblemente más. Ya que los valores de un array pueden ser otros arrays, árboles y también son posibles arrays multidimensionales.
Una explicación sobre tales estructuras de datos está fuera del alcance de este manual, pero encontrará al menos un ejemplo de cada uno de ellos. Para más información, consulte la extensa literatura que existe sobre este amplio tema.
Un array puede ser creado usando el constructor del lenguaje array(). Éste toma un cierto número de parejas clave => valor como argumentos.
array(
clave => valor,
clave2 => valor2,
clave3 => valor3,
...
)
La coma después del elemento del array es opcional y se puede omitir. Esto normalmente se hace para arrays de una sola línea, esto es, es preferible array(1, 2) que array(1, 2, ). Por otra parte, para arrays multilínea, la coma final se usa comnúnmente, ya que permite la adición sencilla de nuevos elementos al final.
A partir de PHP 5.4 también se puede usar la sintaxis de array corta, que reemplaza array() con [].
Ejemplo #1 Un array simple
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
// a partir de PHP 5.4
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
La clave puede ser un integer o un string. El valor puede ser de cualquier tipo.
Además, los siguientes moldeados de tipo en la clave producirá:
Desde PHP 5.4, el acceso al índice de cadena se hace consistente. Como resultado, algunos valores de retorno pueden ser diferentes de versiones anteriores. A partir de PHP 5.4, los índices de cadena deberían ser un integer o un integer como string, de otro modo el resultado será una advertencia.
Ejemplo #2 String offset access example
<?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)
Si varios elementos en la declaración del array usan la misma clave, sólo la última será usada y los demás son sobrescritos.
Ejemplo #3 Ejemplo de moldeado de tipo y sobrescritura
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>
El resultado del ejemplo sería:
array(1) {
[1]=>
string(1) "d"
}
Como todas las claves en el ejemplo anterior se convierten en 1, los valores serán sobrescritos en cada nuevo elemento y el último valor asignado "d" es el único que queda.
Los arrays PHP pueden contener claves integer y string al mismo tiempo ya que PHP no distingue entre arrays indexados y asociativos.
Ejemplo #4 Claves mixtas integer y string
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
?>
El resultado del ejemplo sería:
array(4) {
["foo"]=>
string(3) "bar"
["bar"]=>
string(3) "foo"
[100]=>
int(-100)
[-100]=>
int(100)
}
La clave es opcional. Si no se especifica, PHP usará el incremento de la clave integer más grande utilizada anteriormente.
Ejemplo #5 Arrays indexados sin clave
<?php
$array = array("foo", "bar", "hallo", "world");
var_dump($array);
?>
El resultado del ejemplo sería:
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "hallo"
[3]=>
string(5) "world"
}
Es posible especificar la clave sólo para algunos de los elementos y dejar por fuera a los demás:
Ejemplo #6 Claves no en todos los elementos
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>
El resultado del ejemplo sería:
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
Como se puede ver el último valor "d" se le asignó la clave 7. Esto es debido a que la mayor clave integer era 6.
Los elementos de array se pueden acceder utilizando la sintaxis array[key].
Ejemplo #7 Acceso a elementos de array
<?php
$array = array(
"foo" => "bar",
42 => 24,
"multi" => array(
"dimensional" => array(
"array" => "foo"
)
)
);
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>
El resultado del ejemplo sería:
string(3) "bar" int(24) string(3) "foo"
A partir de PHP 5.4 es posible hacer referencia al array de el resultado de una llamada a la función o el método directamente. Antes sólo era posible utilizando una variable temporal.
Ejemplo #8 Hacer referencia al resultado array de funciones
<?php
function getArray() {
return array(1, 2, 3);
}
// en PHP 5.4
$secondElement = getArray()[1];
// anteriormente
$tmp = getArray();
$secondElement = $tmp[1];
// o
list(, $secondElement) = getArray();
?>
Nota:
Si intenta acceder a una clave del array que no se ha definido es lo mismo que el acceso a cualquier otra variable no definida: se emitirá un mensaje de error de nivel
E_NOTICE, y el resultado seráNULL.
Un array existente puede ser modificado al definir valores explícitamente en éste.
Esto se realiza mediante la asignación de valores al array, especificando la clave en corchetes. La clave también se puede omitir, resultando en un par de corchetes vacíos ([]).
$arr[clave] = valor;
$arr[] = valor;
// clave puede ser un integer o string
// valor puede ser cualquier valor de cualquier tipo
Si $arr aún no existe, se creará, así que esto es también una forma alternativa de crear un array. Sin embargo, esta práctica es desaconsejada ya que si $arr ya contiene algún valor (p.ej. un string de una variable de petición), entonces este valor estará en su lugar y [] puede significar realmente el operador de acceso a cadenas. Siempre es mejor inicializar variables mediante una asignación directa.
Para cambiar un valor determinado, se debe asignar un nuevo valor a ese elemento con su clave. Para quitar un par clave/valor, se debe llamar la función unset() en éste.
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // Esto es lo mismo que $arr[13] = 56;
// en este punto de el script
$arr["x"] = 42; // Esto agrega un nuevo elemento a
// el array con la clave "x"
unset($arr[5]); // Esto elimina el elemento del array
unset($arr); // Esto elimina el array completo
?>
Nota:
Como se mencionó anteriormente, si no se especifica una clave, se toma el máximo de los índices integer existentes, y la nueva clave será ese valor máximo más 1 (aunque al menos 0). Si todavía no existen índices integer, la clave será 0 (cero).
Tenga en cuenta que la clave integer máxima utilizada para éste no es necesario que actualmente exista en el array. Ésta sólo debe haber existido en el array en algún momento desde la última vez que el array fué re-indexado. El siguiente ejemplo ilustra este comportamiento:
<?php
// Crear un array simple.
$array = array(1, 2, 3, 4, 5);
print_r($array);
// Ahora elimina cada elemento, pero deja el mismo array intacto:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// Agregar un elemento (note que la nueva clave es 5, en lugar de 0).
$array[] = 6;
print_r($array);
// Re-indexar:
$array = array_values($array);
$array[] = 7;
print_r($array);
?>El resultado del ejemplo sería:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 )
Hay un buen número de funciones útiles para trabajar con arrays. Véase la sección funciones de array.
Nota:
La función unset() permite remover claves de un array. Tenga en cuenta que el array no es re-indexado. Si se desea un verdadero comportamiento "eliminar y desplazar", el array puede ser re-indexado usando la función array_values().
<?php
$a = array(1 => 'uno', 2 => 'dos', 3 => 'tres');
unset($a[2]);
/* producirá un array que se ha definido como
$a = array(1 => 'uno', 3 => 'tres');
y NO
$a = array(1 => 'uno', 2 =>'tres');
*/
$b = array_values($a);
// Ahora $b es array(0 => 'uno', 1 =>'tres')
?>
La estructura de control foreach existe específicamente para arrays. Ésta provee una manera fácil de recorrer un array.
Siempre deben usarse comillas alrededor de un índice de array tipo string literal. Por ejemplo, $foo['bar'] es correcto, mientras que $foo[bar] no lo es. ¿Pero por qué? Es común encontrar este tipo de sintaxis en scripts viejos:
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>
Esto está mal, pero funciona. La razón es que este código tiene una
constante indefinida (bar) en lugar de un valor string
('bar' - note las comillas). Puede que en el futuro PHP defina
constantes que, desafortunadamente para tal tipo de código, tengan el
mismo nombre. Funciona porque PHP automáticamente convierte una
cadena pura (un string sin comillas que no
corresponda con símbolo conocido alguno) en un string que contiene la
cadena pura. Por ejemplo, si no se ha definido una constante llamada
bar, entonces PHP reemplazará su valor por la
cadena 'bar' y usará ésta última.
Nota: Esto no quiere decir que siempre haya que usar comillas en la clave. No use comillas con claves que sean constantes o variables, ya que en tal caso PHP no podrá interpretar sus valores.
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);
// Array simple:
$array = array(1, 2);
$count = count($array);
for ($i = 0; $i < $count; $i++) {
echo "\nRevisando $i: \n";
echo "Mal: " . $array['$i'] . "\n";
echo "Bien: " . $array[$i] . "\n";
echo "Mal: {$array['$i']}\n";
echo "Bien: {$array[$i]}\n";
}
?>El resultado del ejemplo sería:
Revisando 0: Notice: Undefined index: $i in /path/to/script.html on line 9 Mal: Bien: 1 Notice: Undefined index: $i in /path/to/script.html on line 11 Mal: Bien: 1 Revisando 1: Notice: Undefined index: $i in /path/to/script.html on line 9 Mal: Bien: 2 Notice: Undefined index: $i in /path/to/script.html on line 11 Mal: Bien: 2
Más ejemplos para demostrar este comportamiento:
<?php
// Mostrar todos los errores
error_reporting(E_ALL);
$arr = array('fruit' => 'apple', 'veggie' => 'carrot');
// Correcto
print $arr['fruit']; // apple
print $arr['veggie']; // carrot
// Incorrecto. Esto funciona pero también genera un error de PHP de
// nivel E_NOTICE ya que no hay definida una constante llamada fruit
//
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit]; // apple
// Esto define una constante para demostrar lo que pasa. El valor 'veggie'
// es asignado a una constante llamada fruit.
define('fruit', 'veggie');
// Note la diferencia ahora
print $arr['fruit']; // apple
print $arr[fruit]; // carrot
// Lo siguiente está bien ya que se encuentra al interior de una cadena. Las constantes no son procesadas al
// interior de cadenas, así que no se produce un error E_NOTICE aquí
print "Hello $arr[fruit]"; // Hello apple
// Con una excepción, los corchetes que rodean las matrices al
// interior de cadenas permiten el uso de constantes
print "Hello {$arr[fruit]}"; // Hello carrot
print "Hello {$arr['fruit']}"; // Hello apple
// Esto no funciona, resulta en un error de intérprete como:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Esto por supuesto se aplica también al uso de superglobales en cadenas
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";
// La concatenación es otra opción
print "Hello " . $arr['fruit']; // Hello apple
?>
Cuando se habilita error_reporting para mostrar
errores de nivel E_NOTICE (como por ejemplo
definiendo el valor E_ALL), este tipo de usos serán
inmediatamente visibles. Por omisión, error_reporting se encuentra
configurado para no mostrarlos.
Tal y como se indica en la sección de sintaxis, lo que existe entre los corchetes cuadrados ('[' y ']') debe ser una expresión. Esto quiere decir que código como el siguiente funciona:
<?php
echo $arr[somefunc($bar)];
?>
Este es un ejemplo del uso de un valor devuelto por una función como índice del array. PHP también conoce las constantes:
<?php
$error_descriptions[E_ERROR] = "Un error fatal ha ocurrido";
$error_descriptions[E_WARNING] = "PHP produjo una advertencia";
$error_descriptions[E_NOTICE] = "Esta es una noticia informal";
?>
Note que E_ERROR es también un identificador válido,
asi como bar en el primer ejemplo. Pero el último
ejemplo es equivalente a escribir:
<?php
$error_descriptions[1] = "Un error fatal ha ocurrido";
$error_descriptions[2] = "PHP produjo una advertencia";
$error_descriptions[8] = "Esta es una noticia informal";
?>
ya que E_ERROR es igual a 1, etc.
En algún momento en el futuro, puede que el equipo de PHP quiera usar otra constante o palabra clave, o una constante proveniente de otro código puede interferir. Por ejemplo, en este momento no puede usar las palabras empty y default de esta forma, ya que son palabras clave reservadas.
Nota: Reiterando, al interior de un valor string entre comillas dobles, es válido no rodear los índices de array con comillas, así que "$foo[bar]" es válido. Consulte los ejemplos anteriores para más detalles sobre el porqué, así como la sección sobre procesamiento de variables en cadenas.
Para cualquiera de los tipos: integer, float, string, boolean y resource, convertir un valor a un array resulta en un array con un solo elemento, con índice 0, y el valor del escalar que fue convertido. En otras palabras, (array)$scalarValue es exactamente lo mismo que array($scalarValue).
Si convierte un object a un array, el resultado es un array cuyos elementos son las propiedades del object. Las claves son los nombres de las variables miembro, con algunas excepciones notables: las variables privadas tienen el nombre de la clase al comienzo del nombre de la variable; las variables protegidas tienen un caracter '*' al comienzo del nombre de la variable. Estos valores adicionados al inicio tienen bytes nulos a los lados. Esto puede resultar en algunos comportamientos inesperados:
<?php
class A {
private $A; // Este campo se convertirá en '\0A\0A'
}
class B extends A {
private $A; // Este campo se convertirá en '\0B\0A'
public $AA; // Este campo se convertirá en 'AA'
}
var_dump((array) new B());
?>
En el ejemplo anterior parecerá que se tienen dos claves llamadas 'AA', aunque en realidad una de ellas se llama '\0A\0A'.
Es posible comparar arrays con la función array_diff() y mediante operadores de arrays.
El tipo array en PHP es bastante versátil. Aquí hay algunos ejempos:
<?php
// Esto:
$a = array( 'color' => 'red',
'taste' => 'sweet',
'shape' => 'round',
'name' => 'apple',
4 // la clave será 0
);
$b = array('a', 'b', 'c');
// . . .es completamente equivalente a
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name'] = 'apple';
$a[] = 4; // la clave será 0
$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// Después de que se ejecute el código, $a será el array
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round',
// 'name' => 'apple', 0 => 4), y $b será el array
// array(0 => 'a', 1 => 'b', 2 => 'c'), o simplemente array('a', 'b', 'c').
?>
Ejemplo #9 Uso de array()
<?php
// Array como mapa de propiedades
$map = array( 'version' => 4,
'OS' => 'Linux',
'lang' => 'english',
'short_tags' => true
);
// Keys estrictamente numéricas
$array = array( 7,
8,
0,
156,
-10
);
// esto es lo mismo que array(0 => 7, 1 => 8, ...)
$switching = array( 10, // key = 0
5 => 6,
3 => 7,
'a' => 4,
11, // key = 6 (el índice entero máximo era 5)
'8' => 2, // key = 8 (integer!)
'02' => 77, // key = '02'
0 => 12 // el valor 10 será reemplazado por 12
);
// array vacío
$empty = array();
?>
Ejemplo #10 Colección
<?php
$colors = array('rojo', 'azul', 'verde', 'amarillo');
foreach ($colors as $color) {
echo "¿Le gusta el $color?\n";
}
?>
El resultado del ejemplo sería:
¿Le gusta el rojo? ¿Le gusta el azul? ¿Le gusta el verde? ¿Le gusta el amarillo?
Modificar los valores del array directamente es posible a partir de PHP 5, pasándolos por referencia. Las versiones anteriores necesitan una solución alternativa:
Ejemplo #11 Cambiando elemento en el bucle
<?php
// PHP 5
foreach ($colors as &$color) {
$color = strtoupper($color);
}
unset($color); /* se asegura de que escrituras subsiguientes a $color
no modifiquen el último elemento del arrays */
// Alternativa para versiones anteriores
foreach ($colors as $key => $color) {
$colors[$key] = strtoupper($color);
}
print_r($colors);
?>
El resultado del ejemplo sería:
Array
(
[0] => ROJO
[1] => AZUL
[2] => VERDE
[3] => AMARILLO
)
Este ejemplo crea un array con base uno.
Ejemplo #12 Índice con base 1
<?php
$firstquarter = array(1 => 'Enero', 'Febrero', 'Marzo');
print_r($firstquarter);
?>
El resultado del ejemplo sería:
Array
(
[1] => 'Enero'
[2] => 'Febrero'
[3] => 'Marzo'
)
Ejemplo #13 Llenado de un array
<?php
// llenar un array con todos los ítems de un directorio
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
?>
Los Arrays son ordenados. El orden puede ser modificado usando varias funciones de ordenado. Vea la sección sobre funciones de arrays para más información. La función count() puede ser usada para contar el número de elementos en un array.
Ejemplo #14 Ordenado de un array
<?php
sort($files);
print_r($files);
?>
Dado que el valor de un array puede ser cualquier cosa, también puede ser otro array. De esta forma es posible crear arrays recursivas y multi-dimensionales.
Ejemplo #15 Arrays recursivos y multi-dimensionales
<?php
$fruits = array ( "fruits" => array ( "a" => "orange",
"b" => "banana",
"c" => "apple"
),
"numbers" => array ( 1,
2,
3,
4,
5,
6
),
"holes" => array ( "first",
5 => "second",
"third"
)
);
// Algunos ejemplos que hacen referencia a los valores del array anterior
echo $fruits["holes"][5]; // prints "second"
echo $fruits["fruits"]["a"]; // prints "orange"
unset($fruits["holes"][0]); // remove "first"
// Crear una nueva array multi-dimensional
$juices["apple"]["green"] = "good";
?>
La asignación de arrays siempre involucra la copia de valores. Use el operador de referencia para copiar un array por referencia.
<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 ha cambiado,
// $arr1 sigue siendo array(2, 3)
$arr3 = &$arr1;
$arr3[] = 4; // ahora $arr1 y $arr3 son iguales
?>
Para crear un nuevo object, utilice la declaración new para instanciar una clase:
<?php
class foo
{
function do_foo()
{
echo "Doing foo.";
}
}
$bar = new foo;
$bar->do_foo();
?>
Para una descripción completa, vea el capítulo Clases y Objetos.
Si un object se convierte en un object, éste no se
ve modificado. Si un valor de cualquier otro tipo se convierte en un
object, se crea una nueva instancia de la clase stdClass
incorporada. Si el valor es NULL, la nueva instancia estará vacía. Los Arrays
se convierten en un object con propiedades nombradas por claves
con sus correspondientes valores. Para cualquier otro valor, una variable miembro
denominada scalar contendrá el valor.
<?php
$obj = (object) 'ciao';
echo $obj->scalar; // muestra 'ciao'
?>
Un valor tipo resource es una variable especial, que contiene una referencia a un recurso externo. Los recursos son creados y usados por funciones especiales. Vea el apéndice para un listado de todas estas funciones y los tipos resource correspondientes.
Vea también la función get_resource_type().
Dado que las variables resource contienen gestores especiales a archivos abiertos, conexiones con bases de datos, áreas de pintura de imágenes y cosas por el estilo, la conversión a tipo resource carece de sentido.
Gracias al sistema de conteo de referencias introducido con el Motor Zend de PHP 4, un recurso que ya no es referenciado es detectado automáticamente, y es liberado por el recolector de basura. Por esta razón, rara vez se necesita liberar la memoria manualmente.
Nota: Los enlaces persistentes con bases de datos son una excepción a esta regla. Ellos no son destruidos por el recolector de basura. Vea también la sección sobre conexiones persistentes para más información.
El valor especial NULL representa una variable sin valor. NULL es el
unico valor posible de tipo NULL.
Una variable es considerada null si:
Se le ha asignado la constante NULL.
No se ha asignado a un valor todavía.
Se ha destruido con unset().
No hay más que un valor de tipo null, y es la
constante NULL insensible a mayúsculas/minúsculas.
<?php
$var = NULL;
?>
Moldear una variable a null usando (unset) $var
no eliminará la variable o destruirá su valor.
Esto sólo retornará un valor NULL.
Las llamadas de retorno se pueden representar con el tipo callable a partir de PHP 5.4. Esta documentación utilizó la información del tipo callback con el mismo propósito.
algunas funciones como call_user_func() o usort() aceptan funciones de llamadas de retorno definidas por el usuario como parámetro. Las funciones de llamadas de retorno no sólo pueden ser funciones simples, sino también métodos de un object, incluyendo métodos de clase estáticos.
Una función PHP se pasa por su nombre como una string. Se puede utilizar cualquier función nativa o definida por el usuario, excepto contrucciones del lenguaje, tal como: array(), echo, empty(), eval(), exit(), isset(), list(), print o unset().
Un método de un object instanciado se pasa como un array conteniendo un object en el índice 0 y el nombre del método en el índice 1.
Métodos de clase estáticos también se pueden pasar sin instanciar un object de una clase al pasar el nombre de la clase en lugar de un object en el índice 0. A partir de PHP 5.2.3, también es posible pasar 'NombreDeClase::nombreDeMetodo'.
Además de las funciones definidas por el usuario normales, también se puede utilizar la función create_function() para crear funciones de devolución de llamadas anónimas. A partir de PHP 5.3.0 también es posible pasar un cierre a un parámetro de llamada de retorno.
Ejemplo #1 Ejemplos de funciones de llamadas de retorno
<?php
// Un ejemplo de función de llamada de retorno
function my_callback_function() {
echo 'hello world!';
}
// Un ejemplo de método de llamada de retorno
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// Tipo 1: Llamada de retorno simple
call_user_func('my_callback_function');
// Tipo 2: Llamada a un método de clase estático
call_user_func(array('MyClass', 'myCallbackMethod'));
// Tipo 3: Llamada al método de un objeto
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// Tipo 4: Llamada a un método de clase estático (A partir de PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');
// Tipo 5: Llamada a un método de clase estático relativo (A partir de PHP 5.3.0)
class A {
public static function who() {
echo "A\n";
}
}
class B extends A {
public static function who() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::who')); // A
?>
Ejemplo #2 Ejemplo de llamada de retorno utilizando un cierre o función anónima
<?php
// Nuestro cierre
$double = function($a) {
return $a * 2;
};
// Este es nuestro rango de números
$numbers = range(1, 5);
// Aquí utilizamos el cierre como llamada de retorno
// para doblar el valor de cada elemento en nuestro
// rango
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>
El resultado del ejemplo sería:
2 4 6 8 10
Nota: En PHP 4, era necesario usar una referencia para crear una llamada de retorno que apunte al object real, y no a una copia del mismo. Para más detalles, vea las Referencias Explicadas.
Nota:
Las funciones de retorno de llamada que se registran con funciones como call_user_func() y call_user_func_array() no se llamarán si se produce una excepción en la función de retorno previa.
mixed indica que un parámetro puede aceptar múltiples tipos (pero no necesariamente todos).
gettype(), por ejemplo, puede aceptar todos los tipos PHP, mientras que str_replace() sólo acepta strings y arrays.
Los pseudo-tipos callback fueron usados en está documentación antes de que la sugerencia de tipo callable fuera introducida en PHP 5.4. Significan exactamente lo mismo.
void como un tipo de variable de retorno significa que el valor de retorno no es útil. void en una lista de parámetros significa que la función no acepta ningún parámetro.
$... en el prototipo de funciones significa
and so on. Este nombre de variable se usa cuando una función
puede tomar un número infinito de argumentos.
PHP no requiere (ni soporta) la definición explicita de tipos en la declaración de variables; el tipo de la variable se determina por el contexto en el cual se emplea la variable. Es decir, si se asigna un valor string a una variable $var, entonces $var se convierte en un string. Si un valor integer es entonces asignado a la misma variable $var, ésta se convierte en integer.
Un ejemplo de la conversión de tipos automática de PHP es el operador suma '+'. Si ambos operandos son float, entonces ambos operandos son evaluados como floats y el resultado será un float. De otra manera, los operandos seran interpretados como integers, y el resultado será entonces integer. Tenga en cuenta que esto no implica que se cambien los tipos de los propios operandos; el único cambio es en como se evalúan los operandos y en el tipo de expresión en sí mismo.
<?php
$foo = "0"; // $foo es string (ASCII 48)
$foo += 2; // $foo es ahora un integer (2)
$foo = $foo + 1.3; // $foo es ahora un float (3.3)
$foo = 5 + "10 Cerditos pequeñitos"; // $foo es integer (15)
$foo = 5 + "10 Cerdos pequeños"; // $foo es integer (15)
?>
Si considera confusos los últimos dos ejemplos anteriores, consulte Conversión de cadenas a números.
Para forzar a que una variable sea evaluada como un determinado tipo, consulte la sección Forzado de tipos. Para cambiar el tipo de variable, consulte la función settype().
Para probar cualquiera de los ejemplos de esta sección, utilice la función var_dump().
Nota:
El comportamiento de la conversión automática en array está actualmente sin definir.
Tambien, debido a que PHP soporta el indexado de string mediante compensaciones mediante la misma sintaxis empleada en el indexado de arrays, los siguientes ejemplos son válidos para todas las versiones de PHP:
<?php
$a = 'car'; // $a es un string
$a[0] = 'b'; // $a sigue siendo un string
echo $a; // bar
?>Consulte la sección Acceso a cadenas mediante caracteres para más información.
El forzado de tipos en PHP funciona de la misma manera que en C:, donde el nombre del tipo deseado se escribe entre paréntesis antes de la variable que se quiera forzar.
<?php
$foo = 10; // $foo es un integer
$bar = (boolean) $foo; // $bar es un boolean
?>
Los siguientes forzados de tipos están permitidos:
El forzado (binary) y el soporte del prefijo b fueron añadidos en PHP 5.2.1
Fíjese que se permiten las tabulaciones y espacios dentro de los paréntesis, por lo que los siguientes ejemplos son funcionalmente equivalentes:
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
Forzado literal de strings y variables a strings binarios:
<?php
$binary = (binary) $string;
$binary = b"binary string";
?>
Nota:
El lugar de forzar una variable a string, tambien se puede encerrar la variable entre comillas dobles.
<?php
$foo = 10; // $foo es un integer
$str = "$foo"; // $str es un string
$fst = (string) $foo; // $fst es tambien un string
// Esto muestra que "son lo mismo"
if ($fst === $str) {
echo "son lo mismo";
}
?>
Puede que no sea obvio que sucede exactamente cuando se fuerzan ciertos tipos. Para más información, consulte estas secciones:
En PHP las variables se representan con un signo de dólar seguido por el nombre de la variable. El nombre de la variable es sensible a minúsculas y mayúsculas.
Los nombres de variables siguen las mismas reglas que otras etiquetas en PHP. Un nombre de variable válido tiene que empezar con una letra o un carácter de subrayado (underscore), seguido de cualquier número de letras, números y caracteres de subrayado. Como expresión regular se podría expresar como: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Nota: Para los propósitos de este manual, una letra es a-z, A-Z, y los bytes del 127 al 255 (0x7f-0xff).
Nota: $this es una variable especial que no puede ser asignada.
Vea también Guia de Entorno de Usuario para Nombres.
Para más información sobre funciones relacionadas con variables, vea la Referencia de Funciones de Variables.
<?php
$var = 'Roberto';
$Var = 'Juan';
echo "$var, $Var"; // imprime "Roberto, Juan"
$4site = 'aun no'; // inválido; comienza con un número
$_4site = 'aun no'; // válido; comienza con un carácter de subrayado
$täyte = 'mansikka'; // válido; 'ä' es ASCII (Extendido) 228
?>
De forma predeterminada, las variables siempre se asignan por valor. Esto significa que cuando se asigna una expresión a una variable, el valor completo de la expresión original se copia en la variable de destino. Esto quiere decir que, por ejemplo, después de asignar el valor de una variable a otra, los cambios que se efectúen a una de esas variables no afectará a la otra. Para más información sobre este tipo de asignación, vea Expresiones.
PHP también ofrece otra forma de asignar valores a las variables: asignar por referencia. Esto significa que la nueva variable simplemente referencia (en otras palabras, "se convierte en un alias de" ó "apunta a") la variable original. Los cambios a la nueva variable afectan a la original, y viceversa.
Para asignar por referencia, simplemente se antepone un signo ampersand (&) al comienzo de la variable cuyo valor se está asignando (la variable fuente). Por ejemplo, el siguiente segmento de código produce la salida 'Mi nombre es Bob' dos veces:
<?php
$foo = 'Bob'; // Asigna el valor 'Bob' a $foo
$bar = &$foo; // Referenciar $foo vía $bar.
$bar = "Mi nombre es $bar"; // Modifica $bar...
echo $bar;
echo $foo; // $foo también se modifica.
?>
Algo importante a tener en cuenta es que sólo las variables con nombre pueden ser asignadas por referencia.
<?php
$foo = 25;
$bar = &$foo; // Esta es una asignación válida.
$bar = &(24 * 7); // Inválida; referencia una expresión sin nombre.
function test() {
return 25;
}
$bar = &test(); // Inválido.
?>
No es necesario inicializar variables en PHP, sin embargo, es una muy
buena práctica. Las variables no inicializadas tienen un valor
predeterminado de acuerdo a su tipo dependiendo del contexto en el que
son usadas - las booleanas se asumen como FALSE, los enteros y
flotantes como cero, las cadenas (p.ej. usadas en
echo) se establecen como una cadena vacía y las
matrices se convierten en un array vacío.
Ejemplo #1 Valores predeterminados en variables sin inicializar
<?php
// Una variable no definida Y no referenciada (sin contexto de uso); imprime
// NULL
var_dump($variable_indefinida);
// Uso booleano; imprime 'false' (Vea operadores ternarios para más
// información sobre esta sintaxis)
echo($booleano_indefinido ? "true\n" : "false\n");
// Uso de una cadena; imprime 'string(3) "abc"'
$cadena_indefinida .= 'abc';
var_dump($cadena_indefinida);
// Uso de un entero; imprime 'int(25)'
$int_indefinido += 25; // 0 + 25 => 25
var_dump($int_indefinido);
// Uso de flotante/doble; imprime 'float(1.25)'
$flotante_indefinido += 1.25;
var_dump($flotante_indefinido);
// Uso de array; imprime array(1) { [3]=> string(3) "def" }
$array_indefinida[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
var_dump($array_indefinida);
// Uso de objetos; crea un nuevo objeto stdClass (vea http://www.php.net/manual/en/reserved.classes.php)
// Imprime: object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" }
$objeto_indefinido->foo = 'bar';
var_dump($objeto_indefinido);
?>
Depender del valor predeterminado de una variable sin inicializar es problemático al incluir un archivo en otro que use el mismo nombre de variable. También es un importante riesgo de seguridad cuando la opción register_globals se encuentra habilitada. Un error de nivel E_NOTICE es emitido cuendo se trabaja con variables sin inicializar, con la excepción del caso en el que se anexan elementos a un array no inicializado. La construcción del lenguaje isset() puede ser usada para detectar si una variable ya ha sido inicializada.
PHP proporciona una gran cantidad de variables predefinidas a cualquier script que se ejecute. Muchas de éstas, sin embargo, no pueden ser completamente documentadas ya que dependen del servidor que esté corriendo, la versión y configuración de dicho servidor, y otros factores. Algunas de estas variables no estarán disponibles cuando se ejecute PHP desde la línea de comandos. Para obtener una lista de estas variables, por favor vea la sección sobre Variables Predefinidas Reservadas.
A partir de PHP 4.2.0, el valor predeterminado de la directiva PHP register_globals es off (desactivada). Este es un cambio importante en PHP. Tener register_globals off afecta el conjunto de variables predefinidas disponibles en el sistema. Por ejemplo, para obtener DOCUMENT_ROOT se usará $_SERVER['DOCUMENT_ROOT'] en vez de $DOCUMENT_ROOT ó $_GET['id'] de la URL http://www.example.com/test.php?id=3 en lugar de $id ó $_ENV['HOME'] en lugar de $HOME.
Para más información sobre este cambio, puede consultar el apartado de configuración sobre register_globals, el capítulo sobre seguridad Usando "Register Globals" , asi como los anuncios de lanzamiento de PHP » 4.1.0 y » 4.2.0
El uso de las variables reservadas predefinidas en PHP, como las matrices superglobales es recomendable.
A partir de PHP 4.1.0, PHP ofrece un conjunto adicional de matrices predefinidas que contienen variables del servidor web, el entorno y entradas del usuario. Estas nuevas matrices son un poco especiales porque son automáticamente globales. Por esta razón, son conocidas a menudo como "superglobales". Las superglobales se mencionan más abajo; sin embargo para una lista de sus contenidos y más información sobre variables predefinidas en PHP, por favor consulte la sección Variables predefinidas reservadas. Asimismo, podrá notar cómo las antiguas variables predefinidas ($HTTP_*_VARS) todavía existen. A partir de PHP 5.0.0, las arrays de tipo long variables predefinidas se pueden desactivar con la directiva register_long_arrays .
Nota: Variables variables
Las superglobales no pueden ser usadas como variables variables al interior de funciones o métodos de clase.
Nota:
Aún cuando las superglobales y HTTP_*_VARS pueden existir al mismo tiempo; estas variables no son idénticas, así que modificar una no cambia la otra.
Si ciertas variables no son definidas en variables_order, las matrices PHP predefinidas asociadas a estas, estarán vacías.
El ámbito de una variable es el contexto dentro del que la variable está definida. La mayor parte de las variables PHP sólo tienen un ámbito simple. Este ámbito simple también abarca los ficheros incluídos y los requeridos. Por ejemplo:
<?php
$a = 1;
include 'b.inc';
?>
Aquí, la variable $a estará disponible al interior del script incluido b.inc. Sin embargo, al interior de las funciones definidas por el usuario se introduce un ámbito local a la función. Cualquier variable usada dentro de una función está, por omisión, limitada al ámbito local de la función. Por ejemplo:
<?php
$a = 1; /* ámbito global */
function test()
{
echo $a; /* referencia a una variable del ámbito local */
}
test();
?>
Este script no producirá salida, ya que la sentencia echo utiliza una versión local de la variable $a, a la que no se ha asignado ningún valor en su ámbito. Puede que usted note que hay una pequeña diferencia con el lenguaje C, en el que las variables globales están disponibles automáticamente dentro de la función a menos que sean expresamente sobreescritas por una definición local. Esto puede causar algunos problemas, ya que la gente puede cambiar variables globales inadvertidamente. En PHP, las variables globales deben ser declaradas globales dentro de la función si van a ser utilizadas dentro de dicha función.
En primer lugar, un ejemplo de uso de global:
Ejemplo #1 Uso de global
<?php
$a = 1;
$b = 2;
function Suma()
{
global $a, $b;
$b = $a + $b;
}
Suma();
echo $b;
?>
El script anterior producirá la salida "3". Al declarar $a y $b globales dentro de la función, todas las referencias a tales variables se referirán a la versión global. No hay límite al número de variables globales que se pueden manipular dentro de una función.
Un segundo método para acceder a las variables desde un ámbito global es usando el array $GLOBALS. El ejemplo anterior se puede reescribir así:
Ejemplo #2 Uso de $GLOBALS en lugar de global
<?php
$a = 1;
$b = 2;
function Suma()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
Suma();
echo $b;
?>
El array $GLOBALS es un array asociativo con el nombre de la variable global como clave y los contenidos de dicha variable como el valor del elemento del array. $GLOBALS existe en cualquier ámbito, esto ocurre ya que $GLOBALS es una superglobal. Aquí hay un ejemplo que demuestra el poder de las superglobales:
Ejemplo #3 Ejemplo que demuestra las superglobales y el ámbito
<?php
function test_global()
{
// La mayoría de variables predefinidas no son "super" y requieren
// 'global' para estar disponibles al ámbito local de las funciones.
global $HTTP_POST_VARS;
echo $HTTP_POST_VARS['name'];
// Las superglobales están disponibles en cualquier ámbito y no
// requieren 'global'. Las superglobales están disponibles desde
// PHP 4.1.0, y ahora HTTP_POST_VARS se considera obsoleta.
echo $_POST['name'];
}
?>
Nota:
Utilizar una clave global fuera de una función no es un error. Esta puede ser utilizada aún si el fichero está incluido desde el interior de una función.
Otra característica importante del ámbito de las variables es la variable estática. Una variable estática existe sólo en el ámbito local de la función, pero no pierde su valor cuando la ejecución del programa abandona este ámbito. Consideremos el siguiente ejemplo:
Ejemplo #4 Ejemplo que demuestra la necesidad de variables estáticas
<?php
function test()
{
$a = 0;
echo $a;
$a++;
}
?>
Esta función tiene poca utilidad ya que cada vez que es llamada asigna a $a el valor 0 e imprime un "0". La sentencia $a++, que incrementa la variable, no sirve para nada, ya que en cuanto la función finaliza, la variable $a desaparece. Para hacer una función útil para contar, que no pierda la pista del valor actual del conteo, la variable $a debe declararse como estática:
Ejemplo #5 Ejemplo del uso de variables estáticas
<?php
function test()
{
static $a = 0;
echo $a;
$a++;
}
?>
Ahora, $a se inicializa únicamente en la primera llamada a la función, y cada vez que la función test() es llamada, imprimirá el valor de $a y lo incrementa.
Las variables estáticas también proporcionan una forma de manejar funciones recursivas. Una función recursiva es la que se llama a sí misma. Se debe tener cuidado al escribir una función recursiva, ya que puede ocurrir que se llame a sí misma indefinidamente. Hay que asegurarse de implementar una forma adecuada de terminar la recursión. La siguiente función cuenta recursivamente hasta 10, usando la variable estática $count para saber cuándo parar:
Ejemplo #6 Variables estáticas con funciones recursivas
<?php
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
?>
Nota:
Las variables estáticas pueden ser declaradas como se ha visto en los ejemplos anteriores. Al tratar de asignar valores a estas variables que sean el resultado de expresiones, causará un error de análisis sintáctico.
Ejemplo #7 Declaración de variables estáticas
<?php
function foo(){
static $int = 0; // correcto
static $int = 1+2; // incorrecto (ya que es una expresión)
static $int = sqrt(121); // incorrecto (es una expresión también)
$int++;
echo $int;
}
?>
Nota:
Las declaraciones estáticas son resueltas en tiempo de compilación.
Nota:
Utilizar una clave global fuera de una función no es un error. Esta pueda ser utilizada aún si el fichero está incluido en el interior de una función.
El motor Zend 1, utilizado por PHP 4, implementa los modificadores static y global para variables en términos de referencias. Por ejemplo, una variable global verdadera importada dentro del ámbito de una función con global crea una referencia a la variable global. Esto puede ser causa de un comportamiento inesperado, tal y como podemos comprobar en el siguiente ejemplo:
<?php
function prueba_referencia_global() {
global $obj;
$obj = &new stdclass;
}
function prueba_no_referencia_global() {
global $obj;
$obj = new stdclass;
}
prueba_referencia_global();
var_dump($obj);
prueba_no_referencia_global();
var_dump($obj);
?>
El resultado del ejemplo sería:
Un comportamiento similar se aplica a static. Las referencias no son almacenadas estáticamente.
<?php
function &obtener_instancia_ref() {
static $obj;
echo 'Objeto estático: ';
var_dump($obj);
if (!isset($obj)) {
// Asignar una referencia a la variable estática
$obj = &new stdclass;
}
$obj->property++;
return $obj;
}
function &obtener_instancia_no_ref() {
static $obj;
echo 'Objeto estático: ';
var_dump($obj);
if (!isset($obj)) {
// Asignar el objeto a la variable estática
$obj = new stdclass;
}
$obj->property++;
return $obj;
}
$obj1 = obtener_instancia_ref();
$aun_obj1 = obtener_instancia_ref();
echo "\n";
$obj2 = obtener_instancia_no_ref();
$aun_obj2 = obtener_instancia_no_ref();
?>
El resultado del ejemplo sería:
Este ejemplo demuestra que al asignar una referencia a una variable estática, esta no es recordada cuando se invoca la funcion &obtener_instancia_ref() por segunda vez.
A veces es conveniente tener nombres de variables variables. Dicho de otro modo, son nombres de variables que se pueden definir y usar dinámicamente. Una variable normal se establece con una sentencia como:
<?php
$a = 'hola';
?>
Una variable variable toma el valor de una variable y lo trata como el nombre de una variable. En el ejemplo anterior, hola, se puede usar como el nombre de una variable utilizando dos signos de dólar. Es decir:
<?php
$$a = 'mundo';
?>
En este momento se han definido y almacenado dos variables en el árbol de símbolos de PHP: $a, que contiene "hola", y $hola, que contiene "mundo". Es más, esta sentencia:
<?php
echo "$a ${$a}";
?>
produce el mismo resultado que:
<?php echo "$a $hola"; ?>
esto quiere decir que ambas producen el resultado: hola mundo.
Para usar variables variables con matrices, hay que resolver un problema de ambigüedad. Si se escribe $$a[1] el intérprete necesita saber si nos referimos a utilizar $a[1] como una variable, o si se pretendía utilizar $$a como variable y el índice [1] como índice de dicha variable. La sintaxis para resolver esta ambigüedad es: ${$a[1]} para el primer caso y ${$a}[1] para el segundo.
También se puede acceder a las propiedades de la clase usando el nombre de la variable de la propiedad. El nombre de la propiedad será resuelto según donde se hizo la llamada. Por ejemplo, en esta expresión $foo->$bar, de forma local en la clase se buscará por $bar y su valor será usado como el nombre de la propiedad de $foo. Esto también es cierto si $bar es un acceso a un array.
Ejemplo #1 Ejemplo de la propiedad variable
<?php
class foo {
var $bar = 'Soy bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "\n";
echo $foo->$baz[1] . "\n";
?>
El resultado del ejemplo sería:
Por favor tenga en cuenta que las variables variables no pueden usarse con las Matrices superglobales de PHP al interior de funciones o métodos de clase. La variable $this es también una variable especial que no puede ser referenciada dinámicamente.
Cuando se envía un formulario a un script PHP, las variables de dicho formulario pasan a estar automáticamente disponibles en el script gracias a PHP. Por ejemplo, consideremos el siguiente formulario:
Ejemplo #1 Variables de formulario simples
<form action="foo.php" method="post">
Nombre usuario: <input type="text" name="username" /><br />
Email: <input type="text" name="email" /><br />
<input type="submit" name="submit" value="¡Enviarme!" />
</form>
Dependiendo de su configuración y preferencias personales, existen muchas maneras de acceder a los datos de formularios HTML. Algunos ejemplos:
Ejemplo #2 Acceso a datos de un formulario simple HTML POST
<?php
// Disponible desde PHP 4.1.0
echo $_POST['username'];
echo $_REQUEST['username'];
import_request_variables('p', 'p_');
echo $p_username;
// Desde PHP 5.0.0, las variables predefinidas largas se pueden
// desactivar con la directiva register_long_arrays.
echo $HTTP_POST_VARS['username'];
// Disponible si la directiva de PHP register_globals = on. A partir de
// PHP 4.2.0 el valor predeterminado de register_globals = off.
// Usar o depender de este método no es recomendable.
echo $username;
?>
Usar un formulario GET es similar excepto en el uso de variables predefinidas, que en este caso serán del tipo GET. GET también se usa con QUERY_STRING (la información despues del símbolo '?' en una URL). Por ejemplo http://www.example.com/test.php?id=3 contiene datos GET que son accesibles con $_GET['id']. Vea también $_REQUEST e import_request_variables().
Nota:
Las matrices superglobales, como $_POST y $_GET, están disponibles desde PHP 4.1.0.
Nota:
Puntos y espacios en nombres de variable son convertidos a subguiones. Por ejemplo <input name="a.b" /> resulta $_REQUEST["a_b"].
Como hemos dicho, antes de PHP 4.2.0, el valor por omisión de register_globals era on (activado). La comunidad PHP recomienda no confiar en esta directiva ya que es preferible asumir que tiene el valor off (desactivada) y programar teniendo en cuenta esto.
Nota:
La directiva de configuración magic_quotes_gpc afecta a valores Get, Post y Cookie. Si está activada (on), el valor (It's "PHP!") será convertido automáticamente a (It\'s \"PHP!\"). El escape de caracteres es necesario en inserciones a bases de datos. Vea también addslashes(), stripslashes() y magic_quotes_sybase.
PHP también entiende arrays en el contexto de variables de formularios (vea la faq relacionada). Se puede, por ejemplo, agrupar juntas variables relacionadas o usar esta característica para obtener valores de una entrada "select" múltiple. Por ejemplo, vamos a mandar un formulario a sí mismo y a presentar los datos cuando se reciban:
Ejemplo #3 Variables de formulario más complejas
<?php
if ($_POST) {
echo '<pre>';
echo htmlspecialchars(print_r($_POST, true));
echo '</pre>';
}
?>
<form action="" method="post">
Nombre: <input type="text" name="personal[nombre]" /><br />
Email: <input type="text" name="personal[email]" /><br />
Cerveza: <br />
<select multiple name="cerveza[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
<option value="stuttgarter">Stuttgarter Schwabenbräu</option>
</select><br />
<input type="submit" value="¡enviarme!" />
</form>
Cuando se envía un formulario, es posible usar una imagen en vez del botón estándar "submit":
<input type="image" src="image.gif" name="sub" />
Cuando el usuario hace click en cualquier parte de la imagen, el formulario que la acompaña se transmitirá al servidor con dos variables adicionales, sub_x y sub_y. Éstas contienen las coordenadas del clic del usuario dentro de la imagen. Los más experimentados puede notar que los nombres de variable enviados por el navegador contienen un guión en vez de un subrayado (guión bajo), pero PHP convierte el guión en subrayado automáticamente.
PHP soporta cookies de HTTP de forma transparente tal y como están definidas en » RFC 6265. Las cookies son un mecanismo para almacenar datos en el navegador y así rastrear o identificar a usuarios que vuelven. Se pueden crear cookies usando la función setcookie(). Las cookies son parte de la cabecera HTTP, así que se debe llamar a la función SetCookie antes de que se envíe cualquier salida al navegador. Es la misma restricción que para la función header(). Los datos de una cookie están disponibles en el array con datos de cookies apropiada, tal como $_COOKIE, $HTTP_COOKIE_VARS y también en $_REQUEST. Vea la función setcookie() para más detalles y ejemplos.
Si se quieren asignar múltiples valores a una sola cookie, basta con asignarlo como un array. Por ejemplo:
<?php
setcookie("MiCookie[foo]", 'Prueba 1', time()+3600);
setcookie("MiCookie[bar]", 'Prueba 2', time()+3600);
?>
Esto creará dos cookies separadas aunque MiCookie será un array simple en el script. Si se quiere definir una sola cookie con valores múltiples, considere el uso de la función serialize() o explode() primero en el valor.
Nótese que una cookie reemplazará a una cookie anterior que tuviese el mismo nombre en el navegador a menos que la ruta o el dominio fuesen diferentes. Así, para una aplicación de carrito de compras se podría querer mantener un contador e ir pasándolo. Es decir:
Ejemplo #4 Un ejemplo de setcookie()
<?php
if (isset($_COOKIE['conteo'])) {
$conteo = $_COOKIE['conteo'] + 1;
} else {
$conteo = 1;
}
setcookie('conteo', $conteo, time()+3600);
setcookie("Carrito[$conteo]", $item, time()+3600);
?>
Típicamente, PHP no altera los nombres de las variables cuando se pasan a un script. Sin embargo, hay que notar que el punto no es un carácter válido en el nombre de una variable PHP. Para conocer la razón, considere el siguiente ejemplo:
<?php
$varname.ext; /* nombre de variable inválido */
?>
Por esta razón, es importante hacer notar que PHP reemplazará automáticamente cualquier punto en los nombres de variables de entrada por guiones bajos (subrayados).
Dado que PHP determina los tipos de las variables y los convierte (generalmente) según lo necesita, no siempre resulta obvio de qué tipo es una variable dada en un momento concreto. PHP incluye varias funciones que descubren de qué tipo es una variable: gettype(), is_array(), is_float(), is_int(), is_object(), y is_string(). Vea también el capítulo sobre Tipos.
Una constante es un identificador (nombre) para expresar un valor simple. Como el nombre sugiere, este valor no puede variar durante la ejecucción del script. (A excepción de las constantes predefinidas, que en realidad no son constantes). Una constante es sensible a mayúsculas por defecto. Por convención, los identificadores de contantes siempre suelen declararse en mayúsculas.
El nombre de una constante sigue las mismas reglas que cualquier otra etiqueta de PHP. Un nombre de constante válido empieza por una letra o subguión, seguido por cualquier número o letras, números o subguiones. Usando una expresión regular, se representaría de la siguiente manera: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
Vea también Guia de Entorno de Usuario para Nombres.
Ejemplo #1 Nombres de constantes correctos e incorrectos
<?php
// Nombre de constantes correctos
define("FOO", "something");
define("FOO2", "something else");
define("FOO_BAR", "something more");
// Nombres de constantes incorrectos
define("2FOO", "something");
// Esto es válido, pero debería ser evitado:
// Ya que quizá algún día PHP crea una constante mágica
// con el mismo nombre y en ese caso provocaría un error en tu script
define("__FOO__", "something");
?>
Nota: Para nuestros propósitos, entenderemos como letra los carácteres a-z, A-Z, y los ASCII del 127 hasta el 255 (0x7f-0xff).
Igual que las superglobals, el acceso a una constante es global. Se puede acceder a constantes desde cualquier sitio del script sin importar desde donde. Para más información en el acceso, lea el manual en la sección acceso a variables.
Se puede definir una constante usando la función define() o también declarándola fuera de la clase con const desde PHP 5.3.0. Una vez que la constante está definida, no puede ser cambiada o redifinida en ningún momento.
Solo se puede definir como constantes valores escalares (boolean, integer, float y string). Se puede definir resource en constantes, pero debería ser evitado, porque puede causar resultados inesperados.
Para obtener el valor de una constante solo es necesarios especificar su nombre. A diferencia de las variables, no se debe prefijar una constante con el signo $. También se puede usar la función constant() para leer el valor de una constante si se desea obtener el valor de una constante de forma dinámica. Use get_defined_constants() para obtener una lista de todas las constantes definidas.
Nota: Las contantes y las variables (globales) se encuentran en un espacio de nombres distinto. Esto implica que por ejemplo
TRUEy $TRUE son diferentes.
Si se usa una constante que todavía no está definida, PHP asume que se está refiriendo al nombre de la constante en si, igual que si fuera una string (CONSTANT vs "CONSTANT"). Cuando esto suceda, se mostrará un error de nivel E_NOTICE. Ver también la sección en el manual de porqué $foo[bar] es incorrecto (a no ser que primero define() bar como constante). Si simplemente quiere comprobar si una constante está definida, use la función defined().
Estas son las diferencias entre constantes y variables:
Ejemplo #1 Definiendo constantes
<?php
define("CONSTANT", "Hola mundo.");
echo CONSTANT; // muestra "Hola mundo."
echo Constant; // muestra "Constant" y provoca un error.
?>
Ejemplo #2 Definiendo constantes usando el keyword const
<?php
// Funciona desde PHP 5.3.0
const CONSTANT = 'Hola Mundo';
echo CONSTANT;
?>
Nota:
A diferencia de definir constantes usando define(), las constantes definidas con la palabra clave const deben declararse en el nivel superior del entorno de la aplicación porque se definen en tiempo de ejecución. Esto significa que no pueden declararse dentro de funciones, loops o declaraciones if.
Vea también Constantes de clase.
PHP ofrece un largo número de constantes predefinidas a cualquier script en ejecucción. Muchas de estas constantes, sin embargo, son creadas por diferentes extensiones, y sólo estarán presentes si dichas extensiones están disponibles, bien por carga dinámica o porque han sido compiladas.
Hay ocho constantes predefinidas que cambian dependiendo de donde son usadas.
Por ejemplo el valor de __LINE__ depende en la línea que
se use en el script. Estas constantes especiales son sensibles a mayúsculas
y son las siguientes:
| Nombre | Descripción |
|---|---|
__LINE__ |
Línea actual en el fichero. |
__FILE__ |
Ruta completa y nombre del fichero. Si se usa dentro de un include,
devolverá el nombre del fichero del include.
Desde PHP 4.0.2, __FILE__ siempre contiene la
ruta absoluta con symlinks resueltos, en otras versiones contenía
la ruta relativa según las circunstancias.
|
__DIR__ |
Directorio del fichero. Si se utiliza dentro de un include, devolverá el directorio del fichero incluído. Esta constante es igual que dirname(__FILE__). El nombre del directorio no lleva la barra inicial a no ser que esté en el directorio root. (Fue añadida en PHP 5.3.0) |
__FUNCTION__ |
Nombre de la función. (Añadida en PHP 4.3.0) Desde PHP 5 esta constante devuelve el nombre de la función donde fue declarada (sensible a mayúsculas). En PHP 4 su valor siempre es en minúsculas. |
__CLASS__ |
Nombre de la clase. (Añadida en PHP 4.3.0) Desde PHP 5 esta constante devuelve el nombre de la clase donde fue declarada (sensible a mayúsculas). En PHP 4 su valor siempre es en minúsculas. El nombre de la clase incluye el namespace declarado en (p.e.j. Foo\Bar). Tenga en cuenta que a partir de PHP 5.4 __CLASS__ también funciona con traits. Cuando es usado en un método trait, __CLASS__ es el nombre de la clase del trait que está siendo utilizado. |
__TRAIT__ |
El nombre de el trait. (Añadido en PHP 5.4.0) A partir de PHP 5.4 esta constante devuelve el trait que fué declarado (sensible a mayúsculas y minúsculas). El nombre de el trait incluye el namespace si alguno fué declarado en (p.e.j. Foo\Bar). |
__METHOD__ |
Nombre del método de la clase. (Añadida en PHP 5.0.0.) Nombre del método devuelto donde fue declarada. (sensible a mayúsculas). |
__NAMESPACE__ |
Nombre del espacio de nombres actual (sensible a mayúsculas). Esta constante se define en tiempo de compilación (Añadida en PHP 5.3.0) El nombre del namespace actual (sensible a mayúsculas). |
Véase también get_class(), get_object_vars(), file_exists() y function_exists().
La expresiones son las piedras de construcción más importantes de PHP. En PHP casi todo lo que se escribe es una expresión. La manera más simple y acertada de definir lo que es una expresión es "cualquier cosa que tiene un valor".
Las formas más básicas de expresiones son las constantes y las variables. Cuando se escribe "$a = 5", se está asignando '5' a $a. '5', obviamente, tiene el valor 5, o en otras palabras, '5' es una expresión con el valor de 5 (en este caso, '5' es una constante entera).
Después de esta asignación, se espera que el valor de $a sea 5 también, por lo que si se escribe $b = $a, se espera que esto se comporte tal como si se escribiera $b = 5. En otras palabras, $a es también una expresión con el valor 5. Si todo funciona bien, esto es exactamente lo que sucederá.
Un ejemplo de expresiones algo más complejo son las funciones. Por ejemplo, considere la siguiente función:
<?php
function foo ()
{
return 5;
}
?>
Asumiendo que está familiarizado con el concepto de función (si no lo está, échele una ojeada al capítulo sobre funciones), asumirá que escribir $c = foo() es esencialmente igual que escribir $c = 5. Y está en lo cierto. Las funciones son expresiones con el valor de sus valores devueltos. Ya que foo() devuelve 5, el valor de la expresión 'foo()' es 5. Normalmente las funciones no sólo devuelven un valor estático, sino que computan algo.
Por supuesto, los valores en PHP no tienen que ser enteros, y con frecuencia no lo son. PHP soporta cuatro tipos de valores escalares: valores enteros (integer), valores de coma (punto) flotante (float), valores de cadena (string) y valores booleanos (boolean) - (valores escalares son aquellos que no se pueden descomponer en piezas más pequeñas, a diferencia de las matrices, por ejemplo). PHP también soporta dos tipos compuestos (no escalares): matrices (arrays) y objetos. Cada uno de estos tipos de valores pueden ser asignados a variables o devueltos desde funciones.
PHP lleva las expresiones mucho más allá, de la misma manera que lo hacen otros lenguajes. PHP es un lenguaje orientado a expresiones, en el sentido de que casi todo es una expresión. Considere el ejemplo que ya hemos tratado, '$a = 5'. Es fácil de ver que aquí hay dos valores involucrados, el valor de la constante entera '5', y el valor de $a que ha sido actualizado a 5 también. Aunque la verdad es que existe aquí un valor adicional involucrado, que es el valor de la asignación misma. La asignación evalúa al valor asignado, en este caso 5. En la práctica, esto significa que '$a = 5', sin importar lo que haga, es una expresión con el valor 5. De este modo, escribir algo como '$b = ($a = 5)' es igual que escribir '$a = 5; $b = 5;' (el punto y coma marca el final de una sentencia). Ya que las asignaciones se analizan de derecha a izquierda, también se puede escribir '$b = $a = 5'.
Otro buen ejemplo de orientación a expresiones es el pre- y post-incremento y decremento. Los usuarios de PHP y de otros muchos lenguajes pueden estar familiarizados con la notación variable++ y variable--. Éstos son los operadores de incremento y decremento. En PHP, al igual que en C, hay dos tipos de incrementos - pre-incremento y post-incremento. Ambos esencialmente incrementan la variable, y el efecto sobre la variable es idéntico. La diferencia está con el valor de la expresión de incremento. Pre-incremento, que se escribre '++$variable', evalúa al valor incrementado (PHP incrementa la variable antes de leer su valor, de ahí el nombre de 'pre-incremento'). Post-incremento, que se escribe '$variable++' evalúa el valor original de $variable, antes de que sea incrementado (PHP incrementa la variable después de leer su valor, de ahí el nombre de 'post-incremento').
Un tipo de expresiones muy comunes son las expresiones de comparación.
Estas expresiones evalúan si algo es FALSE (falso) o TRUE (verdadero). PHP
soporta > (mayor que), >= (mayor o igual que), == (igual),
!= (distinto), < (menor que) y <= (menor o igual que).
El lenguaje también soporta un conjunto de operadores de equivalencia estricta: ===
(igual y del mismo tipo) y !== (diferente o de distinto tipo).
Estas expresiones se usan mayormente dentro de ejecuciones condicionales,
tales como la sentencia if.
El último ejemplo de expresiones que trataremos aquí es una combinación de expresiones operador-asignación. Ya sabe que si quiere incrementar $a en 1, puede simplemente escribir '$a++' o '++$a'. Pero si lo que quiere es añadirle más de uno, por ejemplo 3, podría escribir '$a++' varias veces, pero esto, obviamente, no es una manera muy eficiente o cómoda. Una práctica mucho más común es escribir '$a = $a + 3'. '$a + 3' evalúa al valor de $a más 3, y se vuelve a asignar a $a, lo que resulta en incrementar $a en 3. En PHP, como en otros lenguajes como C, se puede escribir esto de una manera más abreviada, lo que con el tiempo se podría convertir en una forma más clara y rápida de entenderlo. Añadir 3 al valor actual de $a puede ser escrito '$a += 3'. Esto significa exactamente "toma el valor de $a, añádele 3 y asígnalo de nuevo a $a". Además de ser más corto y claro, también resulta en una ejecución más rápida. El valor de '$a += 3', al igual que el valor de una asignación normal, es el valor asignado. Observe que NO es 3, sino el valor combinado de $a más 3 (éste es el valor que es asignado a $a). Se puede usar cualquier operador compuesto de dos partes en este modo de operador-asignación, por ejemplo '$a -= 5' (restar 5 del valor de $a), '$b *= 7' (multiplicar el valor de $b por 7), etc.
Existe una expresión más que le puede parecer rara si no la ha visto en otros lenguajes, el operador condicional ternario:
<?php
$primero ? $segundo : $tercero
?>
Si el valor de la primera subexpresión es TRUE (no es cero),
se evalúa la segunda subexpresión, y ése será el resultado de
la expresión condicional. Si no, se evalúa la tercera
subexpresión, y ése será el valor.
El siguiente ejemplo debería ayudarle a comprender un poco mejor el pre- y post-incremento y las expresiones en general:
<?php
function doble($i)
{
return $i*2;
}
$b = $a = 5; /* asignar el valor cinco a la variable $a y $b */
$c = $a++; /* post-incremento, asignar el valor original de $a
(5) a $c */
$e = $d = ++$b; /* pre-incremento, asignar el valor incrementado de
$b (6) a $d y $e */
/* en este punto, $d y $e son iguales a 6 */
$f = doble($d++); /* asignar el doble del valor de $d antes
del incremento, 2*6 = 12, a $f */
$g = doble(++$e); /* asignar el doble del valor de $e después
del incremento, 2*7 = 14, a $g */
$h = $g += 10; /* primero, $g es incrementado en 10 y finaliza con el
valor 24. El valor de la asignación (24) es
asignado después a $h, y $h finaliza también con el
valor 24. */
?>
Algunas expresiones pueden considerarse como sentencias. En este caso, una sentencia tiene la forma 'expr ;', es decir, una expresión seguida de un punto y coma. En '$b = $a = 5;', '$a = 5' es una expresión válida, pero no es una sentencia en sí. Sin embargo, '$b = $a = 5;' es una sentencia válida.
Lo último que vale la pena mencionar es el valor verdadero de las expresiones.
En muchos casos, principalmente en ejecuciones condicionales y bucles, no
interesa saber el valor específico de la expresión, sino sólo
si el valor significa TRUE o FALSE.
Las constantes TRUE y FALSE (insensible a mayúsculas-minúsculas) son los
dos valores booleanos posibles. Cuando es necesario, una expresión es
convertida automáticamente al tipo boolean. Véase la
sección sobre
conversión de tipos para más detalles.
PHP proporciona una implementación completa y potente de expresiones, y documentarla por completo va más allá del ámbito de este manual. Los ejemplos de arriba deberían darle una buena idea de lo que son las expresiones y cómo construir expresiones útiles. Durante el resto de este manual se escribirá expr para indicar cualquier expresión de PHP válida.
Un operador es algo que toma uno más valores (o expresiones, en jerga de programación) y produce otro valor (de modo que la construcción en si misma se convierte en una expresión).
Los operadores se pueden agrupar de acuerdo con el número de valores que toman. Los operadores unarios toman sólo un valor, por ejemplo ! (el operador lógico de negación) o ++ (el operador de incremento). Los operadores binarios toman dos valores, como los familiares operadores aritméticos + (suma) y - (resta), y la mayoría de los operadores de PHP entran en esta categoría. Finalmente, hay sólo un operador ternario, ? :, el cual toma tres valores; usualmente a este se le refiere simplemente como "el operador ternario" (aunque podría tal vez llamarse más correctamente como el operador condicional).
Una lista completa de operadores de PHP sigue en la sección Precedencia de Operadores. Está también explica la precedencia y asociatividad, las cuales gobiernan exactamente como son evaluadas expresiones que contienen varios diferentes operadores.
La precedencia de un operador indica qué tan "estrechamente" se unen dos expresiones juntas. Por ejemplo, en la expresión 1 + 5 * 3 , la respuesta es 16 y no 18 porque el operador de multiplicación ("*") tiene una precedencia mayor que el operador de adición ("+"). Los paréntesis pueden ser usados para forzar la precedencia, si es necesario. Por ejemplo: (1 + 5) * 3 se evalúa como 18.
Cuando los operadores tienen la misma precedencia, su asociatividad decide si se evalúan a partir de la derecha o desde la izquierda - ver más abajo los ejemplos.
La siguiente tabla lista en orden la precedencia de los operadores, con los operadores de mayor precedencia en la parte superior. Los operadores en la misma línea tienen la misma precedencia, en cuyo caso su asociatividad decide cuál es el orden de evaluación.
| Asociatividad | Operadores | Información adicional |
|---|---|---|
| no asociativo | clone new | clone and new |
| izquierda | [ | array() |
| no asociativo | ++ -- | incremento/decremento |
| derecha | ~ - (int) (float) (string) (array) (object) (bool) @ | tipos |
| no asociativo | instanceof | tipos |
| derecha | ! | lógico |
| izquierda | * / % | aritmética |
| izquierda | + - . | aritmética y string |
| izquierda | << >> | bit a bit |
| no asociativo | < <= > >= <> | comparación |
| no asociativo | == != === !== | comparación |
| izquierda | & | bit a bit y referencias |
| izquierda | ^ | bit a bit |
| izquierda | | | bit a bit |
| izquierda | && | lógico |
| izquierda | || | lógico |
| izquierda | ? : | ternario |
| derecha | = += -= *= /= .= %= &= |= ^= <<= >>= => | asignación |
| izquierda | and | lógico |
| izquierda | xor | lógico |
| izquierda | or | lógico |
| izquierda | , | muchos usos |
Para operadores de igual precedencia, asociatividad izquierda significa que la evaluación procede de la izquierda a la derecha y asociatividad derecha significa lo opuesto.
Ejemplo #1 Asociatividad
<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2
$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
// mezclar ++ y + produce un comportamiento indefinido
$a = 1;
echo ++$a + $a++; // puede mostrar 4 o 5
?>
Nota:
Aunque = tiene una precedencia menor que la mayoría de los demás operadores, PHP permitirá aun expresiones similares a lo siguiente: if (!$a = foo()), en cuyo caso el valor devuelto de foo() es puesto en $a.
¿Recuerda la aritmética básica de la escuela? Estos funcionan igual que aquellos.
| Ejemplo | Nombre | Resultado |
|---|---|---|
| -$a | Negación | Opuesto de $a. |
| $a + $b | Adición | Suma de $a y $b. |
| $a - $b | Sustracción | Diferencia de $a y $b. |
| $a * $b | Multiplicación | Producto de $a y $b. |
| $a / $b | División | Cociente de $a y $b. |
| $a % $b | Módulo | Resto de $a dividido por $b. |
El operador de división ("/") devuelve un valor flotante a menos que los dos operandos sean integers (o strings que se conviertan a integers) y los números sean divisibles, en cuyo caso será devuelto un valor integer.
Los operandos del módulo se convierten en integers (por extracción de la parte decimal) antes del procesamiento.
El resultado del operador módulo % tiene el mismo signo que el dividendo — es decir, el resultado de $a % $b tendrá el mismo signo que $a. Por ejemplo:
<?php
echo (5 % 3)."\n"; // muestra 2
echo (5 % -3)."\n"; // muestra 2
echo (-5 % 3)."\n"; // muestra -2
echo (-5 % -3)."\n"; // muestra -2
?>
Véase también la página del manual sobre funciones matemáticas.
El operador básico de asignación es "=". Se podría inclinar a pensar primero que es como un "igual a". No lo es. Realmente significa que el operando de la izquierda se establece con el valor de la expresión de la derecha (es decir, "se define como").
El valor de una expresión de asignación es el valor asignado. Es decir, el valor de "$a = 3" es de 3. Esto permite hacer algunas cosas intrincadas:
<?php
$a = ($b = 4) + 5; // ahora $a es igual a 9 y $b se ha establecido en 4.
?>
Para arrays, asignar un valor a una clave con nombre se realiza utilizando el operador "=>". La precedencia de este operador es la misma que otros operadores de asignación.
Además del operador básico de asignación, existen "operadores combinados" para todos los de aritmética binaria, unión de arrays y operadores de strings que permiten usar un valor en una expresión y entonces establecer su valor como el resultado de esa expresión. Por ejemplo:
<?php
$a = 3;
$a += 5; // establece $a en 8, como si se hubiera dicho: $a = $a + 5;
$b = "Hola ";
$b .= "ahí!"; // establece $b en "Hola ahí!", al igual que $b = $b . "ahí!";
?>
Tener en cuenta que la asignación copia la variable original en la nueva (asignación por valor), por lo que los cambios en una no afectarán a la otra. Esto también puede tener relevancia si se necesita copiar algo como un gran array dentro de un bucle estrecho.
Una excepción al comportamiento usual de la asignación por valor en PHP ocurre con objects los cuales son asignados por referencia en PHP 5. Los objetos pueden ser explícitamente copiados por medio de la palabra clave clone.
La asignación por referencia también está soportada, utilizando la sintaxis "$var = &$othervar;". Asignación por referencia significa que ambas variables terminan apuntando a los mismos datos y nada es copiado en ninguna parte.
Ejemplo #1 Asignación por referencia
<?php
$a = 3;
$b = &$a; // $b es una referencia para $a
print "$a\n"; // muestra 3
print "$b\n"; // muestra 3
$a = 4; // cambia $a
print "$a\n"; // muestra 4
print "$b\n"; // muestra 4 también, dado que $b es una referencia para $a, la cual ha
// sido cambiada
?>
Desde PHP 5, el operador new
retorna una referencia automáticamente, así que asignar el resultado de
new por referencia, resulta
en un mensaje E_DEPRECATED en PHP 5.3 y posteriores y
un mensaje E_STRICT en versiones anteriores.
Por ejemplo, éste código resultará en una advertencia:
<?php
class C {}
/* La siguiente línea genera el siguiente mensaje de error:
* Deprecated: Assigning the return value of new by reference is deprecated in...
*/
$o = &new C;
?>
Más información sobre referencias y sus usos potenciales se puede encontrar en la sección del manual Referencias Explicadas
Los operadores bit a bit permiten la evaluación y la manipulación de bits específicos dentro de un integer.
| Ejemplo | Nombre | Resultado |
|---|---|---|
$a & $b |
And (y) | Los bits que están activos en ambos $a y $b son activados. |
$a | $b |
Or (o inclusivo) | Los bits que están activos ya sea en $a o en $b son activados. |
$a ^ $b |
Xor (o exclusivo) | Los bits que están activos en $a o en $b, pero no en ambos, son activados. |
~ $a |
Not (no) | Los bits que están activos en $a son desactivados, y viceversa. Bits that are set in $a are not set, and vice versa. |
$a << $b |
Shift left(desplazamiento a izquierda) | Desplaza los bits de $a, $b pasos a la izquierda (cada paso quiere decir "multiplicar por dos"). |
$a >> $b |
Shift right (desplazamiento a derecha) | Desplaza los bits de $a, $b pasos a la derecha (cada paso quiere decir "dividir por dos"). |
El desplazamiento de bits en PHP es aritmético. Los bits desplazados por fuera de cualquiera de los extremos son descartados. Desplazamientos de izquierda tienen ceros desplazados a la derecha mientras que el bit de signo es desplazado fuera a la izquierda, es decir que no se conserva el signo de un operando. Desplazamientos a la derecha tienen copias del bit de signo desplazado a la izquierda, es decir que se conserva el signo de un operando.
Utilice paréntesis para garantizar la precedencia deseada. Por ejemplo, $a & $b == true evalúa la equivalencia y luego el bit a bit, mientras que ($a & $b) == true evalúa el bit a bit y luego la equivalencia.
Sea consciente de las conversiones de tipos de datos. Si tanto los parámetros de la izquierda como los de la derecha son cadenas, el operador bit a bit operará en los valores ASCII de los caracteres.
La configuración error_reporting del PHP ini utiliza valores de bit a bit,
lo que ofrece una demostración del mundo real de desactivar
bits. Para mostrar todos los errores, a excepción de los avisos,
las instrucciones del archivo php.ini dicen utilizar:
E_ALL & ~E_NOTICE
Esto funciona iniciando con E_ALL: 00000000000000000111011111111111 Luego se toma el valor de E_NOTICE ... 00000000000000000000000000001000 ... y se invierte por medio de ~: 11111111111111111111111111110111 Finalmente, se utiliza AND (&) para encontrar los bits que se activaron en ambos valores: 00000000000000000111011111110111
Otra forma de lograrlo es mediante XOR (^)
para encontrar los bits que están activados en sólo el primer valor o en el otro:
E_ALL ^ E_NOTICE
error_reporting también se puede utilizar para demostrar la activación de bits.
La forma para mostrar sólo los errores y los errores recuperables es:
E_ERROR | E_RECOVERABLE_ERROR
Este proceso combina E_ERROR 00000000000000000000000000000001 y 00000000000000000001000000000000 usando el operador OR (|) para obtener los bits activados en cualquiera de estos valores: 00000000000000000001000000000001
Ejemplo #1 Operaciones AND, OR y XOR bit a bit sobre integers
<?php
/*
* Ignore la sección superior,
* es sólo el formateado para hacer la salida más clara.
*/
$format = '(%1$2d = %1$04b) = (%2$2d = %2$04b)'
. ' %3$s (%4$2d = %4$04b)' . "\n";
echo <<<EOH
--------- --------- -- ---------
resultado valor op prueba
--------- --------- -- ---------
EOH;
/*
* Aquí están los ejemplos.
*/
$values = array(0, 1, 2, 4, 8);
$test = 1 + 4;
echo "\n AND bit a bit \n";
foreach ($values as $value) {
$result = $value & $test;
printf($format, $result, $value, '&', $test);
}
echo "\n OR inclusivo bit a bit \n";
foreach ($values as $value) {
$result = $value | $test;
printf($format, $result, $value, '|', $test);
}
echo "\n OR exclusivo (XOR) bit a bit \n";
foreach ($values as $value) {
$result = $value ^ $test;
printf($format, $result, $value, '^', $test);
}
?>
El resultado del ejemplo sería:
--------- --------- -- --------- resultado valor op prueba --------- --------- -- --------- AND bit a bit ( 0 = 0000) = ( 0 = 0000) & ( 5 = 0101) ( 1 = 0001) = ( 1 = 0001) & ( 5 = 0101) ( 0 = 0000) = ( 2 = 0010) & ( 5 = 0101) ( 4 = 0100) = ( 4 = 0100) & ( 5 = 0101) ( 0 = 0000) = ( 8 = 1000) & ( 5 = 0101) OR inclusivo bit a bit ( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101) ( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101) ( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101) (13 = 1101) = ( 8 = 1000) | ( 5 = 0101) OR exclusivo (XOR) bit a bit ( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101) ( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101) ( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101) (13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101)
Ejemplo #2 Operaciones XOR bit a bit sobre strings
<?php
echo 12 ^ 9; // Sale '5'
echo "12" ^ "9"; // Sale el caracter de retroceso (ascii 8)
// ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8
echo "hallo" ^ "hello"; // Salen los valores ascii #0 #4 #0 #0 #0
// 'a' ^ 'e' = #4
echo 2 ^ "3"; // Sale 1
// 2 ^ ((int)"3") == 1
echo "2" ^ 3; // Sale 1
// ((int)"2") ^ 3 == 1
?>
Ejemplo #3 Desplazamiento de bits sobre integers
<?php
/*
* Aquí están los ejemplos.
*/
echo "\n--- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS POSITIVOS ---\n";
$val = 4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copia del bit de signo desplazado hacia el lado izquierdo');
$val = 4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places);
$val = 4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'bits desplazados fuera del lado derecho');
$val = 4;
$places = 4;
$res = $val >> $places;
p($res, $val, '>>', $places, 'mismo resultado que arriba; no se puede desplazar más allá del 0');
echo "\n--- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS NEGATIVOS ---\n";
$val = -4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copia del bit de signo desplazado al lado izquierdo');
$val = -4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places, 'bits desplazados fuera del lado derecho');
$val = -4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'mismo resultado que arriba; no se puede desplazar más allá del -1');
echo "\n--- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS POSITIVOS ---\n";
$val = 4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'ceros rellenan en el lado derecho');
$val = 4;
$places = (PHP_INT_SIZE * 8) - 4;
$res = $val << $places;
p($res, $val, '<<', $places);
$val = 4;
$places = (PHP_INT_SIZE * 8) - 3;
$res = $val << $places;
p($res, $val, '<<', $places, 'bit de signo resulta desplazado fuera');
$val = 4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'bit de signo desplazado fuera del lado izquierdo');
echo "\n--- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS NEGATIVOS ---\n";
$val = -4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'ceros rellenan en el lado derecho');
$val = -4;
$places = (PHP_INT_SIZE * 8) - 3;
$res = $val << $places;
p($res, $val, '<<', $places);
$val = -4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'bits desplazados fuera del lado izquierdo, incluyendo el bit de signo');
/*
* Ignore this bottom section,
* it is just formatting to make output clearer.
*/
function p($res, $val, $op, $places, $note = '') {
$format = '%0' . (PHP_INT_SIZE * 8) . "b\n";
printf("Expression: %d = %d %s %d\n", $res, $val, $op, $places);
echo " Decimal:\n";
printf(" val=%d\n", $val);
printf(" res=%d\n", $res);
echo " Binary:\n";
printf(' val=' . $format, $val);
printf(' res=' . $format, $res);
if ($note) {
echo " NOTE: $note\n";
}
echo "\n";
}
?>
El resultado del ejemplo en equipos de 32 bits sería:
--- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS POSITIVOS --- Expression: 2 = 4 >> 1 Decimal: val=4 res=2 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000010 NOTE: copia del bit de signo desplazado hacia el lado izquierdo Expression: 1 = 4 >> 2 Decimal: val=4 res=1 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000001 Expression: 0 = 4 >> 3 Decimal: val=4 res=0 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000000 NOTE: bits desplazados fuera del lado derecho Expression: 0 = 4 >> 4 Decimal: val=4 res=0 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000000 NOTE: mismo resultado que arriba; no se puede desplazar más allá del 0 --- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS NEGATIVOS --- Expression: -2 = -4 >> 1 Decimal: val=-4 res=-2 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111110 NOTE: copia del bit de signo desplazado al lado izquierdo Expression: -1 = -4 >> 2 Decimal: val=-4 res=-1 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111111 NOTE: bits desplazados fuera del lado derecho Expression: -1 = -4 >> 3 Decimal: val=-4 res=-1 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111111 NOTE: mismo resultado que arriba; no se puede desplazar más allá del -1 --- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS POSITIVOS --- Expression: 8 = 4 << 1 Decimal: val=4 res=8 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000001000 NOTE: ceros rellenan en el lado derecho Expression: 1073741824 = 4 << 28 Decimal: val=4 res=1073741824 Binary: val=00000000000000000000000000000100 res=01000000000000000000000000000000 Expression: -2147483648 = 4 << 29 Decimal: val=4 res=-2147483648 Binary: val=00000000000000000000000000000100 res=10000000000000000000000000000000 NOTE: bit de signo resulta desplazado fuera Expression: 0 = 4 << 30 Decimal: val=4 res=0 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000000 NOTE: bit de signo desplazado fuera del lado izquierdo --- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS NEGATIVOS --- Expression: -8 = -4 << 1 Decimal: val=-4 res=-8 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111000 NOTE: ceros rellenan en el lado derecho Expression: -2147483648 = -4 << 29 Decimal: val=-4 res=-2147483648 Binary: val=11111111111111111111111111111100 res=10000000000000000000000000000000 Expression: 0 = -4 << 30 Decimal: val=-4 res=0 Binary: val=11111111111111111111111111111100 res=00000000000000000000000000000000 NOTE: bits desplazados fuera del lado izquierdo, incluyendo el bit de signo
El resultado del ejemplo en equipos de 64 bits sería:
--- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS POSITIVOS --- Expression: 2 = 4 >> 1 Decimal: val=4 res=2 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000010 NOTE: copia del bit de signo desplazado hacia el lado izquierdo Expression: 1 = 4 >> 2 Decimal: val=4 res=1 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000001 Expression: 0 = 4 >> 3 Decimal: val=4 res=0 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: bits desplazados fuera del lado derecho Expression: 0 = 4 >> 4 Decimal: val=4 res=0 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: mismo resultado que arriba; no se puede desplazar más allá del 0 --- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS NEGATIVOS --- Expression: -2 = -4 >> 1 Decimal: val=-4 res=-2 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111110 NOTE: copia del bit de signo desplazado al lado izquierdo Expression: -1 = -4 >> 2 Decimal: val=-4 res=-1 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 NOTE: bits desplazados fuera del lado derecho Expression: -1 = -4 >> 3 Decimal: val=-4 res=-1 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 NOTE: mismo resultado que arriba; no se puede desplazar más allá del -1 --- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS POSITIVOS --- Expression: 8 = 4 << 1 Decimal: val=4 res=8 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000001000 NOTE: ceros rellenan en el lado derecho Expression: 4611686018427387904 = 4 << 60 Decimal: val=4 res=4611686018427387904 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0100000000000000000000000000000000000000000000000000000000000000 Expression: -9223372036854775808 = 4 << 61 Decimal: val=4 res=-9223372036854775808 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=1000000000000000000000000000000000000000000000000000000000000000 NOTE: bit de signo resulta desplazado fuera Expression: 0 = 4 << 62 Decimal: val=4 res=0 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: bit de signo desplazado fuera del lado izquierdo --- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS NEGATIVOS --- Expression: -8 = -4 << 1 Decimal: val=-4 res=-8 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111000 NOTE: ceros rellenan en el lado derecho Expression: -9223372036854775808 = -4 << 61 Decimal: val=-4 res=-9223372036854775808 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1000000000000000000000000000000000000000000000000000000000000000 Expression: 0 = -4 << 62 Decimal: val=-4 res=0 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: bits desplazados fuera del lado izquierdo, incluyendo el bit de signo
No desplazar a la derecha más de 32 bits en sistemas de 32 bits. No desplazar a la izquierda en caso de que resulte en un número más largo de 32 bits. Usar funciones de la extensión gmp para manipulación bit a bit sobre números más allá de PHP_INT_MAX.
Ver también pack(), unpack(), gmp_and(), gmp_or(), gmp_xor(), gmp_testbit(), gmp_clrbit()
Los operadores de comparación, como su nombre lo indica, permiten comparar dos valores. Puede también estar interesado en ver las tablas de comparación de tipos, ya que muestran ejemplos de las varias comparaciones relacionadas con tipos.
| Ejemplo | Nombre | Resultado |
|---|---|---|
| $a == $b | Igual | TRUE si $a es igual a $b después de la manipulación de tipos. |
| $a === $b | Idéntico |
TRUE si $a es igual a $b, y son del mismo
tipo.
|
| $a != $b | Diferente | TRUE si $a no es igual a $b después de la manipulación de tipos. |
| $a <> $b | Diferente | TRUE si $a no es igual a $b después de la manipulación de tipos. |
| $a !== $b | No idéntico |
TRUE si $a no es igual a $b, o si no son del mismo
tipo.
|
| $a < $b | Menor que | TRUE si $a es estrictamente menor que $b. |
| $a > $b | Mayor que | TRUE si $a es estrictamente mayor que $b. |
| $a <= $b | Menor o igual que | TRUE si $a es menor o igual que $b. |
| $a >= $b | Mayor o igual que | TRUE si $a es mayor o igual que $b. |
Si se compara un número con un string o la comparación implica strings numéricos, entonces cada string es convertido en un número y la comparación realizada numéricamente. Estas reglas también se aplican a la sentencia switch. La conversión de tipo no tiene lugar cuando la comparación es === o !== ya que esto involucra comparar el tipo así como el valor.
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
switch ("a") {
case 0:
echo "0";
break;
case "a": // nunca alcanzado debido a que "a" ya ha coincidido con 0
echo "a";
break;
}
?>
Para varios tipos, la comparación se realiza de acuerdo a la siguiente tabla (en orden).
| Tipo de operando 1 | Tipo de operando 2 | Resultado |
|---|---|---|
| null o string | string | Convierte NULL en "", comparación numérica o léxica |
| bool o null | cualquiera | Convierte en bool, FALSE < TRUE |
| object | object | Las clases internas pueden definir su propia comparación, diferentes clases son incomparables, la misma clase - comparan propiedades en la misma forma que los arrays (PHP 4), PHP 5 tiene su propia explicación |
| string, resource o number | string, resource o number | Traducir las cadenas y recursos a números, matemática usual |
| array | array | Un array con menos elementos es menor, si una clave del operando 1 no se encuentra en el operando 2 entonces los arrays son incomparables, de otra forma - compara valor por valor (ver el siguiente ejemplo) |
| array | cualquiera | array es siempre mayor |
| object | cualquiera | object es siempre mayor |
Ejemplo #1 Transcripción de la comparación estándar de arrays
<?php
// Arrays son comparados de esta forma con los operadores de comparación estándar
function standard_array_compare($op1, $op2)
{
if (count($op1) < count($op2)) {
return -1; // $op1 < $op2
} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return null; // uncomparable
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
?>
Ver también strcasecmp(), strcmp(), operadores de array, y la sección del manual sobre tipos.
Debido a la forma en que son representados internamente los floats, no se deben probar por igualdad dos floats.
Ver la documentación de float para más información.
Otro operador condicional es el operador "?:" (o ternario).
Ejemplo #2 Asignación de un valor predeterminado
<?php
// Ejemplo de uso para: Operador Ternario
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// Lo anterior es idéntico a esta sentencia if/else
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
TRUE y a
expr3 si
expr1 se evalúa como FALSE.
A partir de PHP 5.3, es posible dejar de lado la parte media del operador
ternario. La expresión expr1 ?: expr3 retorna
expr1 si expr1
se evalúa como TRUE y expr3 si es de otra manera.
Nota: Por favor note que el operador ternario es una sentencia, y que no evalúa a una variable, pero si al resultado de una sentencia. Esto es importante saberlo si se desea retornar una variable por referencia. La sentencia return $var == 42 ? $a : $b; en una función con retorno-por-referencia no funcionará por lo que se ha mencionado y una advertencia es generada en versiones posteriores de PHP.
Nota:
Es recomendable evitar el "apilamiento" expresiones ternarias. El comportamiento de PHP al utilizar más de un operador ternario en una única sentencia no es evidente:
Ejemplo #3 Comportamiento Ternario poco obvio
<?php
// a primera vista, lo siguiente parece tener la salida de 'true'
echo (true?'true':false?'t':'f');
// sin embargo, la salida real de lo anterior es 't'
// esto se debe a que las expresiones ternarias se evalúan de izquierda a derecha
// la siguiente es una versión más obvia del mismo código anterior
echo ((true ? 'true' : false) ? 't' : 'f');
// aquí, se puede ver que la primera expresión es evaluada como 'true', que
// a su vez se evalúa como (bool)true, retornando así la rama verdadera de la
// segunda expresión ternaria.
?>
PHP soporta un operador de control de errores: el signo de arroba (@). Cuando se antepone a una expresión en PHP, cualquier mensaje de error que pueden ser generado por esa expresión será ignorado.
Si se ha establecido una función de controlador de errores personalizado con set_error_handler() entonces todavía será llamada, pero este controlador de errores personalizado puede (y debe) llamar a error_reporting() el cual devolverá 0 cuando la llamada que provocó el error fue precedida por el signo @.
Si la propiedad track_errors está activada, cualquier mensaje de error generado por la expresión será guardada en la variable $php_errormsg. Esta variable se sobrescribe en cada error, así que se debe comprobar antes si se desea utilizar.
<?php
/* Error intencional de archivo */
$my_file = @file ('non_existent_file') or
die ("La apertura de archivo ha fallado: el error fue '$php_errormsg'");
// esto funciona con cualquier expresión, no solo con funciones:
$value = @$cache[$key];
// no producirá una anotación si el índice $key no existe.
?>
Nota: El operador @ trabaja sólo sobre expresiones. Una simple regla de oro es: si se puede tomar el valor de algo, entonces se le puede anteponer el operador @. Por ejemplo, puede anteponerse a variables, a llamadas a funciones e includes, constantes y así sucesivamente. No puede anteponerse a definiciones de función o clase, ni a estructuras condicionales como if y foreach, y así sucesivamente.
Ver también error_reporting() y la sección del manual sobre funciones de Manejo de Errores y Registros.
En la actualidad, el operador de prefijo "@" para control de errores deshabilitará incluso el reporte de errores en casos de fallos críticos que terminarán la ejecución del script. Entre otras cosas, esto quiere decir que si se usa "@" para eliminar los errores de una cierta función y ésta no se encuentra disponible o ha sido escrita de forma incorrecta, el script se detendrá en ese punto sin indicación de por qué.
PHP soporta un operador de ejecución: las comillas invertidas (``). ¡Note que estas no son las comillas sencillas! PHP intentará ejecutar el contenido entre las comillas invertidas como si se tratara de un comando del shell; la salida será retornada (es decir, no será simplemente volcada como salida; puede ser asignada a una variable). El uso del operador de comillas invertidas es idéntico al de shell_exec().
<?php
$output = `ls -al`;
echo "<pre>$output</pre>";
?>
Nota:
El operador de comillas invertidas se deshabilita cuando safe mode esta activado o shell_exec() esta desactivado.
Nota:
A diferencia de otros lenguajes, las comillas invertidas no pueden ser usadas dentro de strings entre comillas dobles.
Vea también la sección del manual sobre funciones de ejecución de programas, popen() proc_open() y Usando PHP desde la línea de comandos.
PHP soporta operadores estilo C de pre- y post-incremento y decremento.
Nota: Los operadores de incremento/decremento no afectan a los valores booleanos. Decrementar valores
NULLtampoco tiene efecto, pero incrementarlos entonces resulta en 1.
| Ejemplo | Nombre | Efecto |
|---|---|---|
| ++$a | Pre-incremento | Incrementa $a en uno, y luego retorna $a. |
| $a++ | Post-incremento | Retorna $a, y luego incrementa $a en uno. |
| --$a | Pre-decremento | Decrementa $a en uno, luego retorna $a. |
| $a-- | Post-decremento | Retorna $a, luego decrementa $a en uno. |
Aquí hay un script simple de ejemplo:
<?php
echo "<h3>Postincremento</h3>";
$a = 5;
echo "Debe ser 5: " . $a++ . "<br />\n";
echo "Debe ser 6: " . $a . "<br />\n";
echo "<h3>Preincremento</h3>";
$a = 5;
echo "Debe ser 6: " . ++$a . "<br />\n";
echo "Debe ser 6: " . $a . "<br />\n";
echo "<h3>Postdecremento</h3>";
$a = 5;
echo "Debe ser 5: " . $a-- . "<br />\n";
echo "Debe ser 4: " . $a . "<br />\n";
echo "<h3>Predecremento</h3>";
$a = 5;
echo "Debe ser 4: " . --$a . "<br />\n";
echo "Debe ser 4: " . $a . "<br />\n";
?>
PHP sigue la convención de Perl cuando trabaja con operaciones aritméticas sobre variables de caracteres y no la de C. Por ejemplo, en PHP y Perl $a = 'Z'; $a++; convierte $a en 'AA', mientras que en C a = 'Z'; a++; convierte a en '[' (el valor ASCII de 'Z' es 90, el valor ASCII de '[' es 91). Nótese que las variables de caracteres pueden ser incrementadas pero no decrementadas y aun así sólo caracteres de ASCII plano (a-z y A-Z) están soportados. Incrementar o decrementar otras variables de caracteres no tiene efecto, el string original no se modifica.
Ejemplo #1 Operaciones aritméticas sobre variables de caracteres
<?php
$i = 'W';
for ($n=0; $n<6; $n++) {
echo ++$i . "\n";
}
?>
El resultado del ejemplo sería:
X Y Z AA AB AC
Incrementar o decrementar booleanos no tiene efecto.
| Ejemplo | Nombre | Resultado |
|---|---|---|
| $a and $b | And (y) | TRUE si tanto $a como $b son TRUE. |
| $a or $b | Or (o inclusivo) | TRUE si cualquiera de $a o $b es TRUE. |
| $a xor $b | Xor (o exclusivo) | TRUE si $a o $b es TRUE, pero no ambos. |
| ! $a | Not (no) | TRUE si $a no es TRUE. |
| $a && $b | And (y) | TRUE si tanto $a como $b son TRUE. |
| $a || $b | Or (o inclusivo) | TRUE si cualquiera de $a o $b es TRUE. |
La razón para tener las dos variaciones diferentes de los operadores "and" y "or" es que ellos operan con precedencias diferentes. (Ver Precedencia de operadores.)
Ejemplo #1 Los operadores lógicos ilustrados
<?php
// --------------------
// foo() nunca será llamado ya que los operadores están en cortocircuito
$a = (false && foo());
$b = (true || foo());
$c = (false and foo());
$d = (true or foo());
// --------------------
// "||" tiene una precedencia mayor que "or"
// El resultado de la expresión (false || true) es asignado a $e
// Actúa como: ($e = (false || true))
$e = false || true;
// La constante false es asignada a $f y entonces true es ignorado
// Actúa como: (($f = false) or true)
$f = false or true;
var_dump($e, $f);
// --------------------
// "&&" tiene una precedencia mayor que "and"
// El resultado de la expresión (true && false) es asignado a $g
// Actúa como: ($g = (true && false))
$g = true && false;
// La constante true es asignada a $h y entonces false es ignorado
// Actúa como: (($h = true) and false)
$h = true and false;
var_dump($g, $h);
?>
El resultado del ejemplo sería algo similar a:
bool(true) bool(false) bool(false) bool(true)
Existen dos operadores para datos tipo string. El primero es el operador de concatenación ('.'), el cual retorna el resultado de concatenar sus argumentos derecho e izquierdo. El segundo es el operador de asignación sobre concatenación ('.='), el cual añade el argumento del lado derecho al argumento en el lado izquierdo. Por favor consulte Operadores de asignación para más información.
<?php
$a = "Hello ";
$b = $a . "World!"; // ahora $b contiene "Hello World!"
$a = "Hello ";
$a .= "World!"; // ahora $a contiene "Hello World!"
?>
Ver también las secciones del manual sobre el tipo string y las funciones de strings.
| Ejemplo | Nombre | Resultado |
|---|---|---|
| $a + $b | Unión | Unión de $a y $b. |
| $a == $b | Igualdad | TRUE si $a i $b tienen las mismas parejas clave/valor. |
| $a === $b | Identidad | TRUE si $a y $b tienen las mismas parejas clave/valor en el mismo
orden y de los mismos tipos. |
| $a != $b | Desigualdad | TRUE si $a no es igual a $b. |
| $a <> $b | Desigualdad | TRUE si $a no es igual a $b. |
| $a !== $b | No-identidad | TRUE si $a no es idéntica a $b. |
El operador + devuelve el array del lado derecho añadido al array del lado izquierdo; para las claves que existan en ambos arrays, serán utilizados los elementos del array de la izquierda y serán ignorados los elementos correspondientes del array de la derecha.
<?php
$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");
$c = $a + $b; // Unión de $a y $b
echo "Union of \$a and \$b: \n";
var_dump($c);
$c = $b + $a; // Unión de $b y $a
echo "Union of \$b and \$a: \n";
var_dump($c);
?>
Union of $a and $b:
array(3) {
["a"]=>
string(5) "apple"
["b"]=>
string(6) "banana"
["c"]=>
string(6) "cherry"
}
Union of $b and $a:
array(3) {
["a"]=>
string(4) "pear"
["b"]=>
string(10) "strawberry"
["c"]=>
string(6) "cherry"
}
Los elementos de los arrays son iguales para la comparación si éstos tienen la misma clave y valor.
Ejemplo #1 Comparando arrays
<?php
$a = array("apple", "banana");
$b = array(1 => "banana", "0" => "apple");
var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
?>
Ver también las secciones del manual sobre el tipo array y funciones de arrays.
instanceof se utiliza para determinar si una variable de PHP es un objeto instanciado de una cierta clase:
Ejemplo #1 Utilizando instanceof con clases
<?php
class MyClass
{
}
class NotMyClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>
El resultado del ejemplo sería:
bool(true) bool(false)
instanceof también se puede utilizar para determinar si una variable es un objeto instanciado de una clase que hereda de una clase padre:
Ejemplo #2 Utilizando instanceof con clases heredadas
<?php
class ParentClass
{
}
class MyClass extends ParentClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
?>
El resultado del ejemplo sería:
bool(true) bool(true)
Para comprobar si un objeto no es una instancia de una clase, se puede usar el operador lógico not.
Ejemplo #3 Utilizando instanceof para verificar si un objeto no es una instancia de una clase
<?php
class MyClass
{
}
$a = new MyClass;
var_dump(!($a instanceof stdClass));
?>
El resultado del ejemplo sería:
bool(true)
Finalmente, instanceof también se puede utilizar para determinar si una variable es un objeto instanciado de una clase que implementa una interface:
Ejemplo #4 Utilizando instanceof para la clase
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof MyInterface);
?>
El resultado del ejemplo sería:
bool(true) bool(true)
Aunque instanceof se utiliza generalmente con un nombre de clase literal, también puede ser utilizado con otro objeto o una variable string:
Ejemplo #5 Utilizando instanceof con otras variables
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';
var_dump($a instanceof $b); // $b is an object of class MyClass
var_dump($a instanceof $c); // $c is a string 'MyClass'
var_dump($a instanceof $d); // $d is a string 'NotMyClass'
?>
El resultado del ejemplo sería:
bool(true) bool(true) bool(false)
Hay algunas trampas para tener en cuenta. Antes de versión de PHP 5.1.0, instanceof llamaría a __autoload() si el nombre de clase no existía. Además, si la clase no estaba cargada, un error fatal ocurriría. Esto se puede solucionar mediante una referencia de clase dinámica o una variable string que contenga el nombre de la clase:
Ejemplo #6 Evitando búsquedas del nombre de clase y errores fatales con instanceof en PHP 5.0
<?php
$d = 'NotMyClass';
var_dump($a instanceof $d); // aquí no hay error fatal
?>
El resultado del ejemplo sería:
bool(false)
El operador instanceof fue introducido en PHP 5. Antes de esta época se utilizaba is_a(), pero desde entonces is_a() se ha quedado obsoleto en favor de instanceof. Tenga en cuenta que a partir de PHP 5.3.0, is_a() ya no está obsoleto.
Ver también get_class() y is_a().
Todo script PHP está construido en base a una serie de sentencias. Una sentencia puede ser una asignación, una llamada de función, un ciclo, una sentencia condicional o incluso una sentencia que no hace nada (una sentencia vacía). Las sentencias generalmente finalizan con un punto y coma. Adicionalmente, las sentencias pueden agruparse en un conjunto de sentencias, encapsulándolas entre corchetes. Un grupo de sentencias es una sentencia por sí misma también. Los diferentes tipos de sentencias son descritos en este capítulo.
(PHP 4, PHP 5)
El constructor if es una de las características más importantes de muchos lenguajes, incluido PHP. Permite la ejecución condicional de fragmentos de código. PHP dispone de una estructura if que es similar a la de C:
if (expr) sentencia
Como se describe en la sección sobre
expresiones , la expresión es evaluada a su
valor booleano. Si la expresión se evalúa como TRUE,
PHP ejecutará la sentencia y si se evalúa
como FALSE la ignorará. Más información sobre qué valores evalúan
como FALSE se puede encontrar en la sección 'Convirtiendo a booleano'.
El siguiente ejemplo mostraría a es mayor que b si $a es mayor que $b:
<?php
if ($a > $b) {
echo "a es mayor que b";
}
?>
A menudo se desea tener más de una sentencia para ser ejecutada condicionalmente. Por supuesto, no hay necesidad de envolver cada sentencia con una cláusula if. En cambio, se pueden agrupar varias sentencias en un grupo de sentencias. Por ejemplo, este código mostraría a es mayor que b si $a es mayor que $b y entonces asignaría el valor de $a a $b:
<?php
if ($a > $b) {
echo "a es mayor que b";
$b = $a;
}
?>
Las sentencias if pueden anidarse dentro de otra sentencias if infinitamente, lo cual provee completa flexibilidad para la ejecución condicional de diferentes partes del programa.
(PHP 4, PHP 5)
Con frecuencia se desea ejecutar una sentencia si una determinada condición se
cumple y una sentencia diferente si la condición no se cumple. Esto
es para lo que sirve else. El else
extiende una sentencia if para ejecutar una sentencia
en caso que la expresión en la sentencia if se evalúe
como FALSE. Por ejemplo, el siguiente código
deberá mostrar a es mayor que
b si $a es mayor que
$b y a NO es mayor
que b en el caso contrario:
<?php
if ($a > $b) {
echo "a es mayor que b";
} else {
echo "a NO es mayor que b";
}
?>
FALSE y si hay algunas expresiones
elseif - sólo se ejecuta si también todas son evaluadas
como FALSE (ver elseif).
(PHP 4, PHP 5)
elseif, como su nombre lo sugiere, es una combinación
de if y else. Del mismo modo que
else, extiende una sentencia if
para ejecutar una sentencia diferente en caso que la expresión
if original se evalúe como
FALSE. Sin embargo, a diferencia de
else, esa expresión alternativa sólo se
ejecutará si la expresión condicional del elseif
se evalúa como TRUE. Por ejemplo, el
siguiente código debe mostrar a es mayor que
b, a es igual que b
o a es menor que b:
<?php
if ($a > $b) {
echo "a es mayor que b";
} elseif ($a == $b) {
echo "a es igual que b";
} else {
echo "a es menor que b";
}
?>
Puede haber varios elseif dentro de la misma
sentencia if. La primera
expresión elseif (si hay alguna) que se evalúe como
TRUE sería ejecutada. En PHP también se puede
escribir 'else if' (en dos palabras) y el comportamiento sería idéntico
al de 'elseif' (en una sola palabra). El significado sintáctico
es ligeramente diferente (si se está familiarizado con C, este es el mismo
comportamiento) pero la conclusión es que ambos resultarían tener exactamente
el mismo comportamiento.
La sentencia elseif es ejecutada solamente si la
expresión if precedente y cualquiera de las expresiones
elseif precedentes son evaluadas como
FALSE, y la expresión
elseif actual se evalúa como
TRUE.
Nota: Tenga en cuenta que elseif y else if serán considerados exactamente iguales sólamente cuando se utilizan corchetes como en el ejemplo anterior. Al utilizar los dos puntos para definir las condiciones if/elseif, no debe separarse else if en dos palabras o PHP fallará con un error del interprete.
<?php
/* Método incorrecto: */
if($a > $b):
echo $a." es mayor que ".$b;
else if($a == $b): // No compilará
echo "La línea anterior provoca un error del interprete.";
endif;
/* Método correcto: */
if($a > $b):
echo $a." es mayor que ".$b;
elseif($a == $b): // Tenga en cuenta la combinación de las palabras.
echo $a." igual ".$b;
else:
echo $a." no es ni mayor que ni igual a ".$b;
endif;
?>
(PHP 4, PHP 5)
PHP ofrece una sintaxis alternativa para algunas de sus estructuras de control; a saber: if, while, for, foreach, y switch. En cada caso, la forma básica de la sintaxis alternativa es cambiar el corchete de apertura por dos puntos (:) y el corchete de cierre por endif;, endwhile;, endfor;, endforeach;, o endswitch;, respectivamente.
<?php if ($a == 5): ?>
A es igual a 5
<?php endif; ?>
En el ejemplo anterior, el bloque HTML "A es igual a 5" se anida dentro de una sentencia if escrita en la sintaxis alternativa. El bloque HTML se mostraría solamente si $a es igual a 5.
La sintaxis alternativa también se aplica a else y elseif. El siguiente es una estructura if con elseif y else en el formato alternativo:
<?php
if ($a == 5):
echo "a igual 5";
echo "...";
elseif ($a == 6):
echo "a igual 6";
echo "!!!";
else:
echo "a no es 5 ni 6";
endif;
?>
Nota:
No se soporta la mezcla de sintaxis en el mismo bloque de control.
(PHP 4, PHP 5)
Los bucles while son el tipo más sencillo de bucle en PHP. Se comportan igual que su contrapartida en C. La forma básica de una sentencia while es:
while (expr)
sentencia
El significado de una sentencia while es simple. Le
dice a PHP que ejecute las sentencias anidadas, tanto
como la expresión while se evalúe como
TRUE. El valor de la expresión es verificado
cada vez al inicio del bucle, por lo que incluso si este valor
cambia durante la ejecución de las sentencias anidadas, la ejecución
no se detendrá hasta el final de la iteración (cada vez que PHP ejecuta
las sentencias contenidas en el bucle es una iteración). A veces, si la
expresión while se evalúa como
FALSE desde el principio, las sentencias
anidadas no se ejecutarán ni siquiera una vez.
Al igual que con la sentencia if, se pueden agrupar varias instrucciones dentro del mismo bucle while rodeando un grupo de sentencias con corchetes, o utilizando la sintaxis alternativa:
while (expr):
sentencias
...
endwhile;
Los siguientes ejemplos son idénticos y ambos presentan los números del 1 al 10:
<?php
/* ejemplo 1 */
$i = 1;
while ($i <= 10) {
echo $i++; /* el valor presentado sería
$i antes del incremento
(post-incremento) */
}
/* ejemplo 2 */
$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;
?>
(PHP 4, PHP 5)
Los bucles do-while son muy similares a los
bucles while, excepto que la expresión verdadera es
verificada al final de cada iteración en lugar que al principio.
La diferencia principal con los bucles while es
que está garantizado que corra la primera iteración de un bucle
do-while (la expresión verdadera sólo es verificada al
final de la iteración), mientras que no necesariamente va a correr con un
bucle while regular (la expresión verdadera es
verificada al principio de cada iteración, si se evalúa como
FALSE justo desde el comienzo, la ejecución del
bucle terminaría inmediatamente).
Hay una sola sintaxis para bucles do-while:
<?php
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
El bucle de arriba se ejecutaría exactamente una sola vez, ya que después de la primera
iteración, cuando la expresión verdadera es verificada, se evalúa como
FALSE ($i no es mayor que 0) y termina la ejecución
del bucle.
Los usuarios avanzados de C pueden estar familiarizados con un uso distinto del bucle do-while, para permitir parar la ejecución en medio de los bloques de código, mediante el encapsulado con do-while (0), y utilizando la sentencia break. El siguiente fragmento de código demuestra esto:
<?php
do {
if ($i < 5) {
echo "i no es lo suficientemente grande";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
echo "i está bien";
/* procesar i */
} while (0);
?>
No se preocupe si no se entiende esto completamente o en absoluto. Se pueden codificar scripts e incluso scripts potentes sin usar esta 'característica'. Desde PHP 5.3.0, es posible utilizar el operador goto en lugar de este hack.
(PHP 4, PHP 5)
Los bucles for son los ciclos más complejos en PHP. Se comportan como sus contrapartes en C. La sintaxis de un bucle for es:
for (expr1; expr2; expr3)
sentencia
La primera expresión (expr1) es evaluada (ejecutada) una vez incondicionalmente al comienzo del bucle.
En el comienzo de cada iteración, la
expr2 es evaluada, Si es
TRUE, el bucle continúa y las sentencias
anidadas son ejecutadas. Si se evalúa como
FALSE, termina la ejecución del bucle.
Al final de cada iteración, la expr3 es evaluada (ejecutada).
Cada una de las expresiones puede estar vacía o contener múltiples
expresiones separadas por comas. En la expr2, todas
las expresiones separadas por una coma son evaluadas pero el resultado se toma
de la última parte.
Que la expr2 esté vacía significa que el bucle deberá
ser corrido indefinidamente (PHP implícitamente lo considera como
TRUE, como en C). Esto puede no ser tan inútil como se
pudiera pensar, ya que muchas veces se quiere terminar el bucle usando
una sentencia condicional break
en lugar de utilizar la expresión verdadera del
for.
Considere los siguientes ejemplos. Todos ellos muestran los números del 1 al 10:
<?php
/* ejemplo 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* ejemplo 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
/* ejemplo 3 */
$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}
/* ejemplo 4 */
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>
Por supuesto, el primer ejemplo parece ser el mejor (o quizás el cuarto), pero se puede encontrar que la posibilidad de usar expresiones vacías en los bucles for resulta útil en muchas ocasiones.
PHP también soporta la sintaxis alternativa de los dos puntos para bucles for.
for (expr1; expr2; expr3):
sentencia
...
endfor;
Es una cosa común a muchos usuarios iterar por medio de arrays como en el ejemplo de abajo.
<?php
/*
* Este es un array con algunos datos que se desean modificar
* cuando se corra por el bucle for.
*/
$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < sizeof($people); ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
?>
El problema radica en la segunda expresión del for. Este código puede ser lento porque tiene que calcular el tamaño del array en cada iteración. Dado que el tamaño nunca cambia, se pueden optimizar fácilmente usando una variable intermedia para almacenar el tamaño y usarla en el bucle en lugar del sizeof. El siguiente ejemplo ilustra esto:
<?php
$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0, $size = sizeof($people); $i < $size; ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
?>
(PHP 4, PHP 5)
El constructor foreach proporcina un modo sencillo de iterar sobre arrays. foreach funciona sólo sobre arrays y objetos, y emitirá un error al intentar usarlo con una variable de un tipo diferente de datos o una variable no inicializada. Existen dos sintaxis:
foreach (expresión_array as $valor)
sentencias
foreach (expresión_array as $clave => $valor)
sentencias
La primera forma recorre el array dado por expresión_array. En cada iteración, el valor del elemento actual se asigna a $valor y el puntero interno del array avanza una posición (así en la próxima iteración se estará observando el siguiente elemento).
La segunda forma además asigna la clave del elemento actual a la variable $clave en cada iteración.
También es posible personalizar la iteración de objetos.
Nota:
Cuando foreach inicia su ejecución, el puntero interno del array se pone automáticamente en el primer elemento del array. Esto significa que no es necesario llamar la función reset() antes de un bucle foreach.
Ya que foreach depende el puntero de array interno, cambiar éste dentro del bucle puede conducir a un comportamiento inesperado.
Para poder modificar directamente los elementos del array dentro de bucle, se ha de anteponer & a $valor. En este caso el valor será asignado por referencia.
<?php
$array = array(1, 2, 3, 4);
foreach ($array as &$valor) {
$valor = $valor * 2;
}
// $array ahora es array(2, 4, 6, 8)
unset($valor); // rompe la referencia con el último elemento
?>
Referenciar $valor sólo es posible si el array iterado puede ser referenciado (es decir, si es una variable). El siguiente código no funcionará:
<?php
foreach (array(1, 2, 3, 4) as &$valor) {
$valor = $valor * 2;
}
?>
La referencia del $valor y el último elemento del array permanecen aún después del bucle foreach. Se recomienda destruirlos con unset().
Nota:
foreach no soporta la capacidad de suprimir mensajes de error usando '@'.
Se puede haber notado que las siguientes construcciones son funcionalmente idénticas:
<?php
$array = array("uno", "dos", "tres");
reset($array);
while (list(, $valor) = each($array)) {
echo "Valor: $valor<br />\n";
}
foreach ($array as $valor) {
echo "Valor: $valor<br />\n";
}
?>
Las siguientes construcciones también son funcionalmente idénticas:
<?php
$array = array("uno", "dos", "tres");
reset($array);
while (list($clave, $valor) = each($array)) {
echo "Clave: $clave; Valor: $valor<br />\n";
}
foreach ($array as $clave => $valor) {
echo "Clave: $clave; Valor: $valor<br />\n";
}
?>
Algunos ejemplos más para demostrar su uso:
<?php
/* Ejemplo 1 de foreach: sólo el valor */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Valor actual de \$a: $v.\n";
}
/* Ejemplo 2 de foreach: valor (con su notación de acceso manual impreso con fines ilustrativos) */
$a = array(1, 2, 3, 17);
$i = 0; /* sólo para efectos ilustrativos */
foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}
/* Ejemplo 3 de foreach: clave y valor */
$a = array(
"uno" => 1,
"dos" => 2,
"tres" => 3,
"diecisiete" => 17
);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}
/* Ejemplo 4 de foreach: arrays multidimensionales */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}
/* Ejemplo 5 de foreach: arrays dinámicos */
foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>
(PHP 4, PHP 5)
break termina la ejecución de la estructura actual for, foreach, while, do-while o switch.
break acepta un argumento numérico opcional el cual indica de cuantas estructuras anidadas encerradas se debe salir.
<?php
$arr = array('uno', 'dos', 'tres', 'cuatro', 'pare', 'cinco');
while (list(, $val) = each($arr)) {
if ($val == 'pare') {
break; /* Se puede también escribir 'break 1;' aquí. */
}
echo "$val<br />\n";
}
/* Usando el argumento opcional. */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "En 5<br />\n";
break 1; /* Sólo sale del switch. */
case 10:
echo "En 10; saliendo<br />\n";
break 2; /* Sale del switch y del while. */
default:
break;
}
}
?>
| Versión | Descripción |
|---|---|
| 5.4.0 | Removida la posibilidad de pasar variables (por ejemplo, $num = 2; break $num;) como argumento numérico. |
(PHP 4, PHP 5)
continue se utiliza dentro de las estructuras de bucle para saltarse el resto de la actual iteración del bucle y continuar la ejecución en la evaluación de la condición y entonces el comienzo de la siguiente iteración.
Nota: Tenga en cuenta que en PHP la sentencia switch se considera una estructura de bucle para los efectos del continue.
continue acepta un argumento numérico opcional el cual indica hasta el final de cuantos niveles de bucles cerrados se debe saltar.
Nota:
continue 0; y continue 1; son lo mismo que ejecutar continue;.
<?php
while (list($key, $value) = each($arr)) {
if (!($key % 2)) { // saltar miembros impares
continue;
}
do_something_odd($value);
}
$i = 0;
while ($i++ < 5) {
echo "Outer<br />\n";
while (1) {
echo "Middle<br />\n";
while (1) {
echo "Inner<br />\n";
continue 3;
}
echo "This never gets output.<br />\n";
}
echo "Neither does this.<br />\n";
}
?>
Omitir el punto y coma después del continue puede llevar a confusión. He aquí un ejemplo de lo que no se debe hacer.
<?php
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
print "$i\n";
}
?>
Se esperaría que el resultado sea:
0 1 3 4
Pero la salida de este script será:
2
debido a que el continue print "$i\n"; se evalúa completo como una sola expresión y así print se llama solamente cuando $i == 2 es verdadero. (El valor de retorno de print es pasado a continue como el argumento numérico.)
| Versión | Descripción |
|---|---|
| 5.4.0 | Se ha eliminado la posibilidad de pasar variables (por ejemplo, $num = 2; continue $num;) como argumento numérico. |
(PHP 4, PHP 5)
La sentencia switch es similar a una serie de sentencias IF en la misma expresión. En muchas ocasiones, es posible que se quiera comparar la misma variable (o expresión) con muchos valores diferentes, y ejecutar una parte de código distinta dependiendo de a que valor es igual. Para esto es exactamente la expresión switch.
Nota: Cabe señalar que a diferencia de algunos otros lenguajes, la sentencia continue se aplica a switch y actúa de manera similar a break. Si se tiene un switch dentro de un bucle y se desea continuar a la siguiente iteración de del ciclo exterior, se utiliza continue 2.
Nota:
Tener en cuenta que switch/case hace comparaciones flexibles.
Los dos ejemplos siguientes son dos formas diferentes de escribir lo mismo, uno con una serie de sentencias if y elseif, y el otro usando la sentencia switch:
Ejemplo #1 Estructura switch
<?php
if ($i == 0) {
echo "i es igual a 0";
} elseif ($i == 1) {
echo "i es igual a 1";
} elseif ($i == 2) {
echo "i es igual a 2";
}
switch ($i) {
case 0:
echo "i es igual a 0";
break;
case 1:
echo "i es igual a 1";
break;
case 2:
echo "i es igual a 2";
break;
}
?>
Ejemplo #2 Estrutura switch permite el uso de strings
<?php
switch ($i) {
case "manzana":
echo "i es una manzana";
break;
case "barra":
echo "i es una barra";
break;
case "pastel":
echo "i es un pastel";
break;
}
?>
Es importante entender cómo la sentencia switch es ejecutada con el fin de evitar errores. La sentencia switch ejecuta línea por línea (en realidad, sentencia por sentencia). Al principio, ningún código es ejecutado. Sólo cuando una sentencia case es encontrada con un valor que coincide con el valor de la sentencia switch, PHP comienza a ejecutar la sentencias. PHP continúa ejecutando las sentencias hasta el final del bloque switch, o hasta la primera vez que vea una sentencia break. Si no se escribe una sentencia break al final de la lista de sentencias de un caso, PHP seguirá ejecutando las sentencias del caso siguiente. Por ejemplo:
<?php
switch ($i) {
case 0:
echo "i es igual a 0";
case 1:
echo "i es igual a 1";
case 2:
echo "i es igual a 2";
}
?>
Aquí, si $i es igual a 0, PHP ejecutaría todas las sentencias echo! Si $i es igual a 1, PHP ejecutaría las últimas dos sentencias echo. Se obtendría el comportamiento esperado (se mostraría 'i es igual a 2') sólo si $i es igual a 2. Por lo tanto, es importante no olvidar las sentencias break (aunque es posible que se desee evitar proporcionarlas a propósito bajo determinadas circunstancias).
En una sentencia switch, la condición es evaluada sólo una vez y el resultado es comparado con cada una de las sentencias case. En una sentencia elseif, la condición es evaluada otra vez. Si la condición es más complicada que una simple comparación y/o está en un bucle estrecho, un switch puede ser más rápido.
La lista de sentencias para un caso también puede estar vacía, lo cual simplemente pasa el control a la lista de sentencias para el siguiente caso.
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i es menor que 3 pero no negativo";
break;
case 3:
echo "i es 3";
}
?>
Un caso especial es el default. Este caso coincide con cualquier cosa que no se haya correspondido por los otros casos. Por ejemplo:
<?php
switch ($i) {
case 0:
echo "i es igual a 0";
break;
case 1:
echo "i es igual a 1";
break;
case 2:
echo "i es igual a 2";
break;
default:
echo "i no es igual a 0, 1 ni 2";
}
?>
La expresión case puede ser cualquier expresión que se evalúa como un tipo simple, es decir, entero o números de punto flotante y strings. Los arrays u objetos no se pueden utilizar aquí a menos que sean desreferenciados a un tipo simple.
La sintaxis alternativa para las estructuras de control es compatible con los switch. Para obtener más información, consulte Sintaxis alternativa de estructuras de control.
<?php
switch ($i):
case 0:
echo "i es igual a 0";
break;
case 1:
echo "i es igual a 1";
break;
case 2:
echo "i es igual a 2";
break;
default:
echo "i no es igual a 0, 1 ni 2";
endswitch;
?>
Es posible utilizar un punto y coma en lugar de dos puntos después de un caso como:
<?php
switch($beer)
{
case 'tuborg';
case 'carlsberg';
case 'heineken';
echo 'Buena elección';
break;
default;
echo 'Por favor haga una nueva selección...';
break;
}
?>
(PHP 4, PHP 5)
El constructor declare es usado para fijar directivas de ejecución para un bloque de código. La sintaxis de declare es similar a la sintaxis de otros constructores de control de flujo:
declare (directive)
statement
La sección directive permite que el comportamiento de declare sea configurado. Actualmente, sólo dos directivas están reconocidas: ticks (Ver abajo para más información sobre la directiva ticks) y encoding (Ver abajo para más información sobre la directiva encoding ).
Nota: La directiva encoding fue agregada en PHP 5.3.0
La parte statement del bloque declare será ejecutada - como se ejecuta y que efectos secundarios ocurran durante la ejecución puede depender de la directiva fijada en el bloque directive.
El constructor declare también se puede utilizar en el alcance global, afectando a todo el código que le sigue (sin embargo, si el archivo con el declare fue incluido entonces no afectará al archivo padre).
<?php
// estos son lo mismo:
// se puede usar ésto:
declare(ticks=1) {
// script entero aquí
}
// o se puede usar ésto:
declare(ticks=1);
// script entero aquí
?>
Un tick es un evento que ocurre para cada
sentencia tickable N de bajo nivel ejecutada
por el intérprete dentro del bloque declare.
El valor para N se especifica
usando ticks=N
dentro del bloque de declare
de la sección directive.
No todas las sentencias son tickable. Por lo general, expresiones de condición y expresiones de argumento no son tickables.
Los eventos que ocurren en cada tick se especifican mediante la register_tick_function(). Ver el ejemplo abajo para más detalles. Tener en cuenta que más de un evento puede ocurrir por cada tick.
Ejemplo #1 Ejemplo de uso del tick
<?php
declare(ticks=1);
// Una función llamada en cada evento tick
function tick_handler()
{
echo "tick_handler() llamado\n";
}
register_tick_function('tick_handler');
$a = 1;
if ($a > 0) {
$a += 2;
print($a);
}
?>
Ejemplo #2 Ejemplo de uso de ticks
<?php
function tick_handler()
{
echo "tick_handler() llamado\n";
}
$a = 1;
tick_handler();
if ($a > 0) {
$a += 2;
tick_handler();
print($a);
tick_handler();
}
tick_handler();
?>
Véase también register_tick_function() y unregister_tick_function().
Una codificación de script puede ser especificada para cada script usando la directiva encoding.
Ejemplo #3 Declarando un encoding para el script
<?php
declare(encoding='ISO-8859-1');
// código aquí
?>
Cuando se combina con espacios de nombres, la única sintaxis legal para declarar es declare(encoding='...'); donde ... es el valor del encoding. declare(encoding='...') {} resultará en un error de análisis cuando se combina con espacios de nombres.
El valor declarado de encoding es ignorado en PHP 5.3 a menos que php esté compilado con --enable-zend-multibyte.
Tener en cuenta que PHP no expone si --enable-zend-multibyte fue utilizado para compilar PHP que no sea por phpinfo().
Ver también zend.script_encoding.
(PHP 4, PHP 5)
Si se llama desde una función, la sentencia return inmediatamente termina la ejecución de la función actual, y devuelve su argumento como el valor de la llamada a la función. return también pondrá fin a la ejecución de una sentencia eval() o a un archivo de script.
Si se llama desde el ámbito global, entonces la ejecución del script actual se termina. Si el archivo script actual fue incluido o requerido con include o require, entonces el control es pasado de regreso al archivo que hizo el llamado. Además, si el archivo script actual fue incluido con include, entonces el valor dado a return será retornado como el valor de la llamada include. Si return es llamado desde dentro del fichero del script principal, entonces termina la ejecución del script. Si el archivo script actual fue nombrado por las opciones de configuración auto_prepend_file o auto_append_file en php.ini, entonces se termina la ejecución de ese archivo script.
Para más información, ver Retornando valores.
Nota: Cabe señalar que dado que return es un constructor del lenguaje y no una función, los paréntesis que rodean su argumentos no son necesarios. Es común no utilizarlos, y en realidad se debería hacer así a fin de que PHP tenga menos trabajo que hacer en este caso.
Nota: Si no se suministra un parámetro, entonces el paréntesis debe omitirse y
NULLserá retornado. Llamadas a return con paréntesis pero sin argumentos resultarán en un error del intérprete.
Nota: Nunca se deben usar paréntesis al rededor de la variable de retorno cuando se retorna por referencia, ya que esto no funcionará. Sólo se pueden retornar variables por referencia, no el resultado de una sentencia. Si se utiliza return ($a); entonces no se está retornando una variable, sino el resultado de la expresión ($a) (el cual es, por supuesto, el valor de $a).
(PHP 4, PHP 5)
require es idéntico a include
excepto que en caso de fallo producirá un error fatal de nivel E_COMPILE_ERROR.
En otras palabras, éste detiene el script mientras que
include sólo emitirá una advertencia
(E_WARNING) lo cual permite continuar el script.
Véase la documentación de include para más información.
(PHP 4, PHP 5)
La sentencia include incluye y evalúa el archivo especificado.
La siguiente documentación también se aplica a require.
Los archivos son incluidos con base en la ruta de acceso dada o, si ninguna es dada, el include_path especificado. Si el archivo no se encuentra en el include_path, include finalmente verificará en el propio directorio del script que hace el llamado y en el directorio de trabajo actual, antes de fallar. El constructor include emitirá una advertencia si no puede encontrar un archivo, éste es un comportamiento diferente al de require, el cual emitirá un error fatal..
Si una ruta es definida — ya sea absoluta (comenzando con una letra de unidad o \ en Windows o / en sistemas Unix/Linux) o relativa al directorio actual (comenzando con . o ..) — el include_path será ignorado por completo. Por ejemplo, si un nombre de archivo comienza con ../, el interprete buscará en el directorio padre para encontrar el archivo solicitado.
Para más información sobre como PHP maneja la inclusión de archivos y la ruta de accesos para incluir, ver la documentación de include_path.
Cuando se incluye un archivo, el código que contiene hereda el ámbito de las variables de la línea en la cual ocurre la inclusión. Cualquier variable disponible en esa línea del archivo que hace el llamado, estará disponible en el archivo llamado, desde ese punto en adelante. Sin embargo, todas las funciones y clases definidas en el archivo incluido tienen el ámbito global.
Ejemplo #1 Ejemplo básico de include
vars.php
<?php
$color = 'verde';
$fruta = 'manzana';
?>
test.php
<?php
echo "Una $fruta $color"; // Una
include 'vars.php';
echo "Una $fruta $color"; // Una manzana verde
?>
Si la inclusión ocurre al interior de una función dentro del archivo que hace el llamado, entonces todo el código contenido en el archivo llamado se comportará como si hubiera sido definida dentro de esa función. Por lo tanto, seguirá el ámbito de las variables de esa función. Una excepción a esta regla son las constantes mágicas las cuales son evaluadas por el intérprete antes que ocurra la inclusión.
Ejemplo #2 Incluyendo dentro de funciones
<?php
function foo()
{
global $color;
include 'vars.php';
echo "Una $fruta $color";
}
/* vars.php está en el ámbito de foo() así que *
* $fruta NO está disponible por fuera de éste *
* ámbito. $color sí está porque fue declarado *
* como global. */
foo(); // Una manzana verde
echo "Una $fruta $color"; // Una verde
?>
Cuando un archivo es incluido, el intérprete abandona el modo PHP e ingresa al modo HTML al comienzo del archivo objetivo y se reanuda de nuevo al final. Por esta razón, cualquier código al interior del archivo objetivo que deba ser ejecutado como código PHP, tendrá que ser encerrado dentro de etiquetas válidas de comienzo y terminación de PHP.
Si las "envolturas URL fopen" están activadas en PHP (las cuales lo están en la configuración predeterminada), se puede especificar el archivo a ser incluido usando una URL (vía HTTP u otra envoltura soportada - ver Protocolos y Envolturas soportados para una lista de protocolos) en lugar de una ruta de acceso local. Si el servidor objetivo interpreta el archivo objetivo como código PHP, las variables se pueden pasar al archivo incluido usando una string de petición como la usada con HTTP GET. Esto no es, en estricto rigor, lo mismo que haber incluido el archivo y que haya heredado el ámbito de variables del archivo padre; el script realmente está siendo ejecutado en el servidor remoto y el resultado entonces se incluye dentro del script local.
Versiones de PHP para Windows anteriores a 4.3.0, no soportan el acceso remoto a archivos para esta función, no funcionará ni activando siquiera allow_url_fopen.
Ejemplo #3 include por medio de HTTP
<?php
/* Este ejemplo asume que www.example.com está configurado para interpretar archivos
* .php y no archivos .txt. Además, aquí 'Funciona' quiere decir que las variables
* $foo y $bar están disponibles dentro del archivo incluido. */
// No funciona; file.txt no puede ser manejado por www.example.com como PHP
include 'http://www.example.com/file.txt?foo=1&bar=2';
// No funciona; busca por un archivo llamado 'file.php?foo=1&bar=2' en el
// sistema de archivos local.
include 'file.php?foo=1&bar=2';
// Si funciona.
include 'http://www.example.com/file.php?foo=1&bar=2';
$foo = 1;
$bar = 2;
include 'file.txt'; // Funciona.
include 'file.php'; // Funciona.
?>
El archivo remoto puede ser procesado en el servidor remoto (dependiendo de la extensión del archivo y del hecho de si el servidor remoto corre PHP o no) pero aun así tiene que producir un script PHP válido, porque será procesado en el servidor local. Si el archivo desde el servidor remoto debe ser procesado allá y entregar la salida solamente, readfile() es la mejor función para usar. De lo contrario, debe tenerse especial cuidado para asegurar que el script remoto produce un código válido y deseado.
Ver también Archivos remotos, fopen() y file() para información relacionada.
Manejando retornos: Es posible ejecutar una sentencia return dentro de un archivo incluido con el fin de terminar el procesamiento en ese archivo y volver a script que lo llamó. Además, es posible retornar valores desde los archivos incluidos. Se puede tomar el valor de la llamada "include" de la misma forma como se haría con una función normal. Esto no es, sin embargo, posible si se incluyen archivos remotos, a menos que la salida del archivo remoto tenga unas etiquetas válidas de inicio y terminación de PHP (igual que con cualquier archivo local). Se pueden declarar la variables necesarias dentro de esas etiquetas y serán introducidas en el punto del archivo en el cual fue incluido.
Debido a que include es un constructor especial del lenguaje, los paréntesis no son necesarios en torno a su argumento. Se debe tener cuidado cuando se compara el valor de retorno.
Ejemplo #4 Comparando el valor de retorno de include
<?php
// no funciona, evaluado como include(('vars.php') == 'OK'), es decir include('')
if (include('vars.php') == 'OK') {
echo 'OK';
}
// si funciona
if ((include 'vars.php') == 'OK') {
echo 'OK';
}
?>
Ejemplo #5 include y la sentencia return
return.php
<?php
$var = 'PHP';
return $var;
?>
noreturn.php
<?php
$var = 'PHP';
?>
testreturns.php
<?php
$foo = include 'return.php';
echo $foo; // muestra 'PHP'
$bar = include 'noreturn.php';
echo $bar; // muestra 1
?>
$bar tiene el valor 1 debido a que el include
fue exitoso. Nótese la diferencia entre los ejemplos anteriores. El primero usa
return dentro del archivo incluido, mientras que el otro no.
Si el archivo no se pueden incluir, se retorna FALSE y
se emite un E_WARNING.
Si hay funciones definidas en el archivo incluido, se pueden utilizar en el archivo principal independientemente que hayan return antes o después. Si el archivo se incluye dos veces, PHP 5 arrojará un error fatal ya que las funciones ya han sido declaradas, mientras que PHP 4 no se queja acerca de las funciones definidas después de un return. Se recomienda el uso de include_once en lugar de comprobar si el archivo ya estaba incluido y hacer el retorno de forma condicionada dentro del archivo incluido.
Otra forma de "incluir" un archivo PHP en una variable es capturar la salida mediante el uso de Funciones de control de salida con include. Por ejemplo:
Ejemplo #6 Usando buffering de salida para incluir un archivo PHP dentro de una cadena
<?php
$string = get_include_contents('somefile.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
return ob_get_clean();
}
return false;
}
?>
Con el fin de incluir archivos de forma automática dentro de scripts, véase también las opciones de configuración auto_prepend_file y auto_append_file en php.ini.
Nota: Puesto que esto es una construcción del lenguaje y no una función, no puede ser llamada usando funciones variables.
Ver también require, require_once, include_once, get_included_files(), readfile(), virtual() y include_path.
(PHP 4, PHP 5)
La sentencia require_once es idéntica a require excepto que PHP verificará si el archivo ya ha sido incluido y si es así, no se incluye (require) de nuevo.
Ver la documentación de include_once para información sobre el comportamiento de _once, y como difiere de sus hermanos no _once.
(PHP 4, PHP 5)
La sentencia include_once incluye y evalúa el fichero especificado durante la ejecución del script. Es un comportamiento similar al de la sentencia include, siendo la única diferencia que si el código del fichero ya ha sido incluido, no se volverá a incluir. Como su nombre lo indica, será incluido sólo una vez.
include_once puede ser usado en casos donde el mismo fichero podría ser incluido y evaluado más de una vez durante una ejecución particular de un script, así que en este caso, puede ayudar a evitar problemas como la redefinición de funciones, reasignación de valores de variables, etc.
Ver la documentación de include para información sobre como trabaja esta función.
Nota:
Con PHP 4, la funcionalidad _once difiere entre sistemas operativos insensibles a mayúsculas y minúsculas (como Windows) así que por ejemplo:
Ejemplo #1 include_once con un SO insensible a mayúsculas y minúsculas en PHP 4
<?php
include_once "a.php"; // esto incluirá a.php
include_once "A.php"; // esto incluirá a.php otra vez! (sólo PHP 4)
?>Este comportamiento cambió en PHP 5, así que por ejemplo con Windows primero se normaliza la ruta de acceso para que C:\PROGRA~1\A.php sea identificado igual que C:\Program Files\a.php y el fichero sea incluido sólo una vez.
(PHP 5 >= 5.3.0)
El operador goto puede ser usado para saltar a otra sección en el programa. El punto de destino es especificado mediante una etiqueta seguida de dos puntos y la instrucción es dada como goto seguida de la etiqueta del destino deseado. Este goto no es completamente sin restricciones. La etiqueta de destino debe estar dentro del mismo fichero y contexto, lo que significa que no se puede saltar fuera de una función o método, ni se puede saltar dentro de uno. Tampoco se puede saltar dentro de cualquier clase de estructura de bucle o switch. Se puede saltar fuera de estos y un uso común es utilizar un goto en lugar de un break multi-nivel.
Ejemplo #1 Ejemplo de goto
<?php
goto a;
echo 'Foo';
a:
echo 'Bar';
?>
El resultado del ejemplo sería:
Bar
Ejemplo #2 Ejemplo de goto en un bucle
<?php
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j alcanzó 17';
?>
El resultado del ejemplo sería:
j hit 17
Ejemplo #3 Esto no funcionará
<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
loop:
}
}
echo "$i = $i";
?>
El resultado del ejemplo sería:
Fatal error: 'goto' into loop or switch statement is disallowed in script on line 2 (Error fatal: 'goto' hacia el interior de un bucle o sentencia switch no esta permitido en el script en la línea 2)
Nota:
El operador goto está disponible a partir de PHP 5.3.
Una función puede ser definida usando una sintaxis como la siguiente:
Ejemplo #1 Pseudo código para demostrar el uso de funciones
<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
echo "Función de ejemplo.\n";
return $valordevuelto;
}
?>
Cualquier código PHP válido puede aparecer dentro de una función, incluso otras funciones y definiciones de clases.
Los nombres de las funciones siguen las mismas reglas que otras etiquetas de PHP. Un nombre de función válido comienza con una letra o guión bajo, seguido de cualquier número de letras, números, o guiones bajos. Como expresión regular se expresaría así: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Vea también Guia de Entorno de Usuario para Nombres.
Las funciones no necesitan ser definidas antes de que se referencien, excepto cuando una función está condicionalmente definida como se muestra en los dos ejemplos de abajo.
Cuando una función está definida de una forma condicional como en los dos ejemplos mostrados, sus definiciones deben ser procesadas antes de ser llamadas.
Ejemplo #2 Funciones condicionales
<?php
$haceralgo = true;
/* No podemos llamar a foo() desde aquí
ya que no existe aún,
pero podemos llamar a bar() */
bar();
if ($haceralgo) {
function foo()
{
echo "No existo hasta que la ejecución del programa llegue hasta mí.\n";
}
}
/* Ahora podemos llamar de forma segura a foo()
ya que $haceralgo se evaluó como verdadero */
if ($haceralgo) foo();
function bar()
{
echo "Existo desde el momento inmediato que comenzó el programa.\n";
}
?>
Ejemplo #3 Funciones dentro de funciones
<?php
function foo()
{
function bar()
{
echo "No existo hasta que se llame a foo().\n";
}
}
/* No podemos llamar aún a bar()
ya que no existe. */
foo();
/* Ahora podemos llamar a bar(),
el procesamiento de foo()
la ha hecho accesible. */
bar();
?>
Todas las funciones y las clases de PHP tienen ámbito global - pueden ser llamadas fuera de una función incluso si fueron definidas dentro, y viceversa.
PHP no soporta la sobrecarga de funciones, ni es posible 'desdefinir' ni redefinir funciones previamente declaradas.
Nota: Los nombres de las fuciones son insensibles a mayúsculas-minúsculas, por lo que es una buena idea llamar a las funciones tal y como aparecen en sus declaraciones.
El número variable de argumentos y los argumentos predeterminados están soportados por las funciones. Vea también las referencias de funciones para func_num_args(), func_get_arg(), y func_get_args() para más información.
En PHP es posible llamar a funciones recursivas. Sin embargo, evite las llamadas a funciones/métodos recursivos con más de 100-200 niveles de recursividad ya que pueden agotar la pila y causar la terminación del script actual.
Ejemplo #4 Funciones recursivas
<?php
function recursividad($a)
{
if ($a < 20) {
echo "$a\n";
recursividad($a + 1);
}
}
?>
La información puede ser pasada a las funciones mediante la lista de argumentos, la cual es una lista de expresiones delimitadas por comas. Los argumentos son evaluados de izquierda a derecha.
PHP soporta argumentos pasados por valor (por defecto), pasados por referencia, y valores de argumentos predeterminados. Las Listas de argumentos de longitud variable también están soportadas, vea también las referencias de funciones para func_num_args(), func_get_arg(), y func_get_args() para más información.
Ejemplo #1 Pasar arrays a funciones
<?php
function tomar_array($entrada)
{
echo "$entrada[0] + $entrada[1] = ".$entrada[0]+$entrada[1];
}
?>
Por defecto, los argumentos de las funciones son pasados por valor (por lo que si el valor del argumento dentro de la función se cambia, no se cambia fuera de la función). Para permitir a una función modificar sus argumentos, éstos deben pasarse por referencia.
Para hacer que un argumento a una función sea siempre pasado por referencia hay que poner delante del nombre del argumento el signo 'ampersand' (&) en la definición de la función:
Ejemplo #2 Pasar parámetros de una función por referencia
<?php
function añadir_algo(&$cadena)
{
$cadena .= 'y algo más.';
}
$cad = 'Esto es una cadena, ';
añadir_algo($cad);
echo $cad; // imprime 'Esto es una cadena, y algo más.'
?>
Una función puede definir valores predeterminados al estilo C++ para argumentos escalares como sigue:
Ejemplo #3 Uso de parámetros predeterminados en funciones
<?php
function hacercafé($tipo = "capuchino")
{
return "Hacer una taza de $tipo.\n";
}
echo hacercafé();
echo hacercafé(null);
echo hacercafé("espresso");
?>
El resultado del ejemplo sería:
Hacer una taza de capuchino. Hacer una taza de . Hacer una taza de espresso.
PHP también permite el uso de arrays y del tipo especial NULL
como valores predeterminados, por ejemplo:
Ejemplo #4 Usar tipos no escalares como valores predeterminados
<?php
function hacercafé($tipos = array("capuchino"), $fabricanteCafé = NULL)
{
$aparato = is_null($fabricanteCafé) ? "las manos" : $fabricanteCafé;
return "Hacer una taza de ".join(", ", $tipos)." con $aparato.\n";
}
echo hacercafé();
echo hacercafé(array("capuchino", "lavazza"), "una tetera");
?>
El valor predeterminado debe ser una expresión constante, no (por ejemplo) una variable, un miembro de una clase o una llamada a una función.
Observe que cuando se usan argumentos predeterminados, cualquiera de ellos debería estar a la derecha de los argumentos no predeterminados; si no, las cosas no funcionarán como se esperaba. Considere el siguiente trozo de código:
Ejemplo #5 Uso incorrecto de argumentos predeterminados en una función
<?php
function haceryogur($tipo = "acidófilo", $sabor)
{
return "Hacer un tazón de yogur $tipo de $sabor.\n";
}
echo haceryogur("frambuesa"); // no funcionará como se esperaba
?>
El resultado del ejemplo sería:
Warning: Missing argument 2 in call to haceryogur() in /usr/local/etc/httpd/htdocs/phptest/functest.html on line 41 Hacer un tazón de yogur frambuesa de .
Ahora compare el ejemplo de arriba con este:
Ejemplo #6 Uso correcto de argumentos predeterminados en una función
<?php
function haceryogur($sabor, $tipo = "acidófilo")
{
return "Hacer un tazón de yogur $tipo de $sabor.\n";
}
echo haceryogur("frambuesa"); // funciona como se esperaba
?>
El resultado del ejemplo sería:
Hacer un tazón de yogur acidófilo de frambuensa.
Nota: A partir de PHP 5, los valores predeterminados se pueden pasar por referencia.
PHP tiene soporte para listas de argumentos de longitud variable en funciones definidas por el usuario. Esto realmente es bastante fácil si se usan las funciones func_num_args(), func_get_arg(), y func_get_args().
No se necesita una sintaxis especial, y la lista de argumentos aún puede ser proporcionada explícitamente con definiciones de funciones, y se comportará con normalidad.
Los valores son devueltos usando la sentencia opcional return. Se puede devolver cualquier tipo, incluidos arrays y objetos. Esto causa que la función finalice su ejecución inmediatamente y pase el control de nuevo a la línea desde la que fue llamada. Véase return para más información.
Nota:
Si se omite return será devuelto el valor
NULL.
Ejemplo #1 Uso de return
<?php
function cuadrado($núm)
{
return $núm * $núm;
}
echo cuadrado(4); // imprime '16'.
?>
Una función no puede devolver múltiples valores, pero se pueden obtener resultados similares devolviendo un array.
Ejemplo #2 Devolver un array para obtener múltiples valores
<?php
function números_pequeños()
{
return array (0, 1, 2);
}
list ($cero, $uno, $dos) = números_pequeños();
?>
Para devolver una referencia desde una función use el operador de referencia &, en la declaración de la función y cuando se asigne el valor devuelto a una variable:
Ejemplo #3 Devolver una referencia desde una función
<?php
function &devolver_referencia()
{
return $algunaref;
}
$nuevaref =& devolver_referencia();
?>
Para más información sobre referencias, por favor, lea las Referencias Explicadas.
PHP soporta el concepto de funciones variables. Esto significa que si un nombre de variable tiene paréntesis anexos a él, PHP buscará una función con el mismo nombre que lo evaluado por la variable, e intentará ejecutarla. Entre otras cosas, esto se puede usar para implementar llamadas de retorno, tablas de funciones, y así sucesivamente.
Las funciones variables no funcionarán con constructores de lenguaje como echo, print, unset(), isset(), empty(), include, require y similares. Utilice funciones de envoltura para hacer uso de cualquiera de estos constructores como funciones variables.
Ejemplo #1 Ejemplo de función variable
<?php
function foo() {
echo "En foo()<br />\n";
}
function bar($arg = '')
{
echo "En bar(); el argumento era '$arg'.<br />\n";
}
// Esta es una función de envoltura alrededor de echo
function hacerecho($cadena)
{
echo $cadena;
}
$func = 'foo';
$func(); // Esto llama a foo()
$func = 'bar';
$func('prueba'); // Esto llama a bar()
$func = 'hacerecho';
$func('prueba'); // Esto llama a hacerecho()
?>
Un método de un objeto también puede ser llamado con la sintaxis de funciones variables.
Ejemplo #2 Ejemplo de método variable
<?php
class Foo
{
function Variable()
{
$nombre = 'Bar';
$this->$nombre(); // Esto llama al método Bar()
}
function Bar()
{
echo "Esto es Bar";
}
}
$foo = new Foo();
$nombrefunc = "Variable";
$foo->$nombrefunc(); // Esto llama a $foo->Variable()
?>
Cuando se llaman a métodos estáticos, la llamada a la función es más fuerte que el operador de propiedad static:
Ejemplo #3 Ejemplo de método variable con propiedades estáticas
<?php
class Foo
{
static $variable = 'propiedad estática';
static function Variable()
{
echo 'Método Variable llamado';
}
}
echo Foo::$variable; // Esto imprime 'propiedad estática'. No necesita una $variable en este ámbito.
$variable = "Variable";
Foo::$variable(); // Esto llama a $foo->Variable() leyendo $variable en este ámbito.
?>
Véase también call_user_func(), variables variables y function_exists().
PHP se estandariza con muchas funciones y construcciones. También existen funciones que necesitan extensiones específicas de PHP compiladas, si no, aparecerán errores fatales "undefined function" ("función no definida"). Por ejemplo, para usar las funciones de image tales como imagecreatetruecolor(), PHP debe ser compilado con soporte para GD. O para usar mysql_connect(), PHP debe ser compilado con soporte para MySQL. Hay muchas funciones de núcleo que está incluidas en cada versión de PHP, tales como las funciones de string y de variable. Una llamada a phpinfo() o get_loaded_extensions() mostrará las extensiones que están cargadas en PHP. Observe también que muchas extensiones están habilitadas por defecto y que el manual de PHP está dividido por extensiones. Véase configuración, instalación, y capítulos individuales de extensiones para más información sobre cómo configurar PHP.
Interpretar y comprender un prototipo de una función está explicado dentro de la sección del manual titulada cómo interpretar la definición de una función. Es importante comprender lo que devuelve una función o si una función funciona directamente con un valor pasado. Por ejemplo, str_replace() devolverá la cadena modificada mientras que usort() funciona con la variable actual pasada. Cada página del manual también tiene información específica para cada función, como información sobre parámetros de funciones, cambios de comportamiento, valores devueltos en caso de éxito o fallo, e información de disponibilidad. Conocer estas importantes diferencias (a menudo imperceptibles) es crucial para escribir código de PHP correcto.
Nota: Si los parámetros dados a una función no son los que se esperaban, como pasar un array donde se esperaba un string, el valor devuelto de la función será indefinido. En este caso lo más probable es que devuelva
NULLpero esto es sólo una convención, y no se puede confiar en ello.
Véase también function_exists(), la referencia de funciones, get_extension_funcs(), y dl().
Las funciones anónimas, también conocidas como closures (cierres), permiten la creación de funciones que no tienen un nombre especificado. Son más útiles como valor de los parámetros de llamadas de retorno, pero tienen muchos otros usos.
Ejemplo #1 Ejemplo de función anónima
<?php
echo preg_replace_callback('~-([a-z])~', function ($coincidencia) {
return strtoupper($coincidencia[1]);
}, 'hola-mundo');
// imprime holaMundo
?>
Los cierres también se pueden usar como valores de variables; PHP automáticamente convierte tales expresiones en instancias de la clase interna Closure. Se asume que un cierre a una variable usa la misma sintaxis que cualquier otra asignación, incluido el punto y coma final:
Ejemplo #2 Ejemplo de asignación de variable de una función anónima
<?php
$saludo = function($nombre)
{
printf("Hola %s\r\n", $nombre);
};
$saludo('Mundo');
$saludo('PHP');
?>
Los cierres también pueden heredar variables del ámbito padre. Cualquier variable de estas debe ser declarada en la cabecera de la función. Heredar variables del ámbito padre no es lo mismo que usar variables globales. Las variables globales existen en el ámbito global, lo que implica que no importa qué función se esté ejecutando. El ámbito padre de un cierre es la función en la que el cierre fue declarado (no necesariamente la función desde la que se llamó). Vea el siguiente ejemplo:
Ejemplo #3 Cierres y ámbito
<?php
// Un carro de compras básico que contiene una lista de productos añadidos
// y la cantidad de cada producto. Incluye un método que
// calcula el precio total de los artículos del carro usando un
// cierre como llamada de retorno.
class Carro
{
const PRECIO_MANTEQUILLA = 1.00;
const PRECIO_LECHE = 3.00;
const PRECIO_HUEVOS = 6.95;
protected $productos = array();
public function añadir($producto, $cantidad)
{
$this->productos[$producto] = $cantidad;
}
public function obtenerCantidad($producto)
{
return isset($this->productos[$producto]) ? $this->productos[$producto] :
FALSE;
}
public function obtenerTotal($impuesto)
{
$total = 0.00;
$llamadaDeRetorno =
function ($cantidad, $producto) use ($impuesto, &$total)
{
$precioUnidad = constant(__CLASS__ . "::PRECIO_" .
strtoupper($producto));
$total += ($precioUnidad * $cantidad) * ($impuesto + 1.0);
};
array_walk($this->productos, $llamadaDeRetorno);
return round($total, 2);
}
}
$mi_carro = new Carro;
// Añadir algunos artículos al carro
$mi_carro->añadir('mantequilla', 1);
$mi_carro->añadir('leche', 3);
$mi_carro->añadir('huevos', 6);
// Imprimir el total con un impuesto de venta del 5%.
print $mi_carro->obtenerTotal(0.05) . "\n";
// El resultado es 54.29
?>
Las funciones anónimas son implementadas usando la clase Closure.
| Versión | Descripción |
|---|---|
| 5.4.0 | $this puede ser usado en funciones anónimas. |
| 5.3.0 | Las funciones anónimas se encuentran disponibles. |
Nota: Es posible usar func_num_args(), func_get_arg(), y func_get_args() desde dentro de un cierre.
A partir de PHP 5, el modelo de objetos ha sido reescrito para permitir un mejor rendimiento y con más características. Este fue un cambio importante a partir de PHP 4. PHP 5 tiene un modelo de objetos completo.
Entre las características de PHP 5 están la inclusión de la visibilidad, las clases abstractas y clases y métodos finales, métodos mágicos adicionales, interfaces, clonación y tipos sugeridos.
PHP trata los objetos de la misma manera como referencias o manejadores, lo que significa que cada variable contiene una referencia de objeto en lugar de una copia de todo el objeto. Ver objetos y referencias
Vea también Guia de Entorno de Usuario para Nombres.
La definición básica de clases comienza con la palabra clave class, seguido por un nombre de clase, continuado por un par de llaves que encierran las definiciones de las propiedades y métodos pertenecientes a la clase.
El nombre de clase puede ser cualquier etiqueta válida que no sea una palabra reservada de PHP. Un nombre válido de clase comienza con una letra o un guión bajo, seguido de la cantidad de letras, números o guiones bajos que sea. Como una expresión regular, se expresaría de la siguiente forma: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Una clase puede tener sus propias constantes, variables (llamadas "propiedades"), y funciones (llamadas "métodos").
Ejemplo #1 Definición simple de una clase
<?php
class SimpleClass
{
// Declaración de la propiedad
public $var = 'a default value';
// Declaración del método
public function displayVar() {
echo $this->var;
}
}
?>
La pseudo-variable $this está disponible cuando un método es invocado dentro del contexto de un objeto. $this es una referencia del objeto que invoca (usualmente el objeto al que el método pertenece, pero posiblemente sea otro objeto, si el método es llamado estáticamente desde el contexto de un objeto secundario).
Ejemplo #2 Algunos ejemplo de la pseudo-variable $this
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this está definida (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this no está definida.\n";
}
}
}
class B
{
function bar()
{
// Nota: la siguiente línea arrojará un Warning si E_STRICT está habilitada.
A::foo();
}
}
$a = new A();
$a->foo();
// Nota: la siguiente línea arrojará un Warning si E_STRICT está habilitada.
A::foo();
$b = new B();
$b->bar();
// Nota: la siguiente línea arrojará un Warning si E_STRICT está habilitada.
B::bar();
?>
El resultado del ejemplo sería:
$this está definida (A) $this no está definida. $this está definida (B) $this no está definida.
Para crear una instancia de una clase, la palabra clave new debe ser usada. Un objeto siempre se creará a menos que el objeto tenga un constructor que arroje una excepción en caso de error. Las clases deberían ser definidas antes de la instanciación (y en algunos casos esto es un requerimiento).
Si un string que contiene el nombre de una clase se usa con new, una nueva instancia de esa clase será creada. Si la clase está en un espacio de nombres, su nombre completo debe ser usado cuando se hace esto.
Ejemplo #3 Creación de una instancia
<?php
$instance = new SimpleClass();
// Esto también se puede hacer con variables:
$className = 'Foo';
$instance = new $className(); // Foo()
?>
En el contexto de una clase, es posible crear un nuevo objeto con new self y new parent.
Cuando se asigna una instancia de una clase ya creada a una nueva variable, ésta última accederá a la misma instancia como al objeto que le fue asignado. Esta conducta es la misma cuando se pasan instancias a una función. Una copia de un objeto ya creado se puede lograr a través de la clonación de la misma.
Ejemplo #4 Asignación de objetos
<?php
$instance = new SimpleClass();
$assigned = $instance;
$reference =& $instance;
$instance->var = '$assigned tendrá este valor';
$instance = null; // $instance y $reference se transforman en null
var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>
El resultado del ejemplo sería:
NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned tendrá este valor"
}
PHP 5.3.0 introdujo un par de nuevas maneras para crear instancias de un objeto:
Ejemplo #5 Creando nuevos objetos
<?php
class Test
{
static public function getNew()
{
return new static;
}
}
class Child extends Test
{}
$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);
$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);
$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>
El resultado del ejemplo sería:
bool(true) bool(true) bool(true)
Una clase puede heredar los métodos y propiedades de otra clase al utilizar la palabra clave extends en la declaración de la clase. No es posible extender múltiples clases; una clase sólo puede heredar de una clase base.
Los métodos y propiedades heredados pueden ser sobrescritos con la redeclaración de éstos utilizando el mismo nombre que en la clase parent. Sin embargo, si la clase parent definió un método como final, éste no podrá ser sobrescrito. Es posible acceder a los métodos sobrescritos o propiedades estáticas referenciándolos con parent::.
Cuando se sobrescriben métodos, la cantidad y disposición de los parámetros
debería 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
parámetros.
Ejemplo #6 Herencia simple de clases
<?php
class ExtendClass extends SimpleClass
{
// Redefinición del método parent
function displayVar()
{
echo "Clase extendida\n";
parent::displayVar();
}
}
$extended = new ExtendClass();
$extended->displayVar();
?>
El resultado del ejemplo sería:
Clase extendida un valor por defecto
Las variables pertenecientes a clases son llamadas "propiedades". También se les puede referir usando otros términos como "atributos" o "campos", pero para los propósitos de esta referencia vamos a utilizar "propiedades". Éstas se definen usando una de las palabras claves public, protected, o private, seguido por una declaración normal de variable. Esta declaración puede incluir una inicialización, pero esta inicialización debe ser un valor constante, es decir, debe tener la capacidad de ser evaluada en la compilación y no debe depender de información en tiempo de ejecución para ser evaluada.
Vea Visibilidad para más información sobre que significan 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 declaración de propiedades en lugar de (o además de) public, protected, o private. Sin embargo, var ya no se requiere más. Entre las versiones 5.0 y 5.1.3 de PHP, el uso de var fue considerado obsoleto y emitirá un Warning
E_STRICT, pero a partir de PHP 5.1.3 no está más obsoleta y no emitirá la advertencia.Si declara una propiedad utilizando var en lugar de public, protected, o private, entonces PHP tratará dicha propiedad como si hubiera sido definida como public.
Dentro de los métodos de clase, las propiedades, constantes y métodos pueden ser accedidos a través de $this->property (donde property es el nombre de la propiedad) a menos que el acceso sea a una propiedad estática dentro del contexto de un método de clase estático, en cuyo caso sería accedida usando self::$property. Vea Static para más información.
La pseudo-variable $this está disponible dentro de cualquier método de clase cuando éste es invocado dentro del contexto de un objeto. $this es una referencia del objeto que invoca (usualmente el objeto al que el método pertenece, pero posiblemente sea otro objeto, si el método es llamado estáticamente desde el contexto de un objeto secundario).
Ejemplo #1 Declaración de propiedades
<?php
class SimpleClass
{
// Declaraciones inválida de propiedades:
public $var1 = 'hola ' . 'mundo';
public $var2 = <<<EOD
hola mundo
EOD;
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
public $var5 = $myVar;
// Declaraciones válida de propiedades:
public $var6 = myConstant;
public $var7 = array(true, false);
// Esto se permite sólo en PHP 5.3.0 y superiores.
public $var8 = <<<'EOD'
hola mundo
EOD;
}
?>
Nota:
Existen varias funciones interesantes para manipular clases y objetos. Quizá le interese echar un vistazo a las Funciones de Clases/Objetos.
A diferencia de heredocs, nowdocs puede ser utilizado en cualquier contexto de datos estáticos, incluyendo declaración 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 nowdoc fue agregado en PHP 5.3.0.
Es posible definir valores constantes en función de cada clase manteniéndola invariable. Las constantes se diferencian de variables comunes en que no utilizan el símbolo $ al declararlas o usarlas.
El valor debe ser una expresión constante, no (por ejemplo) una variable, una propiedad, un resultado de una operación matemática, o una llamada a una función.
También es posible para las interfaces tener constantes. Ver la documentación de interfaces para ejemplos.
A partir de PHP 5.3.0, es posible hacer referencia a una clase utilizando una variable. El valor de la variable no puede ser una palabra clave (por ej., self, parent y static).
Ejemplo #1 Definición y uso de una constante
<?php
class MyClass
{
const constant = 'valor constante';
function showConstant() {
echo self::constant . "\n";
}
}
echo MyClass::constant . "\n";
$classname = "MyClass";
echo $classname::constant . "\n"; // A partir de PHP 5.3.0
$class = new MyClass();
$class->showConstant();
echo $class::constant."\n"; // A partir de PHP 5.3.0
?>
Ejemplo #2 Ejemplo de datos estáticos
<?php
class foo {
// A partir de PHP 5.3.0
const bar = <<<'EOT'
bar
EOT;
}
?>
A diferencia de heredocs, nowdocs puede ser utilizado en cualquier contexto de datos estáticos.
Nota:
El soporte nowdoc fue agregado en PHP 5.3.0.
Muchos desarrolladores que escriben aplicaciones orientadas a objetos crean un archivo fuente PHP para cada definición 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 más necesario. Se puede definir una función __autoload() la cual es automáticamente invocada en caso de que esté intentando utilizar una clase/interfaz que todavía no haya sido definida. Al invocar a esta función el motor de scripting está dando una última oportunidad de cargar la clase antes que PHP falle con un error.
spl_autoload_register() proporciona una alternativa más flexible para la carga automática de clases. Por esta razón, el uso de __autoload() no se recomienda y puede ser obsoleta o eliminada en el futuro.
Nota:
Antes de 5.3.0, las excepciones lanzadas en la función __autoload no podían ser capturadas en el bloque catch y eso resultaba en un error fatal. Desde 5.3.0+ las excepciones lanzadas en la función __autoload pueden ser capturadas en el bloque catch, con 1 disposición. Si se lanza una excepción personalizada, entonces la clase de excepción personalizada debe estar disponible. La función __autoload puede ser usada recursivamente para auto-cargar la clase de excepción personalizada.
Nota:
La auto-carga no está disponible si utiliza PHP en modo interactivo CLI.
Nota:
Si el nombre de la clase es usado, por ejemplo, en call_user_func() entonces puede contener algunos caracteres peligrosos tal como ../. Se recomienda no utilizar la entrada del usuario en tales funciones o al menos verifique dicha entrada en __autoload().
Ejemplo #1 Ejemplo de auto-carga
Este ejemplo intenta cargar las clases MyClass1 y MyClass2 de los archivos MyClass1.php y MyClass2.php respectivamente.
<?php
function __autoload($class_name) {
include $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
Ejemplo #2 Otro ejemplo de auto-carga
Este ejemplo intenta cargar la interfaz ITest.
<?php
function __autoload($name) {
var_dump($name);
}
class Foo implements ITest {
}
/*
string(5) "ITest"
Fatal error: Interface 'ITest' not found in ...
*/
?>
Ejemplo #3 Auto-carga con manejo de excepciones para 5.3.0+
Este ejemplo lanza una excepción y demuestra los bloques try/catch.
<?php
function __autoload($name) {
echo "Intentando cargar $name.\n";
throw new Exception("Imposible cargar $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
El resultado del ejemplo sería:
Intentando cargar NonLoadableClass. Imposible cargar NonLoadableClass.
Ejemplo #4 Auto-carga con manejo de excepciones para 5.3.0+ - Omitiendo excepción personalizada
Este ejemplo lanza una excepción para una excepción personalizada no cargable.
<?php
function __autoload($name) {
echo "Intentando cargar $name.\n";
throw new MissingException("Imposible cargar $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
El resultado del ejemplo sería:
Intentando cargar NonLoadableClass. Intentando cargar MissingException. Fatal error: Class 'MissingException' not found in testMissingException.php on line 4
PHP 5 permite a los desarrolladores declarar métodos constructores para las clases. Aquellas que tengan un método constructor lo invocarán en cada nuevo objeto creado, lo que lo hace idóneo para cualquier inicialización que el objeto pueda necesitar antes de ser usado.
Nota: Constructores parent no son llamados implícitamente si la clase child define un constructor. Para ejecutar un constructor parent, se requiere invocar a parent::__construct() desde el constructor child.
Ejemplo #1 Utilización de nuevos constructores unificados
<?php
class BaseClass {
function __construct() {
print "En el constructor de BaseClass\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "En el constructor de SubClass\n";
}
}
$obj = new BaseClass();
$obj = new SubClass();
?>
Por motivos de compatibilidad, si PHP 5 no puede encontrar una función __construct() para una determinada clase, buscará el viejo estilo de la función constructora, mediante el nombre de la clase. Efectivamente, esto significa que en el único caso en el que se tendría compatibilidad es si la clase tiene un método llamado __construct() que fuese utilizado para diferentes propósitos.
A diferencia con otros métodos, PHP no generará un mensaje de error a
nivel de E_STRICT cuando __construct()
es sobrescrito con diferentes parámetros que los métodos padre
__construct() tienen.
A partir de PHP 5.3.3, los métodos con el mismo nombre que el último elemento de una clase en un nombre de espacios no serán más 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 método regular a partir de PHP 5.3.3
}
}
?>
PHP 5 introduce un concepto de destructor similar al de otros lenguajes orientados a objetos, tal como C++. El método destructor será llamado tan pronto como no hayan otras referencias a un objeto determinado, o en cualquier otra circunstancia de finalización.
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 serán llamados implícitamente por el motor. Para ejecutar un destructor padre, se deberá llamar explícitamente a parent::__destruct() en el interior del destructor.
El destructor será invocado aún si la ejecución del script es detenida usando exit(). Llamar a exit() en un destructor evitará que se ejecuten las rutinas restantes de finalización.
Nota:
Los destructores invocados durante la finalización del script tienen los headers HTTP ya enviados. El directorio de trabajo en la fase de finalización del script puede ser diferente con algunos SAPIs (por ej., Apache).
Nota:
Intentar lanzar una excepción desde un destructor (invocado en la finalización del script) causa un error fatal.
La visibilidad de una propiedad o método se puede definir anteponiendo una de las palabras claves public, protected o private en la declaración. Miembros de clases declarados como public pueden ser accedidos de cualquier lado. Miembros declarados como protected, sólo de la clase misma, por herencia y clases parent. Aquellos definidos como private, únicamentede la clase que los definió.
Las propiedades de clases deben ser definidas como public, private, o protected. Si se declaran usando var, serán definidas como public.
Ejemplo #1 Declaración de propiedades
<?php
/**
* Definición 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
/**
* Definición de MyClass2
*/
class MyClass2 extends MyClass
{
// Se puede redeclarar los métodos 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 declaración de una variable de PHP 4 con la palabra clave var todavía es soportado (como un sinónimo de public) por razones de compatibilidad. En PHP 5 antes de 5.1.3, su uso genera un Warning
E_STRICT.
Los métodos de clases pueden ser definidos como public, private, o protected. Aquellos declarados sin ninguna palabra clave de visibilidad explícita serán definidos como public.
Ejemplo #2 Declaración de métodos
<?php
/**
* Definición de MyClass
*/
class MyClass
{
// Declaración de un constructor public
public function __construct() { }
// Declaración de un método public
public function MyPublic() { }
// Declaración de un método protected
protected function MyProtected() { }
// Declaración de un método 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
/**
* Definición 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
?>
Los objetos del mismo tipo tendrán acceso a los miembros private y protected entre ellos aunque no sean de la misma instancia. Esto es porque los detalles específicos de implementación 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 'Método private accedido.';
}
public function baz(Test $other)
{
// Se puede cambiar la propiedad private:
$other->foo = 'hola';
var_dump($other->foo);
// También se puede invocar al método private:
$other->bar();
}
}
$test = new Test('test');
$test->baz(new Test('other'));
?>
El resultado del ejemplo sería:
string(5) "hola" Método private accedido.
La herencia es un principio de programación 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 métodos públicos y protegidos de la clase padre. A menos que una clase sobrescriba esos métodos, mantendrán su funcionalidad original.
Esto es útil para la definición y abstracción de la funcionalidad y permite la implementación de funcionalidad adicional en objetos similares sin la necesidad de reimplementar toda la funcionalidad compartida.
Nota:
A menos que la carga automática 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'
?>
El Operador de Resolución de Ámbito (también denominado Paamayim Nekudotayim) o en términos simples, el doble dos-puntos, es un token que permite acceder a elementos estáticos, constantes, y sobrescribir propiedades o métodos de una clase.
Cuando se hace referencia a estos items desde el exterior de la definición 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 podría, en un principio, parecer una extraña elección para bautizar a un doble dos-puntos. Sin embargo, mientras se escribía 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 definición 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 métodos desde el interior de la definición de la clase.
Ejemplo #2 :: desde el interior de la definición de la clase
<?php
class OtherClass extends MyClass
{
public static $my_static = 'variable estática';
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 definición parent de un método, PHP no invocará al método parent. Depende de la clase extendida el hecho de llamar o no al método parent. Esto también se aplica a definiciones de métodos Constructores y Destructores, Sobrecarga, y Mágicos.
Ejemplo #3 Invocando a un método parent
<?php
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}
class OtherClass extends MyClass
{
// Sobrescritura de definición parent
public function myFunc()
{
// Pero todavía se puede llamar a la función parent
parent::myFunc();
echo "OtherClass::myFunc()\n";
}
}
$class = new OtherClass();
$class->myFunc();
?>
Véase también algunos ejemplos de trucos de llamadas estáticas .
Declarar propiedades o métodos de clases como estáticos los hacen accesibles sin necesidad de una instanciación de la clase. Una propiedad declarada como static no puede ser accedida con un objeto de clase instanciado (pero sí se puede con métodos estáticos).
Por motivos de compatibilidad con PHP 4, si no se utiliza ninguna declaración de visibilidad, se tratará a las propiedades o métodos como si hubiesen sido definidos como public.
Debido a que los métodos estáticos se pueden invocar sin tener creada una instancia del objeto, la pseudo-variable $this no está disponible dentro de los métodos declarados como static.
Las propiedades estáticas no pueden ser accedidas a través del objeto utilizando el operador flecha (->).
Invocar métodos no estáticos estáticamente genera un Warning a nivel de E_STRICT.
Como cualquier otra variable estática en PHP, las propiedades estáticas sólo pueden ser inicializadas utilizando una string literal o una constante; las expresiones no están permitidas. Por tanto, puede inicializar una propiedad estática con enteros o arrays (por ejemplo), pero no puede hacerlo con otra variable, con el valor de devolución de una función, 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 (por ej., self, parent y static).
Ejemplo #1 Ejemplo de propiedad estática
<?php
class Foo
{
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
class Bar extends Foo
{
public function fooStatic() {
return parent::$my_static;
}
}
print Foo::$my_static . "\n";
$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n"; // Undefined "Property" my_static
print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n"; // A partir de PHP 5.3.0
print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>
Ejemplo #2 Ejemplo de método estático
<?php
class Foo {
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // A partir de PHP 5.3.0
?>
PHP 5 introduce clases y métodos abstractos. Las clases definidas como abstract seguramente no son instanciadas y cualquier clase que contiene almenos un método abstracto debe ser definida como abstract. Los métodos definidos como abstractos simplemente declaran la estructura del método, pero no pueden definir la implementación.
Cuando se hereda de una clase abstracta, todos los métodos definidos como abstract en la definición de la clase parent deben ser redefinidos en la clase child; adicionalmente, estos métodos deben ser definidos con la misma visibilidad (o con una menos restrictiva). Por ejemplo, si el método abstracto está definido como protected, la implementación de la función puede ser redefinida como protected o public, pero nunca como private. Por otra parte, las estructuras de los métodos tienen que coincidir, es decir, los (type hinting) tipos sugeridos y el número de argumentos requeridos deben ser los mismos. Esto también aplica a los constructores de PHP 5.4. Antes de PHP 5.4 las estructuras del constructor podían ser diferentes.
Ejemplo #1 Ejemplo de clase abstracta
<?php
abstract class AbstractClass
{
// Forzando la extensión de clase para definir este método
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// Método común
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 sería:
ConcreteClass1 FOO_ConcreteClass1 ConcreteClass2 FOO_ConcreteClass2
Códigos antiguos que no tengan clases o funciones definidas por el usuario llamadas 'abstract' deberían ejecutarse sin modificaciones.
Las interfaces de objetos permiten crear código con el cual especificamos qué métodos deben ser implementados por una clase, sin tener que definir cómo estos métodos son manipulados.
Las interfaces son definidas utilizando la palabra clave interface, de la misma forma que con clases estándar, pero sin métodos que tengan su contenido definido.
Todos los métodos declarados en una interfaz deben ser public, ya que ésta es la naturaleza de una interfaz.
Para implementar una interfaz, se utiliza el operador implements. Todos los métodos 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 más de una interfaz si se deseara, separándolas cada una por una coma.
Nota:
Una clase no puede implementar dos interfaces que compartan nombres de funciones, puesto que esto causaría ambigüedad.
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 métodos que fueron definidos en la interfaz. De no cumplir con esta regla, se generará un error fatal.
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.
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 método 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 múltiple 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 métodos particulares. Vea el operador instanceof y type hinting.
Desde PHP 5.4.0, PHP implementa una metodología de reutilización de código llamada Traits.
Los traits (rasgos) son un mecanismo de reutilización de código 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 métodos sobre varias clases independientes y pertenecientes a clases jerárquicas distintas. La semántica a la hora combinar Traits y clases se define de tal manera que reduzca su complejidad y se eviten los problemas típicos asociados a la herencia múltiple y a los Mixins.
Un Trait es similar a una clase, pero con el único objetivo de agrupar funcionalidades muy específicas y de una manera coherente. No se puede instanciar directamente un Trait. Es por tanto un añadido a la herencia tradicional, y habilita la composición 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;
/* ... */
}
?>
Los miembros heredados de una clase base se sobrescriben cuando se inserta otro miembro homónimo desde un Trait. De acuerdo con el orden de precedencia, los miembros de la clase actual sobrescriben los métodos del Trait, que a su vez sobrescribe los métodos heredados.
Ejemplo #2 Ejemplo de Orden de Precedencia
Se sobrescribe un miembro de la clase base con el método insertado en MiHolaMundo a partir del Trait DecirMundo. El comportamiento es el mismo para los métodos definidos en la clase MiHolaMundo. Según el orden de precedencia los métodos de la clase actual sobrescriben los métodos del Trait, a la vez que el Trait sobrescribe los métodos 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 sería:
¡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 sería:
¡Hola Universo!
Se pueden insertar múltiples Traits en una clase, mediante una lista separada por comas en la sentencia use.
Ejemplo #4 Uso de Múltiples Traits
<?php
trait Hola {
public function decirHola() {
echo 'Hola ';
}
}
trait Mundo {
public function decirMundo() {
echo 'Mundo';
}
}
class MiHolaMundo {
use Hola, Mundo;
public function decirAdmiración() {
echo '!';
}
}
$o = new MiHolaMundo();
$o->decirHola();
$o->decirMundo();
$o->decirAdmiración();
?>
El resultado del ejemplo sería:
Hola Mundo!
Si dos Traits insertan un método 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 unívocamente uno de los métodos conflictivos.
Como esto sólo permite excluir métodos, se puede usar el operador as para permitir incluir uno de los métodos conflictivos bajo otro nombre.
Ejemplo #5 Resolución de Conflictos
En este ejemplo, Talker utiliza los traits A y B. Como A y B tienen métodos 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 implementación 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;
}
}
?>
Al usar el operador as, se puede también ajustar la visibilidad del método en la clase exhibida.
Ejemplo #6 Modificar la Visibilidad de un Método
<?php
trait HolaMundo {
public function decirHola() {
echo 'Hola Mundo!';
}
}
// Cambiamos visibilidad de decirHola
class MiClase1 {
use HolaMundo { decirHola as protected }
}
// Método alias con visibilidad cambiada
// La visibilidad de decirHola no cambia
class MiClase2 {
use HolaMundo { hacerHolaMundo as private decirHola }
}
?>
Al igual que las clases, los Traits también pueden hacer uso de otros Traits. Al usar uno o más traits en la definición 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 sería:
Hola Mundo!
Los traits soportan el uso de métodos abstractos para imponer requisitos a la clase a la que se exhiban.
Ejemplo #8 Expresar Resquisitos con Métodos 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;
}
}
?>
Los métodos de un trait pueden referenciar a variables estáticas, pero no puede ser definido en el trait. Los traits, sin embargo, pueden definir método estáticos a la clase a la que se exhiben.
Ejemplo #9 Variables estáticas
<?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 Métodos Estáticos
<?php
trait EjemploEstatico {
public static function hacerAlgo() {
return 'Hacer algo';
}
}
class Ejemplo {
use EjemploEstatico;
}
Ejemplo::hacerAlgo();
?>
Los traits también 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 definición de la clase es compatible (misma
visibilidad y valor inicial) o de otro modo un error fatal.
Ejemplo #12 Resolución de Conflictos
<?php
trait PropiedadesTrait {
public $misma = true;
public $diferente = false;
}
class EjemploPropiedades {
use PropiedadesTrait;
public $misma = true; // Estándares estrictos
public $diferente = true; // Error fatal
}
?>
La sobrecarga en PHP ofrece los medios para "crear" dinámicamente propiedades y métodos. Estas entidades dinámicas se procesan por los métodos mágicos que se pueden establecer en una clase para diversas acciones.
Se invoca a los métodos de sobrecarga cuando se interactúa con propiedades o métodos que no se han declarado o que no son visibles en el ámbito activo. A lo largo de esta sección usaremos los términos "propiedades inaccesibles" y "métodos inaccesibles" para referirnos a esta combinación de declaración y visibilidad.
Todos los métodos sobrecargados deben definirse como public.
Nota:
No se puede pasar ninguno de los parámetros de estos métodos mágicos por referencia.
Nota:
La interpretación de PHP de "overloading" es distinta de la mayoría de los lenguajes orientados a objetos. La sobrecarga tradicionalmente ofrece la capacidad de tener múltiples métodos con el mismo nombre, pero con un tipo o un número distinto de parámetros.
| Versión | Descripción |
|---|---|
| 5.3.0 | Se añade __callStatic. Se añadieron advertencias para hacer cumplir la visibilidad public e impedir la declaración static. |
| 5.1.0 | Añadidos los métodos __isset y __unset. |
$name
)$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 parámetro $name es el nombre de la propiedad con la que se está interactuando. En el método __set() el parámetro $value especifica el valor que se debe asignar a la propiedad $name.
La sobrecarga de propiedades sólo funciona en contextos de objetos. Estos métodos mágicos no se lanzarán en contextos estáticos. Por esa razón, no se deben declarar como estáticos. Desde PHP 5.3.0, se emite un aviso si alguno de los métodos de sobrecarga es declarado como static.
Nota:
Debido a la forma en que PHP procesa el operador de asignación, el valor que devuelve __set() se ignora. Del mismo modo, nunca se llama a __get() al encadenar asignaciones como ésta:
$a = $obj->b = 8;
Nota:
No se puede utilizar una propiedad sobrecargada en ninguna construcción del lenguaje que no sea isset(). Esto significa que si se invoca a empty() en una propiedad sobrecargada, no se llamará al método de sobrecarga.
Para solventar esta limitación, se debe copiar la propiedad sobrecargada en una variable de ámbito local que empty() pueda manejar.
Ejemplo #1 Sobrecarga de propiedades mediante los métodos __get(), __set(), __isset() y __unset()
<?php
class PropertyTest
{
/** Localización de los datos sobrecargados. */
private $data = array();
/** La sobrecarga no se usa en propiedades declaradas. */
public $declared = 1;
/** La sobre carga sólo 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 línea ' . $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 método mágico, 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 sería:
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 línea 69 in <file>en la línea 28
__call() es lanzado al invocar un método inaccesible en un contexto de objeto.
__callStatic() es lanzado al invocar un método inaccesible en un contexto estático.
El parámetro $name corresponde al nombre del método al que se está llamando. El parámetro $arguments es un array enumerado que contiene los parámetros que se han pasado al método $name.
Ejemplo #2 Sobrecarga de métodos mediante los métodos __call() and __callStatic()
<?php
class MethodTest
{
public function __call($name, $arguments)
{
// Nota: el valor $name es sensible a mayúsculas.
echo "Llamando al método de objeto '$name' "
. implode(', ', $arguments). "\n";
}
/** Desde PHP 5.3.0 */
public static function __callStatic($name, $arguments)
{
// Nota: el valor $name es sensible a mayúsculas.
echo "Llamando al método estático '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
$obj->runTest('en contexto de objeto');
MethodTest::runTest('en contexto estático'); // Desde PHP 5.3.0
?>
El resultado del ejemplo sería:
Llamando al método de objeto 'runTest' en contexto de objeto Llamando al método estático 'runTest' en contexto estático
PHP 5 ofrece una manera para que los objetos sean definidos por lo que es posible iterar a través de una lista de elementos, con, por ejemplo, una sentencia foreach. Por defecto, todas las propiedades visibles serán utilizados para la iteración.
Ejemplo #1 Iteración 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 sería:
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 través de todas las propiedades visibles que se puedan acceder.
Para dar un paso más, se puede implementar la interfaz Iterator. Esto permite al objeto decidir cómo será iterado y qué valores estarán disponibles en cada iteración.
Ejemplo #2 Iteración 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 sería:
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 métodos de Iterator. IteratorAggregate solamente requiere la implementación de un único método, IteratorAggregate::getIterator(), el cual debería devolver una instancia de una clase que implemente Iterator.
Ejemplo #3 Iteración de objeto implementando IteratorAggregate
<?php
class MyCollection implements IteratorAggregate
{
private $items = array();
private $count = 0;
// Se requiere la definición 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 sería:
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 más ejemplos de iteradores, vea la extensión SPL.
Los nombres de método __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() y __clone() son mágicos en las clases PHP. No se puede tener métodos con estos nombres en cualquiera de las clases a menos que desee la funcionalidad mágica asociada a estos.
PHP se reserva todos los nombres de los métodos que comienzan con __ como mágicos. Se recomienda que no utilice los nombres de métodos con __ en PHP a menos que desee alguna funcionalidad mágica documentada.
serialize() comprueba si la clase tiene un método con
el nombre mágico __sleep(). Si es así,
el método se ejecuta antes de cualquier serialización. 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 método 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 resultaría 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. Además, el método es útil si tiene objetos muy grandes que no necesitan guardarse por completo.
Por el contrario, unserialize() comprueba la presencia de un método con el nombre mágico __wakeup(). Si está presente, este método 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 serialización y realizar otras tareas de reinicialización.
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();
}
}
?>
El método __toString() permite a una clase
decidir cómo comportarse cuando se le trata como un string. Por ejemplo,
lo que echo $obj; mostraría. Este método debe
devolver un string, si no se emitirá un nivel de error fatal E_RECOVERABLE_ERROR.
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 sería:
Hola Mundo
Antes de PHP 5.2.0 el método
__toString()
se llama sólo 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 conversión de los objetos sin el método __toString()
a string podría causar E_RECOVERABLE_ERROR.
El método __invoke() es llamado cuando un script intenta llamar a un objeto como si fuera una función.
Nota:
Esta característica 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 sería:
int(5) bool(true)
$properties
)Este método static es llamado para las clases exportadas por var_export(), desde PHP 5.1.0.
El único parámetro de este método 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 sería:
object(A)#2 (2) {
["var1"]=>
int(5)
["var2"]=>
string(3) "foo"
}
PHP 5 introduce la nueva palabra clave final, que impide que las clases hijas sobrescriban un método, antecediendo su definición con la palabra final. Si la propia clase se define como final, entonces no se podrá heredar de ella.
Ejemplo #1 Ejemplo de métodos 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 función 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 (BaseClass)
?>
Nota: Las propiedades no pueden declararse como final. Sólo pueden las clases y los métodos.
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, sería si tuviéramos 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 sería 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 réplica del objeto principal, se espera que se cree una nueva instancia de este otro objeto, de forma que la réplica tenga su propia copia
Para crear una copia de un objeto se utiliza la palabra clave clone (que invoca, si fuera posible, al método __clone() del objeto). No se puede llamar al método __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, mantendrán las referencias.
Una vez que la clonación ha finalizado, se llamará al método __clone() del nuevo objeto (si el método __clone() estuviera definido), para permitirle realizar los cambios necesarios sobre sus propiedades.
Ejemplo #1 Clonación 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 sería:
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
)
)
En PHP 5, la comparación de objetos es más 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 comparación (==), 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 idénticas sí y sólo sí hacen referencia a la misma instancia de la misma clase.
Un ejemplo aclarará estas reglas.
Ejemplo #1 Ejemplo de comparación 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 sería:
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 comparación de sus objetos.
Desde PHP 5 se incorpora la implicación de tipos. Ahora, las funciones pueden obligar a que sus parámetros sean objetos (especificando el nombre de la clase en el prototipo de la función), interfaces, arrays (desde PHP 5.1) o tipos callable (despe PHP 5.4). Sin embargo, si se usa NULL como el valor predeterminado del parámetro, será permitido como un argumento para llamada posterior.
Si se especifica una clase o una interfaz como tipo implicado también se permitirán todos sus hijos o implementaciones too.
La implicación de tipos no puede usarse con tipos escalares como int o string. Tampoco están permitidos los Traits.
Ejemplo #1 Ejemplos de Implicación de Tipos
<?php
// Una clase de ejemplo
class MiClase
{
/**
* Una función de prueba
*
* El primer parámetro debe ser un objeto del tipo OtraClase
*/
public function prueba(OtraClase $otraclase) {
echo $otraclase->var;
}
/**
* Otra función de prueba
*
* El primer parámetro debe ser un array
*/
public function prueba_array(array $array_entrada) {
print_r($array_entrada);
}
/**
* El primer parámetro debe ser un iterador
*/
public function prueba_interface(Traversable $iterador) {
echo get_class($iterador);
}
/**
* El primer parámetro debe ser de tipo callable
*/
public function prueba_callable(callable $callback, $data) {
call_user_func($callback, $data);
}
}
// Otra clase de ejemplo
class OtraClase {
public $var = 'Hola Mundo';
}
?>
Si no se satisface el type hint, 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: Imprime en pantalla Hola Mundo
$miclase->prueba($otraclase);
// Error Fatal: El argumento 1 debe ser un array
$miclase->prueba('una cadena');
// Funciona: Imprime en pantalla el array
$miclase->prueba(array('a', 'b', 'c'));
// Funciona: Imprime en pantalla ArrayObject
$miclase->prueba_interface(new ArrayObject(array()));
// Funciona: Imprime en pantalla int(1)
$miclase->prueba_callable('var_dump', 1);
?>
Los tipos sugeridos tambíen se pueden usar con funciones:
<?php
// Una clase de ejemplo
class MiClase {
public $var = 'Hola Mundo';
}
/**
* Una función de prueba
*
* El primer parámetro debe ser un objeto del tipo MiClase
*/
function miFunción (MiClase $foo) {
echo $foo->var;
}
// Funciona
$miclase = new MiClase;
miFunción($miclase);
?>
Tipo implicado que acepta valores de tipo NULL:
<?php
/* Se acepta el valor NULL */
function prueba(stdClass $obj = NULL) {
}
prueba(NULL);
prueba(new stdClass);
?>
Desde PHP 5.3.0, PHP incorpora una nueva funcionalidad llamada enlace estático en tiempo de ejecución que permite hacer referencias a la clase en uso dentro de un contexto de herencia estática.
De forma más precisa, un enlace estático en tiempo de ejecución para funcionar almacena el nombre de clase de la última llamada que no tenga "propagación". En el caso de las llamadas a métodos estáticos, se trata de la clase a la que se llamó explícitamente (normalmente, la que precede al operador ::); en los casos de llamadas a métodos que no son estáticos, se resolvería a la clase del objeto. Una "llamada con propagación" es una llamada estática que está precedida por self::, parent::, static::, o, si seguimos la jerarquía de clases, forward_static_call(). La función get_called_class() puede utilizarse para obtener un string con el nombre de la clase que realiza la llamada, y static:: revela cuál es su alcance.
Se le ha llamado "enlace estático en tiempo de ejecución" teniendo en cuenta un punto de vista interno. "Enlace en tiempo de ejecución" viene del hecho de que static:: ya resuelve a la clase en la que se definió el método, sino que en su lugar se resolverá utilizando información en tiempo de ejecución debido a que se puede utilizar (entre otras cosas) para las llamadas de métodos estáticos, se le llamó también "enlace estático".
Las referencias estáticas 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 función:
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 sería:
A
Los enlaces estáticos en tiempo de ejecución tratan de resolver estas limitaciones empleando una palabra clave que haga referencia a la clase que realizó la llamada en tiempo de ejecución. 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 básico de static::
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // He aquí el enlace estático en tiempo de ejecución
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
?>
El resultado del ejemplo sería:
B
Nota:
En contextos no estáticos, la clase que realiza la llamada será la clase del objeto instanciado. Dado que $this-> tratará de invocar métodos privados en su mismo ámbito, el uso de static:: puede provocar diferents resultados. Otra diferencia es que static:: sólo puede hacer referencia a propiedades estáticas.
Ejemplo #3 Uso de static:: en un contexto no estático
<?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 método original; el ámbito del nuevo es ahora C */
}
}
$b = new B();
$b->test();
$c = new C();
$c->test(); //falla
?>
El resultado del ejemplo sería:
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 estática, la resolución de enlaces estáticos en tiempo de ejecución se dentendrá sin propagarse. Por otra parte, las llamadas estáticas que utilicen palabras clave como parent:: o self:: sí propagarán la información.
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 sería:
A C C
Uno de los puntos clave de la POO de PHP 5 que a menudo se menciona es que "por omisión los objetos se pasan por referencia". Esto no es completamente cierto. Esta sección 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 parámetro, 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 sería:
2 2 2
La función 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 métodos no se guardarán, sólo 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 definición de la clase A. Esto se puede hacer, por ejemplo, escribiendo la definición de la clase A en un fichero, para después o bien incluirlo, o bien hacer uso de la función 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 algún 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 aplicación está usando sesiones, y utiliza session_register() para registrar objetos, estos objetos se serializarán automáticamente al final de cada página PHP, y se deserializan también automáticamente en cada una de las siguientes peticiones. Esto significa que, una vez que formen parte de la sesión, estos objetos se podrán utilizar en cualquier página de la aplicación. Sin embargo, la función session_register(): ha sido borrada a partir de PHP 5.4.0
Si una aplicación serializa objetos para su uso posterior, se recomienda encarecidamente que se incluya la definición de la clase en toda la aplicación. Si no se hiciera, se deserializaría el objeto sin una definición de clase, lo cual daría como resultado que PHP definiera al objeto con la clase __PHP_Incomplete_Class_Name, que no tiene métodos, haciendo que el objeto no fuera útil.
Por tanto, si en el ejemplo anterior $a se guardara en una sesión mediante session_register("a"), sería necesario incluir el fichero classa.inc en todas las páginas, no sólo en page1.php y page2.php.
Aquí se registran los cambios del modelo de POO de PHP 5. Las descripciones y otras notas respecto a estas nuevas funcionalidades están documentadas dentro de la documentación de POO 5.
| Versión | Descripción |
|---|---|
| 5.4.0 | Cambiado: Si una clase abstracta define una firma para el constructor ahora se hará cumplir. |
| 5.3.3 | Cambiado: Los métodos con el mismo nombre que el último elemento de un nombre de clase perteneciente a un espacio de nombres ya no serán 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 omisión de los métodos de una clase que implemente un interfaz coincidan con los valores por omisión 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 método
mágico se le declara como estático.
Además, hace necesario que tengan visibilidad pública.
|
| 5.3.0 | Cambiado: Antes de 5.3.0, las excepciones lanzadas en la función __autoload() no podían capturarse en el bloque catch, y provocaban un error fatal. Ahora, las excepciones lanzadas dentro de la función __autoload pueden capturarse en el bloque catch, con una única salvedad. Si se lanza una excepción definida por el usuario, entonces esta excepción debería estar disponible. Se puede utilizar recursivamente la función __autoload para cargar automáticamente la clase de la excepción definida por el usuario. |
| 5.3.0 | Añadido: El método __callStatic. |
| 5.3.0 | Añadido: Soporte heredoc y nowdoc para constantes de clase y definición 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 | Añadido: Enlaces estáticos en tiempo de ejecución. |
| 5.3.0 | Añadido: El método __invoke(). |
| 5.2.0 |
Cambiado: Al método __toString()
sólo 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 método __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 emitía 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 método estático __set_state() en las clases exportadas por var_export(). |
| 5.1.0 | Añadido: Los métodos __isset() y __unset(). |
(PHP 5 >= 5.3.0)
¿Qué son los espacios de nombres? En su definición más 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 actúan 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. Además, para acceder al archivo foo.txt fuera del directorio /home/greg se debe añadir 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 programación.
En el mundo de PHP, los espacios de nombres están diseñados para solucionar dos problemas que los autores de bibliotecas y aplicaciones se encuentran cuando crean elementos de código reusable tales como clases o funciones:
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; // véase la sección "Definir Espacios de Nombres"
class MiClase {}
function mifunción() {}
const MICONSTANTE = 1;
$a = new MiClase;
$c = new \mi\nombre\MiClase; // véase la sección "Espacio Global"
$a = strlen('hola'); // véase la sección "Usar espacios de nombres: una alternativa a
// funciones/constantes globales"
$d = namespace\MICONSTANTE; // véase la sección "El operador namespace y
// la constante __NAMESPACE__"
$d = __NAMESPACE__ . '\MICONSTANTE';
echo constant($d); // véase la sección "Espacios de Nombres y características dinámicas del lenguaje"
?>
Nota:
Los nombres de espacio de nombres PHP y php, y los nombres compuestos a partir de estos nombres (como PHP\Classes) están reservados para el uso del lenguaje interno y no deben ser utilizados en el código.
(PHP 5 >= 5.3.0)
Aunque cualquier código de PHP válido puede estar contenido dentro de un espacio de nombres, sólo son afectados por los espacios de nombres cuatro tipos de código: 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 código - con una excepción: la palabra clave declare.
Ejemplo #1 Declarar un único espacio de nombres
<?php
namespace MiProyecto;
const CONECTAR_OK = 1;
class Conexión { /* ... */ }
function conectar() { /* ... */ }
?>
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
?>
Además, a diferencia de otras construcciones de PHP, se puede definir el mismo espacio de nombres en múltiples archivos, permitiendo la separación de contenido de espacios de nombres a través del sistema de archivos.
(PHP 5 >= 5.3.0)
Al igual que los directorios y archivos, los espacios de nombres de PHP también tienen la capacidad de especificar una jerarquía 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 jerarquía
<?php
namespace MiProyecto\Sub\Nivel;
const CONECTAR_OK = 1;
class Conexión { /* ... */ }
function conectar() { /* ... */ }
?>
(PHP 5 >= 5.3.0)
También se pueden declarar múltiples espacios de nombres en el mismo archivo. Hay dos sintaxis permitidas.
Ejemplo #1 Declarar múltiples espacios de nombres, sintaxis de combinación simple
<?php
namespace MiProyecto;
const CONECTAR_OK = 1;
class Conexión { /* ... */ }
function conectar() { /* ... */ }
namespace OtroProyecto;
const CONECTAR_OK = 1;
class Conexión { /* ... */ }
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 múltiples espacios de nombres, sintaxis de llaves
<?php
namespace MiProyecto {
const CONECTAR_OK = 1;
class Conexión { /* ... */ }
function conectar() { /* ... */ }
}
namespace OtroProyecto {
const CONECTAR_OK = 1;
class Conexión { /* ... */ }
function conectar() { /* ... */ }
}
?>
Se desaconseja encarecidamente, como práctica de código, el combinar múltiples espacios de nombres en el mismo archivo. El caso de uso principal es combinar múltiples scripts de PHP en el mismo archivo.
Combinar código global que no es de espacio de nombres con código que sí lo es, sólo está soportado mediante la sintaxis de llaves. El código global debería estar encerrado en una declaración de espacio de nombres sin nombre de espacio de nombres:
Ejemplo #3 Declarar múltiples espacios de nombres y código que no es de espacio de nombres
<?php
namespace MiProyecto {
const CONECTAR_OK = 1;
class Conexión { /* ... */ }
function conectar() { /* ... */ }
}
namespace { // código global
session_start();
$a = MiProyecto\conectar();
echo MiProyecto\Conexión::iniciar();
}
?>
No puuede existir código de PHP fuera de las llaves del espacio de nombres excepto para una sentencia de apertura declare.
Ejemplo #4 Declarar múltiples espacios de nombres y código que no es de espacio de nombres
<?php
declare(encoding='UTF-8');
namespace MiProyecto {
const CONECTAR_OK = 1;
class Conexión { /* ... */ }
function conectar() { /* ... */ }
}
namespace { // código global
session_start();
$a = MiProyecto\conectar();
echo MiProyecto\Conexión::iniciar();
}
?>
(PHP 5 >= 5.3.0)
Antes de hablar del uso de los espacios de nombres es importante entender cómo sabe PHP qué elemento del código del espacio de nombre se requiere. Se puede hacer una simple analogía 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:
Aquí hay un ejemplo de los tres tipos de sintaxis en código real:
archivo1.php
<?php
namespace Foo\Bar\subespaciodenombres;
const FOO = 1;
function foo() {}
class foo
{
static function métodoestático() {}
}
?>
archivo2.php
<?php
namespace Foo\Bar;
include 'archivo1.php';
const FOO = 2;
function foo() {}
class foo
{
static function métodoestático() {}
}
/* Nombre no cualificado */
foo(); // se resuelve con la función Foo\Bar\foo
foo::métodoestático(); // se resuelve con la clase Foo\Bar\foo, método métodoestático
echo FOO; // se resuelve con la constante Foo\Bar\FOO
/* Nombre cualificado */
subespaciodenombres\foo(); // se resuelve con la función Foo\Bar\subespaciodenombres\foo
subespaciodenombres\foo::métodoestático(); // se resuelve con la clase Foo\Bar\subespaciodenombres\foo,
// método métodoestático
echo subespaciodenombres\FOO; // se resuelve con la constante Foo\Bar\subespaciodenombres\FOO
/* Nombre conmpletamente cualificado */
\Foo\Bar\foo(); // se resuelve con la función Foo\Bar\foo
\Foo\Bar\foo::métodoestático(); // se resuelve con la clase Foo\Bar\foo, método métodoestático
echo \Foo\Bar\FOO; // se resuelve con la constante Foo\Bar\FOO
?>
Observe que para acceder a cualquier clase, función 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 función global strlen
$b = \INI_ALL; // accede a la constante global INI_ALL
$c = new \Exception('error'); // instancia a la clase global Exception
?>
(PHP 5 >= 5.3.0)
La implementación de PHP de los espacios de nombres está influenciada por su naturaleza dinámica como lenguaje de programación. Así, para convertir código como el del siguiente ejemplo en código de espacios de nombres:
Ejemplo #1 Acceder dinámicamente 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
?>
Ejemplo #2 Acceder dinámicamente 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 "\\nombreespaciodenombres\\nombreclase" */
$a = '\nombreespaciodenombres\nombreclase';
$obj = new $a; // imprime nombreespaciodenombres\nombreclase::__construct
$a = 'nombreespaciodenombres\nombreclase';
$obj = new $a; // también imprime nombreespaciodenombres\nombreclase::__construct
$b = 'nombreespaciodenombres\nombrefunc';
$b(); // imprime nombreespaciodenombres\nombrefunc
$b = '\nombreespaciodenombres\nombrefunc';
$b(); // también imprime nombreespaciodenombres\nombrefunc
echo constant('\nombreespaciodenombres\nombreconst'), "\n"; // imprime de espacio de nombres
echo constant('nombreespaciodenombres\nombreconst'), "\n"; // también imprime de espacio de nombres
?>
Asegúrese de leer la nota sobre escapar nombres de espacios de nombres en cadenas.
(PHP 5 >= 5.3.0)
PHP soporta dos formas de acceder de manera abstracta a elementos dentro del espacio de nombres actual,
la constante mágica __NAMESPACE__, y la palabra clave
namespace.
El valor de __NAMESPACE__ es una cadena que contiene el nombre del espacio de
nombres actual. En código global, código que no es de espacio de nombres, contiene una cadena vacía.
Ejemplo #1 Ejemplo de __NAMESPACE__, código de espacio de nombres
<?php
namespace MiProyecto;
echo '"', __NAMESPACE__, '"'; // imprime "MiProyecto"
?>
Ejemplo #2 Ejemplo de __NAMESPACE__, código global
<?php
echo '"', __NAMESPACE__, '"'; // imprime ""
?>
__NAMESPACE__ es útil para construir nombres
dinámicamente, por ejemplo:
Ejemplo #3 usar __NAMESPACE__ para la construcción dinámica de nombres
<?php
namespace MiProyecto;
function obtener($nombreclase)
{
$a = __NAMESPACE__ . '\\' . $nombreclase;
return new $a;
}
?>
La palabra clave namespace se puede usar para solicitar explícitamente 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 mío; // véase "Usar espacios de nombres: Apodar/Importar"
blah\mío(); // llama a la función MiProyecto\blah\mío()
namespace\blah\mío(); // llama a la función MiProyecto\blah\mío()
namespace\func(); // llama a la función MiProyecto\func()
namespace\sub\func(); // llama a la función MiProyecto\sub\func()
namespace\nombrec::método(); // llama al método estático "método" de la clase MiProyecto\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\CONSTANTE a $b
?>
Ejemplo #5 El operador namespace, en código global
<?php
namespace\func(); // llama a la función func()
namespace\sub\func(); // llama a la función sub\func()
namespace\nombrec::método(); // llama al método estático "método" de la clase nombrec
$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
?>
(PHP 5 >= 5.3.0)
La capacidad de referirse a un nombre completamente cualificado externo con un alias, o importar, es una característca importante de los espacios de nombres. Esto es similar a la capacidad de los sistemas de archivos basados en Unix de crear enlaces simbólicos 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 función 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 importación:
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\NombreDeClase
NombreEN\suben\func(); // llama a la función Mi\Completo\NombreEN\subes\func
$a = new ArrayObject(array(1)); // instancia un objeto de la clase ArrayObject
// sin el "use ArrayObject" instanciaríamos un objeto de la clase foo\ArrayObject
?>
PHP soporta adicionalmente un atajo apropiado para poner múltiples sentencias use en la misma línea
Ejemplo #2 Importar/apodar con el operador use, múltiples 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 función Mi\Completo\NombreEN\suben\func
?>
La importación se realiza en tiempo de compilación, y al hacerlo no afecta a los nombres de clases, funciones o constantes.
Ejemplo #3 La importación y los nombres dinámicos
<?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
?>
Además, la importación sólo afecta a los nombres no cualificados y cualificados. Los nombres completamente cualificados son absolutos, y no son afectados por la importación.
Ejemplo #4 La importación 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\NombreDeClase\cosa
$obj = new \Otra\cosa; // instancia un objeto de la clase Otra\cosa
?>
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 importación se realiza en tiempo de compilación y no en tiempo de ejecución, 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 importación ilegal
<?php
namespace Languages;
class Greenlandic
{
use Languages\Danish;
...
}
?>
Nota:
Las reglas de importación tiene una base por fichero, lo que significa que los archivos incluidos NO heredarán las reglas de importación del padre.
(PHP 5 >= 5.3.0)
Sin ninguna definición 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 especificación de espacio global
<?php
namespace A\B\C;
/* Esta función es A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // llamar a fopen global
return $f;
}
?>
(PHP 5 >= 5.3.0)
Dentro de un espacio de nombres, cuando PHP se encuentra con nombre no cualificado en un contexto de nombre de clase, función o constante, los resuelve con diferentes propiedades. Los nombres de clases siempre se resuelven con el nombre de espacio de nombres actual. Así, para acceder a clases de usuario internas o que no son de espacio de nombres, se debe referir a ellas con su nombre completamente cualificado:
Ejemplo #1 Acceder a clases globales dentro de un espacio de nombres
<?php
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hola'); // $a es un objeto de la clase A\B\C\Exception
$b = new \Exception('hola'); // $b es un objeto de la clase Exception
$c = new ArrayObject; // error fatal, no se encontró la clase A\B\C\ArrayObject
?>
Para funciones y constantes, PHP recurrirá a funciones y constantes globales si no existe una función o constante en el espacio de nombres.
Ejemplo #2 Recurrir a funciones/constantes globales dentro de un espacio de nombres
<?php
namespace A\B\C;
const E_ERROR = 45;
function strlen($str)
{
return \strlen($str) - 1;
}
echo E_ERROR, "\n"; // imprime "45"
echo INI_ALL, "\n"; // imprime "7" - recurre a INI_ALL global
echo strlen('hola'), "\n"; // imprime "3"
if (is_array('hola')) { // imprime "no es un array"
echo "es una array\n";
} else {
echo "no es un array\n";
}
?>
(PHP 5 >= 5.3.0)
Aquí hay algunas definiciones importantes para los propósitos de estas reglas de resolución:
Es un identificador sin un separador de espacios de nombres, como Foo
Es un identificador con un separador de espacios de nombres, como Foo\Bar
Es un identificador con un separador de espacios de nombres que comienza con un separador de espacios de nombres, como \Foo\Bar. namespace\Foo también es un nombre completamente cualificado.
Los nombres se resuelven siguiendo estas reglas de resolución:
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 espacio de nombres "A"
// después se llama a la función global "foo"
\foo(); // se llama a la función "foo" definidia en el ámbito global
mi\foo(); // se llama a la función "foo" definida en el espacio de nombres "A\mi"
F(); // primero se intenta llamar a "F" definida en el espacio de nombres "A"
// después se llama a la función global "F"
// referecias a clases
new B(); // crea un objeto de la clase "B" definida en el espacio de nombres "A"
// si no se encuentra, se intenta autocargar la clase "A\B"
new D(); // usando las reglas de importación, 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 importación, 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"
// métodos estáticos/funciones de espacio de nombres desde otro espacio de nombres
B\foo(); // se llama a la función "foo" desde el espacio de nombres "A\B"
B::foo(); // se llama al método "foo" de la clase "B" definidia en el espacio de nombres "A"
// si no se encuentra la clase "A\B", se intenta autocargar la clase "A\B"
D::foo(); // usando las reglas de importación, se llama al método "foo" de la clase "D"
// definida en el espacio de nombres "B"
// si no se encuentra la clase "B\D", se intenta autocargar la clase "B\D"
\B\foo(); // se llama a la función "foo" desde el espacio de nombres "B"
\B::foo(); // se llama al método "foo" de la clase "B" desde el ámbito global
// si no es encuentra la clase "B", se intenta autocargar la clase "B"
// métodos estáticos/funciones de espacio de nombres del espacio de nombres actual
A\B::foo(); // se llama al método "foo" de la clase "B" desde el espacio de nombres "A\A"
// si no se encuentra la clase "A\A\B", se intenta autocargar la clase "A\A\B"
\A\B::foo(); // se llama al método "foo" de la clase "B" desde el espacio de nombres "A"
// si no se encuentra la clase "A\B", se intenta autocargar la clase "A\B"
?>
(PHP 5 >= 5.3.0)
Esta FAQ está dividida en dos secciones: preguntas comunes, y algunas especificaciones de implementación que son útiles para comprenderlos completamente.
Primero, las preguntas comunes.
Existen unos pocos detalles de implementación de las implementaciones de espacios de nombres que son útiles para enterderlos.
No. Los espacios de nombres no afectan a ningún código existente de ninguna manera, o a ningún código todavía por escribir que no contenga espacios de nombres. Se puede escribir este código 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;
?>
Ejemplo #3 Acceder a clases internas en espacios de nombres
<?php
namespace foo;
$a = new \stdClass;
function probar(\ArrayObject $ejemploalusiónatipo = null) {}
$a = \DirectoryIterator::CURRENT_AS_FILEINFO;
// extender una clase interna o global
class MiExcepción extends \Exception {}
?>
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 alusión a tipo
function probar(MiClase $ejemploalusiónatipo = null) {}
// otra manera de usar una clase desde el espacio de nombres actual una alusión a tipo
function probar(\foo\MiClase $ejemploalusiónatipo = null) {}
// extender una clase desde el espacio de nombres actual
class Extendida extends MiClase {}
// acceder a una función global
$a = \funcglobal();
// acceder a una constante global
$b = \INI_ALL;
?>
Los nombres que comienzan con una \ siempre se resuelven a aquello que parecen, así \mi\nombre de hecho es mi\nombre, y \Exception es Exception.
Ejemplo #5 Nombres Completamente Cualificados
<?php
namespace foo;
$a = new \mi\nombre(); // instancia a la clase "mi\nombre"
echo \strlen('hola'); // llama a la función "strlen"
$a = \INI_ALL; // $a está establecida al valor de la constante "INI_ALL"
?>
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 importación que apode a otro nombre como mi, el alias de importación se aplica a mi en mi\nombre.
De otro modo, al nombre del espacio de nombres actual se le añade 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 método estático "nombre" de la clase "blah\blah\bar"
mi\bar(); // llama a la función "foo\mi\bar"
$a = mi\BAR; // establece $a al valor de la constante "foo\mi\BAR"
?>
Los nombres de clases que no contienen una barra invertida como nombre se pueden resolver de 2 formas diferentes.
Si hay una sentencia de importación que apode a otro nombre como nombre, se aplica el alias de importación.
De otro modo, al nombre del espacio de nombres actual se le añade 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 método estático "nombre" de la clase "blah\blah"
?>
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 añade al inicio nombre.
Finalmente, si el nombre de la constante o de la función no existe en el espacio de nombres actual, se usa un nombre de constante o función 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);
$a = array_flip($a);
return $a;
}
mi(); // calls "foo\mi"
$a = strlen('hola'); // llama a la función global "strlen" ya que "foo\strlen" no existe
$matriz = array(1,3,2);
$b = sort($matriz); // llama a la función "foo\sort"
$c = foo(); // llama a la función "foo\foo" - la importación no se aplica
$a = FOO; // establece $a al valor de la constante "foo\FOO" - la importación no se aplica
$b = INI_ALL; // establece $b al valor de la constante "INI_ALL"
?>
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 otro
?>
No existe conflicto entre nombres, aunque la clase MiClase exista dentro del espacio de nombres mis\cosas, porque la definición 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 importación
$a = new MiClase;
?>
PHP no permite los espacios de nombres anidados
<?php
namespace mis\cosas {
namespace anidado {
class foo {}
}
}
?>
<?php
namespace mis\cosas\anidado {
class foo {}
}
?>
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 función largas, importe el espacio de nombres que la contiene
<?php
namespace mío;
use nombre\en\ultra\largo;
$a = largo\CONSTANT;
largo\func();
?>
Es muy importante darse cuenta de que ya que la barra invertida se usa como carácter de escape dentro de cadenas, se deberían 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 línea dentro de las cadenas entre comillas dobles!
$obj = new $a;
$a = new 'sin\peligro\alguno'; // aquí sin problemas.
$obj = new $a;
?>
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 definida
$a = \Bar\FOO; // error fatal, constante Bar\FOO del espacio de nombres no definida
?>
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 = 'estúpido'; // también error fatal;
// etc.
?>
PHP 5 tiene un modelo de excepciones similar al de otros lenguajes de programación. Una excepción puede ser lanzada (thrown), y atrapada ("catched") dentro de PHP. El código puede estar dentro de un bloque try, para facilitar la captura de excepciones potenciales. Cada bloque try debe tener al menos un bloque catch correspondiente. Se pueden usar múltiples bloques catch para atrapar diferentes clases de excepciones. La ejecución normal (cuando no es lanzada ninguna excepción dentro del bloque try, o cuando un bloque catch que coincide con la clase de la excepción lanzada no está presente) continuará después del último bloque catch definido en la sencuencia. Las excepciones pueden ser lanzadas (o relanzadas) dentro de un bloque catch.
Cuando una excepción es lanzada, el código siguiente a la declaración no será ejecutado, y PHP intentará encontrar el primer bloque catch conicidente. Si una excepción no es capturada, se emitirá un Error Fatal de PHP con un mensaje "Uncaught Exception ..." ("Excepción No Capturada"), a menos que se haya definido un gestor con set_exception_handler().
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 Información de Errores, sólo las extensiones Orientadas a objetos modernas utilizan excepciones. Sin embargo, los errores se pueden traducir a excepciones simplemente con ErrorException.
Standard PHP Library (SPL) - (Biblioteca PHP Estándar) proporciona un buen número de excepciones internas.
Ejemplo #1 Lanzar una Excepción
<?php
function inverso($x) {
if (!$x) {
throw new Exception('División por cero.');
}
else return 1/$x;
}
try {
echo inverso(5) . "\n";
echo inverso(0) . "\n";
} catch (Exception $e) {
echo 'Excepción capturada: ', $e->getMessage(), "\n";
}
// Continuar la ejecución
echo 'Hola Mundo';
?>
El resultado del ejemplo sería:
0.2 Excepción capturada: División por cero. Hola Mundo
Ejemplo #2 Excepciones Anidadas
<?php
class MiExcepción extends Exception { }
class Prueba {
public function probar() {
try {
try {
throw new MiExcepción('foo!');
} catch (MiExcepción $e) {
/* relanzarla */
throw $e;
}
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}
$foo = new Prueba;
$foo->probar();
?>
El resultado del ejemplo sería:
string(4) "foo!"
Una clase de Excepción 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 excepción
private $string; // caché de __toString
protected $code = 0; // código de excepción definido por el usuario
protected $file; // nombre de archivo fuente de la excepción
protected $line; // línea fuente de la excepción
private $trace; // determinación del origen
private $previous; // excepción previa si la excepción está anidada
public function __construct($message = null, $code = 0, Exception $previous = null);
final private function __clone(); // Inhibe la clonación de excepciones.
final public function getMessage(); // mensaje de excepción
final public function getCode(); // código de excepción
final public function getFile(); // nombre de archivo fuente
final public function getLine(); // línea fuente
final public function getTrace(); // un array de backtrace()
final public function getPrevious(); // excepción anterior
final public function getTraceAsString(); // string formateado del seguimiento del origen
/* Sobrescribible */
public function __toString(); // string formateado para mostrar
}
?>
Si una clase extiende la clase Exception interna y redefine el constructor, se recomienda encarecidamente que también llame a parent::__construct() para asegurarse que toda la información disponible haya sido asignada apropiadamente. El método __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 Excepción resultará en un error
E_ERRORfatal.
Ejemplo #2 Extender la clase Exception (PHP 5.3.0+)
<?php
/**
* Definir una clase de excepción personalizada
*/
class MiExcepción extends Exception
{
// Redefinir la excepción, por lo que el mensaje no es opcional
public function __construct($message, $code = 0, Exception $previous = null) {
// algo de código
// asegúrese de que todo está asignado apropiadamente
parent::__construct($message, $code, $previous);
}
// representación de cadena personalizada del objeto
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function funciónPersonalizada() {
echo "Una función personalizada para este tipo de excepción\n";
}
}
/**
* Crear una clase para probar la excepción
*/
class ProbarExcepción
{
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 excepción personalizada
throw new MiExcepción('1 no es un parámetro válido', 5);
break;
case self::THROW_DEFAULT:
// lanzar la predeterminada.
throw new Exception('2 no está permitido como parámetro', 6);
break;
default:
// No hay excepción, el objeto se creará.
$this->var = $avalue;
break;
}
}
}
// Ejemplo 1
try {
$o = new ProbarExcepción(ProbarExcepción::THROW_CUSTOM);
} catch (MiExcepción $e) { // Será atrapada
echo "Atrapada mi excepción\n", $e;
$e->funciónPersonalizada();
} catch (Exception $e) { // Skipped
echo "Atrapada la Excepción Predeterminada\n", $e;
}
// Continuar la ejecución
var_dump($o); // Null
echo "\n\n";
// Ejemplo 2
try {
$o = new ProbarExcepción(ProbarExcepción::THROW_DEFAULT);
} catch (MiExcepción $e) { // Este tipo no coincide
echo "Atrapada mi excepción\n", $e;
$e->funciónPersonalizada();
} catch (Exception $e) { // Will be caught
echo "Atrapada la Excepción Predeterminada\n", $e;
}
// Continuar la ejecución
var_dump($o); // Null
echo "\n\n";
// Ejemplo 3
try {
$o = new ProbarExcepción(ProbarExcepción::THROW_CUSTOM);
} catch (Exception $e) { // Será atrapada
echo "Atrapada la Excepción Predeterminada\n", $e;
}
// Continuar la ejecución
var_dump($o); // Null
echo "\n\n";
// Ejemplo 4
try {
$o = new ProbarExcepción();
} catch (Exception $e) { // Saltado, sin excepción
echo "Atrapada la Excepción Predeterminada\n", $e;
}
// Continuar la ejecución
var_dump($o); // ProbarExcepción
echo "\n\n";
?>
Nota:
Las versiones de PHP 5, anteriores a PHP 5.3.0, no soportan excepciones anidadas. El siguiente fragmento de código se puede usar para reemplazar la clase MiExcepción si se desea ejecutar este ejemplo.
<?php
/**
* Definir una clase de excepción personalizada
*/
class MiExcepción extends Exception
{
// Redefinir la excepción, por lo que el mensaje no es opcional
public function __construct($message, $code = 0) {
// algo de código
// asegúrese de que todo está asignador apropiadamente
parent::__construct($message, $code);
}
// representación de cadena personalizada del objeto
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function funciónPersonalizada() {
echo "Una función personalizada para este tipo de excepción\n";
}
}
?>
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 aritmética de punteros con ellas, realmente no son direcciones de memoria, etc. Véase ¿Qué NO son las Referencias? para más información. Las referencias son alias de la tabla de símbolos. 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 analogía más próxima 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.
Hay tres operaciones básicas que se realizan usando referencias: asignar por referencia, pasar por referencia, y devolver por referencia. En esta sección se dará una introducción a estas operaciones, con enlaces para una lectura complementaria.
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;
?>
Nota:
$a y $b aquí son completamente iguales. $a no está apuntando a $b o viceversa. $a y $b están 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);
?>
E_DEPRECATED en PHP 5.3 y
posteriores, y un mensaje E_STRICT en versiones anteriores.
(Técnicamente, la diferencia es que, en PHP 5, las variables de objetos, como
los recursos, son meros punteros a la información del objeto actual, por lo que estas referencias
a objetos no son "referencias" en el mismo sentido usado antes (alias).
Para más información, véase Objetos
y referencias.)
Si se asigna una referencia a una varible declarada global dentro de una función, la referencia será visible sólo dentro de la función. 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 sólo dentro de la función
} else {
$GLOBALS["var2"] =& $var1; // visible también 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 de ejemplo'
?>
Nota:
Si se asigna un valor a una variable con referencias en una sentencia foreach, también 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 asignación por referencia, las expresiones creadas con el constructor de lenguaje array() también pueden comportarse como tales prefijando & al elemento del array a añadir. 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 asignación 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 también se aplica a las llamadas a funciones donde el array es pasado por valor. Ejemplo:
<?php
/* Asignación de variables escalares */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c no es una referencia; no cambia $a o $b
/* Asignación 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 asignación por referencia!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* ¡El contenido de $arr se cambia incluso si no es una referencia! */
?>
Lo segundo que hacen las referencias es pasar variables por referencia. Esto se lleva a cabo haciendo que una variable local en una función y una variable en el ámbito de la llamada referencien al mismo contenido. Ejemplo:
<?php
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
?>
Lo tercero que hacen las referncias es devolver por referencia.
Como se dijo antes, las referencias no son punteros. Es decir, la siguiente construcción 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 $bar en el ámbito de la llamada a otra cosa usando el mecanismo de referencia, ya que $bar no está disponible en la función foo (está representada por $var, pero $var sólo tiene el contenido de la variable y no la vinculación nombre-a-valor en la tabla de símbolos de llamada). Se puede usar devolver referencias para referencias variables seleccionadas por la función.
Se puede pasar una variable por referencia a una función y así hacer que la función 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 ningún signo de referencia en una llamada a una función - sólo en la definición de la función. 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);.
Se puede pasar por referencia lo siguiente:
Referencias devueltas desde funciones, esto es:
<?php
function foo(&$var)
{
$var++;
}
function &bar()
{
$a = 5;
return $a;
}
foo(bar());
?>
Ninguna otra expresión debería pasarse por referencia, ya que el resultado no está definido. Por ejemplo, los siguientes ejemplos de pasar por referencia no son válidos:
<?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); // Expresión, no una variable
foo(5); // Produce un error fatal
?>
Devolver por referencia es útil cuando se quiere usar una función para encontrar a qué variable debería estar vinculada una referencia. No use devolver por referencia para aumentar el rendimiento. El motor optimizará automáticamente esto por sí mismo. Hay que devolver referencias sólo cuando se tenga una razón técnicamente válida 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.
?>
Nota: A diferencia de pasar un parámetro, aquí se tiene que usar & en ambos lugares - para indicar que se quiere devolver por referencia, no una copia, y para indicar que la vinculación por referencia, en vez de la asignación normal, debería ser hecha para $miValor.
Nota: Si se intenta devolver una referencia desde una función con la sintaxis: return ($this->valor);, no funcionará ya que se está intentando devolver el resultado de una expresión, y no de una variable, por referencia. Sólo se puede devolver variables por referencia desde una función - nada más. 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_NOTICEsi el código intenta devolver una expresión dinámica o un resultado del operador new.
Para usar la referencia retornada, se debe usar la asignación por referencia:
<?php
function &collector() {
static $collection = array();
return $collection;
}
$collection = &collector();
$collection[] = 'foo';
?>
<?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.
Cuando se destruye una referencia, se rompe el vínculo 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);
?>
De nuevo, podría ser útil pensar en esto como análogo a una llamada a unlink de Unix.
Muchas construcciones sintácticas de PHP están implementadas mediante el mecanismo de referencia, por lo que todo lo mencionado aquí sobre la vinculación de referencias también se aplica a estas construcciones. Algunas construcciones, como pasar y devolver por referencia, han sido mencionadas antes. Otras construcciones que usan referencias son:
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 también significa que al destruir $var no se destruirá la variable global.
En un método de un objeto, $this es siempre una referencia al objeto que realiza la llamada.
PHP proporciona una gran cantidad de variables predefinidas para todos los scripts. Las variables representan de todo, desde variables externas hasta variables de entorno incorporadas, desde los últimos mensajes de error hasta los últimos encabezados recuperados.
Véase también la pregunta frecuente titulada "¿Cómo me afecta register_globals?"
Superglobals — Superglobals son variables internas que están disponibles siempre en todos los ámbitos
Algunas variables predefinidas en PHP son "superglobales", lo que significa que están 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 métodos.
Las variables superglobals son:
| Versión | Descripción |
|---|---|
| 4.1.0 | Las superglobals son añadidas a PHP. |
Nota: Disponibilidad de variables
Por defecto, todas las superglobals están disponibles pero hay directivas que afectan a su disponibilidad. Para más información, véase la documentacion de variables_order.
Nota: Tratando con register_globals
Si la directiva obsoleta register_globals tiene el valor on entonces las variables están tambien disponibles en el ámbito global del código. Por ejemplo, $_POST['foo'] tambien existirá como $foo.
Para información relacionada, consulte el FAQ titulado "¿Cómo puede afectarme register_globals?"
Nota: Variables variables
Las variables superglobals no pueden ser usadas como variables variables dentro de funciones o métodos de clase.
(PHP 4, PHP 5)
$GLOBALS — Hace referencia a todas las variables disponibles en el ámbito global
Es un array asociativo que contiene las referencias a todas la variables que están definidas en el ámbito global del script. Los nombres de las variables son las claves del array.
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 sería algo similar a:
$foo en el ámbito global: Contenido de ejemplo $foo en el ámbito simple: variable local
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 métodos.
Nota: Disponibilidad de las variables
A diferencia de todas las otras superglobals, $GLOBALS ha estado esencialmente siempre disponible en PHP.
(PHP 4 >= 4.1.0, PHP 5)
$_SERVER -- $HTTP_SERVER_VARS [obsoleto] — Información del entorno del servidor y de ejecución
$_SERVER es un array que contiene información, tales como cabeceras, rutas y localizaciones del código. Las entradas en este array son creadas por el servidor web. No existe garantía 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 número de estas variables se encuentran recogidas en » especificación CGI 1.1, así que al menos debe esperar encontrar estas entradas.
$HTTP_SERVER_VARS contiene la misma información 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).
Puede encontrar o no los siguientes elementos en $_SERVER. Tenga en cuenta que si ejecuta PHP desde línea de comando pocos o ninguno de los siguientes elementos estarán disponibles (o tendrán algún significado).
Nota:
El script de PHP se considera terminado después de enviar las cabeceras (es decir después de producir cualquier resultado sin emplear buffers para el resultado) si el método de la petición empleado era HEAD.
Nota: Tenga en cuenta que si se emplea ISAPI con IIS el valor será off si la petición no se ha realizado a través del protocolo HTTPS.
Nota: Su servidor web debe estar configurado para crear esta variable. Por ejemplo en Apache necesita que exista HostnameLookups On dentro de httpd.conf. Consulte tambien gethostbyaddr().
La ruta del script ejecutándose 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.
Nota: A partir de PHP 4.3.2, PATH_TRANSLATED no está definida de forma implícita en el SAPI de Apache 2, en comparación a la situación de Apache 1, donde era necesario establecer el mismo valor que la variable del servidor SCRIPT_FILENAME cuando no era proporcionada por Apache. Este cambio ha sido realizado para cumplir la especificación CGI donde PATH_TRANSLATED sólo debe existir si PATH_INFO esta definida. Los usuarios de Apache 2 pueden emplear AcceptPathInfo = On dentro de httpd.conf para definir PATH_INFO.
| Versión | Descripción |
|---|---|
| 4.1.0 | Se introdujo $_SERVER que deprecaba $HTTP_SERVER_VARS. |
Ejemplo #1 Ejemplo de $_SERVER
<?php
echo $_SERVER['SERVER_NAME'];
?>
El resultado del ejemplo sería algo similar a:
www.example.com
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 métodos.
(PHP 4 >= 4.1.0, PHP 5)
$_GET -- $HTTP_GET_VARS [obsoleta] — Variables HTTP GET
Un array asociativo de variables pasado al script actual vía parámetros URL.
$HTTP_GET_VARS contiene la misma información, pero no es una superglobal. (Note que $HTTP_GET_VARS y $_GET son diferentes variables y que PHP los usa de forma diferente)
| Versión | Descripción |
|---|---|
| 4.1.0 | Se introduzco $_GET y $HTTP_GET_VARS quedó obsoleto. |
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 sería algo similar a:
Hola Hannes!
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 métodos.
Nota:
Las variables GET son pasadas vía urldecode().
(PHP 4 >= 4.1.0, PHP 5)
$_POST -- $HTTP_POST_VARS [obsoleta] — Variables HTTP POST
Un array asociativo de variables pasadas al script actual a través del método HTTP POST.
$HTTP_POST_VARS contiene la misma información inicial, pero no es una superglobal. (Nótese que $HTTP_POST_VARS y $_POST son diferentes variables y que PHP las trata de forma distinta)
| Versión | Descripción |
|---|---|
| 4.1.0 | Se introdujo $_POST y $HTTP_POST_VARS quedó obsoleta. |
Ejemplo #1 Ejemplo de $_POST
<?php
echo 'Hola ' . htmlspecialchars($_POST["nombre"]) . '!';
?>
Asumiendo que el usuario envió por el método POST nombre=Juan
El resultado del ejemplo sería algo similar a:
Hola Juan!
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 métodos.
(PHP 4 >= 4.1.0, PHP 5)
$_FILES -- $HTTP_POST_FILES [obsoleta] — Variables de Carga de Archivos HTTP
Una variable tipo array asociativo de elementos cargados al script actual a través del método POST.
$HTTP_POST_FILES contiene la misma información inicial, pero no es una superglobal. (Note que $HTTP_POST_FILES y $_FILES son variables diferentes y que PHP las trata como tal)
| Versión | Descripción |
|---|---|
| 4.1.0 | Se introdujo $_FILES, haciendo $HTTP_POST_FILES obsoleta. |
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 métodos.
(PHP 4 >= 4.1.0, PHP 5)
$_REQUEST — Variables HTTP Request
| Versión | Descripción |
|---|---|
| 5.3.0 | Se introdujo request_order. Esta directiva afecta al contenido de $_REQUEST. |
| 4.3.0 | Se eliminó la información $_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 métodos.
Nota:
Cuando se ejecuta en la línea de comandos , no se incluirán las entradas argv y argc; ya que están presentes en el array $_SERVER
Nota:
Las variables en $_REQUEST se proporcionan al script a través 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 según la directiva de configuración PHP variables_order.
(PHP 4 >= 4.1.0, PHP 5)
$_SESSION -- $HTTP_SESSION_VARS [obsoleta] — Variables de sesión
Es un array asociativo que contiene variables de sesión disponibles para el script actual. Ver la documentación de Funciones de sesión para más información sobre su uso.
$HTTP_SESSION_VARS contiene la misma información inicial pero no es una superglobal. (Nótese que $HTTP_SESSION_VARS y $_SESSION son diferentes variables y PHP las trata de forma distinta)
| Versión | Descripción |
|---|---|
| 4.1.0 | Se introdujo $_SESSION y $HTTP_SESSION_VARS quedó absoleta. |
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 métodos.
(PHP 4 >= 4.1.0, PHP 5)
$_ENV -- $HTTP_ENV_VARS [obsoleta] — Variables de entorno
Una variable tipo array asociativo de variables pasadas al script actual a través del método del entorno.
Estas variables son importadas en el espacio de nombres global de PHP desde el entorno bajo el que está siendo ejecutado el intérprete PHP. Muchas son entregadas por el intérprete de comandos bajo el que PHP está corriendo y diferentes sistemas suelen tener diferentes tipos de intérpretes de comandos, una lista definitiva es imposible. Por favor consulte la documentación de su intérprete 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 módulo del servidor o procesador CGI.
$HTTP_ENV_VARS contiene la misma información inicial, pero no es una superglobal. (Note que $HTTP_ENV_VARS y $_ENV son variables diferentes y que PHP las trata como tal)
| Versión | Descripción |
|---|---|
| 4.1.0 | Se introdujo $_ENV, haciendo $HTTP_ENV_VARS obsoleta. |
Ejemplo #1 Ejemplo de $_ENV
<?php
echo '¡Mi nombre de usuario es ' . $_ENV["USER"] . '!';
?>
Asumiendo que "bjori" ejecuta este script
El resultado del ejemplo sería algo similar a:
¡Mi nombre de usuario es bjori!
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 métodos.
(PHP 4, PHP 5)
$php_errormsg — El último mensaje de error
$php_errormsg es una variable que contiene el texto del último mensaje de error generado por PHP. Esta variable solo está disponible en el entorno en donde el error ocurrió y solamente funcionará si la opción de configuración track_errors está activada on (por defecto es off).
Nota: Esta variable solamente está disponible cuando la directiva track_errors está activada en el php.ini.
Si el usuario ha definido un controlador de errores (set_error_handler()),
$php_errormsg tendrá un valor solamente si el controlador de errores
devuelve FALSE
Ejemplo #1 Ejemplo de $php_errormsg
<?php
@strpos();
echo $php_errormsg;
?>
El resultado del ejemplo sería algo similar a:
Wrong parameter count for strpos()
(PHP 4, PHP 5)
$HTTP_RAW_POST_DATA — Datos POST sin tratar
$HTTP_RAW_POST_DATA contiene los datos POST sin tratar. Véase always_populate_raw_post_data
(PHP 4 >= 4.0.4, PHP 5)
$http_response_header — Encabezados de respuesta HTTP
El array $http_response_header es similar a la functión 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.
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 sería 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
(PHP 4, PHP 5)
$argc — El número de argumentos pasados a un script
Contiene el número de argumentos pasados al script actual cuando se ejecuta desde la línea de comandos.
Nota: El nombre del script es pasado siempre como argumento del script, por lo tanto, el valor mínimo de $argc es 1.
Nota: Esta variable sólo está disponible cuando register_argc_argv está activado.
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 sería algo similar a:
int(4)
(PHP 4, PHP 5)
$argv — Array de argumentos pasados a un script
Contiene un array de todos los argumentos pasados a un script cuando se ejecuta desde la línea 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.
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 sería algo similar a:
array(4) {
[0]=>
string(10) "script.php"
[1]=>
string(4) "arg1"
[2]=>
string(4) "arg2"
[3]=>
string(4) "arg3"
}
Ver también las Excepciones SPL
(PHP 5 >= 5.1.0)
Exception es la clase base para todas las excepciones.
El mensaje de la excepción
El código de la excepción
El nombre del fichero donde se originó la excepción
La línea donde se originó la excepción
(PHP 5 >= 5.1.0)
Exception::__construct — Constructor de la excepción
$message = ""
[, int $code = 0
[, Exception $previous = NULL
]]] )Construye la Excepción.
message
Mensaje de la Excepción a lanzar.
code
El código de la Excepción.
previous
La excepción previa usada por el encadenado de la excepción.
| Versión | Descripción |
|---|---|
| 5.3.0 |
Se añadió el parámetro previous.
|
Nota:
El
messageNO es seguro binariamente.
(PHP 5 >= 5.1.0)
Exception::getMessage — Obtiene el mensaje de Excepción
Devuelve el mensaje de Excepción.
Esta función no tiene parámetros.
Devuelve el mensaje de Excepción en formato cadena.
Ejemplo #1 Ejemplo de Exception::getMessage()
<?php
try {
throw new Exception("Algún mensaje de error");
} catch(Exception $e) {
echo $e->getMessage();
}
?>
El resultado del ejemplo sería algo similar a:
Algún mensaje de error
(PHP 5 >= 5.3.0)
Exception::getPrevious — Devuelve la Excepción anterior
Devuelve la Excepción anterior (el tercer parámetro de Exception::__construct()).
Esta función no tiene parámetros.
Devuelve la anterior Exception si está disponible
o NULL en caso contrario.
Ejemplo #1 Ejemplo de Exception::getPrevious()
Recorre e imprime las excepciones.
<?php
class MyCustomException extends Exception {}
function doStuff() {
try {
throw new InvalidArgumentException("You are doing it wrong!", 112);
} catch(Exception $e) {
throw new MyCustomException("Something happend", 911, $e);
}
}
try {
doStuff();
} 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 sería algo similar a:
/home/bjori/ex.php:8 Something happend (911) [MyCustomException] /home/bjori/ex.php:6 You are doing it wrong! (112) [InvalidArgumentException]
(PHP 5 >= 5.1.0)
Exception::getCode — Obtiene el código de Excepción
Esta función no tiene parámetros.
Devuelve el código de Excepción en forma de integer en Exception pero posiblemente en forma de otros tipos en Exception descendientes (por ejemplo como string en PDOException).
Ejemplo #1 Ejemplo de Exception::getCode()
<?php
try {
throw new Exception("Un mensaje de error", 30);
} catch(Exception $e) {
echo "El código de excepción es: " . $e->getCode();
}
?>
El resultado del ejemplo sería algo similar a:
El código de excepción es: 30
(PHP 5 >= 5.1.0)
Exception::getFile — Obtiene el fichero en el que ocurrió la excepción
Obtiene el nombre del fichero desde donde fue creada la excepción.
Esta función no tiene parámetros.
Devuelve el nombre del fichero en donde fue creada la excepción.
Ejemplo #1 Ejemplo de Exception::getFile()
<?php
try {
throw new Exception;
} catch(Exception $e) {
echo $e->getFile();
}
?>
El resultado del ejemplo sería algo similar a:
/home/bjori/tmp/ex.php
(PHP 5 >= 5.1.0)
Exception::getLine — Obtiene la línea en donde ocurrió la excepción
Devuelve el número de la línea donde se creó la excepción.
Esta función no tiene parámetros.
Devuelve el número de la línea donde se creó la excepción.
Ejemplo #1 Ejemplo de Exception::getLine()
<?php
try {
throw new Exception("Algún mensaje de error");
} catch(Exception $e) {
echo "La excepción se creó en la línea: " . $e->getLine();
}
?>
El resultado del ejemplo sería algo similar a:
La excepción se creó en la línea: 3
(PHP 5 >= 5.1.0)
Exception::getTrace — Obtiene el seguimiento de la pila
Devuelve el seguimiento de pila de excepción.
Esta función no tiene parámetros.
Devuelve el seguimiento de pila de excepción como un array.
Ejemplo #1 Exception::getTrace() example
<?php
function test() {
throw new Exception;
}
try {
test();
} catch(Exception $e) {
var_dump($e->getTrace());
}
?>
El resultado del ejemplo sería 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) {
}
}
}
(PHP 5 >= 5.1.0)
Exception::getTraceAsString — Obtiene el stack trace como cadena
Devuelve el stack trace de la Excepción como cadena.
Esta función no tiene parámetros.
Devuelve el stack trace de la Excepción como cadena.
Ejemplo #1 Ejemplo de Exception::getTraceAsString()
<?php
function test() {
throw new Exception;
}
try {
test();
} catch(Exception $e) {
echo $e->getTraceAsString();
}
?>
El resultado del ejemplo sería algo similar a:
#0 /home/bjori/tmp/ex.php(7): test()
#1 {main}
(PHP 5 >= 5.1.0)
Exception::__toString — Representación de la excepción en formato cadena
Devuelve la representación de la excepción en formato string.
Esta función no tiene parámetros.
Devuelve la representación de la excepción en formato string.
Ejemplo #1 Ejemplo de Exception::__toString()
<?php
try {
throw new Exception("Some error message");
} catch(Exception $e) {
echo $e;
}
?>
El resultado del ejemplo sería algo similar a:
exception 'Exception' with message 'Some error message' in /home/bjori/tmp/ex.php:3
Stack trace:
#0 {main}
(PHP 5 >= 5.1.0)
Exception::__clone — Clona la excepción
Intenta clonar la Excepción, lo que resultará en un error Fatal.
Esta función no tiene parámetros.
No devuelve ningún valor.
Las Excepciones no se pueden clonar.
(PHP 5 >= 5.1.0)
Un error de excepción.
$message = ""
[, int $code = 0
[, int $severity = 1
[, string $filename = __FILE__
[, int $lineno = __LINE__
[, Exception $previous = NULL
]]]]]] )La gravedad de la excepción
Ejemplo #1 Use set_error_handler() para convertir mensajes de error en errores de excepción.
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
/* Trigger exception */
strpos();
?>
El resultado del ejemplo sería 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
(PHP 5 >= 5.1.0)
ErrorException::__construct — Constructor de la Excepción
$message = ""
[, int $code = 0
[, int $severity = 1
[, string $filename = __FILE__
[, int $lineno = __LINE__
[, Exception $previous = NULL
]]]]]] )Construye la Excepción.
message
Mensaje de la Excepción a lanzar.
code
El código de la Excepción.
severity
Nivel de la severidad de la Excepción.
filename
Nombre del fichero donde se lanzó la Excepción.
lineno
Número de la línea donde se produjo la excepción.
previous
La anterior excepción utilizada para la excepción de encadenamiento.
(PHP 5 >= 5.1.0)
ErrorException::getSeverity — Obtiene la severidad de la excepción
Devuelve la severidad de la excepción.
Esta función no tiene parámetros.
Devuelve el nivel de la severidad de la excepción.
Ejemplo #1 Ejemplo de ErrorException::getSeverity()
<?php
try {
throw new ErrorException("Exception message", 0, 75);
} catch(ErrorException $e) {
echo "La severidad de la excepción es: " . $e->getSeverity();
}
?>
El resultado del ejemplo sería algo similar a:
La severidad de la excepción es: 75
(No hay información de versión disponible, podría estar únicamente en SVN)
Interfaz para detectar si una clase es tranvesable mediante foreach.
Una interfaz abstracta básica no puede ser implementada por su cuenta. Sin embargo debe ser implementada con IteratorAggregate o Iterator.
Nota:
Las clases internas que implementan esta interfaz pueden ser usadas en una construcción foreach y no necesitan implementar IteratorAggregate o Iterator.
Nota:
Este es el motor interno de una interfaz que no puede ser implementada en códigos de PHP. Se debe emplear en su lugar tanto IteratorAggregate como Iterator.
Esta interfaz no tiene métodos, ya que su único propósito es servir de interfaz básica para todas las clases traversable.
(PHP 5 >= 5.0.0)
Interfaz para iteradores externos u objetos que pueden ser iterados internamente por sí mismos.
PHP ya ofrece un número de iteradores para muchas de las tareas del día a día. Véase la lista de iteradores SPL.
Ejemplo #1 Uso básico
Este ejemplo muestra el orden en el que se llaman a los métodos 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 sería 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"
(PHP 5 >= 5.0.0)
Iterator::current — Devuelve el elemento actual
Esta función no tiene parámetros.
Puede devolver cualquier tipo.
(PHP 5 >= 5.0.0)
Iterator::key — Devuelve la clave del elemento actual
Devuelve la clave del elemento actual.
Esta función no tiene parámetros.
Devuelve scalar en caso de éxito, o NULL en caso de error.
Muestra un E_NOTICE en caso de error.
(PHP 5 >= 5.0.0)
Iterator::next — Avanza al siguiente elemento
Avanza la posición actual al siguiente elemento.
Nota:
El método es llamado después de cada foreach loop.
Esta función no tiene parámetros.
El valor devuelto es ignorado.
(PHP 5 >= 5.0.0)
Iterator::rewind — Rebobine la Iterator al primer elemento
Rebobina de nuevo al primer elemento de la Iterator.
Nota:
Este es el primer método llamado cuando se inicia un foreach bucle. No va a ser ejecutado despues foreach bucle.
Esta función no tiene parámetros.
Cualquier valor devuelto se pasa por alto.
(PHP 5 >= 5.0.0)
Iterator::valid — Comprueba si la posición actual es válido
Este método se llama después de Iterator::rewind() y Iterator::next() para comprobar si la posición actual es válido.
Esta función no tiene parámetros.
El valor de retorno se debe fundir a boolean y luego evaluar.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PHP 5 >= 5.0.0)
Para crear una interfaz externa Iterator.
Ejemplo #1 Uso básico
<?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 sería 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"
(PHP 5 >= 5.0.0)
IteratorAggregate::getIterator — Recuperar un Iterator externo
Devuelve un iterador externo.
Esta función no tiene parámetros.
Una instancia de un objeto que implementa Iterator o Traversable
Lanza una Exception en caso de fallo.
(PHP 5 >= 5.0.0)
Interfaz para proporcionar acceso a objetos como arrays.
Ejemplo #1 Uso básico
<?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 sería 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
)
)
(PHP 5 >= 5.0.0)
ArrayAccess::offsetExists — Comprobar si existe o no un índice
Comprueba si existe o no un índice.
Este método 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á vacío sólo si ArrayAccess::offsetExists() devuelve
TRUE.
offset
El índice a ser comprobado.
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.
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 sería 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)
(PHP 5 >= 5.0.0)
ArrayAccess::offsetGet — Offset para recuperar
Devuelve el valor correspondiente a desplazamiento especificado.
Este método se ejecuta para comprobar si el desplazamiento es empty().
offset
El desplazamiento va a recuperar.
Nota:
A partir de PHP 5.3.4, el prototipo de los controles se relajaron y es posible para las implementaciones de este método para devolver por referencia. Esto hace que las modificaciones indirectas a las dimensiones de los arreglos sobrecargados de objetos ArrayAccess posibles.
Una modificación directa es aquella que reemplaza completamente el valor de la dimensión de el arreglo, como en $obj[6] = 7. Una modificación indirecta, por el contrario, sólo una parte los cambios de la dimensión, o los intentos de asignar la dimensión en función de otra variable, como en $obj[6][7] = 7 o $var =& $obj[6]. Con incrementos ++ y disminye con -- también se aplican de una manera que requiere la modificación indirecta.
Si bien la modificación directa desencadena una llamada a ArrayAccess::offsetSet(), modificación indirecta provoca una llamada a ArrayAccess::offsetGet(). En ese caso, la aplicación de ArrayAccess::offsetGet() debe ser capaz de volver por la referencia, de lo contrario un
E_NOTICEmensaje es elevado..
Puede devolver todos los tipos de valor.
(PHP 5 >= 5.0.0)
ArrayAccess::offsetSet — Inicializa un offset
Asigna un valor a un offset determinado.
offset
El offset al que se asigna el valor.
value
El valor a asignar.
No devuelve ningún valor.
Nota:
El parámetro
offsetserá inicializado aNULLsi otro valor no está disponible, como en el siguiente ejemplo.<?php
$arrayaccess[] = "primer valor";
$arrayaccess[] = "segundo valor";
print_r($arrayaccess);
?>El resultado del ejemplo sería:
Array ( [0] => primer valor [1] => segundo valor )
Nota:
Esta función 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 dimensión directamente, sino cambiando una sub-dimensión o sub-propiedad o asignando la dimensión del array por referencia en otra variable). En su lugar, se llama a ArrayAccess::offsetGet(). La operación tendrá éxito si devuelve el valor por referencia, lo cuál sólo es posible desde PHP 5.3.4.
(PHP 5 >= 5.0.0)
ArrayAccess::offsetUnset — Destruye un offset
Destruye un offset.
Nota:
Este método no será llamado cuando se fuerza un tipo mediante (unset)
offset
El offset a destruir.
No devuelve ningún valor.
(PHP 5 >= 5.1.0)
Interfaz para personalizar la serialización.
Las clases que implementan esta interfaz no soportan __sleep() ni __wakeup(). El método serialize se llama cuando una instancia requiere ser serializada. Esto no invoca __destruct() ni tiene ningún efecto adicional a menos que se programe dentro del método. Cuando los datos son deserializados, la clase es conocida y el correspondiente método unserialize() es llamado como constructor en lugar de llamar al método __construct(). Se puede ejecutar el constructor estándar en el método si fuera necesario.
Ejemplo #1 Uso básico
<?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 sería algo similar a:
string(38) "C:3:"obj":23:{s:15:"Mis datos privados";}"
string(15) "Mis datos privados"
(PHP 5 >= 5.1.0)
Serializable::serialize — Representación en formato cadena de un objeto
Devuelve la representación de un objeto en formato string.
Nota:
Este método actúa como el destructor del objeto. El método __destruct() no será llamado después de usar este método.
Esta función no tiene parámetros.
Devuelve la representación de un objeto o NULL
Lanza una Exception cuando de devuelen otros tipos de string y
NULL
(PHP 5 >= 5.1.0)
Serializable::unserialize — Construye el objeto
$serialized
)Es llamado durante la unserialización del objeto.
Nota:
Este método actua como el constructor del objeto. El método __construct() no será llamado después de este método.
serialized
La representación en formato string de un objeto.
El valor devuelto por este método es ignorado.
(No hay información de versión disponible, podría estar únicamente en SVN)
Clase usada para representar funciones anónimas.
Las funciones anónimas, implementadas en PHP 5.3, producían objetos de este tipo. Este hecho solía ser considerado como un detalle de implementación, pero ahora puede confiarse en él. Desde PHP 5.4, esta clase tiene métodos que permiten más control de las funciones anónimas después de que hayan sido creadas.
Además de los métodos listados aquí, esta clase también posse un método __invoke. Esto es por consistencia con otras clases que implementan la llamada mágica, ya que este método no se usa para llamar a la función.
(No hay información de versión disponible, podría estar únicamente en SVN)
Closure::__construct — Constructor que anula la instanciación
Este método sólo existe para anular la instanciación de la clase Closure. Los objetos de esta clase se crean del modo descrito en la página funciones anónimas.
Esta función no tiene parámetros.
Este método no tiene un valor de retorno; simplemente emite un error
(de tipo E_RECOVERABLE_ERROR).
(No hay información de versión disponible, podría estar únicamente en SVN)
Closure::bind — Duplicar un cierre con un objeto vinculado y ámbito de clase especificados
$closure
, object $newthis
[, mixed $newscope
= 'static'
] )Este método es una versión estática de Closure::bindTo(). Véase la documentación de ese método para más información.
closure
La función anónima a vincular.
newthis
El objeto al que la función anónima dada debería 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 métodos protegidos y privados del objeto vinculado.
Devuelve un nuevo objeto Closure o FALSE en caso de error
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 sería algo similar a:
1 2
(No hay información de versión disponible, podría estar únicamente en SVN)
Closure::bindTo — Duplicar el cierre con un objeto vinculado y ámbito de clase nuevos
Crea y devuelve una nueva función anónima 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 función, y el "ámbito de clase" representa una clase
que determina los miembros privados y protegidos a los que será capaz
de acceder la función anónima. Concretamente, los miembros que serán
visibles son los mismos que si la función anónima fuese un método de
la clase dada como valor del parámetro
newscope.
Los cierres estáticos no pueden tener ningún objeto vinculado (el valor del parámetro
newthis debería ser NULL), pero esta función puede,
no obstante, usarse para cambiar su ámbito de clase.
Esta función se asegurará de que un cierre no estático que tenga una instancia
vinculada se le aplique un ámbito y viceversa. En este punto,
los cierres no estáticos que le son dados un ámbito, excepto una instancia NULL, son hechos
estáticos, y los cierres no estáticos 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 anónimas, se puede usar cloning en su lugar.
newthis
El objeto al que la función anónima dada debería 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 métodos protegidos y privados del objeto vinculado.
Devuelve el objeto Closure recién creado
o FALSE en caso de error
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 sería algo similar a:
1 2
PHP ofrece varias opciones y parámetros 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 parámetros con stream_context_set_params().
Opciones de contexto de sockets — Listado de opciones de contexto de sockets
Las opciones de contexto de sockets están disponibles para todas las envolturas que trabajan sobre sockets, como tcp, http y ftp.
| Versión | Descripción |
|---|---|
| 5.1.0 | Se agregó bindto. |
| 5.3.3 | Se agregó backlog. |
Ejemplo #1 Ejemplo de uso básico 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 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 — Lista de opciones de contexto de HTTP
Opciones de contexto para los transports http:// y https://.
| Versión | Descripción |
|---|---|
| 5.3.4 |
Añadido follow_location.
|
| 5.3.0 |
La opción protocol_version soporta decodificación de
transferencias fragmentadas en caso de valer 1.1.
|
| 5.2.10 |
Añadido ignore_errors.
|
| 5.2.10 |
El parámetro header puede ahora ser un array de índices numéricos.
|
| 5.2.1 |
Añadido timeout.
|
| 5.1.0 | Añadido soporte para HTTPS mediante proxies HTTP. |
| 5.1.0 |
Añadido max_redirects.
|
| 5.1.0 |
Añadido protocol_version.
|
Ejemplo #1 Captura una página y envía 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);
// información 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);
?>
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: Línea de estado HTTP
Cuando esta envultura sigue una redirección, el wrapper_data devuelto por stream_get_meta_data() no contiene necesariamente la línea de estado HTTP que realmente se aplica al contenido del índice 0.La primera petición devolvió un 301 (redirección permanente), de manera que la envoltura automáticamente sigue la redirección para obtener una respuesta con código 200 (índice = 4).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', ...
Opciones de contexto para FTP — Listado de opciones de contexto para FTP
Opciones de contexto para transportes ftp:// y ftps://
| Versión | Descripción |
|---|---|
| 5.1.0 |
Se añadió proxy.
|
| 5.0.0 |
Se añadió overwrite y resume_pos.
|
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://.
Opciones de contexto para SSL — Listado de opciones de contexto para SSL
Opciones de contexto para transportes ssl:// y tls://
| Versión | Descripción |
|---|---|
| 5.3.2 |
Se agregó SNI_enabled y
SNI_server_name.
|
| 5.0.0 |
Se agregó capture_peer_cert,
capture_peer_chain and
ciphers.
|
Nota: Debido a que ssl:// el es transporte subyacente para las envolturas https:// y ftps://, cualquier opción de contexto que aplique para ssl:// también 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 utiliza
OPENSSL_TLSEXT_SERVER_NAMEpara determinar si SNI está soportado.
Opciones de contexto para CURL — Listado de opciones de contexto para CURL
Las opciones de contexto para CURL están disponibles cuando la extensión CURL fue compilada usando la opción de configuración --with-curlwrappers .
Ejemplo #1 Obtener una página 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);
?>
Opciones de contexto Phar — Listado de opciones de contexto Phar
Opciones de contexto para phar:// envoltura.
Contexto parámetros — Contexto lista de parámetros
Estos parametros se puede establecer en un contexto usando el la función stream_context_set_params().
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(). Además de estas envolturas, se pueden definir por el usuario utilizando la función 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 están soportadas.
file:// — Acceso al sistema de ficheros local
El Sistema de Ficheros es la envoltura por omisión 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 también include_path para localizar ficheros con rutas relativas.
| Versión | Descripción |
|---|---|
| 5.0.0 | Añadido file://. |
http:// -- https:// — Acceso a URLS en HTTP(s)
Permite acceso de lectura a ficheros/recursos mediante HTTP 1.0, utilizando el método GET de HTTP. Junto con la petición, se envía 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á también en la petición.
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 deberán 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 parámetros.
| Versión | Descripción |
|---|---|
| 4.3.7 | Detectado errores en servidores IIS para evitar "SSL: Fatal Protocol Error". |
| 4.3.0 | Añadido https://. |
| 4.0.5 | Añadido soporte para las redirecciones. |
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);
}
}
?>
Ejemplo #2 Enviando cabeceras personalizadas en una petición HTTP
Pueden enviarse cabeceras personalizadas usando opciones de contexto. También es posible usar este hack: Pueden enviarse cabeceras personalizadas en una petición HTTP aprovechando un efecto colateral de la directiva INI user_agent. Establezca un string válido en user_agent (como el valor por omisión de PHP/versión) seguido de un par retorno de carro/salto de línea y cualquier otra cabecera adicional.
<?php
ini_set('user_agent', "PHP\r\nX-MyCustomHeader: Foo");
$fp = fopen('http://www.example.com/index.php', 'r');
?>
Como resultado se envía la siguiente cabera:
GET /index.php HTTP/1.0 Host: www.example.com User-Agent: PHP X-MyCustomHeader: Foo
Nota: Sólo habrá soporte para HTTPS cuando la extensión openssl esté habilitada.
Las conexiones HTTP son de sólo 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.
ftp:// -- ftps:// — Acceso a URLs por FTP(s)
Permite tanto lectura de ficheros existentes como la creación de nuevos ficheros vía FTP. La conexión fallará si el servidor no soporta FTP en modo pasivo.
Se puede tanto leer como escribir ficheros, pero no las dos cosas simultáneamente. Si el fichero remoto ya existiera en el servidor ftp, y se quisiera abrir en modo escritura sin especificar la opción de contexto overwrite, también fallará la conexión. Si fuera necesario sobrescribir un fichero ya existente en ftp, se tendrá que especificar la opción de contexto overwrite antes de abrir el fichero para su escritura. Alternativamente, puede usarse la extensión FTP.
Si se ha establecido la directiva from en php.ini, se enviará como contraseña para conexiones de FTP anónimo.
| Versión | Descripción |
|---|---|
| 4.3.0 | Added ftps://. |
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 conexión se restablece a una conexión ftp regular sin encriptación.
Nota: Añadiendo contenido
Desde PHP 5.0.0 se puede añadir contenido a los ficheros mediante la envoltura de URL ftp://. Si se tratara de añadir contenido a un fichero con ftp:// en versiones anteriores, se provocaría un fallo.
php:// — Acceso a distintos flujos de E/S
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 estándar, 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 según se lee o se escribe en ellos.
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 más tarde se cierra, sólo se cerraría la copia del descriptor; el flujo
real al que referencia STDIN no se vería 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 sólo lectura, mientras que php://stdout y php://stderr son de sólo escritura.
php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado. En el caso de peticiones POST, es preferible usar php://input en vez de $HTTP_RAW_POST_DATA ya que no depende de diretivas php.ini especiales. Sin embargo, cuando no se genera automáticamente $HTTP_RAW_POST_DATA, se trata de una alternativa que hace un uso menos intensivo de memoria que activando always_populate_raw_post_data. php://input no está disponible con enctype="multipart/form-data".
Nota: Los flujos que se abren con php://input sólo pueden leerse una vez; no hay soporte para operaciones de búsqueda. Pero, dependiendo de la SAPI, podría ser posible abrir otro flujo php://input para reiniciar la lectura. Esto sólo es posible si los datos de la petición se han guardado. Este caso es típico en peticiones POST, pero no en otros métodos de petición, como por ejemplo PUT o PROPFIND.
php://output es un flujo de sólo lectura que permite escribir en el buffer de salida tal como lo hacen print y echo.
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 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://temp utilizará un fichero temporal cuando la cantidad de datos almacenados superen el límite predefinido (por omisión, 2 MB). La ubicación de este fichero temporal está determinada de la misma manera que la funciónsys_get_temp_dir(),
El límite de memoria de php://temp se puede controlar añadiendo /maxmemory:NN, donde NN es la cantidad en bytes máxima de datos a almacenar en memoria antes de recurrir a un fichero temporal.
php://filter es una especie de meta-envoltura diseñada 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 parámetros como parte de su ruta. Revise los ejemplos para ver casos de uso de estos específicos parámetros.
| Nombre | Descripción |
|---|---|
| resource=<flujo a filtrar> | Este parámetro es obligatorio. Especifica el flujo que se desea filtrar. |
| read=<listra de filtros a aplicar a la cadena de lectura> | Este parámetro es opcional. Se pueden enumerar uno o más filtros, separados por el carácter |. |
| write=<lista de filtros a aplicar a la cadena de escritura> | Este parámetro es opcional. Se puedene enumerar uno o más filtros, separados por el carácter |. |
| <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 según proceda. |
| Versión | Descripción |
|---|---|
| 5.3.6 | Se añadió php://fd. |
| 5.1.0 | Se añadió php://memory y php://temp. |
| 5.0.0 | Se añadió php://filter. |
Ejemplo #1 php://temp/maxmemory
Este parámetro opcional permite establecer el límite de memoria a partir del cual php://temp comienza a usar un fichero temporal.
<?php
// Establecer el límite 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 parámetro tiene que ubicarse al final de la especificación 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 ningún 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 parámetro contiene uno o más nombres de filtros separados por el caracter |.
<?php
/* Devolverá el contenido de
www.example.com en mayúsculas */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* Hará lo mismo que el ejemplo de arriba
pero además lo codificará en ROT13 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>
Ejemplo #4 php://filter/write=<lista de filtros a aplicar a la cadena de escritura>
Este parámetro contiene uno o más nombres de filtros separados por el caracter |.
<?php
/* Filtrará el string "Hello World" con
el filtro rot13, y después 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:// — Flujos de compresión
zlib: PHP 4.0.4 - PHP 4.2.3 (sólo 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 ambigüedad 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 extensión ZIP registra la envoltura zip:.
data:// — Data (RFC 2397)
La envoltura del flujo data: (» RFC 2397) está disponible desde PHP 5.2.0.
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:// — Encuentra las rutas que coincidan con el patrón
La envoltura del flujo glob: está disponible desde PHP 5.3.0.
Ejemplo #1 Uso básico
<?php
// Recorrer todos los ficheros *.php del directorio ext/spl/examples/
// y mostrar sus nombres y tamaños
$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:// — Archivo PHP
La envoltura de flujo phar:// está disponible desde PHP 5.3.0. Para consultar una descripción detallada, revise envoltura del flujo Phar.
ssh2:// — Secure Shell 2
ssh2.shell:// ssh2.exec:// ssh2.tunnel:// ssh2.sftp:// ssh2.scp:// PHP 4.3.0 y superior (PECL)
Nota: Esta envoltura no está habilitada por omisión
Para poder usarse la envoltura ssh2.*:// debe instalarase la extensión » SSH2 disponible en » PECL.
Además de permitir hacer un login tradicional en la URI, la envoltura ssh2 también puede reutilizar las conexiones ya abiertas, proporcionando el recurso de conexión en el apartado host de la URL.
Ejemplo #1 Abriendo un flujo a partir de una conexión 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', 'secret');
$stream = fopen("ssh2.tunnel://$session/remote.example.com:1234", 'r');
?>
rar:// — RAR
Esta envoltura se compone de una ruta al fichero RAR (relativa o absoluta) codificada como URL, un asterisco opcional (*), un signo de número opcional (#) y un nombre de entrada codificado como URL que también es opcional, tal como se almacena en el fichero. Cuando se especifique un nombre de entrada, será necesario también especificar un signo de número; además, se puede añadir 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 devolverán 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 podrían parecen datos codificados como URL.
Si no se proporciona ni un signo de número ni tampoco un número de entrada, se mostrará la raíz del fichero. La diferencia respecto a directorios convencionales es que el flujo no contendrá determinada información, tal como la fecha de modificación, dado que el directorio raíz no se almacena dentro el fichero comprimido en de una entrada individual. Para usar la envoltura con RecursiveDirectoryIterator es necesario que al acceder al raíz se incluya el signo de número en la URL, para que así las URLs de los nodos hijo se puedan construir correctamente.
Nota: Esta envoltura no está habilitada por omisión
Para poder usar la envoltura rar://, debe instalarse la extensión » rar disponible en » PECL.
rar:// Disponible desde PECL rar 3.0.0
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 sería 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 (encriptación 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 creación ni la de último acceso es obligatoria WinRAR,
* por esa razón la mayoría de ficheros no lo tendrán */
var_dump(fstat($stream));
?>
El resultado del ejemplo sería 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:// — Flujos de audio
Los ficheros que se abran para lectura usando la envoltura ogg://
se utilizan como codificaciones de audio comprimido usando el códec OGG/Vorbis.
De forma similar, los ficheros abiertos para escritura o para añadir contenido usando
la envoltura ogg:// se escriben como datos de audio comprimidos.
Cuando se use la función stream_get_meta_data() con un fichero
OGG/Vorbis abierto para lectura, se devolverán diversos detalles del
flujo, incluyendo la etiqueta vendor, cualquier
comments que se haya añadido, el número de canales
channels, el ratio de muestreo,
y el rango del ratio de codificación descrito por:
bitrate_lower, bitrate_upper,
bitrate_nominal, y bitrate_window.
ogg:// PHP 4.3.0 and up (PECL)
Nota: Esta envoltura no está habilitada por omisión
Para usar la envoltura ogg:// es necesario instalar la extensión » OGG/Vorbis disponible en » PECL.
expect:// — Flujos de Interacción de Procesos
Los flujos que se hayan abierto con la envoltura expect://, darán acceso a stdio, stdout y stderr (entrada, salida y errores estándar respectivamente) de los procesos, vía PTY.
Nota: Esta envoltura no está habilitada por omisión
Para poder usar la envoltura expect:// se debe instalar la extensión » Expect disponible en » PECL.
expect:// PHP 4.3.0 y superior (PECL)
PHP es un potente lenguaje, y su intérprete, bien como módulo 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 omisión, sea inseguro todo lo que se ejecute en un servidor web. PHP está diseñado específicamente para ser un lenguaje más seguro para escribir aplicaciones CGI que Perl or C. Partiendo de un correcto ajuste de opciones de configuración para tiempo de ejecución y en tiempo de compilación, y el uso de prácticas de programación apropiadas, pueden proporcionarle la combinación de libertad y de seguridad que necesita.
Dado que hay muchas vías para ejecutar PHP, existen muchas opciones de configuración para controlar su comportamiento. Al haber una extensa selección de opciones se garantiza poder usar PHP para un gran número de propósitos, pero a la vez significa que existen combinaciones que conllevan una configuración menos segura.
La flexibilidad de configuración de PHP rivaliza igualmente con la flexibilidad de su código. PHP puede ser usado para construir completas aplicaciones de servidor, con toda la potencia de un usuario de consola, o se puede usar sólo desde el lado del servidor implicando un menor riesgo dentro de un entorno controlado. El cómo construir ese entorno, y cómo de seguro es, depende del desarrollador PHP.
Este capítulo comienza con algunos consejos generales de seguridad, explica las diferentes combinaciones de opciones de configuración y las situaciones en que pueden ser útiles, y describe diferentes consideraciones relacionadas con la programación de acuerdo a diferentes niveles de seguridad.
Un sistema completamente seguro es prácticamente un imposible, de modo que el enfoque usado con mayor frecuencia en la profesión 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 validación biométrica (como rastreo de retinas y análisis dactilar), usted contaría con un nivel extremadamente alto de confiabilidad. También implicaría que llenar los datos de un formulario razonablemente complejo podría tomar media hora, cosa que podría incentivar a los usuarios a buscar métodos 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 código 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 eslabón más débil de una cadena. Si todas las transacciones son registradas copiosamente basándose en la fecha/hora, ubicación, tipo de transacción, etc. pero la verificación 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 páginas más simples. Los datos de entrada que usted puede esperar en sus aplicaciones no necesariamente tendrán relación alguna con el tipo de información que podría ingresar un empleado disgustado, un cracker con meses de tiempo entre sus manos, o un gato doméstico caminando sobre el teclado. Es por esto que es mejor observar el código desde una perspectiva lógica, para determinar en dónde podrían introducirse datos inesperados, y luego hacer un seguimiento de cómo esta información es modificada, reducida o amplificada.
Internet está repleto de personas que tratan de crearse fama al romper la seguridad de su código, bloquear su sitio, publicar contenido inapropiado, y por lo demás haciendo que sus días sean más interesantes. No importa si usted administra un sitio pequeño o grande, usted es un objetivo por el simple hecho de estar en línea, por tener un servidor al cual es posible conectarse. Muchas aplicaciones de cracking no hacen distinciones por tamaños, simplemente recorren bloques masivos de direcciones IP en busca de víctimas. Trate de no convertirse en una.
Usar PHP como un binario CGI es una opción para configuraciones que por alguna razón no desean integrar PHP como un módulo dentro del software de servidor (como Apache), o usarán PHP con diferentes tipos de envoltorios CGI para crear entornos seguros chroot y setuid para scripts. Esta configuración usualmente involucra la instalación del binario ejecutable de PHP en el directorio cgi-bin del servidor web. La recomendación » CA-96.11 del CERT recomienda que está en contra de colocar cualquiera de los intérpretes dentro de cgi-bin. Aún si el binario de PHP puede ser usado como un intérprete independiente, PHP está diseñado para prevenir los ataques que esta configuración hace posible:
Si su servidor no tiene ningún contenido que no esté restringido por contraseña o control de acceso basado en IP, no hay necesidad de estas opciones de configuración. Si su servidor web no le permite hacer redirecciones, o el servidor no tiene una forma de comunicar al binario de PHP que la petición es una forma segura de petición de redireccionamiento, puede especificar la opción --enable-force-cgi-redirect para el script de configuración. Usted todavía tiene que asegurarse que sus scripts de PHP no confían en una forma o en otra para llamar el script, ni directamente http://my.host/cgi-bin/php/dir/script.php ni por redirección http://my.host/dir/script.php.
La redirección puede ser configurada en Apache utilizando directivas Action y AddHandler (vea más abajo).
La directiva de configuración cgi.force_redirect previene a cualquiera que llame a PHP directamente por medio de una URL como esta http://mi.servidor/cgi-bin/php/directoriosecreto/script.php. En cambio, PHP solamente lo analizará en este modo si éste se ha ido a través de una regla directa del servidor web. Las versiones de PHP antiguas a la versión 4.2.0 utilizaban --enable-force-cgi-redirect en opción de tiempo de compilación para esto.
Usualmente la redirección en la configuración de Apache se hace con las siguientes directivas:
Action php-script /cgi-bin/php AddHandler php-script .php
Esta opción ha sido probada solamente con el servidor web Apache, y se basa en que en Apache se configure en una variable de entorno no-estándar de CGI REDIRECT_STATUS para peticiones de redirección. Si su servidor web no soporta ninguna forma de decirle si la petición es directa o redirigida, usted no puede utilizar esta opción y debe usar una de las otras formas de ejecutar la versión CGI aquí documentadas.
Para incluir contenido activo, como scripts y ejecutables, en los directorios de documentos del servidor web es algunas veces considerado una práctica insegura. Si, por el hecho del algún error de configuración, los scripts no se ejecutan y son mostrados como documentos HTML regulares, esto podría resultar en una fuga de información de propiedad intelectual o de información de seguridad como las contraseñas. Por lo tanto muchos Administradores de Sistemas preferirán configurar otra estructura de directorios para scripts que sean accesibles solamente a través del CGI de PHP, y por lo tanto siempre interpretado y no desplegado como tal.
También si el método para asegurar las peticiones no es redirigido, como se describió en la sección anterior, no está disponible, es necesario configurar un script doc_root que sea diferente de la raíz del documento web.
Usted puede configurar el script de la raíz de documento de PHP en la directiva
de configuración doc_root en el
fichero de configuración, o
puede configurar la variable de entorno PHP_DOCUMENT_ROOT.
Si éste es configurado, la versión del CGI
de PHP siempre construirá el nombre del fichero para abrir con este
doc_root y la ruta de información en la petición,
de tal forma que pueda estar seguro que ningún script será ejecutado fuera de
este directorio (excepto por user_dir que se encuentra
más abajo).
Otra opción 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 petición 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 expansión de user_dir sucede sin tomar en cuenta
la configuración de doc_root, así que usted puede
controlar el acceso a la raíz de los documentos y el directorio de los
usuarios separadamente.
Una opción muy segura es poner el binario analizador de PHP en algún lugar fuera del árbol de ficheros de la web. En /usr/local/bin, por ejemplo. El único inconveniente real con esta opción es que ahora tendrá que poner una línea similar a:
#!/usr/local/bin/php
Para que PHP maneje la información correctamente de PATH_INFO y PATH_TRANSLATED con esta configuración, el analizador de PHP debería ser compilado con la opción de configuración --enable-discard-path.
Cuando PHP es usado como un módulo 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 podría tener acceso y modificar la base de datos, incluso sin un nombre de usuario y contraseña. Es completamente posible que una araña(bot) web pudiera toparse con la página web de administración de una base de datos, y eliminar todo de la base de datos. Una protección ante este tipo de situaciones es mediante el uso del mecanismo de autorización de Apache, o con modelos de acceso de diseño propio usando LDAP, archivos .htaccess, etc. e incluir ese código 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 quizás 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 debería ser considerado como una opción por aquellos que no son profesionales en seguridad.
Existen otras soluciones más simples. Mediante el uso de open_basedir se puede controlar y restringir qué directorios pueden ser usados por PHP. También se pueden definir áreas solo-Apache, para restringir todas las actividades basadas en web a archivos que no son de usuarios o del sistema.
PHP está sujeto a la seguridad integrada en la mayoría 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 diseñado para permitir el acceso a nivel de usuarios para el sistema de archivos, es perfectamente posible escribir un script PHP que le permita leer archivos del sistema como /etc/passwd, modificar sus conexiones de red, enviar trabajos de impresión 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 situación 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!";
?>
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!";
?>
Ejemplo #3 Comprobación más 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 autenticación
$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);
?>
Ejemplo #4 Comprobación más segura del nombre de archivo
<?php
$username = $_SERVER['REMOTE_USER']; // usando un mecanismo de autenticación
$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 razón, por lo general es más fácil crear una política en donde se prohíba todo excepto lo que expresamente se permite.
Como PHP utiliza las funciones de C para operaciones relacionadas al sistema de archivos, se podría 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 serán consideradas por completo, sino sólo hasta que ocurra un byte nulo. El siguiente ejemplo muestra un código 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 existe
include '/home/wwwrun/'.$file.'.php';
// el archivo /etc/passwd se incluirá
}
?>
Por lo tanto, cualquier cadena que se utiliza en una operación de sistema de archivos siembre deben ser validados correctamente. He aquí una versión 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';
}
?>
Hoy en día, las bases de datos son componentes cardinales de cualquier aplicación basada en la web permitiendo a los sitios web que provean una variedad de contenido dinámico. Esta información 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 información usted necesita conectarse a la base de datos, enviar una consulta legítima, devolver el resultado, y cerrar la conexión. Hoy en día, el lenguaje de consultas comunmente utilizado en esta interacción es el Lenguaje Estructurado de Consultas (SQL, por sus siglas en inglés). 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 introducción a lo más básico de cómo acceder y manipular base de datos dentro de scripts de PHP.
Tenga en mente esta simple regla: Protección en profundidad. En la mayoría de sitios tome la acción de incrementar la protección de su base de datos, para una menor probabilidad de que un atacante tenga éxito en exponer o abusar de cualquier información que tenga almacenada. El buen diseño del esquema de la base de datos y de la aplicación se ocupará de sus mayores temores.
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 creación. Usualmente, sólo 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 deberían 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 aplicación con permisos muy limitados a los objetos. La mayoría de privilegios que son requeridos deberían 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 aplicación, solamente afecta a los cambios que su aplicación permita.
Usted está encarecido a no implementar toda la lógica del negocio en la aplicación web (Ej., sus scripts), en su lugar hágalo 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 lógica 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 automáticamente, lo cual a menudo provee un vistazo al interior cuando hay problemas de depuración con su programa o con el sistema de seguimientos de transacciones de su aplicación.
Puede ser que quiera establecer las conecciones sobre SSL para encriptar la comunicación cliente/servidor para incrementar la seguridad, o también puede usar ssh para encriptar la conexión de red entre los clientes y el servidor de base de datos. Si alguno de éstos es utilizado, el monitoreo de su tráfico y la obtención de información sobre su base de datos será difícil para un posible atacante.
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 podrían ser divulgados o mal utilizados, a menos que la información 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 encripción de datos.
La forma más fácil para trabajar en este problema, es crear primero su propio paquete de encripción, y utilizarlo desde de sus scripts de PHP. PHP puede guiarle en esto con muchas extensiones, tales como Mcrypt y Mhash, cubriendo así, una amplia variedad de algoritmos de encripción. 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 encripción.
En caso de datos que deben estar ocultos, si no fuera necesario usar su representación real (es decir, que no se mostrarán), quizás convenga utilizar hashing. El ejemplo más típico de hashing es cuando se almacena el hash MD5 de una contraseña en una base de datos, en lugar de almacenar la contraseña en sí misma. Vea también las funciones crypt() y md5().
Ejemplo #1 Utilizando campos de contraseña con hash
<?php
// Almacenando la contraseña con hash
$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
pg_escape_string($username), crypt($password, '$2a$07$usesomesillystringforsalt$'));
$result = pg_query($connection, $query);
// Consultando si el usuario envió la contraseña correcta
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
pg_escape_string($username), crypt($password, '$2a$07$usesomesillystringforsalt$'));
$result = pg_query($connection, $query);
if (pg_num_rows($result) > 0) {
echo 'Bienvenido/a, $username!';
} else {
echo 'La autenticación ha fallado para $username.';
}
?>
Muchos desarrolladores web son desprevendios de cómo las consultas SQL pueden ser manipuladas, y asumen que una consulta SQL es un comando confiable. Esto significa que las consultas SQL están expuestas a que sean malversadas en controles de acceso, y por lo tanto, sobrepasar las revisiones de autenticación y autorización estándar, y que algunas veces las consultas SQL aún podrían permitir el acceso de comandos a nivel de sistema operativo del ordenador.
Comandos directos de Inyección SQL es una técnica donde un atacante crea o altera comandos SQL existentes para exponer datos ocultos, sobreponerse a los que son importantes, o peor aún, ejecutar comandos peligrosos a nivel de sistema en el equipo donde se encuentra la base de datos. Esto se logra a través de la aplicación, tomando la entrada del usuario y combinándola con parámetros estáticos para elaborar una consuta SQL. Los siguientes ejemplos están basados en historias reales, desafortunadamente.
Debido a la falta de validación en la entrada de datos y conectándose a la base de datos con privilegios de super usuario o de alguien con privilegios que puede crear usuarios, el atacante podría crear un super usuario en su base de datos.
Ejemplo #1 Dividiendo el conjunto de resultados en páginas ... y haciendo super usuarios (PostgreSQL)
<?php
$offset = $argv[0]; // Cuidado, no hay validación en la entrada de datos!
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
$result = pg_query($conn, $query);
?>
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
select 'crack', usesysid, 't','t','crack'
from pg_shadow where usename='postgres';
--
Nota:
Esta es una técnica común para forzar al analizador SQL a que ignore el resto de la consulta escrita por el desarrollador con dos guiónes: -- los cuales representan un comentario en SQL.
Una forma factible de obtener contraseñas es burlar las páginas de búsqueda 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 cláusulas WHERE, ORDER BY, LIMIT y OFFSET en las declaraciones SELECT. Si su base de datos soporta el constructor UNION, el atacante podría intentar añadir una consulta enetera a la consulta original para listar contraseñas de una tabla arbitraria. Utilizar campos de contraseña encriptadoslds es fuertemente recomendado.
Ejemplo #2 Listando nuestros artículos ... y algunas contraseñas (de cualquier servidor de base de datos)
<?php
$query = "SELECT id, name, inserted, size FROM products
WHERE size = '$size'
ORDER BY $order LIMIT $limit, $offset;";
$result = odbc_exec($conn, $query);
?>
' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --
Las consultas de actualización de SQL, también son susceptibles a ataques. Estas consultas también son amenazadas por acortamiento y adición en una consulta completamente nueva a esta. Sin embargo el atacante podría manipularla con la cláusula SET. En este caso, algunos esquemas de información 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 contraseñas o nombres de usuarios.
Ejemplo #3 Desde re-establecer una contraseña ... hasta ganar más privilegios (en cualquier servidor de bases de datos)
<?php
$query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";
?>
<?php
// $uid == ' or uid like'%admin%'; --
$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%'; --";
// $pwd == "hehehe', admin='yes', trusted=100 "
$query = "UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHERE
...;";
?>
Un ejemplo horrible de cómo 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);
?>
<?php
$query = "SELECT * FROM products
WHERE id LIKE '%a%'
exec master..xp_cmdshell 'net user test testpass /ADD'--";
$result = mssql_query($query);
?>
Nota:
Algunos de los ejemplos de citados arriba estan vinculados a un servidor de base de datos específico. Esto no significa que un ataque similar sea imposible en contra de otros productos. Su servidor de base de datos podría ser vulnerable de forma similar en otra manera.
Pese a que pueda parecer obvio que un atacante debe tener al menos algún conocimiento de arquitecturas de bases de datos para poder realizar un ataque con éxito, el obtener esta información suele ser muy sencillo. Por ejemplo, cuando la base de datos forma parte de un paquete de software libre, o disponible públicamente, con una instalación predefinida, esta información se encuentra completamente libre y disponible. Esta información puede haber sido divulgada en proyectos de código cerrado - incluso si está codificad, ofuscada o compilada - incluso por el propio código mediante mensajes de error. Otros métodos incluyen el uso de nombres de tablas y columnas frecuentes. Por ejemplo, un formulario de inicio de sesión que utiliza una tabla 'users' con los nombres de columna 'id', 'username', y 'password'.
Esos ataques están principalmente basados en explotar el código que no ha sido escrito teniendo en mente la seguridad. Nunca confíes en ningún tipo de entrada, especialmente la que viene del lado del cliente, aún cuando esta venga de una caja de selección, un campo oculto o una cookie. El primer ejemplo muestra que una inofensiva consulta puede causar desastres.
Si la expresión espera una entrada numérica, considere verificar los datos con la función is_numeric(), o silenciosamente cambie su tipo utilizando settype(), o use su representación numérica por medio de sprintf().
Ejemplo #5 Una forma más segura de redactar una consulta para paginación
<?php
settype($offset, 'integer');
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// Fíjese en %d en el formato de cadena, utilizar %s podría no tener un resultado significativo
$query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
$offset);
?>
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 daño, pero éste puede ser útil para hacer una retro revisión de cual aplicación ha sido intervenida. El registro no es útil por sí mismo, pero lo es debido a la información que contiene. Más detalles generalmente es mejor que los pocos.
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 táctica estándar de ataque conlleva a perfilar un sistema; llenándolo de datos incorrectos, revisando los tipos y contextos de los errores que son devueltos. Esto le permite al atacante recolectar información acerca del servidor, para determinar posibles debilidades. Por ejemplo, si un atacante ha recogido información sobre una página basada en un envío previo, él podría intentar sobrescribir las variables, o modificarlas:
Ejemplo #1 Atacando variables con una página HTML personalizada
<form method="post" action="objetivodelataque?username=badfoo&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é función o qué fichero de PHP falló, y el número de línea en donde la falla ocurrió. Toda esta es la información 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 depuración, pero en un sitio en escena, esto puede exponer variables ocultas, sintáxis sin revisar, y otra información peligrosa. Es especialmente peligroso el código en ejecución de fuentes conocidas con manejadores de depuración incluidos, o utilizar técnicas comunes de depuración. Si los atacantes pueden determinar qué técnica en general usted está utilizando, ellos podrían tratar de usar fuerza bruta en una página, enviando varias cadenas comunes de depuración:
Ejemplo #2 Explotando variables comunes de depuración
<form method="post" action="objetivodelataque?errors=Y&showerrors=1&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 método de manejo de errores, la capacidad de probar errores en un sistema conlleva a proveer a un atacante con mas información.
Por ejemplo, el estilo común de un error genérico de PHP indica que un sistema ciertamente está ejecutando PHP. Si un atacante está en una página .html, y quiere probar qué motor hay tras de ese servidor (para buscar debilidades en el sistema), lo alimenta con datos erróneos que lo podrían habilitar a que determine que ese sistema fue construido con PHP.
El error de una función puede indicar ya sea, un sistema que puede estar ejecutando un motor específico de base de datos, o dar las pistas de cómo una página web puede estar programada o diseñada. Esto permite una investigación más profunda dentro de los puertos abiertos de la base de datos, o buscar errores específicos o debilidades en una página web. Pasando diferentes porciones de datos erróneos, por ejemplo, un atacante puede determinar el orden de autenticación en un script, (por medio del número de línea de los errores) como también 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í también la estructura y organización de ficheros en el servidor web. El código de error escrito por el desarrollador puede agravar este problema, conllevando a la explotación fácil de la, hasta entonces, información "oculta".
Hay tres grandes soluciones a este problema. La primera consiste en examinar todas las funciones, e intentar arreglar la mayoría de los errores. La segunda es deshabilitar completamente la notificación de errores de el código en ejecución. La tercera es utilizar las funciones de manejo de error propias de PHP para crear su propio manejador de errores. Dependiendo de su política de seguridad, puede ser que encuentre que las tres sean aplicables a su situación.
Una forma de detectar este problema por adelantado es hacer uso de
la función propia de PHP error_reporting(), para ayudarle a
asegurar su código y encontrar el uso de variables que podrían ser peligrosas.
Al probar su código, antes de distribuirlo, con E_ALL,
usted puede encontrar rapidamente áreas donde sus variables pueden ser abiertas para envenenamiento
o modificación en otras maneras. Una vez usted está listo para distribuirlo,
debería deshabilitar completamente el reporte de errores poniendo el valor de
error_reporting() a 0, o apagar el visor de errores
utilizando la opción display_errors del fichero php.ini
para aislar su código de ataques. Si decide hacer esto último,
también debería 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 estén inicializados o comprobados antes de utilizar, tendrán acceso
readfile("/ruta/hacia/datos/altamente/sensibles/index.html");
}
?>
Esta característica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP 5.4.0.
Quizás el cambio más 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 común y muchas personas ni siquiera sabía que existía y asumían sólo que ese era el modo como PHP funcionaba. Esta página explicará cómo se puede escribir código 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 inicialización de variables, significa que es muy fácil escribir código inseguro. Fue una decisión difícil, 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 dónde 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 sólo si el usuario está autenticado
if (authenticated_user()) {
$authorized = true;
}
// Debido a que no se inicializa $authorized como false, esta podría ser
// definida a través 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 lógica anterior podría verse comprometida. Cuando está deshabilitada, $authorized no puede definirse a través de peticiones, así que estará bien, aunque realmente en general es una buena práctica de programación 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 código anterior podría funcionar con register_globals activado o desactivado ya que los usuarios de forma predeterminada no serían autorizados.
Otro ejemplo es aquel de las sesiones. Cuando está register_globals = on, se puede usar también $username en el siguiente ejemplo, pero nuevamente se debe notar que $username también puede provenir de otros medios, tal como GET (a través de la URL).
Ejemplo #2 Ejemplo de uso de sesiones con register_globals on u off
<?php
// No se sabría por dónde proviene $username, pero se sabe que $_SESSION es
// para datos de sesión.
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 falsificación. Si se sabe previamente con exactitud el lugar de donde una variable debería provenir, se puede verificar si los datos enviados provienen de una clase inapropiada de sumisión. 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 también la sección del manual sobre el uso de variables desde fuentes externas sources.
Ejemplo #3 Detección de envenenamiento simple de variables
<?php
if (isset($_COOKIE['MAGIC_COOKIE'])) {
// MAGIC_COOKIE viene de una cookie.
// ¡Asegúrese de validar la información de la cookie!
} elseif (isset($_GET['MAGIC_COOKIE']) || isset($_POST['MAGIC_COOKIE'])) {
mail("admin@example.com", "Posible intento de ataque", $_SERVER['REMOTE_ADDR']);
echo "Violación de seguridad, el administrador ha sido alertado.";
exit;
} else {
// MAGIC_COOKIE no se establece a través de este REQUEST
}
?>
Por supuesto, simplemente deshabilitar register_globals no quiere decir que su código
es seguro. Cada pieza de datos que es remitida, también 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 información sobre la emulación de register_globals activado o desactivado, consulte este FAQ.
Nota: Nota de disponibilidad de Superglobals
Los arrays Superglobal como $_GET, $_POST y $_SERVER, etc. están disponibles desde PHP 4.1.0. Para más información, lea la sección del manual en superglobals
Las mayores debilidades de muchos programas PHP no son inherentes al lenguaje mismo, sino simplemente un problema generado cuando se escribe código sin pensar en la seguridad. Por esta razón, usted debería tomarse siempre el tiempo para considerar las implicaciones de cada pedazo de código, 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
// quizás de alguien más?
unlink ($variable_malvada);
// Imprimir el registro del acceso... ¿o quizás una entrada de /etc/passwd?
fwrite ($desc_archivo, $variable_malvada);
// Ejecutar algo trivial.. ¿o rm -rf *?
system ($variable_malvada);
exec ($variable_malvada);
?>
Usted debería examinar siempre, y cuidadosamente su código para asegurarse de que cualquier variable siendo enviada desde un navegador web sea chequeada apropiadamente, y preguntarse a sí mismo:
Al preguntarse adecuadamente estas preguntas mientras escribe su script, en lugar de hacerlo posteriormente, usted previene una desafortunada re-implementación 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 también desee considerar la deshabilitación de register_globals, magic_quotes, u otros parámetros convenientes que pueden causar confusión sobre la validez, fuente o valor de una determinada variable. Trabajar con PHP en modo error_reporting(E_ALL) también puede ayudarle a advertir variables que están siendo usadas antes de ser chequeadas o inicializadas (de modo que puede prevenir que datos inusuales produzcan operaciones inadvertidas).
Esta característica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP 5.4.0.
Las comillas mágicas son un procedimiento que automágicamente limpian los datos de entrada de un script PHP. Es aconsejable trabajar con las comillas mágicas deshabilitadas y, en su lugar, hacer un filtrado en tiempo de ejecución y bajo demanda.
Esta característica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP 5.4.0.
Cuando están habilitadas, todos los caracteres ' (comillas simples), " (comillas dobles), \ (barras) y NULL son "escapados" automáticamente con una barra. Este comportamiento es equivalente al de la función addslashes().
Hay tres directivas para las comillas mágicas:
Esta característica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP 5.4.0.
Esta característica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP 5.4.0.
Esta característica ha sido declarada OBSOLETA desde PHP 5.3.0. Su uso está totalmente desaconsejado.
La directiva magic_quotes_gpc sólo puede deshabilitarse en el sistema, y no en tiempo de ejecución. En otras palabras, no se puede utilizar ini_set().
Ejemplo #1 Deshabilitar comillas mágicas en el servidor
Ejemplo que establece un Off a estas directivas en php.ini. Para más detalles, lea la sección del manual titulada Cómo cambiar los ajustes de configuración.
; 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 configuración del servidor, también puede usar .htaccess. Por ejemplo:
php_flag magic_quotes_gpc Off
Si tuviera interés en implementar código portable (aquél que funciona en cualquier entorno), y no pudiera modificar la configuración en el servidor, aquí hay un ejemplo de cómo deshabilitar magic_quotes_gpc en tiempo de ejecución. Este método es ineficiente por lo que se recomienda establecer los valores apropiados para las directivas en otro lugar.
Ejemplo #2 Deshabilitar las comillas mágicas en tiempo de ejecución
<?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);
}
?>
En general, la seguridad por obscuridad es una de las formas más débiles de la seguridad. Pero en algunos casos, cada pequeño elemento extra de seguridad es deseable.
Unas cuantas técnicas 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 información disponible para ellos.
Otra táctica 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 configuración de Apache. Entonces se pueden utilizar extensiones de archivo engañosas:
Ejemplo #1 Ocultando PHP como si fuera otro lenguaje
# Hacer ver el código PHP como si fueran otros tipos de código AddType application/x-httpd-php .asp .py .pl
Ejemplo #2 Utilizando tipos desconocidos para extensiones de PHP
# Hacer ver el código PHP como si fueran tipos desconocidos AddType application/x-httpd-php .bop .foo .133t
Ejemplo #3 Utilizando tipos HTML para extensiones de PHP
# Hacer ver el código PHP como si fueran HTML AddType application/x-httpd-php .htm .html
PHP, como cualquier otro sistema de tamaño considerable, está bajo constante escrutinio y remodelación. Cada nueva versión incluye con frecuencia cambios mayores y menores para mejorar la seguridad y reparar cualquier fallo, problemas de configuración, 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.
Es posible usar la función 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 autenticación respectivamente. Esas variables predefinidas son encontradas en los arrays $_SERVER y $HTTP_SERVER_VARS. Ambos métodos de autenticación "Basic" y "Digest" (desde PHP 5.1.0) son soportados. Ver la función header() para más información.
Nota: Nota de la versión de PHP
Superglobals, como $_SERVER, están disponibles en PHP » 4.1.0.
Un fragmento de ejemplo de un script el cual podría forzar la autenticación en una página es el siguiente:
Ejemplo #1 Ejemplo de Autenticación 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 botón 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 Autenticación HTTP Digest
Este ejemplo muestra como implementar un script PHP de autenticación Digest. Para más información 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 botón 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 líneas del HTTP header. Para garantizar la mayor compatibilidad con todos los clientes, la palabra "Basic" debe ser escrita con mayúsculas "B", el string real debe ser encerrado en comillas dobles (no simples), y exactamente un espacio debe preceder el código 401 en la línea del header HTTP/1.0 401. Los parámetros de autenticación 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 debería 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-Authenticate antes 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 página que fué autenticada con un mecanismo externo tradicional, las variables PHP_AUTH no deberán ser colocadas si la autenticación externa esta habilitada para esa página 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 configuración
PHP usa la presencia de una directiva AuthType para determinar si una autenticación externa esta en uso.
Nótese, 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 borrarán el caché de la ventana de autenticación del navegador local después 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 botón de "deslogueo".
Ejemplo #3 Ejemplo de Autenticación 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 recurso\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($_SERVER['PHP_AUTH_USER']) . "\" />\n";
echo "<input type='submit' value='Re Authenticate' />\n";
echo "</form></p>\n";
}
?>
Este comportamiento no es requerido por la autenticación HTTP Basic estandar, así que se debería depender de esto. Probando con Lynx mostrará que Lynx no limpia las credenciales de autenticación 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 información de autenticación.
También notese que hasta PHP 4.3.3, la autenticación HTTP no trabajaba usando Microsoft IIS con la versión CGI de PHP, una limitación 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 limitación si se esta usando el módulo IIS (ISAPI) y PHP 4, no se debería usar las variables PHP_AUTH_* pero en su lugar, la variable HTTP_AUTHORIZATION esta disponible. Por ejemplo, considerar el siguiente código: list($user, $pw) = explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
Nota: Nota de IIS:
Para que funcione la Autenticación 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.
El soporte de sesiones en PHP consiste en una manera de guardar ciertos datos a través de diferentes accesos web. Esto permite crear aplicaciones más personalizadas y mejorar las características del sitio web. Toda la información está en la sección. Referencia de sesiones.
» XForms define una variación 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 descripción detallada de como crear XForms, para el fin de este tutorial únicamente veremos un ejemplo simple.
Ejemplo #1 Un formulario simple de búsqueda 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 botón submit. Cuando el botón submit es presionado, el formulario
será enviado a la página referenciada por action.
Aquí es donde comienza a verse diferente desde el punto de vista de la aplicación web. En un formulario normal HTML, los datos serían enviados como application/x-www-form-urlencoded, en el mundo XForms, esta información 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_DATA donde 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 versión de su navegador si el ejemplo falla.
Esta característica permite que los usuarios envien tanto archivos de texto como binarios. Con la autenticación de PHP y las funciones de manipulación de archivos, se tiene completo control sobre quién 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 también las directivas file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size y max_input_time en php.ini
PHP también soporta el método PUT para la carga como lo utilizan los clientes Netscape Composer y Amaya del W3C. Ver el soporte del método PUT para más detalles.
Ejemplo #1 Formulario para la carga de archivos
Una página de carga de archivos puede ser construida mediante la creación de un formulario especial el cual se vería algo como esto:
<!-- El tipo de codificación de datos, enctype, se DEBE especificar como a continuación -->
<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 tamaño máximo 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 sólo para descubrir que era demasiado grande y falló la transferencia. Tener en cuenta: engañar a esta configuración en el lado del navegador es muy fácil, así que nunca se debe confiar en que archivos con un tamaño mayor serán bloqueados por esta característica. Es simplemente una característica de conveniencia para los usuarios en el lado cliente de la aplicación. Sin embargo, la configuración de PHP (en el lado del servidor) para un máximo de tamaño, no puede ser engañada.
Nota:
Asegúrese 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 versión anterior). Este array contendrá toda la información sobre el archivo cargado.
El contenido de $_FILES del formulario de ejemplo es el siguiente. Tenga en cuenta que esto asume la utilización del nombre del archivo cargado userfile, tal como se utiliza en el script de ejemplo anterior. Este puede ser cualquier nombre.
El nombre original del archivo en la máquina cliente.
El tipo mime del archivo, si el navegador proporciona esta información. Un ejemplo podría 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.
El tamaño, en bytes, del archivo subido.
El nombre temporal del archivo en el cual se almacena el archivo cargado en el servidor.
El código de error asociado a esta carga de archivo. Este elemento fue añadido 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 directiva upload_tmp_dir en php.ini. El directorio por defecto del servidor puede ser cambiado mediante el establecimiento de la variable de entorno TMPDIR en el entorno en el cual se ejecuta PHP. Configurarlo usando putenv() desde un script PHP no funcionará. Esta variable de entorno también se puede utilizar para asegurarse de que las demás operaciones están trabajando sobre los archivos cargados.
Ejemplo #2 Validación de la carga de archivos
Ver también las entradas para las funciones is_uploaded_file() y move_uploaded_file() para más información. El siguiente ejemplo procesaría la carga de archivo que vendría de un formulario.
<?php
// En versiones de PHP anteriores a 4.1.0, $HTTP_POST_FILES debe utilizarse en lugar
// 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 válido y fue cargado exitosamente.\n";
} else {
echo "¡Posible ataque de carga de archivos!\n";
}
echo 'Aquí hay más información de depurado:';
print_r($_FILES);
print "</pre>";
?>
El script PHP que recibe el archivo cargado, debe implementar cualquier lógica 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 pequeño o demasiado grande. Se podría utilizar la variable $_FILES['userfile']['type'] para descartar cualquier archivo que no corresponda con un cierto criterio de tipo, pero usando esto sólo 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 lógica de acuerdo con los códigos de error. Cualquiera que sea la lógica, se debe borrar el archivo del directorio temporal o moverlo a otra parte.
Si ningún 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.
A partir de PHP 4.2.0, PHP devuelve un código de error apropiado, junto con el array del archivo. El código 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 podría 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 sólo parcialmente cargado.
UPLOAD_ERR_NO_FILE
Valor: 4; Ningún 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 extensión de PHP detuvo la carga de archivos. PHP no proporciona una forma de determinar cual extensión 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.
El item MAX_FILE_SIZE no puede especificar un tamaño de archivo mayor que el que ha sido configurado en el upload_max_filesize en el archivo php.ini. Por defecto es 2 megabytes.
Si hay un límite de memoria activado, un memory_limit más grande puede ser necesario. Asegurarse de configurar un memory_limit lo suficientemente grande.
Si el max_execution_time es demasiado pequeño, la ejecución del script puede excederse de este valor. Asegurarse de configurar un max_execution_time lo suficientemente grande.
Nota: max_execution_time sólo afecta al plazo de ejecución del propio script. Todo el tiempo gastado en actividades que tengan lugar por fuera de la ejecución del script, tales como las llamadas al sistema usando system(), la función 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 máximo que el script ha estado funcionando.
max_input_time establece el tiempo máximo, en segundos, al script se le permite recibir información, esto incluye la subida de archivos. Para archivos grandes o múltiples, o usuarios con conexiones más lentas, el valor predeterminado de 60 segundos puede ser excedido.
Si post_max_size se establece demasiado pequeño, los archivos grandes no pueden ser cargados. Asegurarse de configurar post_max_size lo suficientemente grande.
A partir de PHP 5.2.12, la configuración max_file_uploads controla el número máximo de archivos que se pueden cargar en una petición. Si más archivos que ese límite son subidos, entonces $_FILES parará de procesar archivos una vez se alcanza el límite. Por ejemplo, si max_file_uploads se establece en 10, entonces $_FILES nunca contendrá más de 10 elementos.
No validar sobre cual archivo se opera puede significar que los usuarios pueden acceder a información 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 exóticos (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[]).
Múltiples archivos pueden ser subidos utilizando diferentes name para los input.
También es posible subir múltiples archivos simultáneamente y tener la información organizada automáticamente en arrays. Para ello, es necesario utilizar la misma sintaxis de sumisión de array en el formulario HTML como se hace con múltiples selects y checkboxes:
Ejemplo #1 Subida de múltiples 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'] serán 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 también se inicializan. Cada uno de estos será un array indexado numéricamente 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] contendría el valor review.html, y $_FILES['userfile']['name'][1] contendría el valor xwp.out. De manera similar, $_FILES['userfile']['size'][0] contendría el tamaño del archivo review.html y así sucesivamente.
$_FILES['userfile']['name'][0], $_FILES['userfile']['tmp_name'][0], $_FILES['userfile']['size'][0], y $_FILES['userfile']['type'][0] también son establecidos.
A partir de PHP 5.2.12, la configuración max_file_uploads actúa como un límite en el número de archivos que se pueden subir en una petición. Se necesita asegurar que el formulario no intenta cargar más archivos que este límite en una petición.
PHP ofrece soporte para el método HTTP PUT utilizado por algunos clientes para almacenar archivos en un servidor. Las peticiones PUT son mucho más 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 automáticamente 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 petición. En Apache se hace esto con la directiva de Script. Se puede colocar casi en cualquier parte del archivo de configuración de Apache. Un lugar común es dentro de un bloque <Directory> o tal vez dentro de un bloque <VirtualHost>. Una línea como ésta haría el truco:
Script PUT /put.php
Esto le dice a Apache que envíe todas peticiones PUT para URIs que coincidan con el contexto en el cual se pone esta línea en el script put.php. Esto asume, por supuesto, que se tiene habilitado PHP para la extensión .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 haría algo como lo siguiente en el put.php. Esto copiaría 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 estándar */
$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);
?>
Siempre que allow_url_fopen este habilitado en php.ini, se pueden usar URLs HTTP y FTP con la mayoría de las funciones que toman un nombre de archivo como parámetro. Además, 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 más información 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 opción de configuración --enable-url-fopen-wrapper .
Nota:
Las versiones Windows de PHP más 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 extensión Funciones de GD e Imágenes
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 página 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 línea */
if (preg_match ("@\<title\>(.*)\</title\>@i", $line, $out)) {
$title = $out[1];
break;
}
}
fclose($file);
?>
También 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 método. Si se intenta sobreescribir un archivo que ya existe, la llamada a la función 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 vía HTTP cuando se requiere autenticación básica).
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 podría tener la idea del ejemplo anterior que se esta usando esta técnica para escribir un archivo de log remoto. Desafortunadamente esto no funcionaría porque la función fopen() llamada fallará si el archivo remoto ya existe. Para hacer logs distribuidos como ese, se debería dar un vistazo a syslog().
Internamente en PHP se mantiene un estatus de la conexión. Hay 3 posibles estados:
Cuando un script en PHP esta ejecutándose, normalmente esta activo el estado NORMAL. Si el cliente remoto se desconecta, el flag ABORTED es activado. Un cliente remoto se desconecta usualmente porque el usuario presiona su botón STOP. Si el tiempo limite PHP-imposed (ver set_time_limit()) es activado, el flag TIMEOUT se activa.
Se puede decidir si se desea que un cliente se desconecte o no a causa
de que se aborte el script. Algunas veces es útil que los scripts se
ejecuten inclusive si ya no hay un navegador recibiendo la salida.
El comportamiento por defecto es que el script sea abortado cuando el
cliente remoto se desconecte. Este comportamiento puede ser establecido
a través de la directiva ignore_user_abort en php.ini así como a través
de la directiva correspondiente de Apache en httpd.conf
php_value ignore_user_abort o
con la función ignore_user_abort(). Si se decide
no decirle a PHP que ignore abortar al usuario y el usuario aborta,
el script terminará. La única excepción es si se tiene registrada una
función de cierre usando register_shutdown_function().
Con una función de cierre, cuando el usuario remoto activa el botón STOP,
la próxima vez que el script intente mostrar algo, PHP detectará que la
conexión fue abortada y la función de cierre es llamada.
Esta función de cierre también es llamada al final del script cuando
termina normalmente, así que para hacer algo diferente en el caso de que
un cliente se desconecte usar la función connection_aborted().
Esta función retornará TRUE si la conexión fue abortada.
El script puede ser terminado también por el temporizador incorporado en los scripts. El tiempo por defecto es de 30 segundos. Puede ser cambiado usando la directiva max_execution_time de php.ini o la correspondiente directiva php_value max_execution_time de Apache httpd.conf así como con la función set_time_limit(). Cuando el temporizador expira el script será abortado y así como el caso del cliente anterior que se desconecto, si la función de cierre ha sido registrada ésta será llamada. Dentro de esta función de cierre se puede comprobar para ver si el timeout causa la función de cierre llamando a la función connection_status(). Esta función retornará 2 si el timeout causo la llamada a la función de cierre.
Una cosa a notar es que ambos estados ABORTED y TIMEOUT pueden ser activados al mismo tiempo. Esto es posible si se le dice a PHP que ignore el aborto del usuario. PHP notará de hecho que un usuario podría haber roto la conexión, pero el script se mantendrá ejecutándose. Si este activa el limite de tiempo será abortado y la función de cierre, si existe, será llamada. A este punto, se encontrará que connection_status() retorna 3.
Las conexiones persistentes son enlaces que no se cierran cuando la ejecución del script termina. Cuando una conexión persistente es solicitada, PHP chequea si ya existe una conexión persistente idéntica (que fuera abierta antes) - y si existe, la usa. Si no existe, crea el enlace. Una conexión "Idéntica" es una conexión que fue abierta por el mismo host, con el mismo usuario y el mismo password (donde sea aplicable).
Las personas que no estan completamente familiarizadas con como trabajan los web servers y la distribución de carga podrían equivocarse en usar conexiones persistentes para lo que no son. En particular, no le da la habilidad de abrir "sesiones de usuario" en el mismo enlace, no le da la habilidad de construir una transacción eficiente, pero no hacen muchas otras cosas más. De hecho, para ser extremadamente claros acerca de esto, las conexiones persistentes no dan cualquier otra funcionalidad que no fuera posible hacerse con sus hermanas no-persistentes.
¿Por qué?
Esto tiene que ver con la forma en que los web servers trabajan. Hay 3 formas en las cuales el web server puede generar paginas web usando PHP.
El primer método es usar PHP como una "capa" CGI. Cuando se ejecuta de esta forma, una instancia del interprete PHP es creado y destruido por cada solicitud de la página (para una página PHP) al web server. Porque es destruido después de cada solicitud, cualquier recurso que se necesite (como un enlace a un servidor de base de datos SQL) son cerradas cuando son destruidas. En este caso, no se gana nada intentando usar conexiones persistentes -- simplemente no persisten.
La segunda, y mas popular, es ejecutar PHP como un modulo en un servidor multiproceso, el cual actualmente solo incluye a Apache. Un servidor multiproceso normalmente tiene un proceso (el padre) el cual coordina un grupo de procesos (los hijos) los cuales no trabajan sirviendo páginas web. Cuando una solicitud viene desde el cliente, es manejada por uno de los hijos el cual no este sirviendo a otro cliente. Esto significa que cuando el mismo cliente hace una segunda solicitud al servidor, podría ser servido por un proceso hijo diferente a la primera vez. Cuando se abre una conexión persistente, cada petición siguiente de servicios SQL puede reusar la misma conexión establecida al servidor SQL.
El último método es usar PHP como un plug-in para un servidor web multihilos. Actualmente PHP 4 tiene soporte para ISAPI, WSAPI, y NSAPI (en Windows), los cuales permiten usar PHP como un plug-in multihilo en servidores como Nestcape FastTrack (iPlanet), Microsoft Internet Information Server (IIS), y O'Reilly's WebSite Pro. El comportamiento es esencialmente el mismo para el modelo multiproceso descrito antes.
Si las conexiones persistentes no tienen ninguna funcionalidad adicional, ¿Para que son buenas?
La respuesta es extremadamente simple -- eficiencia. Las conexiones persistentes son buenas si la sobrecarga para crear enlaces al servidor SQL son altas. Que hallan o no sobrecargas depende de muchos factores. Como, cual base de datos se usa, que sea o no la misma computadora en que esta el servidor web, así como la carga de la maquina que tiene el servidor SQL y así por el estilo. Lo esencial es que si la sobrecarga de conexiones es alta, las conexiones persistentes ayudan considerablemente. Podrían causar que los procesos hijos únicamente se conecten una vez en todo lo que duran, en lugar de que se haga cada vez que se procese una página que se conecte a un servidor SQL. Esto significa que por cada hijo que abrió una conexión persistente mantendrá una conexión persistente al servidor. Por ejemplo, si se tienen 20 procesos hijos diferentes que ejecutaran un script que hace una conexión persistente al servidor SQL, se tendrían 20 conexiones diferentes al servidor SQL, una por cada hijo.
Nótese, sin embargo, que esto puede tener algunos inconvenientes si se esta usando una base de datos con un limite de conexiones que sean excedidas por las conexiones persistentes hijas. Si la base de datos tiene un limite de 16 conexiones simultaneas, y en el curso de una sesión ocupada del servidor, 17 hilos intentan conectarse, uno no sera posible de hacerse. Si hay bugs en los scripts los cuales no contemplen los cierres de las conexiones (como un loop infinito), la base de datos con los 16 conexiones podría rápidamente hundida. Chequear la documentación de la base de datos para obtener información de como manejar conexiones abandonadas u ociosas.
Hay un par de advertencias mas que tener en mente cuando se usan conexiones persistentes. Una es que cuando se usan bloqueos de tablas con una conexión persistente, si el script por alguna razón no puede soltar el bloqueo, entonces los scripts subsecuentes que usan la misma conexión serán bloqueadas indefinidamente y podría ser necesario reiniciar el servidor httpd o el servidor de la base de datos. Otra cosa es que cuando se usan transacciones, una transacción bloqueada también podría llevar al siguiente script el cual usa la conexión si la ejecución del script termina antes que el bloqueo lo haga. En ese caso, se puede usar register_shutdown_function() para registrar una función de limpieza para desbloquear las tablas o deshacer la transacción. Mejor aún es evitar este problema por completo no usando conexiones persistentes en scripts los cuales usan bloqueo de tablas o transacciones (se pueden usar en otros lugares).
Un resumen importante. Las conexiones persistentes fueron diseñadas para tener conexiones normales uno a uno. Esto significa siempre que se podría ser capaz de reemplazar conexiones persistentes con conexiones no-persistentes, y no cambiaría la forma en que este se comporte. Esto podría (y probablemente lo hará) cambiar la eficiencia del script, pero no su comportamiento!.
Ver también fbsql_pconnect(), ibase_pconnect(), ifx_pconnect(), ingres_pconnect(), msql_pconnect(), mssql_pconnect(), mysql_pconnect(), ociplogon(), odbc_pconnect(), oci_pconnect(), pfsockopen(), pg_pconnect(), and sybase_pconnect().
The PHP safe mode is an attempt to solve the shared-server security problem. It is architecturally incorrect to try to solve this problem at the PHP level, but since the alternatives at the web server and OS levels aren't very realistic, many people, especially ISP's, use safe mode for now.
Esta característica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP 5.4.0.
| Versión | Descripción |
|---|---|
| 5.4.0 |
Removed from PHP, and generates a fatal E_CORE_ERROR
level error when enabled.
|
| 5.3.0 |
Deprecated, and E_DEPRECATED errors were added.
|
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| safe_mode | "0" | PHP_INI_SYSTEM | Removed in PHP 5.4.0. |
| safe_mode_gid | "0" | PHP_INI_SYSTEM | Available since PHP 4.1.0. Removed in PHP 5.4.0. |
| safe_mode_include_dir | NULL | PHP_INI_SYSTEM | Available since PHP 4.1.0. Removed in PHP 5.4.0. |
| safe_mode_exec_dir | "" | PHP_INI_SYSTEM | Removed in PHP 5.4.0. |
| safe_mode_allowed_env_vars | "PHP_" | PHP_INI_SYSTEM | Removed in PHP 5.4.0. |
| safe_mode_protected_env_vars | "LD_LIBRARY_PATH" | PHP_INI_SYSTEM | Removed in PHP 5.4.0. |
He aquí una breve explicación de las directivas de configuración.
safe_mode
boolean
Whether to enable PHP's safe mode. If PHP is compiled with --enable-safe-mode then defaults to On, otherwise Off.
Esta característica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP 5.4.0.
safe_mode_gid
boolean
By default, Safe Mode does a UID compare check when
opening files. If you want to relax this to a GID compare,
then turn on safe_mode_gid.
Whether to use UID (FALSE) or
GID (TRUE) checking upon file
access.
safe_mode_include_dir
string
UID/GID checks are bypassed when including files from this directory and its subdirectories (directory must also be in include_path or full path must including).
As of PHP 4.2.0, this directive can take a colon (semi-colon on Windows) separated path in a fashion similar to the include_path directive, rather than just a single directory. The restriction specified is actually a prefix, not a directory name. This means that "safe_mode_include_dir = /dir/incl" also allows access to "/dir/include" and "/dir/incls" if they exist. When you want to restrict access to only the specified directory, end with a slash. For example: "safe_mode_include_dir = /dir/incl/" If the value of this directive is empty, no files with different UID/GID can be included in PHP 4.2.3 and as of PHP 4.3.3. In earlier versions, all files could be included.safe_mode_exec_dir
string
If PHP is used in safe mode, system() and the other functions executing system programs refuse to start programs that are not in this directory. You have to use / as directory separator on all environments including Windows.
safe_mode_allowed_env_vars
string
Setting certain environment variables may be a potential security breach. This directive contains a comma-delimited list of prefixes. In Safe Mode, the user may only alter environment variables whose names begin with the prefixes supplied here. By default, users will only be able to set environment variables that begin with PHP_ (e.g. PHP_FOO=BAR).
Nota:
If this directive is empty, PHP will let the user modify ANY environment variable!
safe_mode_protected_env_vars
string
This directive contains a comma-delimited list of environment variables that the end user won't be able to change using putenv(). These variables will be protected even if safe_mode_allowed_env_vars is set to allow to change them.
See also: open_basedir, disable_functions, disable_classes, register_globals, display_errors, and log_errors.
When safe_mode is on, PHP checks to see if the owner of the current script matches the owner of the file to be operated on by a file function or its directory. For example:
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php -rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
<?php
readfile('/etc/passwd');
?>
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2
However, there may be environments where a strict UID check is not appropriate and a relaxed GID check is sufficient. This is supported by means of the safe_mode_gid switch. Setting it to On performs the relaxed GID checking, setting it to Off (the default) performs UID checking.
If instead of safe_mode, you set an open_basedir directory then all file operations will be limited to files under the specified directory. For example (Apache httpd.conf example):
<Directory /docroot> php_admin_value open_basedir /docroot </Directory>
Warning: open_basedir restriction in effect. File is in wrong directory in /docroot/script.php on line 2
You can also disable individual functions. Note that the disable_functions directive can not be used outside of the php.ini file which means that you cannot disable functions on a per-virtualhost or per-directory basis in your httpd.conf file. If we add this to our php.ini file:
disable_functions = readfile,system
Warning: readfile() has been disabled for security reasons in /docroot/script.php on line 2
These PHP restrictions are not valid in executed binaries, of course.
This is a still probably incomplete and possibly incorrect listing of the functions limited by safe mode.
| Function | Limitations |
|---|---|
| dbmopen() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. |
| dbase_open() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. |
| filepro() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. |
| filepro_rowcount() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. |
| filepro_retrieve() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. |
| ifx_* | sql_safe_mode restrictions, (!= safe mode) |
| ingres_* | sql_safe_mode restrictions, (!= safe mode) |
| mysql_* | sql_safe_mode restrictions, (!= safe mode) |
| pg_lo_import() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. |
| posix_mkfifo() | Comprueba si el directorio en el que el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado. |
| putenv() | Obeys the safe_mode_protected_env_vars and safe_mode_allowed_env_vars ini-directives. See also the documentation on putenv() |
| move_uploaded_file() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. |
| chdir() | Comprueba si el directorio en el que el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado. |
| dl() | Esta función no está disponible cuando PHP está corriendo en safe mode. |
| backtick operator | Esta función no está disponible cuando PHP está corriendo en safe mode. |
| shell_exec() (functional equivalent of backticks) | Esta función no está disponible cuando PHP está corriendo en safe mode. |
| exec() | You can only execute executables within the safe_mode_exec_dir. For practical reasons it's currently not allowed to have .. components in the path to the executable. escapeshellcmd() is executed on the argument of this function. |
| system() | You can only execute executables within the safe_mode_exec_dir. For practical reasons it's currently not allowed to have .. components in the path to the executable. escapeshellcmd() is executed on the argument of this function. |
| passthru() | You can only execute executables within the safe_mode_exec_dir. For practical reasons it's currently not allowed to have .. components in the path to the executable. escapeshellcmd() is executed on the argument of this function. |
| popen() | You can only execute executables within the safe_mode_exec_dir. For practical reasons it's currently not allowed to have .. components in the path to the executable. escapeshellcmd() is executed on the argument of this function. |
| fopen() | Comprueba si el directorio en el que el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado. |
| mkdir() | Comprueba si el directorio en el que el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado. |
| rmdir() | Comprueba si el directorio en el que el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado. |
| rename() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. Comprueba si el directorio en el que el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado. |
| unlink() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. Comprueba si el directorio en el que el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado. |
| copy() | Comprueba si los archivos o directorios que va a utilizar
tienen el mismo UID (propietario) que el script que está siendo ejecutado. Comprueba si el directorio en el que
el script está operando tiene el mismo UID (propietario) que el script que está siendo
ejecutado. (on
source and
target) |
| chgrp() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. |
| chown() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. |
| chmod() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. In addition, you cannot set the SUID, SGID and sticky bits |
| touch() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. Comprueba si el directorio en el que el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado. |
| symlink() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. Comprueba si el directorio en el que el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado. (note: only the target is checked) |
| link() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. Comprueba si el directorio en el que el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado. (note: only the target is checked) |
| apache_request_headers() | In safe mode, headers beginning with authorization (case-insensitive) will not be returned. |
| header() | In safe mode, the uid of the script is added to the realm part of the WWW-Authenticate header if you set this header (used for HTTP Authentication). |
| PHP_AUTH variables | In safe mode, the variables PHP_AUTH_USER, PHP_AUTH_PW, and AUTH_TYPE are not available in $_SERVER. Regardless, you can still use REMOTE_USER for the USER. (note: only affected since PHP 4.3.0) |
| highlight_file(), show_source() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. Comprueba si el directorio en el que el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado. (note: only affected since PHP 4.2.1) |
| parse_ini_file() | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. Comprueba si el directorio en el que el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado. (note: only affected since PHP 4.2.1) |
| set_time_limit() | Has no effect when PHP is running in safe mode. |
| max_execution_time | Has no effect when PHP is running in safe mode. |
| mail() | In safe mode, the fifth parameter is disabled. (note: only affected since PHP 4.2.3) |
| session_start() | The owner of a script must be the same as owner of a session.save_path directory if the default files session.save_handler is used. |
| All filesystem and stream functions. | Comprueba si los archivos o directorios que va a utilizar tienen el mismo UID (propietario) que el script que está siendo ejecutado. Comprueba si el directorio en el que el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado. (see the safe_mode_include_dir php.ini option. |
Desde PHP 4.3.0, hay soporte para CLI SAPI. El principal objetivo de esta SAPI es el desarrollo de aplicaciones de consola en PHP. En este capítulo se explica las diferencias que hay entre CLI SAPI y otras SAPIs. Vale la pena aclarar que CLI y CGI son SAPIs diferentes pese a que compartan la mayoría de características.
Para que CLI SAPI esté activa por omisión, debe usarse --enable-cli , pero puede deshabilitarse usando la opción --disable-cli al ejecutar ./configure.
Tanto el nombre, ubicación y presencia del binario CLI/CGI depende de cómo se instale PHP en el sistema. Por omisión, al ejecutar make, tanto CGI como CLI se construyen y ubican como sapi/cgi/php-cgi y sapi/cli/php respectivamente, en el directorio fuente de PHP. Debe tenerse en cuenta que los dos se llaman php. Dependiendo de la configuración, sucederá una cosa u otra al ejecutar make install. Si durante la configuración se elige un módulo SAPI, como por ejemplo apxs, o bien se usa la opción --disable-cgi , se copia CLI a {PREFIX}/bin/php al ejecutar make install a no ser que CGI ya esté ahí. Por ejemplo, si se utiliza --with-apxs en la configuración, entonces CLI se copiaría a {PREFIX}/bin/php durante make install. Si se deseara sobrescribir la instalación del binario de CGI, debe usarse make install-cli tras make install. Adicionalmente, se puede especificar --disable-cgi en la configuración.
Nota:
Ya que tanto --enable-cli como --enable-cgi se habilitan por omisión, el simple hecho de tener --enable-cli en la configuración no implica que CLI se instale en {PREFIX}/bin/php durante make install.
Desde PHP 5, en sistemas Windows el binario CLI se instala en el directorio principal con el nombre de php.exe. La versión CGI se instala como php-cgi.exe. Además, se instalaría php-win.exe si PHP se hubiera configurado usando --enable-cli-win32 . Funciona igual que la versión CLI, solo que no muestra ninguna salida, por lo que no sirve para la consola.
Nota: ¿Qué SAPI tengo?
Desde la consola, al escribir php -v sabremos si php es un CGI o CLI. Revise, asimismo, la función php_sapi_name() y la constante
PHP_SAPI.
Nota:
En Unix hay disponible una página del manual escribiendo man php en la terminal.
Principales diferencias de CLI SAPI respecto a otras SAPIs:
A diferencia de CGI SAPI, no se envía ninguna cabecera a la salida.
Pese a que CGI SAPI tiene un mecanismo para desactivar las cabeceras HTTP, no existe un equivalente para habilitarlas en CLI SAPI.
Por omisión, CLI se inicia en modo silencioso, si bien se mantienen las opciones -q y --no-header por motivos de compatibilidad, de forma que pueda ser posible utilizar antigüos scripts CGI.
No se cambia el directorio de trabajo al del script (las opciones -C y --no-chdir se mantiene por compatibilidad).
Mensajes de error en texto plano (no se formatean en HTML).
Hay ciertas directivas php.ini que se ignoran en CLI SAPI ya que no tienen sentido en un entorno de consola:
| Directiva | Valor por omisión en CLI SAPI | Comentario |
|---|---|---|
| html_errors | FALSE |
Siendo FALSE de forma predeterminada, puede resultar complicado leer mensajes de error en la consola
cuando éstos están mezclados con etiquetas
HTML no interpretadas.
|
| implicit_flush | TRUE |
En un ambiente de línea de comandos, es preferible que las salidas que procedan de print, echo y y similares se muestren inmediatamente y no se mantenga en memoria intermedia. Aun así, es posible utilizar output buffering si se desea postergar o manipular la salida estándar. |
| max_execution_time | 0 (ilimitado) | PHP en un entorno de shell tiende a ser utilizado para una gama mucho más amplia de los propósitos típicos basados en scripts de la Web, y como éstos pueden ser de muy larga duración, el tiempo de ejecución máximo se establece a ilimitado. |
| register_argc_argv | TRUE |
Establecer esta directiva a Las variables de PHP $argc y $argv se establecen automáticamente al valor apropiado cuando se utiliza CLI SAPI. Esos valores también pueden ser encontrados en el array $_SERVER, por ejemplo: $_SERVER['argv'] |
| output_buffering | FALSE |
Aunque la directiva php.ini está codificada como |
| max_input_time | FALSE |
CLI no tiene soporte ni para GET, ni para POST ni para subidas de ficheros. |
Nota:
Estas directivas no pueden ser inicializadas con otro valor desde el fichero de configuración php.ini o con un valor personalizado (si se especifica). Esta limitación se debe a que los valores son aplicados después que todos los ficheros de configuración han sido analizados. Sin embargo, sus valores pueden ser cambiados en tiempo de ejecución (aunque esto no es aplicable a todas ellas, por ejemplo register_argc_argv).
Nota:
Se recomienda habilitar ignore_user_abort en scripts de línea de comandos. Para más información, consulte ignore_user_abort().
Para facilitar el trabajo en entornos de consola, se definen unas determinadas constantes para flujos de Entrada/Salida.
CLI SAPI no cambia el directorio actual a aquel en el que se encuentra el script ejecutado.
Ejemplo #1 Ejemplo que muestra las diferencias respecto a CGI SAPI:
<?php
// Aplicación de pruebas llamada test.php
echo getcwd(), "\n";
?>
Al usar la versión CGI, la salida es:
$ pwd /tmp $ php -q otro_directorio/test.php /tmp/otro_directorio
Esto muestra claramente que PHP cambia el directorio actual a aquél en que se encuentre el script ejecutado.
Al usar CLI SAPI obtenemos:
$ pwd /tmp $ php -f otro_directorio/test.php /tmp
Esto ofrece una gran flexibilidad a la hora de escribir herramientas de consola en PHP.
Nota:
CGI SAPI puede funcionar con este comportamiento propio de CLI SAPI usando la opción -C al ejecutarlo desde la línea de comandos.
Se puede consultar en cualquier momento la lista de opciones de línea de comandos en el binario de PHP con el modificador -h :
Usage: php [opciones] [-f] <fichero> [--] [args...]
php [opciones] -r <código> [--] [args...]
php [opciones] [-B <código_inicial>] -R <código> [-E <código_final>] [--] [args...]
php [opciones] [-B <código_inicial>] -F <fichero> [-E <código_final>] [--] [args...]
php [opciones] -- [args...]
php [opciones] -a
-a Se ejecuta interactivamente.
-c <ruta>|<fichero> Busca el fichero php.ini en este directorio.
-n No se usará el fichero php.ini.
-d foo[=bar] Define la entrada INI de foo con el valor 'bar'
-e Generate información extendida para el depurador/perfilador.
-f <fichero> Analiza y ejecuta el <fichero>.
-h Esta ayuda.
-i Información de PHP.
-l Solamente revisa la sintáxis (lint).
-m Muestra lo compilado en módulos.
-r <code> Ejecuta el <código> PHP sin utilizar las etiquetas del script <?..?>.
-B <código_inicial> Ejecuta el <código_inicial> antes de procesar las líneas de entrada.
-R <code> Ejecuta el <código> PHP por cada línea de entrada.
-F <file> Analiza y ejecuta el <fichero> por cada línea de entrada.
-E <código_final> Ejecuta el <código_final> después de procesar todas las líneas de entrada.
-H Oculta los argumentos pasados desde cualquier herramienta externa.
-S <dirección>:<puerto> Ejecuta con el servidor web interno.
-t <raíz_documento> Especifica la raíz del documento <raíz_documento> para el servidor web interno.
-s Salida de la fuente en sintáxis HTML resaltada.
-v Número de versión.
-w Salida de la fuente con espacios en blanco y comentarios subrayados.
-z <fichero> Carga un <fichero> con extensión de Zend.
args... Argumentos pasados al script. Utilice argumentos con -- cuando el primer argumento
inicie con - o el script sea leído desde la entrada estándar stdin
--ini Muestra los nombres de fichero de configuración.
--rf <nombre> Muestra información sobre la función <nombre>.
--rc <nombre> Muestra información acerca de la clase <nombre>.
--re <nombre> Muestra información acerca de la extensión <nombre>.
--rz <nombre> Muestra información acerca de la extensión Zend <nombre>.
--ri <nombre> Muestra la configuración para la extensión <nombre>.
| Opción | Opción Larga | Descripción |
|---|---|---|
| -a | --interactive |
Ejecutar PHP de forma interactiva. Para más información, consúltese la sección Consola interactiva. |
| -b | --bindpath |
Ruta Ligada en modo de servidor FASTCGI externo (sólo en CGI). |
| -C | --no-chdir |
No cambiar el directorio del script (sólo en CGI). |
| -q | --no-header |
Modo silencioso. Elimina la salida de cabeceras HTTP (sólo en CGI). |
| -T | --timing |
Calcula el tiempo de ejecución del script un número de veces (sólo en CGI). |
| -c | --php-ini |
Especifica ya sea un directorio en el que se busca a php.ini o bien un fichero INI personalizado (que no tiene porqué llamarse php.ini necesariamente), p.ej.: $ php -c /directorio/propio/mi_script.php $ php -c /directorio/propio/fichero-propio.ini mi_script.php Si no se especifica esta opción, se busca el fichero php.ini en las localizaciones predeterminadas. |
| -n | --no-php-ini |
Ignorar por completo el fichero php.ini. |
| -d | --define |
Establecer un valor predeterminado para cualquiera de las directivas de configuración permitidas en php.ini. Ésta es la sintaxis: -d directiva_de_configuracion[=valor]
# Si se omite el valor, se establecerá un "1" a la directiva
$ php -d max_execution_time
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(1) "1"
# Si se pasa un valor vacío, se establecerá "" a la directiva
php -d max_execution_time=
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(0) ""
# Se pasará lo que haya tras el caracter '=' a la directiva de configuración
$ php -d max_execution_time=20
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(2) "20"
$ php
-d max_execution_time=doesntmakesense
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(15) "doesntmakesense"
|
| -e | --profile-info |
Activa el modo de información expandida, para usar con un depurador/perfilador. |
| -f | --file |
Analiza y ejecuta el fichero proporcionado. El modificador -f es opcional y puede ser omitido - es suficiente con solo poner el nombre del fichero a ejecutar.
|
| -h y -? | --help y --usage | Muestra una lista de opciones de línea de comandos, con descripciones de una línea sobre lo que hace. |
| -i | --info | Invoca a phpinfo(), y muestra el resultado. Si PHP no funcionara correctamente, es aconsejable utilizar php -i para ver donde se muestre cualquier mensaje de error antes o en el lugar de las tablas de información. Tenga en cuenta que al usarse en modo CGI la salida es en HTML y por lo tanto muy larga. |
| -l | --syntax-check |
Provee un método conveniente para realizar solamente una revisión de sintáxis del código proporcionado de PHP. En caso de éxito, se muestra el texto No syntax errors detected in <filename> en la salida estándar y se devuelve un código de retorno 0. Si fallara, se mostraría el texto Errors parsing <filename>, además del mensaje de error de análisis correspondiente en la salida estándar, y se retornaría el código -1. Esta opción no encuentra errores fatales (como funciones no definidas). Utilice el modificador -f si se desea también comprobar errores fatales.
|
| -m | --modules |
Ejemplo #1 Muestra los módulos PHP y Zend incorporados (y habilitados) $ php -m [PHP Modules] xml tokenizer standard session posix pcre overload mysql mbstring ctype [Zend Modules] |
| -r | --run |
Permite ejecutar PHP desde la línea de comandos. Las etiquetas de inicio y fin (<?php y ?>) no son necesarias y provocarán un error sintáctico si estuvieran presentes.
|
| -B | --process-begin |
Código PHP a ejecutar antes de procesar la entrada. Añadido en PHP 5. |
| -R | --process-code |
Código PHP a ejecutar por cada línea de entrada. Añadido en PHP 5. Hay dos variables especiales disponibles en este modo: $argn y $argi. $argn contendrá la línea que PHP está procesando en un momento dado, mientras que $argi contendrá el número de línea. |
| -F | --process-file |
Fichero PHP a ejecutar por cada línea de entrada. Añadido en PHP 5. |
| -E | --process-end |
Código PHP a ejecutar tras procesar cada línea. Añadido en PHP 5. Ejemplo #4 Usando las opciones -B , -R y -E para contar el número de líneas de un proyecto. $ find my_proj | php -B '$l=0;' -R '$l += count(@file($argn));' -E 'echo "Total Lines: $l\n";' Total Lines: 37328 |
| -S | --server |
Inicia el servidor web interno. Disponible a partir de PHP 5.4.0. |
| -t | --docroot | Especifiva la raíz del documento para el servidor web interno. Disponible a partir de PHP 5.4.0. |
| -s | --syntax-highlight y --syntax-highlighting |
Mostrar el código fuente destacando la sintaxis en color. Esta opción utiliza los mecanismos internos de análisis del ficheros y escribe una versión HTML coloreada y la muestra en la salida estándar. Tenga en cuenta que todo lo que hace es generar un bloque de etiquetas HTML <code> [...] </code>, sin cabeceras HTML.
|
| -v | --version |
Ejemplo #5 Al usar -v obtenemos el nombre de la SAPI y la versión de PHP y Zend $ php -v PHP 5.3.1 (cli) (built: Dec 11 2009 19:55:07) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies |
| -w | --strip |
Mostrar código fuente sin comentarios ni líneas en blanco.
|
| -z | --zend-extension |
Carga una extensión Zend. Si sólo se proporciona un nombre de fichero, PHP trata de cargar la extensión en el directorio de bibliotecas por defecto de su sistema (normalmente se especifica en /etc/ld.so.conf en sistemas Linux, por ejemplo). Si se proporciona un nombre de fichero con la ruta absoluta no se usarán las rutas de bibliotecas del sistema. Un nombre de fichero relativo que incluya algún directorio le indicará a PHP que sólo trate de cargar la extensión a partir del directorio actual. |
| --ini |
Mostrar el nombre del fichero de configuración y de los directorios analizados. Disponible desde PHP 5.2.3. Ejemplo #6 Ejemplo de --ini $ php --ini Configuration File (php.ini) Path: /usr/dev/php/5.2/lib Loaded Configuration File: /usr/dev/php/5.2/lib/php.ini Scan for additional .ini files in: (none) Additional .ini files parsed: (none) |
|
| --rf | --rfunction |
Mostrar información de la función o método proporcionado (p.ej. número y nombre de los parámetros). Disponible desde PHP 5.1.2. Esta opción sólo está disponible si se compiló PHP con soporte para Reflection.
Ejemplo #7 Uso básico de --rf $ php --rf var_dump
Function [ <internal> public function var_dump ] {
- Parameters [2] {
Parameter #0 [ <requerido> $var ]
Parameter #1 [ <opcional> $... ]
}
}
|
| --rc | --rclass |
Muestra información de la clase dada (lista de constantes, propiedades y métodos). Disponible desde PHP 5.1.2. Esta opción sólo está disponible si se compiló PHP con soporte para Reflection.
Ejemplo #8 Ejemplo de --rc $ php --rc Directory
Class [ <internal:standard> class Directory ] {
- Constants [0] {
}
- Static properties [0] {
}
- Static methods [0] {
}
- Properties [0] {
}
- Methods [3] {
Method [ <internal> public method close ] {
}
Method [ <internal> public method rewind ] {
}
Method [ <internal> public method read ] {
}
}
}
|
| --re | --rextension |
Muestra información de la extensión dada (lista de opciones en php.ini, funciones definidas, constantes y clases). Disponible desde PHP 5.1.2. Esta opción sólo está disponible si se compiló PHP con soporte para Reflection .
Ejemplo #9 Ejemplo de --re $ php --re json
Extension [ <persistent> extension #19 json version 1.2.1 ] {
- Functions {
Function [ <internal> function json_encode ] {
}
Function [ <internal> function json_decode ] {
}
}
}
|
| --rz | --rzendextension |
Mostrar la información de configuración para la extensión Zend proporcionada (la misma información que es devuelta por la función phpinfo()). Disponible como parte de PHP 5.4.0. |
| --ri | --rextinfo |
Mostrar información de configuración de la extensión dada (la misma información que muestra phpinfo()). Disponible desde PHP 5.2.2. La información relevante está disponible usando "main" como nombre de extensión.
Ejemplo #10 Ejemplo de --ri $ php --ri date date date/time support => enabled "Olson" Timezone Database Version => 2009.20 Timezone Database => internal Default timezone => Europe/Oslo Directive => Local Value => Master Value date.timezone => Europe/Oslo => Europe/Oslo date.default_latitude => 59.930972 => 59.930972 date.default_longitude => 10.776699 => 10.776699 date.sunset_zenith => 90.583333 => 90.583333 date.sunrise_zenith => 90.583333 => 90.583333 |
Nota:
Las opciones -rBRFEH, --ini y --r[fcezi] sólo están disponibles en CLI.
Hay tres formas distintas de proveer a la CLI SAPI con código PHP para que sea ejecutado:
Decirle a PHP que ejecute un determinado fichero.
$ php mi_script.php $ php -f mi_script.php
Ambas formas (usando o no el modificador -f ) ejecutan el fichero mi_script.php. Nótese que no hay restricción sobre cuales ficheros puede ser ejecutado; en particular, el nombre del fichero no es necesario que tenga una extensión .php.
Nota:
Si se necesita proporcionar argumentos al script, utilizando el modificador -f , el primer argumento debe ser --.
Pasar el código PHP para ejecutarlo directamente en la línea de comandos.
$ php -r 'print_r(get_defined_constants());'
Debe tomarse especial cuidado con respecto al uso de comillas y la sustitución de variables de la consola.
Nota:
Lea cuidadosamente el ejemplo: No hay etiquetas de inicio y fin. El modificador -r simplemente no lo necesita. Si se usare, provocaría un error sintáctico.
Proporcionar el código PHP a ejecutar a través de la entrada estándar (stdin).
Esto ofrece la posibilidad de crear código PHP dinámicamente para pasárselo al binario, tal y como se ve en este ejemplo (ficticio):
$ alguna_aplicacion | algun_filtro | php | sort -u > salida_final.txt
Como todas las aplicaciones de consola, el binario de PHP acepta un determinado número de argumentos, sin embargo un script PHP también puede recibirlos. El número de argumentos que pueden ser pasados a su script no está limitado por PHP (aunque la consola tiene un determinado número de caracteres límite; usualmente usted no alcanzará este límite). Los argumentos pasados al script están disponibles en el array global $argv. El primer índice (cero) siempre contiene el nombre del script como se llamó desde la línea de comandos. Nótese que, si el código es ejecutado en la línea utilizando el modificador de consola -r , el valor de $argv[0] será simplemente un guión medio -). Lo mismo aplica si el código es ejecutado por medio de una tubería desde la entrada estándar STDIN.
Una segunda variable global, $argc, contiene el número de elementos en el arreglo $argv (pero no el número de argumentos pasados al script).
Dado que los argumentos que se pasan a un script no comienzan con el caracter -, no hay nada especial a tener en cuenta. Si se pasa a un script un argumento que comience por - provocará errores porque el intérprete de PHP pensará que debe manejarlo él, aún antes de ejecutar el script. Para prevenir esto, utilice el separador de lista de argumentos --. Una vez que PHP lea este separador, todos los argumentos que lo sigan se pasarán intactos al script.
# Esto no ejecutará el código dado, sino que mostrará el uso de PHP
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]
# Esto pasrá el argumento '-h' al script, impidiendo que PHP muestre su uso
$ php -r 'var_dump($argv);' -- -h
array(2) {
[0]=>
string(1) "-"
[1]=>
string(2) "-h"
}
Sin embargo, en sistemas Unix, hay otra forma de usar PHP para scripts de consola. Se puede escribir un script en el que la primera línea comience con #!/usr/bin/php (sustitúyalo por la ruta a su CLI binario de PHP si es diferente). El resto del fichero debería contener código PHP normal con las etiquetas usuales de inicio y fin de PHP. Una vez que se otorguen permisos de ejecución al fichero apropiadamente (p.ej. chmod +x test) el script podrá ejecutarse como cualquier otro script de consola o perl:
Ejemplo #1 Ejecutando un script PHP como un script de consola
#!/usr/bin/php
<?php
var_dump($argv);
?>
Asumiendo que este fichero se llama test y que está en el directorio actual, es posible hacer lo siguiente:
$ chmod +x test
$ ./test -h -- foo
array(4) {
[0]=>
string(6) "./test"
[1]=>
string(2) "-h"
[2]=>
string(2) "--"
[3]=>
string(3) "foo"
}
Tal y como puede verse, en este caso no hace falta tener cuidado al pasar al script parámetros que comienzan con -.
El ejecutable de PHP puede ser utilizado para ejecutar scripts de PHP que sean absolutamente independientes del servidor web. En sistemas Unix, los caracteres especiales #! (o conocido como "shebang") deben añadirse en la primera línea del script seguido de la ruta hacia el binario de PHP para que le indique autom[aticamente al sistema cual es el programa que debería ejecutar al script. En plataformas Windows puede asociar php.exe para que funcione al hacer doble clic en ficheros con extensión .php, o se puede hacer un fichero por lotes para ejecutar el script mediante PHP. La primera línea especial "shebang" que se añade a un script para que funcione en Unix no interferirá en Windows (ya que está formateado como un comentario de PHP), así que pueden escribirse programas para plataformas independientes incluyéndose sin ningún problema. Más abajo puede encontrarse un ejemplo sencillo de cómo escribir un programa de línea de comandos en PHP.
Ejemplo #2 Script destinado a ejecutarse desde la línea de comandos (script.php)
#!/usr/bin/php
<?php
if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>
Éste es un script PHP de línea de comandos con un parámetro.
Uso:
<?php echo $argv[0]; ?> <parámetro>
<parámetro> puede ser alguna palabra que desee
mostrar en pantalla. Con las opciones --help, -help, -h,
o -?, puede mostrarse esta ayuda.
<?php
} else {
echo $argv[1];
}
?>
El script de arriba, incluye la primera línea especial "shebang" de Unix para indicar que este fichero debería ejecutarse por PHP. Puesto que aquí estamos trabajando con una versión CLI, no se mostrarán cabeceras HTTP.
El programa comprueba primero que hay más de un parámetro (adicionalmente al nombre del script, el cual también es contado). Si no lo hay, o si el parámetro fuese --help , -help , -h o -? , se imprime el mensaje de ayuda, utilizando $argv[0] para escribir el nombre del script dinámicamente tal como se escribió en la línea de comandos. De otra manera, el parámetro es mostrado exactamente como se recibió.
Para ejecutar el script superior en Unix, debe otorgarle permisos de ejecución al fichero para hacerlo ejecutable, y llamarlo simplemente como script.php mostrar_esto o script.php -h. En Windows, se puede crear un fichero por lotes para lograr esta tarea:
Ejemplo #3 Fichero por lotes para ejecutar un script PHP en línea de comandos (script.bat)
@echo OFF "C:\php\php.exe" script.php %*
Asumiendo que el programa superior se llamara script.php, y CLI php.exe estuviera en C:\php\php.exe , este fichero por lotes lo ejecutaría automáticamente con los parámetros que se le hayan pasado: script.bat mostrar_esto o script.bat -h.
Vea también la documentación de extensión Readline para conocer más funciones que pueden ser utilizadas para mejorar las aplicaciones de línea de comandos en PHP.
Si está en Windows, puede configurar PHP para que no sea necesario añadir ni C:\php\php.exe ni la extensión .php, tal como se describe en PHP en Línea de Comandos en Microsoft Windows.
CLI SAPI define algunas constantes para flujos de E/S que simplifican la programación en línea de comandos.
| Constante | Descripción |
|---|---|
STDIN |
Flujo abierto a stdin. Ahorra tener que abrirlo con
<?php
<?php |
STDOUT |
Flujo abierto a stdout. Ahorra tener que abrirlo con
<?php |
STDERR |
Flujo abierto a stderr. Ahora tener que abrirlo con
<?php |
Teniendo esto en cuenta, no es necesario abrir por ejemplo un flujo a stderr, sino que puede usarse la constante en lugar del recurso de tipo flujo:
php -r 'fwrite(STDERR, "stderr\n");'
Nota:
Estas constantes no están disponibles si se leyera el script PHP a partir de stdin.
Desde PHP 5.1.0, CLI SAPI ofrece una consola interactiva si se usa con el modificador -a y PHP está compilado con la opción --with-readline .
Al usar la consola interactiva, se puede escribir directamente código PHP que se ejecuta al momento.
Ejemplo #1 Ejecutando código desde la consola interactiva
$ php -a
Interactive shell
php > echo 5+8;
13
php > function addTwo($n)
php > {
php { return $n + 2;
php { }
php > var_dump(addtwo(2));
int(4)
php >
La consola interactiva, además, proporciona autocompletado mediante el tabulador de funciones, constantes, nombres de clases, variables, llamadas a métodos estáticos y constantes de clases.
Ejemplo #2 Autocompletado con el tabulador
Al pulsar dos veces la tecla tabulador habiendo múltiples opciones de completados, se mostrará una lista con éstas:
php > strp[TAB][TAB] strpbrk strpos strptime php > strp
Cuando sólo hay una posible opción, sólo con pulsar una vez el tabulador se completará el resto de la línea:
php > strpt[TAB]ime(
También funciona el autocompletado para nombres que se han definido durante la sesión de consola interactiva:
php > $fooEsteEsUnNombreDeVariableMuyLargo = 42; php > $foo[TAB]EsteEsUnNombreDeVariableMuyLargo
La consola interactiva almacena tu historial, al que se puede acceder usando las teclas arriba y abajo. El historial se almacena en el fichero ~/.php_history.
Ya en PHP 5.4.0, la CLI SAPI provee las configuraciones de
php.ini, cli.pager y
cli.prompt. La configuración de cli.pager
permite a un programa externo (tal como less) para que funcione
como un paginador para la salida en lugar de se desplegado directamente en la
pantalla. Las configuraciones de cli.prompt permite
cambiar el indicador de ingreso de órdenes php >.
In PHP 5.4.0 también fue posible establecer las configuraciones de php.ini en la shell interactiva utilizando una notación abreviada.
Ejemplo #3 Estableciendo configuraciones de php.ini en la shell interactiva
La configuración de cli.prompt:
php > #cli.prompt=hola mundo :> hola mundo :>
Usando comillas simples inclinadas es posible ejecutar código PHP en el indicador de órdenes:
php > #cli.prompt=`echo date('H:i:s');` php >
15:49:35 php > echo 'hola';
hola
15:49:43 php > sleep(2);
15:49:45 php >
Establecer el paginador a less:
php > #cli.pager=less php > phpinfo(); (salida desplegada en less) php >
La configuración de cli.prompt soporta unas cuantas secuencias
de escape:
| Sequence: | Description: |
|---|---|
| \e | Utilizado para agregar colores al ingreso de órdenes. Un ejemplo podría ser \e[032m\v \e[031m\b \e[34m\> \e[0m |
| \v | La versión de PHP. |
| \b | Indica cual bloque de PHP está dentro. Por ejemplo /* se usa para indicar que está dentro de un comentario multilineal. El alcance externo es denotado por php. |
| \> | Indica el caracter de ingreso de órdenes. El caracter predeterminado es >, pero cambia cuando la shell está dentro de un bloque indeterminado o una cadena. Los caracteres posibles son: ' " { ( > |
Nota:
Los ficheros que se han incluido en este modo mediante auto_prepend_file y auto_append_file se analizan con algunas restricciones - p.ej. las funciones deben estar definidas antes de que se carguen.
Nota:
La auto-carga no está disponible al usar PHP en modo interactivo en CLI.
Desde PHP 5.4.0, la CLI SAPI provee un servidor web embebido.
Este servidor web está diseñado solamente para propósitos de desarrollo, y no debería ser utilizado en ambientes en producción.
Las peticiones de URI se sirven desde el actual directorio de trabajo donde PHP se inició, a menos que la opción -t sea utilizada para especificar una raíz de documentos explícita.
Si una petición de URI no especifica un fichero, entonces index.php o index.html se devuelven en el directorio proporcionado. Si ninguno de los ficheros existen, entonces se devuelve una respuesta con código 404.
Si un fichero PHP proporcionado en la línea de comandos cuando el servidor web es
iniciado este es tratado como un script "enrutador" por el servidor web.
El script es ejecutado al inicio de cada petición HTTP. Si este
script devuelve FALSE, entonces el recurso requerido es devuelto
tal cual está. De otra manera la salida del script es devuelta al navegador.
Ejemplo #1 Iniciando el servidor web
$ cd ~/public_html $ php -S localhost:8000
La terminal mostrará:
PHP 5.4.0 Servidor de desarrollo iniciado en Jueves Julio 21 10:43:28 2011 Escuchando en localhost:8000 La raíz de documentos es /home/usuario/html_público Presione Ctrl-C para salir
Después de una petición de una URI para http://localhost:8000/ y http://localhost:8000/mi_script.html la terminal mostrará algo similar a:
PHP 5.4.0 Servidor de desarrollo iniciado en Jueves Julio 21 10:43:28 2011 Escuchando en localhost:8000 La raíz de documentos es /home/usuario/html_público Presione Ctrl-C para salir. [Thu Jul 21 10:48:48 2011] ::1:39144 GET /favicon.ico - Petición leída [Thu Jul 21 10:48:50 2011] ::1:39146 GET / - Petición leída [Thu Jul 21 10:48:50 2011] ::1:39147 GET /favicon.ico - Petición leída [Thu Jul 21 10:48:52 2011] ::1:39148 GET /mi_script.html - Petición leída [Thu Jul 21 10:48:52 2011] ::1:39149 GET /favicon.ico - Petición leída
Ejemplo #2 Iniciando con una raíz de documentos específica
$ cd ~/html_público $ php -S localhost:8000 -t foo/
La terminal mostrará:
PHP 5.4.0 Servidor de desarrollo iniciado en Jueves Julio 21 10:50:26 2011 Escuchando en localhost:8000 La raíz de documentos es /home/usuario/html_público/foo Presione Ctrl-C para salir
Ejemplo #3 Utilizando un Script enrutador
Las peticiones a las imágenes se mostrarán, pero las peticiones a ficheros HTML mostrarán "Bienvenido a PHP"
<?php
// router.php
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"]))
return false; // servir la petición tal cual es.
else {
echo "<p>Bienvenido a PHP</p>";
}
?>
$ php -S localhost:8000 router.php
Después de varias peticiones de URI la terminal mostrará algo similar a:
PHP 5.4.0 Servidor de desarrollo iniciado en Jueves Julio 21 10:53:19 2011 Escuchando en localhost:8000 La raíz de documentos es /home/usuario/html_público Presione Ctrl-C para salir. [Thu Jul 21 10:53:45 2011] ::1:55801 GET /mi_logo.jpg - Petición leída [Thu Jul 21 10:53:52 2011] ::1:55803 GET /abc.html - Petición leída [Thu Jul 21 10:53:52 2011] ::1:55804 GET /favicon.ico - Petición leída
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| cli_server.color | "0" | PHP_INI_ALL | Disponible desde PHP 5.4.0. |
He aquí una breve explicación de las directivas de configuración.
cli_server.color
boolean
Habilita el servidor web de desarrollo interno para usa la codificación de color ANSI en la salida del terminal.
Esta sección explica los méritos del nuevo mecanismo del Recolector de Basuras (o también conocido como GC) de la versión 5.3 de PHP.
Una variable en PHP se almacena en un contender llamado "zval". Un contenedor zval contiene, además del tipo de la variable y su valor, dos bits de información adicional. Al primero se le llama "is_ref" y contiene un boolean que indica si la variable es parte o no de con "conjunto de referencias". Con este bit, el motor de PHP sabe diferenciar entre variables normales y referencias. Puesto que PHP permite las referencias definidas por el usuario, tal y como se crean con el operador &, un contenedor zval tiene también un mecanismo contador de referencias para optimizar el uso de memoria. Esta segunda pieza adicional de información, llamada "refcount", contiene el número de variables (también llamadas símbolos) que apuntan a este contenedor zval. Todos los símbolos se almacenan en una tabla de símbolos, de las cuales hay una por cada ámbito. Hay un ámbito para el script principal (es decir, al que el navegador realizó la petición), además de uno por cada función o método.
Se crea un contenedor zval cuando se crea una variable con un valor constante, como por ejemplo:
Ejemplo #1 Creación de un nuevo contenedor zval
<?php
$a = "nuevo string";
?>
En este caso, el nuevo nombre de símbolo, a, se crea en el ámbito actual,
y se crea un nuevo contenedor de variable con el tipo string y el valor
nuevo string. El bit "is_ref" por omisión contiene FALSE dado que no se
ha creado ninguna referencia. "refcount" contiene 1 pues
sólo hay un símbolo que haga uso de este contenedor de variables. Tenga en cuenta
que si "refcount" es 1, "is_ref" siempre valdrá FALSE. Si tiene » Xdebug instalado, puede mostrar esta
información llamando a xdebug_debug_zval().
Ejemplo #2 Mostrar información zval
<?php
xdebug_debug_zval('a');
?>
El resultado del ejemplo sería:
a: (refcount=1, is_ref=0)='nuevo string'
Al asignar esta variable a otra, se incrementará refcount.
Ejemplo #3 Incremento del refcount de zval
<?php
$a = "nuevo string";
$b = $a;
xdebug_debug_zval( 'a' );
?>
El resultado del ejemplo sería:
a: (refcount=2, is_ref=0)='nuevo string'
Aquí refcount vale 2, pues el mismo contenedor de variables está vinculado tanto por a como por b. PHP es lo suficiente inteligente para no copiar el contenedor de la variable cuando no es necesario. Los contenedores de variables se destruyen cuando el "refcount" se queda a cero. "refcount" se decrementa en uno cuando alguno de los símbolos que lo vinculan, abandona su ámbito (p.ej. cuando finaliza una función) o cuando se llama a unset(). El siguiente ejemplo muestra esto:
Ejemplo #4 Decremento del refcount de zval
<?php
$a = "nuevo string";
$c = $b = $a;
xdebug_debug_zval( 'a' );
unset( $b, $c );
xdebug_debug_zval( 'a' );
?>
El resultado del ejemplo sería:
a: (refcount=3, is_ref=0)='nuevo string' a: (refcount=1, is_ref=0)='nuevo string'
Si ahora llamáramos a unset($a);, el contenedor de variable, incluyendo tanto el tipo como el valor, se eliminarían de la memoría.
Las cosas se complican con tipos compuestos tales como arrays o objects. En lugar de un valor de tipo scalar, los arrays y objects almacenan sus propiedades en su propia tabla de símbolos. Esto significa que el siguiente ejemplo crea tres contenedores zval:
Ejemplo #5 Creando un zval de tipo array
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
xdebug_debug_zval( 'a' );
?>
El resultado del ejemplo sería algo similar a:
a: (refcount=1, is_ref=0)=array ( 'meaning' => (refcount=1, is_ref=0)='life', 'number' => (refcount=1, is_ref=0)=42 )
O gráficamente
Los tres contenedores zval son: a, meaning, y number. Se aplican reglas similares a la hora de incrementar y decrementar "refcounts". Abajo, añadimos otro elemento al array, y fijamos su valor al contenido de un elemento ya existente:
Ejemplo #6 Añadiendo un elemento existente a un array
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
xdebug_debug_zval( 'a' );
?>
El resultado del ejemplo sería algo similar a:
a: (refcount=1, is_ref=0)=array ( 'meaning' => (refcount=2, is_ref=0)='life', 'number' => (refcount=1, is_ref=0)=42, 'life' => (refcount=2, is_ref=0)='life' )
O gráficamente
A partir de la salida de Xdebug, vemos que tanto el antiguo como el nuevo elemento del array apuntan a un contenedor cuyo "refcount" vale 2. Pese a que Xdebug muestra dos contenedores zval con valor 'life', son el mismo. La función xdebug_debug_zval() no muestra esto, pero puede comprobarse mostrando el puntero de memoria.
Eliminar un elemento del array es como eliminar un símbolo de un determinado ámbito. Al hacerlo, el "refcount" del contenedor al que apunta el elemento del array se decrementa. De nuevo, cuando "refcount" alcanza cero, el contenedor de la variable se elimina de memoria. Un ejemplo que muestra esto:
Ejemplo #7 Eliminar un elemento de un array
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
unset( $a['meaning'], $a['number'] );
xdebug_debug_zval( 'a' );
?>
El resultado del ejemplo sería algo similar a:
a: (refcount=1, is_ref=0)=array ( 'life' => (refcount=1, is_ref=0)='life' )
Ahora, las cosas se vuelven interesantes si añadimos al propio array como elemento del array, como veremos en el siguiente ejemplo, en el que usaremos el operador de referencia, ya que sino PHP crearía una copia:
Ejemplo #8 Añadiendo al propio array como elemento de sí mismo
<?php
$a = array( 'one' );
$a[] =& $a;
xdebug_debug_zval( 'a' );
?>
El resultado del ejemplo sería algo similar a:
a: (refcount=2, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=2, is_ref=1)=... )
O gráficamente
Puede verse que tanto la variable de tipo array (a) como el segundo elemento (1) apuntan ahora a un contenedor de variables que tiene un "refcount" de 2. Los "..." mostrados arriba, indican que hay una referencia cíclica, lo cual, por supuesto, significa que en este caso los "..." apuntan al original. array.
Al igual que antes, al eliminar una variable se elimina el símbolo, y el contador de referencias del contenedor de variables al que apunte se decrementa en uno. De modo que, si eliminamos la variable $a después de ejecutar el código anterior, el contador de referencias del contenedor de variables al que apuntan tanto $a como el elemento "1" se decrementa en uno, de "2" a "1". Se puede representar así:
Ejemplo #9 Eliminando $a
(refcount=1, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=1, is_ref=1)=... )
O gráficamente
Pese a que ya no hay ningún símbolo en ningún ámbito que apunte a esta estructura, no se puede limpiar ya que el elemento "1" del array todavía apunta al mismo array. Al no haber ningún símbolo externo que apunte a e´l, no hay ninguna forma por la que el usuario pueda eliminar esta estructura; por tanto tenemos una fuga de memoria. Afortunadamente, PHP limpiará esta estructura de datos al finalizar la petición, pero antes de entonces, ocupará un valioso espacio en memoria. Esta situación ocurre a menudo si se está implementando un algoritmo de análisis o en otras situaciones en las que un nodo hijo apunte de nuevo al elemento "padre". Por supuesto, esta situación también puede suceder con objetos, donde es más frecuente que ocurra, ya que los objetos siempre se usan implícitamente por referencia.
Esto no debería ser un problema si sólo ocurre una o dos veces, pero si sucede miles, o incluso millones, de estas fugas de memoria, lógicamente esto comenzaría a ser un problema. Es especialmente problemático en scripts de larga duración, tales como demonios donde en resumen nunca terminan las peticiones, o en un largo conjunto de pruebas unitarias. Esto último causó problemas al ejecutar las pruebas unitarias de la biblioteca de Componentes eZ. En algunos casos, pueden ser necesarios 2 GB de memoria, que quizás no los tenga el servidor de pruebas.
Tradicionalmente, los mecanismos que contabilizan las referencias en memoria, tal como el que usaba PHP anteriormente, fallaban al manejar las fugas de memoria en referencias cíclicas. Sin embargo, desde PHP 5.3.0 implementa el algoritmo síncrono del artículo » Recolección de Ciclos Concurrentes en Sistemas de Contabilidad de Referencias que resuelve este asunto.
Una explicación detallada del funcionamiento del algoritmo queda más allá del objetivo de esta sección, pero aquí explicaremos el mecanismo básico. Antes de nada, debemos establecer unas reglas del juego. Si se incrementa un refcount, entonces sigue en uso, no es basura. Si se decrementa el refcount, y alcanza a cero, el zval puede eliminarse. Esto significa que la recolección de ciclos sólo puede llevarse a cabo cuando un parámetro refcount se decrementa a un valor que no sea cero. En segundo lugar, en la recolección de ciclos de basura, es posible averiguar qué partes son basura comprobando si se puede decrementar en uno sus refcount, para después comprobar cuáles han alcanzado a cero.
Para evitar llamar al comprobador de ciclos de basura en cada decremento de un refcount, el algoritmo lo que hace es pasar todas las posibles raíces (zvals) al "buffer raíz" (marcándolos en "púrpura"). También se asegura de que cada raíz de basura sólo finaliza una vez en el buffer. Únicamente cuando el buffer raíz está completo, comienza el mecanismo de recolección en los zval que haya en su interior. Ver paso A en la figura anterior.
En el paso B, el algoritmo inicia una primera búsqueda en profundidad de todas las posibles raíces en las que decrementa por uno los refcount de los zval que encuentra, asegurándose de que no decrementa dos veces el mismo zval (marcándolo en "gris"). En el paso C, el algoritmo vuelve a llevar a cabo una búsqueda en profundidad dentro de cada nodo raíz, para volver a comprobar el refcount de cada zval. Si ve que el refcount es cero, se marca al zval en "blanco" (azul en la figura). Si es mayor que cero, deshace el decremento con una búsqueda en profundidad partiendo de ese punto, y se le vuelve a marcar en "negro". En el último paso (D), el algoritmo recorre el buffer raíz eliminando las raíces zval que haya, y a la vez, comprueba qué zvals se han marcado en "blanco" en el paso anterior. Todos los zval marcados en "blanco" se eliminarán.
Ahora que ya tiene un conocimiento básico de cómo funciona el algoritmo, volveremos atrás para ver cómo se integra esto en PHP. Por omisión, el recolector de basuras de PHP está habilitado. Hay, sin embargo, una directiva en php.ini que permite cambiar est: zend.enable_gc .
Cuando el recolector de basura está habilitado, el algoritmo que busca ciclos, tal y como se ha descrito arriba, se ejecuta cada vez que se llena el buffer raíz. Éste tiene un tamaño fijo de 10.000 raíces posibles (se puede modificar esto cambiando la contante GC_ROOT_BUFFER_MAX_ENTRIES en Zend/zend_gc.c del código fuente de PHP, y recompilando PHP). Cuando el recolector de basuras se deshabilita, no se ejecutará el algoritmo que busca ciclos. Sea como fuere, las posibles raíces seguirían registrándose en el buffer raíz, sin importar si el mecanismo recolector de basuras está habilitado en la configuración o no.
Si estando deshabilitado el mecanismo recolector de basuras se llenara el buffer raíz de posibles raíces, no se registraría al resto de raíces posibles, por lo que no llegarían a ser analizadas por el algoritmo. Si fueran parte de un ciclo de referencia circular, nunca se liberarían y podrían provocar una fuga de memoria.
La razón por la que se registran las posibles raíces estando deshabilitado el mecanismo es porque es más rápido registrarlas que comprobar en cada una de ellas si el mecanismo está habilitado. Sin embargo, el recolector de basuras y el propio mecanismo de análisis, sí puede conllevar una cantidad de tiempo considerable.
Ademas de poder cambiar la configuración de zend.enable_gc , también es posible habilitar o deshabilitar el mecanismo recolector de basura llamando a gc_enable() o gc_disable() respectivamente. La llamada a estas funciones tiene el mismo efecto que habilitar o deshabilitar el mecanismo en la propia configuración. También es posible forzar la recolección de ciclos incluso sin que esté lleno el buffer raíz. Para hacer esto, se puede usar la función gc_collect_cycles(). Esta función devuelve el número de ciclos que fueron recolectados por el algoritmo.
El motivo por el que es posible habilitar o deshabilitar el mecanismo, o iniciar los ciclos de recolección a mano, es porque podría haber determinadas partes de una aplicación que necesiten mucha precisión de tiempo. En estos casos, quizás no se desee que funcione el mecanismo recolector de basuras. Por supuesto, al deshabilitar el recolector de basuras en algunas partes del código, se corre el riesgo de provocar fugas de memoria, ya que algunas raíces podrían no caber en el buffer raíz. Por tanto, lo mas prudente sería llamar a gc_collect_cycles() justo después de llamar a gc_disable() para que libere la memoria ocupada por posibles raíces ya registradas en el buffer raíz. Esto deja por tanto un buffer vacío, de modo que queda más espacio para almacenar posibles raíces en el tiempo en que el mecanismo recolector de ciclos está deshabilitado.
Como mencionamos en la sección anterior, la recolección de raíces tiene muy bajo impacto en el rendimiento, pero aquí es cuando comparamos PHP 5.2 contra PHP 5.3. Si bien la recolección de posibles raíces comparado con la no recolección, como en PHP 5.2, es más lenta, hay otras modificaciones en tiempo de ejecución en PHP 5.3 que impiden que esta pérdida de rendimiento en particular pueda siquiera apreciarse.
Hay dos principales sectores en los que el rendimiento se ve afectado. El primero es el uso reducido de memoria, y mientras que el segunda es la reducción en tiempo de ejecución cuando el mecanismo recolector de basura lleva a cabo la limpieza de memoria. Revisaremos estos dos asuntos.
Antes de nada, la razón por la que se implementa el mecanismo recolector de basuras es para reducir el uso de memoria limpiando, una vez que se cumplen las condiciones, las variables de referencias circulares. En la implementación de PHP, esto sucede cuando el buffer raíz está lleno, o cuando se invoca la función gc_collect_cycles(). En el gráfico mostrado abajo, se muestra el uso de memoria tanto en PHP 5.2 como en 5.3, excluyendo la memoria base que el propio PHP ocupa al arrancar.
Ejemplo #1 Ejemplo de uso de memoria
<?php
class Foo
{
public $var = '3.1415962654';
}
$baseMemory = memory_get_usage();
for ( $i = 0; $i <= 100000; $i++ )
{
$a = new Foo;
$a->self = $a;
if ( $i % 500 === 0 )
{
echo sprintf( '%8d: ', $i ), memory_get_usage() - $baseMemory, "\n";
}
}
?>
En este ejemplo didáctico, estamos creando un objeto en el que una propiedad enlaza de nuevo al propio objeto. Cuando la variable $a del script se reasigna en la siguiente iteración del bucle, típicamente ocurriría una fuga de memoria. En este caso, se fugan dos contenedores zval (el zval del objeto, y el zval de la propiead), pero sólo se encuentra una posible raíz: la variable que se desasignó. Tras 10.000 iteraciones, el buffer se llena (con un total de 10.000 posibles raíces), y se lanza el mecanismo recolector de basura y libera la memoria asociada con esas posibles raíces. Puede apreciarse claramente en el uso de memoria "dentado" de la gráfica para PHP 5.3. Tras las 10.000 iteraciones, el mecanismo libera la memoria asociada a las variables con referencias cíclicas. En este ejemplo, el propio mecanismo no debe hacer un gran trabajo, puesto que la estructura que produce la fuga es extremadamente sencilla. A partir del diagrama, se puede comprobar que el uso máximo de memoria en PHP 5.3 es en torno a 9 Mb, mientras que en PHP 5.2 el uso de memoria no para de aumentar.
El segundo sector en el que el mecanismo recolector de basura influye en el rendimiento es en el tiempo que lleva a éste liberar la memoria "fugada". Para comprobar de cuánto estamos hablando, modificaremos ligeramente el script anterior para permitir un mayor número de iteraciones, y eliminaremos las figuras de uso de memoria intermedio. Este es el segundo script:
Ejemplo #2 Influencia en rendimiento de Recolector de Basuras
<?php
class Foo
{
public $var = '3.1415962654';
}
for ( $i = 0; $i <= 1000000; $i++ )
{
$a = new Foo;
$a->self = $a;
}
echo memory_get_peak_usage(), "\n";
?>
Ejecutaremos dos veces este script, una con el ajuste zend.enable_gc habilitado, y en la otra deshabilitado:
Ejemplo #3 Ejecutando el script anterior
time php -dzend.enable_gc=0 -dmemory_limit=-1 -n example2.php # and time php -dzend.enable_gc=1 -dmemory_limit=-1 -n example2.php
En la máquina de ejemplo, el primer comando parece llevar en torno a 10,7 segundos, mientras que al segundo comando le lleva 11,4. Esto es un incremento de en torno al 7%. Sin embargo, el uso máximo de memoria del script se ha reducido en un 98%, pasando de 931Mb a 10Mb. Esta prueba no es muy científica, ni siquiera representativa de aplicaciones reales, pero demuestra que el uso de memoria se beneficia del mecanismo recolector de basuras. Lo interesante es que para este script en particular el incremento es siempre del 7%, mientras que el ahorro de memoria aumenta a medida que se encuentran más referencias cíclicas en la ejecución del script.
Todavía es posible dar más información sobre cómo funciona el mecanismo recolector de basuras dentro de PHP. Pero para hacerlo, será necesario recompilar PHP para habilitar el código de análises y de recopilación de datos. Se tendrá que asignar a la variable de entorno CFLAGS el valor -DGC_BENCH=1 antes de ejecutar ./configure con las opciones deseadas. La siguiente secuencia muestra cómo hacerlo:
Ejemplo #4 Recompilando PHP para habilitar el análisis del Recolector de Basuras
export CFLAGS=-DGC_BENCH=1 ./config.nice make clean make
Al ejecutar el ejemplo que vimos arriba con el nuevo binario de PHP que hemos creado, veremos que se muestra el siguiente resultado tras la ejecución de PHP:
Ejemplo #5 Estadísticas de Recolección de Basuras
GC Statistics
-------------
Runs: 110
Collected: 2072204
Root buffer length: 0
Root buffer peak: 10000
Possible Remove from Marked
Root Buffered buffer grey
-------- -------- ----------- ------
ZVAL 7175487 1491291 1241690 3611871
ZOBJ 28506264 1527980 677581 1025731
Las estadísticas más informativas son las que se muestran en el primer bloque. Puede comprobarse que el mecanismo recolector de basuras se ejecutó 110 veces, y en total, se liberaron más de 2 millones de ubicaciones en memoria durante esas 110 ejecuciones. Puesto que el mecanismo recolector de ciclos se ha ejecutado al menos una vez, el "pico del buffer raíz" es siempre 10.000.
En general el recolector de basuras de PHP sólo provocará un retraso cuando el algoritmo recolector de ciclos funcione, mientras que en scripts normales (más pequeños) no habrá un impacto real en el rendimiento.
Sin embargo, en el caso en el que el mecanismo recolector de ciclos se ejecute para scripts normales, la reducción de memoria permitirá que puedan funcionar más scripts concurrentemente en el servidor, ya que en total no utilizarán mucha memoria.
Los beneficios son más evidentss en scripts de larga duración, tales como grandes suits de pruebas o scripts demonios. También en las aplicaciones » PHP-GTK, que generalmente suelen ejecutarse durante más tiempo que scripts para la Web; el nuevo mecanismo marcará la diferencia en cuanto a las fugas de memoria progresivas en el tiempo.
Ver también Categorización de Extensiones.
El APC, o caché alternativo de PHP (por sus siglas en inglés de Alternative PHP Cache), es un código de operación de caché libre y abierto para PHP. Su objetivo es el de proporcionar un marco robusto, libre y abierto para optimizar código de PHP intermedio mediante el almacenamiento en caché.
No se requiere de ninguna biblioteca externa para compilar esta extensión.
Esta extensión » PECL no se distribuye con PHP.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/apc.
No hay una DLL disponible para esta extensión PECL actualmente. Vea también la sección Compilando en Windows .
Nota: En Windows, APC necesita una ruta temporal para existir, y ser modificable por el servidor web. Comprueba las variables de entorno TMP, TEMP y USERPROFILE, en ese orden, y finalmente intenta el directorio WINDOWS si ninguna de ésas está establecida.
Nota: Para detalles de implementación más exhaustivos, altamente técnicos, véase el » archivo TECHNOTES para desarrolladores .
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
Aunque la configuración predeterminada de APC está bien para la mayoría de las instalaciones, los usuarios dedicados deberían considerar ajustar los siguientes parámetros.
Hay dos decisiones principales a tomar para configurar APC. Primero, cuánta memoria va a ser asignada a APC; y segundo, si APC debe comprobar si un archivo ha sido modificado en cada petición. Las dos directivas ini que controlan estos ajustes son apc.shm_size y apc.stat, respectivamente. Lea detenidamente las secciones sobre estas dos directivas más abajo.
Una vez que el servidor está ejecutándose, el script apc.php que está incluido con la extensión debería ser copiado a algún lugar dentro del directorio raíz de documentos y visualizarlo con un navegador, ya que porporciona un análisis detallado del funcionamiento interno de APC. Si GD está habilitado en PHP, también mostrará algunos gráficos interesantes. Lo primero que se debe asegurar es, por supuesto, que se están manejando realmente archivos en caché. Si APC está funcionando, el número dado por Cache full count (a la izquierda) mostrará el número de veces que la caché ha alcanzado su máxima capacidad y ha tenido que limpiar forzosamente cualquier entrada a la que no se haya accedido en los últimos apc.ttl segundos. Este número está minimizado en una caché bien configurada. Si la caché está siendo llenada constantemente, y de este modo liberada forzosamente, el revoltijo resultante tendrá efectos negativos en el rendimiento del script. La forma más sencilla de minimizar este número es asignar más memoria a APC. A menos que se haga esto, debería usarse apc.filters para almacenar en caché menos scripts.
Cuando APC es compilado con soporte para mmap (Memory Mapping - Mapeo de Memoria), sólo usará u segmento de memoria, a diferencia de cuandom APC es construido con soporte para SHM (SysV Shared Memory - Memoria Compartida de SysV), que usa múltiples segmentos de memeria. MMAP no tiene un límite máximo como lo tiene SHM en /proc/sys/kernel/shmmax. En general, se recomienda el soporte para MMAP ya que reclamará la memoria más rápido cuando el servidor web sea reiniciado y a fin de cuentas reduce el impacto de asignacion de memoria al inicio.
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| apc.enabled | "1" | PHP_INI_SYSTEM | PHP_INI_SYSTEM en APC 2. PHP_INI_ALL en APC <= 3.0.12. |
| apc.shm_segments | "1" | PHP_INI_SYSTEM | |
| apc.shm_size | "32M" | PHP_INI_SYSTEM | |
| apc.optimization | "0" | PHP_INI_ALL | PHP_INI_SYSTEM en APC 2. Eliminada en APC 3.0.13. |
| apc.num_files_hint | "1000" | PHP_INI_SYSTEM | |
| apc.user_entries_hint | "4096" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.0. |
| apc.ttl | "0" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.0. |
| apc.user_ttl | "0" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.0. |
| apc.gc_ttl | "3600" | PHP_INI_SYSTEM | |
| apc.cache_by_default | "1" | PHP_INI_ALL | PHP_INI_SYSTEM en APC <= 3.0.12. Disponible a partir de APC 3.0.0. |
| apc.filters | NULL | PHP_INI_SYSTEM | |
| apc.mmap_file_mask | NULL | PHP_INI_SYSTEM | |
| apc.slam_defense | "1" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.0. Anterior a APC 3.1.4, el valor por defecto era "0" (deshabilitado). |
| apc.file_update_protection | "2" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.6. |
| apc.enable_cli | "0" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.7. |
| apc.max_file_size | "1M" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.7. |
| apc.use_request_time | "1" | PHP_INI_ALL | Disponible a partir de APC 3.1.3. |
| apc.stat | "1" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.10. |
| apc.write_lock | "1" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.11. |
| apc.report_autofilter | "0" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.11. |
| apc.include_once_override | "0" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.12. |
| apc.rfc1867 | "0" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.13. |
| apc.rfc1867_prefix | "upload_" | PHP_INI_SYSTEM | |
| apc.rfc1867_name | "APC_UPLOAD_PROGRESS" | PHP_INI_SYSTEM | |
| apc.rfc1867_freq | "0" | PHP_INI_SYSTEM | |
| apc.rfc1867_ttl | "3600" | PHP_INI_SYSTEM | Disponible a partir de APC 3.1.1. |
| apc.localcache | "0" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.14. |
| apc.localcache.size | "512" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.14. |
| apc.coredump_unmap | "0" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.16. |
| apc.stat_ctime | "0" | PHP_INI_SYSTEM | Disponible a partir de APC 3.0.13. |
| apc.preload_path | NULL | PHP_INI_SYSTEM | Disponible a partir de APC 3.1.1. |
| apc.file_md5 | "0" | PHP_INI_SYSTEM | Disponible a partir de APC 3.1.1. |
| apc.canonicalize | "1" | PHP_INI_SYSTEM | Disponible a partir de APC 3.1.1. |
| apc.lazy_functions | 0 | PHP_INI_SYSTEM | Disponible a partir de APC 3.1.3. |
| apc.lazy_classes | 0 | PHP_INI_SYSTEM | Disponible a partir de APC 3.1.3. |
He aquí una breve explicación de las directivas de configuración.
apc.enabled
boolean
apc.enabled se puede establecer a 0 para deshabilitar APC. Esto es útil principalmente cuando APC está compilado estáticamente en PHP, ya que no hay otra forma de deshabilitarlo (cuando se compila como un DSO, la línea extension en php.ini debe ser descomentada).
apc.shm_segments
integer
El número de segmentos de memoria compartida a asignar a la caché del compilador. Si APC está agotando la memoria compartida pero apc.shm_size está establecido tan alto como el sistema lo permita, aumentar este valor podría prevenir que APC agote su propia memoria.
apc.shm_size
integer
El tamaño de cada segmento de memoria compartida en MB. Por defecto, algunos sistemas (incluidos la mayoría de variantes de BSD) tienen límites muy bajos del tamaño de un segmento de memoria compartida.
apc.optimization
integer
El nivel de optimización. Cero deshabilita el optimizador, y valores mayores usan optimizaciones más agresivas. Se esperan mejoras de velocidad muy modestas. Esto es experimental.
apc.num_files_hint
integer
Un "consejo" sobre el número de distintos archivos fuente que serán incluidos o solicitados en su servidor web. Establézcalo a cero u omítalo si no está seguro; este ajuste es útil principalmente para sitios que tienen miles de archivos fuente.
apc.user_entries_hint
integer
Al igual que apc.num_files_hint, un "consejo" sobre el número de distintas variables de caché de usuario a almacenar. Estblézcalo a cero u omítalo si no está seguro.
apc.ttl
integer
El número de segundos que se le permite a una entrada de caché estar parada en una ranura en caso de que esta ranura de entrada de caché sea necesaria para otra entrada. Dejar esto a cero significa que la caché de APC podría llenarse potencialmente de entradas antiguas mientras que las nuevas entradas podrían no ser almacenadas en caché. En el caso de que una caché agote la memoria disponible, la caché será expurgada completamente si ttl es igual a 0. De otro modo, si ttl es mayor que 0, APC intentará eliminar las entradas caducadas.
apc.user_ttl
integer
El número de segundos que se le permite a una entrada de caché estar parada en una ranura en caso de que esta ranura de entrada de caché sea necesaria para otra entrada. Dejar esto a cero significa que la caché de APC podría llenarse potencialmente de entradas antiguas mientras que las nuevas entradas podrían no ser almacenadas en caché. En el caso de que una caché agote la memoria disponible, la caché será expurgada completamente si ttl es igual a 0. De otro modo, si ttl es mayor que 0, APC intentará eliminar las entradas caducadas.
apc.gc_ttl
integer
El número de segundos que una entrada de caché puede permanecer en la lista de recolección de basura. Este valor proporciona un seguro en el caso de que un proceso del servidor muera mientras se ejecuta un archivo fuente en caché; si este archivo fuente es modificado, la memoria asignada para la versión antigua no será reclamada hasta que se alcance este TTL. Estabézcalo a cero para deshabilitar esta característica.
apc.cache_by_default
boolean
Activado por defecto, pero se puede desactivar y usarlo junto con un filtro positivo en apc.filters para que sólo sean almacenados en caché los archivos que coincidan con un filtro positivo.
apc.filters
string
Una lista de expresiones regulares POSIX extendido separadas por comas. Si cualquier patrón coincide con el nombre de archivo fuente, el archivo no será almacenado en caché. Observe que el nombre de archivo usado para la comparación es pasado para incluirlo/requerirlo, no la ruta absoluta. Si el primer carácter de una expresión es +, la expresión será aditiva en el sentido de que cualquier archivo comparado por la expresión será almacenado en caché, y si el primer carácter es -, entonces cualquier cosa que coincida no será almacenada en caché. El caso predeterminado es -, por lo que se puede dejar así.
apc.mmap_file_mask
string
Si se compiló con soporte para MMAP usando --enable-mmap, ésta es la máscara de archivo estilo mktemp a pasar al módulo mmap para determinar si la región de memoria de mmap va a ser para gestión de archivos o para gestión de memoria compartida. Para gestión directa de archivos, establézcalo a algo como /tmp/apc.XXXXXX (exactamente 6 X). Para usar shm_open/mmap al estilo POSIX ponga .shm en algún lugar de su máscara, p.ej. /apc.shm.XXXXXX También se puede establecer a /dev/zero para usar la interfaz /dev/zero de kernel a una memoria de mmap anónima. Dejándolo indefinido forzará un mmap anónimo.
apc.slam_defense
integer
En servidores muy concurridos cuando se inicia el sercidor o se modifican archivos, se puede crear una competición para todos los procesos que intentén almacenar el mismo archivo al mismo tiempo. Esta opción establece el porcentaje de procesos que se saltan el intentar almacenar en caché un archivo que no lo esté. O piense en ello como la probabilidad de saltarse el almacenamiento en caché de un proceso. Por ejemplo, establecer apc.slam_defense a 75 siginifica que hay un 75% de probabilidad de que el proceso no almacene en caché un archivo que no lo está. Así, cuanto mayor sea el valor mayor será la defensa contra los ataques a la caché. Establecer esto a 0 deshabilita esta característica.
Obsoleto por apc.write_lock.
apc.file_update_protection
integer
Cuando un archivo es modificado en un servidor web debería hacerse realmente de una forma atómica. Es decir, escribir en un archivo temporal y renombrar (mv) el archivo a su posición permanente cuando esté listo. Muchos editores de texto, Many text editors, cp, tar y otros programas similares no lo hacen. Esto significa que hay una posibilidad de que se acceda al archivo (y se almacene en caché) mientras está todavía siendo escrito. apc.file_update_protection pone un retardo en la marca de almacenamiento en caché de nuevos archivos. Lo predeterminado es 2 segundos, lo que significa qeu si marca de tiempo de modificación (mtime) de un archivo muestra que es menor que 2 segundo de atigüedad cuando se acceda a él, no será almacenado en caché. La persona desafortunada que acceda a este archivo a medio escribir aún lo verá de forma extraña, pero por lo menos no persistirá. Si todos los archivos del servidor web se actualizan atómicamente mediante algún método como rsync (el cuál actuliza correctamente), se puede deshabilitar esta protección estableciendo esta directiva a 0. Si el sistema se inunda de entradas/salidas y algunos procesos de actualización toman más de 2 segundos, este ajuste debería ser aumentado para habilitar la protección en las operaciones de actualizacón más lentas.
apc.enable_cli
integer
Mayormente para probar y depurar. Estableciendo esto habilita APC para la versión CLI de PHP. Bajo circunstancias normales, no es ideal crear, llenar y destruir la caché de APC en cada petición CLI, pero para varios escenarios de pruebas es útil para ser capaz de habilitar APC para la versión CLI de PHP de manera sencilla.
apc.max_file_size
integer
Previene que los archivos más grandes que este valor sean almacenados en caché. Por defecto es 1M.
apc.stat
integer
Tenga cuidado al cambiar este ajuste. Por defecto está activado, forzando a APC a realizar estadísticas (comprobar) del script en cada petición para determinar si ha sido modificado. Si ha sido modificado será recompilado y se almacenará en caché la nueva versión. Si este ajuste está desactivado, APC no hará ninguna comprobación, lo que normalmente significa que al forzar a APC a recomprobar archivos, el sevidor web tendrá que ser reiniciado o la caché tendrá que ser limpiada manualmente. Observe que la configuración de FastCGI del servidor web puede no limpiar la caché al reinicio. En un servidor de producción donde los archivos de script raramente cambian, se puede lograr aumentar el redimiento significativamente deshabilitando las estadísticas.
Para archivos incluidos/requeridos también se aplica esta opción, pero observe que para inclusiones de rutras relativas (cualquier ruta que no empiece con / en Unix), APC tiene que realizar una verificación para identificar de manera única un arcivo. Si se usan inclusiones de rutas absolutas, APC puede saltarse las estadísticas y usar esa ruta absoluta como el identificador único del archivo.
apc.write_lock
boolean
En servidores concurridos, cuando el servidor se inicia primero, o cuando muchos archivos han sido modificados al mismo tiempo, APC puede intentar compilar y almacenar en caché el mismo archivo múltiples veces. Write_lock garantiza que sólo un proceso intentará compilar y almacenar en caché un script que no lo ésta. Los demás procesos que intenten usar el script se ejecutarán sin usar la caché de código de operaciones, en vez de mirar y esperar a que la caché se prepare.
apc.report_autofilter
boolean
Registra cualquier script que fue automáticamente excluído de ser almacenado en caché debido a cuestiones de enlaces precoces/tardíos.
apc.include_once_override
boolean
Optimiza las llamadas a include_once y require_once y evita las caras llamadas al sistema utilizadas.
Esta característica es EXPERIMENTAL. El comportamiento de esta directiva, su nombre, y la documentación pertinente puede cambiar sin previo aviso en una versión futura de APC. El uso de esta característica está bajo su responsabilidad.
apc.rfc1867
boolean
El gestor de enganche de Progreso de Subidas de Archivo RFC1867 sólo está disponible si APC fue compilado con PHP 5.2.0 o posterior. Cuando está habilitado, cualquier subida de archivo que incluya un campo llamado APC_UPLOAD_PROGRESS antes del campo file en un formulario de subidas hará que APC cree automáticamente una entrada de caché de usuario upload_key donde key es el valor de la entrada APC_UPLOAD_PROGRESS del formulario.
Observe que el campo oculto especificado por APC_UPLOAD_PROGRESS debe ir antes del campo file, si no el progreso de subida no funcionará correctamente.
Observe que el rastreo de subidas de archivos no es seguro a nivel de hilos en este momento, por lo que las nuevas subidas que ocurran mientras se está realizando una anterior deshabilitará el rastreo para la anterior.
Observe que rate sólo está disponible una vez que todas las tranferencias de ficheros estén completadas.
Ejemplo #1 Un ejemplo de apc.rfc1867
<?php
print_r(apc_fetch("upload_$_POST[APC_UPLOAD_PROGRESS]"));
?>
El resultado del ejemplo sería algo similar a:
Array
(
[total] => 1142543
[current] => 1142543
[rate] => 1828068.8
[filename] => test
[name] => file
[temp_filename] => /tmp/php8F
[cancel_upload] => 0
[done] => 1
)
apc.rfc1867_prefix
string
El prefijo de clave a usar para la entrada de caché de usuario generada por la funcionalidad de progreso de subida rfc1867.
apc.rfc1867_name
string
Especifica el nombre de la entrada oculta del formulario que activa el progreso de subida de APC y especifica el sufijo de clave de la caché de usuario.
apc.rfc1867_freq
string
La frecuencia con la que se debería hacer la actualización de la entrada de la caché de usuario para el progreso de subida. Puede tomar la forma de un porcentaje del total del tamaño del archivo o un tamaño en bytes opcionalmente con el sufijo "k", "m", o "g" para kilobytes, megabytes, o gigabytes respectivamente (insensible a mayúsculas-minúsculas). Un valor de 0 actualiza tan a menudo como se pueda, lo que puede causar subidar más lentas.
apc.rfc1867_ttl
bool
TTL para las entradas de rfc1867.
apc.localcache
boolean
Habilita un cierre libre de la caché de seguimiento de procesos locales que reduce las disputas de cierre cuando la caché está siendo escrita.
apc.localcache.size
integer
El tamaño de la caché de seguimiento de procesos locales, debería ser establecido a un valor suficientemente grande, aproximadamente la mitad de apc.num_files_hint.
apc.coredump_unmap
boolean
Habilita a APC para el manejo de señales, como SIGSEGV, que escriben archivos de núcleo cuando se indican. Cuando estas señales son recibidas, APC intentará desmapear el segmento de memoria compartida para excluirlo del archivo de núcleo. Este ajuste puede mejorar la estabilidad del sistema cuando son recibidas señales fatales y se configura un segmento grande de memoria compartida de APC.
Esta característica es potencialmente peligrosa. Desmapear el segmento de memoria compartida en un gestro de señal fatal puede causar un comportamiento indefinido si ocurriera un error fatal.
Nota:
Aunque algunos kernels pueden proporcionar una utilidad para ignorar varios tipos de memoria compartida cuando se genera un archivo de copia de núcleo, estas implementaciones pueden también ignorar segmentos de memoria compartida tales como el marcador de Apache.
apc.stat_ctime
integer
La verificación con ctime evitará problemas causados por programas como svn o rsync asegurándose que los i-nodos no han cambiado desde la úlima estadística. APC normalmente sólo verificará mtime.
apc.canonicalize
bool
Si está activado, las rutas relativas son canonizadas al modo sin estadísticas. En tal caso, los ficheros importados a partir de envolturas de flujos, no se almacerán dado que realpath() no soporta las envolutras de flujos.
apc.preload_path
string
apc.use_request_time
bool
Usa el tiempo de inicio de la petición SAPI para TTL.
apc.file_md5
bool
Graba un hash de archivos md5.
apc.lazy_functions
integer
Habilita la carga lenta de funciones.
apc.lazy_classes
integer
Habilita la carga lenta de clases.
Esta extensión no tiene ningún tipo de recurso definido.
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
APC_BIN_VERIFY_CRC32
(integer)
APC_BIN_VERIFY_MD5
(integer)
APC_ITER_ALL
(integer)
APC_ITER_ATIME
(integer)
APC_ITER_CTIME
(integer)
APC_ITER_DEVICE
(integer)
APC_ITER_DTIME
(integer)
APC_ITER_FILENAME
(integer)
APC_ITER_INODE
(integer)
APC_ITER_KEY
(integer)
APC_ITER_MD5
(integer)
APC_ITER_MEM_SIZE
(integer)
APC_ITER_MTIME
(integer)
APC_ITER_NONE
(integer)
APC_ITER_NUM_HITS
(integer)
APC_ITER_REFCOUNT
(integer)
APC_ITER_TTL
(integer)
APC_ITER_TYPE
(integer)
APC_ITER_VALUE
(integer)
APC_LIST_ACTIVE
(integer)
APC_LIST_DELETED
(integer)
(PECL apc >= 3.0.13)
apc_add — Poner una nueva variable en caché en el almacén de datos
Pone una variable en caché en el almacén de datos, sólo si no está ya almacenada.
Nota: A diferencia de otros mecanismos de PHP, las variables almacenadas al usar apc_add() persistirán entre peticiones (hasta que el valor sea eliminado de la caché).
key
Almacena la variable usando este nombre. Las claves (keys) son
únicas en la caché, por lo que intentar usar apc_add() para
almacenar información con una clave que ya existe no sobrescribirá la
información existente, en su lugar devolverá FALSE. (Esta es la única
diferencia entre apc_add() y
apc_store().)
var
La variable a almacenar
ttl
Time To Live (Tiempo de Vida); almacena var en la caché durante
ttl segundos. Después de que pase
ttl, la variable almacenada será
expurgada de la caché (en la siguiente solicitud). Si no se proporciona
ttl (o si ttl es
0), el valor persistirá hasta que sea eliminado de la
caché manualmente, o si no dejará de existir (al limpiar,
reiniciar, etc.).
values
Nombres en clave, variables en valor.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
La segunda sintaxis devuelve un array con las claves de errores.
Ejemplo #1 Un ejemplo de apc_add()
<?php
$bar = 'BAR';
apc_add('foo', $bar);
var_dump(apc_fetch('foo'));
echo "\n";
$bar = 'NUNCA SE ESTABLECE';
apc_add('foo', $bar);
var_dump(apc_fetch('foo'));
echo "\n";
?>
El resultado del ejemplo sería:
string(3) "BAR" string(3) "BAR"
(PECL apc >= 3.1.4)
apc_bin_dump — Obtener una copia binaria de los archivos y variables de usuario dados
$files
[, array $user_vars
]] )
Devuelve una copia binaria de los archivos y variables de usuario dados desde la caché de APC.
NULL para cada parámetro files o user_vars indica una copia de cada entrada, mientras que
array() no hará copia de nada.
Devuelve una copia binaria de los archivos y variables de usuario dados desde la caché de APC,
FALSE si APC no está habilitado, o NULL si se produjo un error desconocido.
(PECL apc >= 3.1.4)
apc_bin_dumpfile — Imprimir a un archivo una copia binaria de los archivos y variables de usuario almacenados en caché
$files
, array $user_vars
, string $filename
[, int $flags = 0
[, resource $context
]] )Imprime una copia binaria de los archivos y variables de usuario dados desde la caché de APC al archivo nominado.
files
Los nombres de los archivos que van a ser copiados.
user_vars
Las variables de usuario que van a ser copiadas.
filename
El nombre de archivo donde la copia va a ser guardada.
flags
Banderas pasadas al flujo de filename. Véase la
documentación de file_put_contents() para más detalles.
context
El contexto pasado al flujo de filename. Véase la
documentación de file_put_contents() para más detalles.
El número de bytes escritos en el archivo, o si no
FALSE si APC no está habilitado, filename no es un nombre de archivo válido,
filename no se puede abrir, el archivo copia no puede ser completado
(p.ej., el disco duro se ha quedado sin espacio), o si se produjo un error desconocido.
(PECL apc >= 3.1.4)
apc_bin_load — Cargar una copia binaria en la caché de archivo/usuario de APC
$data
[, int $flags = 0
] )Cargar la copia binaria dada en la caché de archivo/usuario de APC.
data
La copia binaria que va a ser cargada, probablemente desde apc_bin_dump().
flags
APC_BIN_VERIFY_CRC32, APC_BIN_VERIFY_MD5,
o ambas.
Devuelve TRUE si la información de la copia binaria dada por data
se cargó con éxito, si no se devuelve FALSE. También se devuelve FALSE si APC
no está habilitado o si data no es una copia binaria válida
de APC (p.ej., tamaño no esperado).
Ejemplo #1 Ejemplo de apc_bin_load()
<?php
$data = apc_bin_dump(NULL, NULL);
apc_bin_load($data, APC_BIN_VERIFY_MD5 | APC_BIN_VERIFY_CRC32);
?>
(PECL apc >= 3.1.4)
apc_bin_loadfile — Cargar una copia binaria desde un archivo a la caché de archivo/usuario de APC
$filename
[, resource $context
[, int $flags
]] )Carga una copia binaria desde un archivo a la caché de archivo/usuario de APC.
filename
El nombre de archivo que contiene la copia, probablemente desde apc_bin_dumpfile().
context
El contexto de archivos.
flags
Puede ser APC_BIN_VERIFY_CRC32, APC_BIN_VERIFY_MD5,
o ambos.
Devuelve TRUE en caso de éxito, si no devuelve FALSE. Las razones por la que devuelve FALSE
incluyen que APC no está habilitado, filename no es un nombre de archivo
válido o está vacío, no se puede abrir filename, la copia del archivo no se
puede completar, o si data no es una copia binaria de APC válida
(p.ej., tamaño no esperado).
(PECL apc >= 2.0.0)
apc_cache_info — Recupera información que hay en caché del almacén de datos de APC
$cache_type
[, bool $limited = false
]] )Recupera información que hay en caché y meta-datos del almacén de datos de APC.
cache_type
Si cache_type es "user",
será devuelta la información acerca de la caché de usuario.
Si cache_type es "filehits",
será devuelta la información acerca de qué archivos han sido servidos desde
la caché de código de bytes para la solicitud actual. Esta característica debe ser
habilitada en la compilación usando --enable-filehits
.
Si cache_type no es válido o no se especifica, será devuelta
la información sobre la caché del sistema (archivos en caché).
limited
Si limited es TRUE, el
valor devuelto excluirá la lista individual de entradas de caché. Esto es
útil cuando se intenta optimizar llamadas para reunión de estadísticas.
Un array de datos en caché (y metadatos) o FALSE en caso de error
Nota: apc_cache_info() emitirá una advertencia si no es capaz de recuperar datos en caché de APC. Esto normalmente ocurre cuando APC no está habilitado.
| Versión | Descripción |
|---|---|
| 3.0.11 |
Se introdujo el parámetro limited.
|
| 3.0.16 |
Se introdujo la opción "filehits" del
parámetro cache_type.
|
Ejemplo #1 Un ejemplo de apc_cache_info()
<?php
print_r(apc_cache_info());
?>
El resultado del ejemplo sería algo similar a:
Array
(
[num_slots] => 2000
[ttl] => 0
[num_hits] => 9
[num_misses] => 3
[start_time] => 1123958803
[cache_list] => Array
(
[0] => Array
(
[filename] => /path/to/apc_test.php
[device] => 29954
[inode] => 1130511
[type] => file
[num_hits] => 1
[mtime] => 1123960686
[creation_time] => 1123960696
[deletion_time] => 0
[access_time] => 1123962864
[ref_count] => 1
[mem_size] => 677
)
[1] => Array (...itera para cada archivo en caché)
)
(PECL apc >= 3.1.1)
apc_cas — Actualiza un valor anterior por un nuevo valor
$key
, int $old
, int $new
)
apc_cas() actualiza un número entero existente si el parámetro
old concuerda con el valor guardado actualmente con
el valor del parámetro new.
key
La clave del valor a ser actualizado.
old
El valor anterior (el valor actualmente guardado).
new
El nuevo valor a actualizar.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de apc_cas()
<?php
apc_store('foobar', 2);
echo '$foobar = 2', PHP_EOL;
echo '$foobar == 1 ? 2 : 1 = ', (apc_cas('foobar', 1, 2) ? 'ok' : 'fallo'), PHP_EOL;
echo '$foobar == 2 ? 1 : 2 = ', (apc_cas('foobar', 2, 1) ? 'ok' : 'fallo'), PHP_EOL;
echo '$foobar = ', apc_fetch('foobar'), PHP_EOL;
echo '$f__bar == 1 ? 2 : 1 = ', (apc_cas('f__bar', 1, 2) ? 'ok' : 'fallo'), PHP_EOL;
apc_store('perfección', 'xyz');
echo '$perfección == 2 ? 1 : 2 = ', (apc_cas('perfección', 2, 1) ? 'ok' : 'fallo épico'), PHP_EOL;
echo '$foobar = ', apc_fetch('foobar'), PHP_EOL;
?>
El resultado del ejemplo sería algo similar a:
$foobar = 2 $foobar == 1 ? 2 : 1 = fallo $foobar == 2 ? 1 : 2 = ok $foobar = 1 $f__bar == 1 ? 2 : 1 = fallo $perfección == 2 ? 1 : 2 = fallo épico $foobar = 1
(PECL apc >= 2.0.0)
apc_clear_cache — Limpia la caché de APC
$cache_type
] )Limpiar la caché de usuario/sistema.
cache_type
Si cache_type es "user", se
limpiará la caché de usuario; de otro modo, se limpiará la caché del sistema
(archivos almacenados en caché).
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL apc >= 3.0.13)
apc_compile_file — Almacena un archivo en la caché de código de byte, evitando todos los filtros
Almacena un archivo en la caché de código de byte, evitando todos los filtros.
filename
Ruta completa o relativa al archivo PHP que será compilado y almacenado en la caché de código de byte.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL apc >= 3.1.1)
apc_dec — Disminuye un número almacenado
$key
[, int $step = 1
[, bool &$success
]] )Disminuye un valor integer almacenado.
key
La clave del valor a ser disminuido.
step
El intervalo, o valor a disminuir.
success
Opcionalmente pasa el valor boolean de éxito o fracaso a esta variable referenciada.
Devuelve el valor actual de key en caso de éxito,
o FALSE en caso de error
Ejemplo #1 Ejemplo de apc_dec()
<?php
echo "Vamos a hacer algo con éxito", PHP_EOL;
apc_store('unnúmero', 42);
echo apc_fetch('unnúmero'), PHP_EOL;
echo apc_dec('unnúmero'), PHP_EOL;
echo apc_dec('unnúmero', 10), PHP_EOL;
echo apc_dec('unnúmero', 10, $éxito), PHP_EOL;
var_dump($éxito);
echo "Ahora, vamos a fracasar", PHP_EOL, PHP_EOL;
apc_store('unacadena', 'foo');
$ret = apc_dec('unacadena', 1, $fracaso);
var_dump($ret);
var_dump($fracaso);
?>
El resultado del ejemplo sería algo similar a:
Vamos a hacer algo con éxito 42 41 31 21 bool(true) Ahora, vamos a fracasar bool(false) bool(false)
(PECL apc >= 3.0.0)
apc_define_constants — Define un conjunto de constantes para recuperación y definición en masa
$key
, array $constants
[, bool $case_sensitive = true
] )define() es notoriamente lenta. Ya que el principal beneficio de APC es aumentar el rendimiento de scripts/aplicaciones, se proporciona este mecanismo para hacer más eficiente el proceso de definición de constantes en masa. Sin embargo, esta función no lo realiza tan bien como se esperaba.
Para una solución de rendimiento mejor, pruebe la extensión » hidef de PECL.
Nota: Para eliminar un conjunto de constantes almacenadas (sin limpiar la caché por completo), se puede pasar un array vacío al parámetro
constants, limpiando de manera eficaz los valores almacenados.
key
key sirve como el nombre del conjunto de constantes
que va a ser almacenado. key se usa para recuperar las
constantes almacenadas en apc_load_constants().
constants
Un array asociativo de pares nombre_constante => valor. nombre_constante debe seguir las reglas normales de nominación de constantes. valor debe evaluar un valor escalar.
case_sensitive
El comportamiento predeterminado para las constantes es ser declaradas sensibles a
mayúsculas-minúsculas; es decir, CONSTANTE y Constante
representan valores diferentes. Si este parámetro es FALSE las
constantes serán declaradas como símbolos insensibles a mayúsculas-minúsculas.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de apc_define_constants()
<?php
$constantes = array(
'UNO' => 1,
'DOS' => 2,
'TRES' => 3,
);
apc_define_constants('números', $constantes);
echo UNO, DOS, TRES;
?>
El resultado del ejemplo sería:
123
(PECL apc >= 3.1.1)
apc_delete_file — Borra archivos de la caché del código de operación
Borra los archivos dados de la caché del código de operación.
keys
Los archivos a ser borrados. Acepta un string, un array de strings, o un object APCIterator.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
O si keys es un array,
se devuelve un array vacío en caso de éxito, o se devuelve un array con los
archivos fallidos.
Ejemplo #1 Ejemplo de apc_delete_file()
<?php
$nombrearchivo = 'archivo.php';
if (apc_compile_file($nombrearchivo)) {
if (apc_delete_file($nombrearchivo)) {
echo "Se borró con éxito el archivo $nombrearchivo de la caché de APC.", PHP_EOL;
}
}
if (apc_compile_file($nombrearchivo)) {
if ($bien = apc_delete_file(array($nombrearchivo, 'noexiste.php'))) {
var_dump($bien);
}
}
$mal = apc_delete_file('noexiste.php');
var_dump($mal);
?>
El resultado del ejemplo sería algo similar a:
Se borró con éxito el archivo $nombrearchivo de la caché de APC.
[Mon May 24 09:30:33 2010] [apc-warning] Could not stat file noexiste.php, unable to delete from cache. in /tmp/test.php on line 13.
array(1) {
[0]=>
string(14) "noexiste.php"
}
[Mon May 24 09:30:33 2010] [apc-warning] Could not stat file noexiste.php, unable to delete from cache. in /tmp/test.php on line 18.
bool(false)
(PECL apc >= 3.0.0)
apc_delete — Elimina una variable almacenada de la caché
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Un ejemplo apc_delete()
<?php
$bar = 'BAR';
apc_store('foo', $bar);
apc_delete('foo');
// esto es obviamente inútil de esta forma
?>
(PECL apc >= 3.1.4)
apc_exists — Comprobar si existe una clave de APC
Devuelve TRUE si la clave existe, de otro modo devuelve FALSE. O si se
pasó un array a keys,
se devuelve un array que contiene todas las claves existentes, o un array
vacío si no existe nada.
Ejemplo #1 Ejemplo de apc_exists()
<?php
$fruta = 'manzana';
$vegetal = 'zanahoria';
apc_store('foo', $fruta);
apc_store('bar', $vegetal);
if (apc_exists('foo')) {
echo "Foo existe: ";
echo apc_fetch('foo');
} else {
echo "Foo no existe";
}
echo PHP_EOL;
if (apc_exists('baz')) {
echo "Baz existe.";
} else {
echo "Baz no existe";
}
echo PHP_EOL;
$ret = apc_exists(array('foo', 'noexiste', 'bar'));
var_dump($ret);
?>
El resultado del ejemplo sería algo similar a:
Foo existe: manzana
Baz no existe
array(2) {
["foo"]=>
bool(true)
["bar"]=>
bool(true)
}
(PECL apc >= 3.0.0)
apc_fetch — Traer una variable almacenada desde la caché
Traer una variable almacenada desde la caché.
key
La clave dada por key usada para almacenar el valor (con
apc_store()). Si se pasa un array cada
elemento es traído y devuelto.
success
Se establece a TRUE para éxito y FALSE en caso de error.
La variable almacenada o una matriz de variables en caso de éxito; FALSE en caso de error
Ejemplo #1 Un ejemplo de apc_fetch()
<?php
$bar = 'BAR';
apc_store('foo', $bar);
var_dump(apc_fetch('foo'));
?>
El resultado del ejemplo sería:
string(3) "BAR"
| Versión | Descripción |
|---|---|
| 3.0.17 |
Se añadio el parámetro success.
|
(PECL apc >= 3.1.1)
apc_inc — Aumentar un número almacenado
$key
[, int $step = 1
[, bool &$success
]] )Aumenta un número almacenado.
key
La clave del valor a ser aumentado.
step
El intervalo, o valor a aumentar.
success
Opcionalmente pasa el valor boolean de éxito o fracaso a esta variable referenciada.
Devuelve el valor actual de key en caso de éxito,
o FALSE en caso de error
Ejemplo #1 Ejemplo de apc_inc()
<?php
echo "Vamos a hacer algo con éxito", PHP_EOL;
apc_store('unnúmero', 42);
echo apc_fetch('unnúmero'), PHP_EOL;
echo apc_inc('unnúmero'), PHP_EOL;
echo apc_inc('unnúmero', 10), PHP_EOL;
echo apc_inc('unnúmero', 10, $éxito), PHP_EOL;
var_dump($éxito);
echo "Ahora, vamos a fracasar", PHP_EOL, PHP_EOL;
apc_store('unacadena', 'foo');
$ret = apc_inc('unacadena', 1, $fracaso);
var_dump($ret);
var_dump($fracaso);
?>
El resultado del ejemplo sería algo similar a:
Vamos a hacer algo con éxito 42 43 53 63 bool(true) Ahora, vamos a fracasar bool(false) bool(false)
(PECL apc >= 3.0.0)
apc_load_constants — Carga un conjunto de constantes de la caché
$key
[, bool $case_sensitive = true
] )Carga un conjunto de constantes de la caché.
key
El nombre del conjunto de constantes (que fue almacenado con apc_define_constants()) que se va a recuperar.
case_sensitive
El comportamiento predeterminado para las constantes es ser declaradas sensibles a
mayúsculas-minúsculas; es decir, CONSTANTE y Constante
representan valores diferentes. Si este parámetro es FALSE las
constantes serán declaradas como símbolos insensibles a mayúsculas-minúsculas.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de apc_load_constants()
<?php
$constantes = array(
'UNO' => 1,
'DOS' => 2,
'TRES' => 3,
);
apc_define_constants('números', $constantes);
apc_load_constants('números');
echo UNO, DOS, TRES;
?>
El resultado del ejemplo sería:
123
(PECL apc >= 2.0.0)
apc_sma_info — Recupera la información de la Asignación de Memoria Compartida de APC
$limited = false
] )Recupera la información de la Asignación de Memoria Compartida de APC.
limited
Cuando se establece a FALSE (predeterminado) apc_sma_info()
devolverá información detallada sobre cada segmento.
Un array de información de Asignación de Memoria Compartida; FALSE en caso de error.
Ejemplo #1 Un ejemplo de apc_sma_info()
<?php
print_r(apc_sma_info());
?>
El resultado del ejemplo sería algo similar a:
Array
(
[num_seg] => 1
[seg_size] => 31457280
[avail_mem] => 31448408
[block_lists] => Array
(
[0] => Array
(
[0] => Array
(
[size] => 31448408
[offset] => 8864
)
)
)
)
(PECL apc >= 3.0.0)
apc_store — Guardar una variable en caché en el almacén de datos
Guarda una variable en caché en el almacén de datos.
Nota: A diferencia de otros mecanismos de PHP, las variables almacenadas al usar apc_store() persistirán entre peticiones (hasta que el valor sea eliminado de la caché).
key
Almacena la variable usando este nombre. Las claves (keys) son
únicas en la caché, por lo que almacenar un segundo valor con la misma clave dada por
key sobrescribirá el valor original.
var
La variable a almacenar
ttl
Time To Live (Tiempo de Vida); almacena var en la caché durante
ttl segundos. Después de que pase
ttl, la variable almacenada será
expurgada de la caché (en la siguiente solicitud). Si no se proporciona
ttl (o si ttl es
0), el valor persistirá hasta que sea eliminado de la
caché manualmente, o si no dejará de existir (al limpiar,
reiniciar, etc.).
values
Nombres en clave, variables en valor.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
La segunda sintaxis devuelve un array con claves de errores.
Ejemplo #1 Un ejemplo de apc_store()
<?php
$bar = 'BAR';
apc_store('foo', $bar);
var_dump(apc_fetch('foo'));
?>
El resultado del ejemplo sería:
string(3) "BAR"
(PECL apc >= 3.1.1)
La clase APCIterator hace que sea más sencillo iterar sobre grandes cachés de APC. Esto es útilya que permite iterar sobre grandes cachés por pasos, mientras aprovecha un número definido de entradas por instancia de cierre, por lo que libera los cierres de caché para otras actividades, en vez de mantener la caché completa para aprovechar 100 (por defecto) entradas. También, usar comparaciones con expresiones regulares es más eficiente ya así se traslada al nivel de C.
$cache
[, mixed $search = null
[, int $format
[, int $chunk_size = 100
[, int $list
]]]] )(PECL apc >= 3.1.1)
APCIterator::__construct — Construye un objeto iterador APCIterator
$cache
[, mixed $search = null
[, int $format
[, int $chunk_size = 100
[, int $list
]]]] )Construye un object APCIterator .
cache
El tipo de caché, que será user o file.
search
Una expresión regular de PCRE que
se compara con nombres de claves de APC, como string para
una única expresión regular, o como un array de expresiones
regulares. O, opcionalmente, pase NULL para saltar la búsquda.
format
El formato deseado, como se configuró con una o más de las constantes APC_ITER_*.
chunk_size
El tamaño de trozo. Debe ser un valor mayor que 0. El valor predeterminado es 100.
list
El tipo a listar. Se puede pasar APC_LIST_ACTIVE
o APC_LIST_DELETED.
Un object APCIterator en caso de éxito,
o NULL en caso de error.
Ejemplo #1 Ejemplo de APCIterator::__construct()
<?php
foreach (new APCIterator('user', '/^counter\./') as $counter) {
echo "$counter[key]: $counter[value]\n";
apc_dec($counter['key'], $counter['value']);
}
?>
(PECL apc >= 3.1.1)
APCIterator::current — Obtener el elemento actual
Obtiene el elemento acutal de la pila de APCIterator.
Esta función no tiene parámetros.
Devuelve el elemento actual en caso de éxito, o FALSE si no
existen más elementos, o en caso de fallo.
(PECL apc >= 3.1.1)
APCIterator::getTotalCount — Obtener la cuenta total
Obtiene la cuenta total.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Esta función no tiene parámetros.
La cuenta total..
(PECL apc >= 3.1.1)
APCIterator::getTotalHits — Obtener el total de éxitos de la caché
Obtiene el número total de éxitos de la caché.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Esta función no tiene parámetros.
El número de éxitos en caso de éxito, o FALSE en caso de fallo.
(PECL apc >= 3.1.1)
APCIterator::getTotalSize — Obtener el tamaño total de la caché
Obtiene el tamaño total de la caché.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Esta función no tiene parámetros.
El tamaño total de la caché.
(PECL apc >= 3.1.1)
APCIterator::key — Obtener la clave del iterador
Obtiene la clave actual del iterador.
Esta función no tiene parámetros.
Devuelve la clave en caso de éxito, o FALSE en caso de error.
(PECL apc >= 3.1.1)
APCIterator::next — Mover el puntero al siguiente elemento
Mueve el puntero del iterador al siguiente elemento.
Esta función no tiene parámetros.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL apc >= 3.1.1)
APCIterator::rewind — Rebobina el iterator
Rebobina el iterador hasta el primer elemento.
Esta función no tiene parámetros.
No devuelve ningún valor.
(PECL apc >= 3.1.1)
APCIterator::valid — Comprueba si la posición acutal es válida
Comprueba si la posición actual del iterador es válida.
Esta función no tiene parámetros.
Devuelve TRUE si la posición actual del iterador es válida, si no FALSE.
APD (por sus siglas en Inglés Advanced PHP Debugger) es el depurador avanzado de PHP. Fue escrito para brindar capacidades de análisis de performance y depurado para el código de PHP, así como para proveer la habilidad de mostrar un rastreo completo. APD soporta el depurado interactivo, pero por defecto escribe datos para rastrear los archivos. También ofrece un registro basado en eventos en el cual varios niveles de información (incluyendo llamados a funciones, argumentos pasados, tiempos, etc.) pueden ser activados o inactivados para scripts individuales.
APD es una extensión de Zend que modifica la forma en que PHP maneja internamente el llamado a funciones y puede ser o no ser compatible con otras extensiones de Zend (por ejemplo Zend Optimizer).
No se requiere de ninguna biblioteca externa para compilar esta extensión.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/apd.
No hay una DLL disponible para esta extensión PECL actualmente. Vea también la sección Compilando en Windows .
En el archivo INI agregue las siguientes líneas:
zend_extension = /absolute/path/to/apd.so apd.dumpdir = /absolute/path/to/trace/directory apd.statement_tracing = 0
Dependiendo de la compilación de PHP, la directiva zend_extension puede ser una de las siguientes:
zend_extension (non ZTS, non debug build) zend_extension_ts ( ZTS, non debug build) zend_extension_debug (non ZTS, debug build) zend_extension_debug_ts ( ZTS, debug build)
Para compilar APD bajo Windows se necesita un ambiente de compilado de PHP que funcione tal como está descrito en http://php.net/ -- básicamente se requiere tener Microsoft Visual C++, win32build.zip, bison/flex y algún conocimiento sobre como logar que todo esto funcione. También se debe asegurar que adp.dsp tenga fines de línea tipo DOS; si son de tipo unix, Microsoft Visual C++ no lo reconocerá correctamente.
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| apd.dumpdir | NULL | PHP_INI_ALL | |
| apd.statement_tracing | "0" | PHP_INI_ALL | Disponible desde APD 0.9. |
He aquí una breve explicación de las directivas de configuración.
apd.dumpdir
string
Configura el directorio en el cual APS escribe los archivos de volcado del performance. Se puede especificar una ruta absoluta o una relativa.
Se puede especificar un directorio diferente como un argumento de apd_set_pprof_trace().
apd.statement_tracing
boolean
Especifica si se hacen o no rastreos por línea. Activar esto (1) impactará en el desempeño de la aplicación.
Esta extensión no tiene ningún tipo de recurso definido.
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
| Constante | Valor | Descripción |
|---|---|---|
FUNCTION_TRACE
(integer)
|
1 | |
ARGS_TRACE
(integer)
|
2 | |
ASSIGNMENT_TRACE
(integer)
|
4 | |
STATEMENT_TRACE
(integer)
|
8 | |
MEMORY_TRACE
(integer)
|
16 | |
TIMING_TRACE
(integer)
|
32 | |
SUMMARY_TRACE
(integer)
|
64 | |
ERROR_TRACE
(integer)
|
128 | |
PROF_TRACE
(integer)
|
256 | |
APD_VERSION
(string)
|
ejemplo: 1.0.2-dev |
Como primera línea del script PHP, llamar la función apd_set_pprof_trace() para iniciar el rastreo.
<?php
apd_set_pprof_trace();
?>
Se puede insertar la línea en cualquier parte del script, pero si no se inicia el rastreo al comienzo, se descartarán los datos de depurado que pudieran llevar a determinar un cuello de botella del desempeño.
Ahora se corre el script. La salida será escrita a apd.dumpdir/pprof_pid.ext.
Si está corriendo la versión CGI de PHP, es necesario agregar la opción
'-e' para activar la información extendida que APD requiere para trabajar
apropiadamente. Por ejemplo:
php -e -f script.php
Para mostrar formateados los datos de performance, se envía el comando pprofp con las opciones de ordenado y presentación. La salida formateada se verá algo como esto:
bash-2.05b$ pprofp -R /tmp/pprof.22141.0 Trace for /home/dan/testapd.php Total Elapsed Time = 0.00 Total System Time = 0.00 Total User Time = 0.00 Real User System secs/ cumm %Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name -------------------------------------------------------------------------------------- 100.0 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0000 0.0009 0 main 56.9 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0005 0.0005 0 apd_set_pprof_trace 28.0 0.00 0.00 0.00 0.00 0.00 0.00 10 0.0000 0.0000 0 preg_replace 14.3 0.00 0.00 0.00 0.00 0.00 0.00 10 0.0000 0.0000 0 str_replace
La opción –R usada en este ejemplo, ordena la tabla del performance por la cantidad de tiempo real que el script gasta ejecutando una función dada. La columna "cumm call" revela cuantas veces cada función es llamada y la columna "s/call" muestra cuantos segundos requiere en promedio cada llamada a la función.
Para generar un archivo de árbol de llamados que se pueda importar en la aplicación de análisis de perfil KCacheGrind, enviar el comando pprof2calltree.
Si tiene comentarios, correcciones, mejoras o quiere ayudar a desarrollar esta bestia, puede enviar un correo a » apd@mail.communityconnect.com. Cualquier ayuda será muy bienvenida.
(PECL apd >= 0.2)
apd_breakpoint — Detiene el interpretador y espera en un CR desde el socket
$debug_level
)Esto puede ser usado para detener el corrido del script y esperar respuestas en el socket conectado. Para dar un paso en el programa, sólo se envía enter (una línea en blanco) o se entra un comando php para ser ejecutado.
debug_levelUn entero que es formado agregando al lado las constantes XXX_TRACE.
No se recomienda
usar MEMORY_TRACE. Es muy lenta y no parece ser precisa.
ASSIGNMENT_TRACE todavía no esta implementada.
Para activar todos los traces funcionales (TIMING, FUNCTIONS, ARGS SUMMARY (como strace -c)) use el valor 99
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Sesión típica usando tcplisten
bash#tcplisten localhost 7777
APD - Advanced PHP Debugger Trace File
---------------------------------------------------------------------------
Process Pid (6118)
Trace Begun at Sun Mar 10 23:13:12 2002
---------------------------------------------------------------------------
( 0.000000): apd_set_session_trace called at /home/alan/Projects/project2/test.
php:5
( 0.074824): apd_set_session_trace_socket() at /home/alan/Projects/project2/tes
t.php:5 returned. Elapsed (0.074824)
( 0.074918): apd_breakpoint() /home/alan/Projects/project2/test.php:7
++ argv[0] $(??) = 9
apd_breakpoint() at /home/alan/Projects/project2/test.php:7 returned. Elapsed (
-2089521468.1073275368)
>\n
statement: /home/alan/Projects/project2/test.php:8
>\n
statement: /home/alan/Projects/project2/test.php:8
>\n
statement: /home/alan/Projects/project2/test.php:10
>apd_echo($i);
EXEC: apd_echo($i);
0
>apd_echo(serialize(apd_get_active_symbols()));
EXEC: apd_echo(serialize(apd_get_active_symbols()));
a:47:{i:0;s:4:"PWD";i:1;s:10:"COLORFGBG";i:2;s:11:"XAUTHORITY";i:3;s:14:"
COLORTERM_BCE";i:4;s:9:"WINDOWID";i:5;s:14:"ETERM_VERSION";i:6;s:16:"SE
SSION_MANAGER";i:7;s:4:"PS1";i:8;s:11:"GDMSESSION";i:9;s:5:"USER";i:10;s:5:"
MAIL";i:11;s:7:"OLDPWD";i:12;s:5:"LANG";i:13;s:10:"COLORTERM";i:14;s:8:"DISP
LAY";i:15;s:8:"LOGNAME";i:16;s:6:"
>apd_echo(system('ls /home/mydir'));
........
>apd_continue(0);
(PECL apd 0.2-0.4)
apd_callstack — Retorna la actual pila de llamado como una matriz
Retorna la actual pila de llamado como una matriz
Una matriz que contiene la actual pila de llamado.
Ejemplo #1 apd_callstack() ejemplo
<?php
print_r(apd_callstack());
?>
(PECL apd 0.2-0.4)
apd_clunk — Lanza una advertencia y una pila de llamado
$warning
[, string $delimiter
] )Se comporta como el Carp::cluck de perl. Lanza una advertencia y una pila de llamado.
warning
La advertencia a lanzar.
delimiter
El delimitador. Por defecto es <BR />.
No devuelve ningún valor.
Ejemplo #1 apd_clunk() ejemplo
<?php
apd_clunk("Alguna advertencia", "<br/>");
?>
(PECL apd >= 0.2)
apd_continue — Reinicia el interpretador
$debug_level
)Usualmente enviado vía el socket para reiniciar el interpretador.
debug_levelUn entero que es formado agregando al lado las constantes XXX_TRACE.
No se recomienda
usar MEMORY_TRACE. Es muy lenta y no parece ser precisa.
ASSIGNMENT_TRACE todavía no esta implementada.
Para activar todos los traces funcionales (TIMING, FUNCTIONS, ARGS SUMMARY (como strace -c)) use el valor 99
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 apd_continue() ejemplo
<?php
apd_continue(0);
?>
(PECL apd 0.2-0.4)
apd_croak — Lanza un error, una pila de lamado y entonces sale
$warning
[, string $delimiter
] )Se comporta como el Carp::croak de perl. Lanza un error, una pila de lamado y entonces sale.
warning
La advertencia a lanzar.
delimiter
El delimitador. Por defecto es <BR />.
No devuelve ningún valor.
Ejemplo #1 apd_croak() ejemplo
<?php
apd_croak("Alguna advertencia","<P>");
?>
(Unknown)
apd_dump_function_table — Muestra la tabla de funciones actual
Muestra la tabla de funciones actual.
No devuelve ningún valor.
Ejemplo #1 apd_dump_function_table() ejemplo
<?php
apd_dump_function_table();
?>
(PECL apd 0.2-0.4)
apd_dump_persistent_resources — Retorna todos los recursos persistentes como una matriz
Retorna todos los recursos persistentes como una matriz.
Una matriz conteniendo la pila de llamada actual.
Ejemplo #1 apd_dump_persistent_resources() ejemplo
<?php
print_r(apd_dump_persistent_resources());
?>
(PECL apd 0.2-0.4)
apd_dump_regular_resources — Retorna todos los recursos regulares actuales como una matriz
Retorna todos los recursos regulares actuales como una matriz.
Una matriz conteniendo los recursos regulares actuales.
Ejemplo #1 apd_dump_regular_resources() ejemplo
<?php
print_r(apd_dump_regular_resources());
?>
(PECL apd >= 0.2)
apd_echo — Echo hacia el socket de depurado
$output
)Usualmente es enviado por medio del socket para requerir información acerca del script que esta corriendo.
output
La variable depurada.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 apd_echo() ejemplo
<?php
apd_echo($i);
?>
(PECL apd 0.2)
apd_get_active_symbols — Obtener una matriz con los nombres de las variables actuales en el ámbito local
Devuelve los nombres de todas las variables definidas en el ámbito activo, (no sus valores).
Una matriz multidimensional con todas las variables.
Ejemplo #1 apd_get_active_symbols() ejemplo
<?php
apd_echo(apd_get_active_symbols());
?>
(PECL apd >= 0.2)
apd_set_pprof_trace — Inicia la sesión de depurado
$dump_directory
[, string $fragment = "pprof"
]] )Inicia el depurado al archivo pprof_{process_id} en el directorio de volcado.
dump_directory
El directorio en el cual el archivo del volcado del análisis es escrito. Si no se especifica, la configuración apd.dumpdir del archivo php.ini será usada.
fragment
Retorna la ruta del archivo de destino.
Ejemplo #1 apd_set_pprof_trace() ejemplo
<?php
apd_set_pprof_trace();
?>
(PECL apd >= 0.2)
apd_set_session_trace_socket — Inicia la sesión remota de depurado
$tcp_server
, int $socket_type
, int $port
, int $debug_level
)
Conecta al servidor tcp_server especificado
(p.ej. tcplisten) y envía los datos de depurado al socket.
tcp_server
Socket IP o Unix Domain (como un archivo) del servidor TCP.
socket_type
Puede ser AF_UNIX para sockets basados en archivos o
APD_AF_INET para tcp/ip estándar.
port
Se puede usar cualquier puerto, pero números más altos son mejores dado que la mayoría de los números bajos pueden estar siendo usados por otros servicios del sistema.
debug_levelUn entero que es formado agregando al lado las constantes XXX_TRACE.
No se recomienda
usar MEMORY_TRACE. Es muy lenta y no parece ser precisa.
ASSIGNMENT_TRACE todavía no esta implementada.
Para activar todos los traces funcionales (TIMING, FUNCTIONS, ARGS SUMMARY (como strace -c)) use el valor 99
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 apd_set_session_trace_socket() ejemplo
<?php
apd_set_session_trace_socket("127.0.0.1",APD_AF_INET,7112,0);
?>
(PECL apd 0.2-0.4)
apd_set_session_trace — Inicia la sesión de depurado
$debug_level
[, string $dump_directory
] )Inicia el depurado al archivo apd_dump_{process_id} en el directorio de volcado.
debug_levelUn entero que es formado agregando al lado las constantes XXX_TRACE.
No se recomienda
usar MEMORY_TRACE. Es muy lenta y no parece ser precisa.
ASSIGNMENT_TRACE todavía no esta implementada.
Para activar todos los traces funcionales (TIMING, FUNCTIONS, ARGS SUMMARY (como strace -c)) use el valor 99
dump_directory
El directorio en el cual el archivo del volcado del análisis es escrito. Si no se especifica, la configuración apd.dumpdir del archivo php.ini será usada.
No devuelve ningún valor.
Ejemplo #1 apd_set_session_trace() ejemplo
<?php
apd_set_session_trace(99);
?>
(PECL apd 0.2-0.4)
apd_set_session — Cambia o configura el nivel actual de depurado
$debug_level
)Esto puede ser usado para incrementar o disminuir el depurado en un área diferente de la aplicación.
debug_levelUn entero que es formado agregando al lado las constantes XXX_TRACE.
No se recomienda
usar MEMORY_TRACE. Es muy lenta y no parece ser precisa.
ASSIGNMENT_TRACE todavía no esta implementada.
Para activar todos los traces funcionales (TIMING, FUNCTIONS, ARGS SUMMARY (como strace -c)) use el valor 99
No devuelve ningún valor.
Ejemplo #1 apd_set_session() ejemplo
<?php
apd_set_session(9);
?>
(PECL apd >= 0.2)
override_function — Pasa por alto funciones integradas
$function_name
, string $function_args
, string $function_code
)Pasa por alto funciones integradas al reemplazarlas en la tabla de símbolos.
function_name
La función para pasar por alto.
function_args
Los argumentos de la función, como una cadena separada por comas.
Usualmente se pasa este parámetro así como el parámetro
function_code, como una sola cadena entre
comillas simples. La razón para usar cadenas entre comillas simples
es para proteger los nombres de variables del análisis sintáctico,
de otra manera, si se utilizan comillas dobles sería necesario usar
secuencias de escape en los nombres de las variables, como por
ejemplo: \$your_var.
function_code
El nuevo código para la función.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 override_function() ejemplo
<?php
override_function('test', '$a,$b', 'echo "DOING TEST"; return $a * $b;');
?>
(PECL apd >= 0.2)
rename_function — Renombra original_name como new_name en la tabla global de funciones
$original_name
, string $new_name
)Renombra original_name como new_name en la tabla global de funciones. Es útil para temporalmente pasar por alto funciones integradas.
original_name
El nombre original de la función.
new_name
El nuevo nombre para la función original_name.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 rename_function() ejemplo
<?php
rename_function('mysql_connect', 'debug_mysql_connect' );
?>
Esta extensión es EXPERIMENTAL. Esto significa que el comportamiento de esta extensión, los nombre de sus funciones y en definitiva TODO lo documentado sobre esta extensión, puede cambiar en una futura versión de PHP SIN AVISO. La advertencia queda hecha, y utilizar esta extensión queda bajo su propia responsabilidad.
Bcompiler ha sido escrito por varias razones:
La segunda de estas metas se alcanza usando las funciones bcompiler_write_header(), bcompiler_write_class(), bcompiler_write_footer(), bcompiler_read(), y bcompiler_load(). Los archivos de código de bytes pueden ser escritos como no comprimidos o planos. bcompiler_load() Lee un archivo de código de bytes bzip comprimido, el cuál tiende a ser 1/3 del tamaño del archivo original.
Para crear archivos tipo EXE, bcompiler tiene que usarse con un archivo sapi modificado o una versión de PHP que haya sido compilada como un biblioteca compartida. En este escenario, bcompiler lee el código de bytes comprimido del final del archivo exe.
Bcompiler puede mejorar el rendimiento en un 30% cuando se usa solamente con código de bytes sin comprimir. Pero tenga en cuenta que el código de byte sin comprimir puede ser hasta 5 veces más largo que el código fuente original. Usar la comprensión de código de bytes puede ahorrar espacio, pero la descompresión requiere mucho más tiempo que analizar una fuente. bcompiler tampoco realiza ninguna optimización de código de byte, esto podría añadirse en el futuro...
En términos de protección de código es seguro decir que sería imposible recrear el código fuente exacto desde donde se construyó, y sin los comentarios que acompañan al código fuente. Sería inútil usar los códigos de bytes de bcompiler para recrear y modificar una clase. Sin embargo, es posible recuperar información de un archivo de código de bytes contruido con bcompiler - por lo que no ponga sus contraseñas privadas o similares en él.
No se requiere de ninguna biblioteca externa para compilar esta extensión.
Esta extensión » PECL no se distribuye con PHP.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/bcompiler.
No hay una DLL disponible para esta extensión PECL actualmente. Vea también la sección Compilando en Windows .
Esta extensión no tiene directivas de configuración definidas en php.ini.
Esta extensión no tiene ningún tipo de recurso definido.
Esta extensión no tiene ninguna constante definida.
Si tiene algún comentario, alguna corrección de un error, alguna mejora o quiere ayudar a desarrollar esta bestia, puede mandarme un mail a » alan_k@php.net. Cualquier ayuda es siempre bienvenida.
(PECL bcompiler >= 0.4)
bcompiler_load_exe — Lee y crea clases desde un archivo exe de bcompiler
$filename
)Lee la información de un archivo exe de bcompiler y crea clases desde el código de bytes.
filename
La ruta al archivo exe, como cadena.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de bcompiler_load_exe()
<?php
bcompiler_load_exe("/tmp/ejemplo.exe");
print_r(get_defined_classes());
?>
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
(PECL bcompiler >= 0.4)
bcompiler_load — Lee y crea clases desde un archivo comprimido con bz
$filename
)Lee la información de un archivo bz comprimido y crear clases desde el código de bytes.
filename
La ruta al archivo bz comprimido, como cadena.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de bcompiler_load()
<?php
bcompiler_load("/tmp/ejemplo");
print_r(get_defined_classes());
?>
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Nota:
Por favor, use las sentencias include o require para analizar el código de bytes, es una manera más portable y conveniente que usar esta función.
Por favor, observe que esta función no ejecutará código del cuerpo de un script que contenido en el archivo de código de bytes.
(PECL bcompiler >= 0.4)
bcompiler_parse_class — Lee el código de bytes de una clase y realiza una llamada de retorno a una función de usuario
$class
, string $callback
)Lee el código de bytes de una clase y realiza una llamada de retorno a una función de usuario.
class
El nombre de la clase, como cadena.
callback
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de bcompiler_parse_class()
<?php
function leerCódigoBytes($datos) {
print_r($datos);
}
bcompiler_parse_class("DB","leerCódigoBytes");
?>
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Nota:
Esta función ha sido eliminada de bcompiler y ya no está disponible a partir de bcompiler 0.5.
(PECL bcompiler >= 0.4)
bcompiler_read — Lee y crea clases ded un gestor de archivo
$filehandle
)Lee información desde un gestor de archivo abierto y crea clases desde el código de bytes.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de bcompiler_read()
<?php
$fh = fopen("/tmp/example","r");
bcompiler_read($fh);
fclose($fh);
print_r(get_defined_classes());
?>
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Nota:
Por favor, use las sentencias include o require para analizar el código de bytes, es una manera más portable y conveniente que usar esta función.
Por favor, observe que esta función no ejecutará código del cuerpo de un script que contenido en el archivo de código de bytes.
(PECL bcompiler >= 0.4)
bcompiler_write_class — Escribe una clase definida como código de bytes
$filehandle
, string $className
[, string $extends
] )Lee el código de bytes de una clase existente de PHP y lo escribe en el gestor de archivo abierto.
filehandle
Un gestor de archivo como el devuelto por fopen().
className
El nombre de la clase, como cadena.
extends
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de bcompiler_write_class()
<?php
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_class($fh,"DB");
// debe escribir DB_common antes de DB_mysql, ya que DB_mysql extiende DB_common.
bcompiler_write_class($fh,"DB_common");
bcompiler_write_class($fh,"DB_mysql");
bcompiler_write_footer($fh);
fclose($fh);
?>
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Nota:
Esta función no realiza una comprobación de dependencia, por lo que asegúrese de escribir las clases en un orden que no resulte en un error undefined class cuando lo cargue.
(PECL bcompiler >= 0.5)
bcompiler_write_constant — Escribe una constante definida como código de bytes
$filehandle
, string $constantName
)Lee el código de bytes de una constante existente de PHP y lo escribe al gestor de archivo abierto.
filehandle
Un gestor de archivo como el devuelto por fopen().
constantName
El nombre de la constante definida, como cadena.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de bcompiler_write_constant()
<?php
define("MODULE_MAX", 30);
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_constant($fh,"MODULE_MAX");
bcompiler_write_footer($fh);
fclose($fh);
?>
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
(PECL bcompiler >= 0.6)
bcompiler_write_file — EScribe un archivo fuente de php como código de bytes
$filehandle
, string $filename
)Esta función compila el archivo fuente especificado en código de bytes y lo escribe al gestor de archivo abierto.
filehandle
Un gestor de archivo como el devuelto por fopen().
filename
La ruta al archivo fuente, como cadena.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de bcompiler_write_file()
<?php
$fh = fopen("ejemplo.phb", "w");
bcompiler_write_header($fh);
bcompiler_write_file($fh, "ejemplo.php");
bcompiler_write_footer($fh);
fclose($fh);
/* lo siguiente debería ser equivalente:
include "ejemplo.php";
y
include "ejemplo.phb";
*/
?>
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
(PECL bcompiler >= 0.5)
bcompiler_write_function — Escribe una función definida como código de bytes
$filehandle
, string $functionName
)Lee el código de bytes de una función existente de PHP y lo escribe al gestor de archivo abierto. El orden no es importante, (p.ej. si la función b utiliza la función a, y se compila como en el ejemplo de abajo, funcionará perfectamente).
filehandle
Un gestor de archivo como el devuelto por fopen().
functionName
El nombre de la función, como cadena.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de bcompiler_write_function()
<?php
$fh = fopen("/tmp/ejemplo","w");
bcompiler_write_header($fh);
bcompiler_write_function($fh,"mi_función_a");
bcompiler_write_function($fh,"mi_función_b");
bcompiler_write_footer($fh);
fclose($fh);
?>
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
(PECL bcompiler >= 0.5)
bcompiler_write_functions_from_file — Escribe todas las funciones definidas en un archivo como código de bytes
$filehandle
, string $fileName
)Busca todas las funciones declaradas en el archivo dado y escribe sus códigos de bytes correspondientes a un gestor de archivo abierto.
filehandle
Un gestor de archivo como el devuelto por fopen().
fileName
El archivo a compilar. Se debe usar siempre include o require para el archivo que se intenta compilar.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de bcompiler_write_functions_from_file()
<?php
require('module.php');
$fh = fopen("/tmp/ejemplo","w");
bcompiler_write_header($fh);
bcompiler_write_functions_from_file($fh,'module.php');
bcompiler_write_footer($fh);
fclose($fh);
?>
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
(PECL bcompiler >= 0.3)
bcompiler_write_header — Escribe la cabecera de bcompiler
$filehandle
[, string $write_ver
] )Escribe la parte de la cabecera de una archivo bcompiler.
filehandle
Un gestor de archivo como el devuelto por fopen().
write_ver
Se puede usar para escribir código de bytes en un formato usado anteriormente, por lo que lo puede usar con versiones anteriores de bcompiler.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de bcompiler_write_header()
<?php
$fh = fopen("/tmp/ejemplo","w");
bcompiler_write_header($fh);
bcompiler_write_class($fh,"DB");
bcompiler_write_footer($fh);
fclose($fh);
?>
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
(PECL bcompiler >= 0.5)
bcompiler_write_included_filename — Escribe un archivo incluido como código de bytes
$filehandle
, string $filename
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Estas funciones tratan sobre el control y registro de errores. Permiten definir sus propias reglas de control de errores, así como modificar la manera en que los errores pueden ser registrados. Esto le permite cambiar y mejorar la notificación de errores para acomodarla a sus necesidades.
Con las funciones de registro se pueden enviar mensajes directamente a otras máquinas, a un e-mail (¡o un e-mail a un busca!), al registro del sistema, etc., por lo que puede registrar y monitorizar selectivamente las partes más importantes de sus aplicaciones y sitios web.
Las funciones de notificación de errores le permiten personalizar a qué nivel y qué tipo de errores se dan, abarcando desde simples avisos hasta funciones personalizadas devueltas al originarse un error.
No se requiere de ninguna biblioteca externa para compilar esta extensión.
No se requiere de ninguna instalación para utilizar estas funciones; forman parte del núcleo de PHP.
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| error_reporting | NULL | PHP_INI_ALL | |
| display_errors | "1" | PHP_INI_ALL | |
| display_startup_errors | "0" | PHP_INI_ALL | |
| log_errors | "0" | PHP_INI_ALL | |
| log_errors_max_len | "1024" | PHP_INI_ALL | Disponible a partir de PHP 4.3.0. |
| ignore_repeated_errors | "0" | PHP_INI_ALL | Disponible a partir de PHP 4.3.0. |
| ignore_repeated_source | "0" | PHP_INI_ALL | Disponible a partir de PHP 4.3.0. |
| report_memleaks | "1" | PHP_INI_ALL | Disponible a partir de PHP 4.3.0. |
| track_errors | "0" | PHP_INI_ALL | |
| html_errors | "1" | PHP_INI_ALL | PHP_INI_SYSTEM en PHP <= 4.2.3. |
| xmlrpc_errors | "0" | PHP_INI_SYSTEM | Disponible a partir de PHP 4.1.0. |
| xmlrpc_error_number | "0" | PHP_INI_ALL | Disponible a partir de PHP 4.1.0. |
| docref_root | "" | PHP_INI_ALL | Disponible a partir de PHP 4.3.0. |
| docref_ext | "" | PHP_INI_ALL | Disponible a partir de PHP 4.3.2. |
| error_prepend_string | NULL | PHP_INI_ALL | |
| error_append_string | NULL | PHP_INI_ALL | |
| error_log | NULL | PHP_INI_ALL |
He aquí una breve explicación de las directivas de configuración.
error_reporting
integer
Establece el nivel de notificación de errores. El parámetro es un valor de tipo integer que representa un campo de bits, o constantes nominadas. Los niveles de error_reporting y constantes están descritos en Constantes Predefinidas, y en php.ini. Para establecerlo en tiempo de ejecución, use la función error_reporting(). Vea también la directiva display_errors.
En PHP 4 y PHP 5 el valor predeterminado es E_ALL
& ~E_NOTICE.
Esta configuración no muestra los errores de nivel E_NOTICE.
Puede querer mostrarlos durante el desarrollo.
Nota:
Habilitar
E_NOTICEdurante el desarrollo tiene algunos beneficios. Para depuración: los mensajes NOTICE le avisarán de posibles errores en su código. Por ejemplo, se avisa del uso de valores no asignados. Es extremadamente útil para encontrar errartas y ahorrar tiempo de depuración. Los mensajes NOTICE le avisarán sobre un estilo malo. Por ejemplo, $arr[item] es mejor que sea escrito como $arr['item'] ya que PHP intenta tratar "item" como una constante. Si no es una constante, PHP asume que es un índice de cadena del array.
Nota:
En PHP 5 está disponible el nuevo nivel de error
E_STRICT. Ya queE_STRICTno está incluido dentro deE_ALLtiene que habilitar explícitamente este tipo de nivel de error. HabilitarE_STRICTdurante el desarrollo tiene algunos beneficios. Los mensajes STRICT le ayudarán a usar el último y más sugerente método de codificación, por ejemplo le advertirá del uso de funciones obsoletas.
Nota: Constantes de PHP fuera de PHP
Usar constantes de PHP fuera de PHP, como en httpd.conf, no tendrá un propósito útil por lo que en tales casos se requerirán los valores de tipo integer. Y ya que se añadirán más niveles de error con el tiempo, el valor máximo (para
E_ALL) cambiará igualmente. Por lo que en lugar deE_ALLconsidere usar un valor grande para cubrir todos los campos de bits desde ahora hasta bien entrado en el futuro, un valor numérico como 2147483647 (incluye todos los errores, no sóloE_ALL).
display_errors
string
Determina si los errores deberían ser impresos en pantalla como parte de la salida o si deberían ocultarse al usuario.
El valor "stderr" envía los errores a stderr en vez de a stdout. El valor está disponible a partir de PHP 5.2.4. En versiones anteriores esta directiva era de tipo boolean.
Nota:
Esta es una característica para apoyar su desarrollo y nunca debería usarse es sistemas de producción (p.ej. sistemas conectados a internet).
Nota:
Aunque display_errors puede ser establecido en tiempo de ejecución (con ini_set ()), no tendrá ningún efecto si el script tiene errores fatales. Esto es porque la acción en tiempo de ejecución deseada no se ejecuta.
display_startup_errors
boolean
Incluso cuando display_errors está activado, los errores que ocurren durante la secuencia de arranque de PHP no se muestran. Se recomienda encarecidamente mantener desactivado display_startup_errors, excepto para depuración.
log_errors
boolean
Indica si los mensajes de error del script deberían de registrarse en el registro del servidor o en error_log. Esta opción es, por lo tanto, específica para servidores.
Nota:
Se aconseja encarecidamente usar el registro de errores en lugar de mostrar los errores en sitios web de producción.
log_errors_max_len
integer
Establece la longitud máxima de log_errors en bytes. En error_log se añade información acerca de la fuente. El valor predeterminado es 1024 y 0 permite no aplicar ninguna longitud máxima en absoluto. Esta longitud se aplica a los errores registrados, a los errores mostrados y también a $php_errormsg.
Cuando se usa un número entero, el valor del mismo es medido en bytes. También se puede usar la notación reducida tal como se describe en esta FAQ.ignore_repeated_errors
boolean
No registra mensajes repetidos. Los mensajes repetidos deben ocurrir en el misma línea del mismo archivo a menos que ignore_repeated_source esté establecido a true.
ignore_repeated_source
boolean
Ignora la fuente del mensaje cuando se ignoran mensajes repetidos. Cuando este ajuste está activado (On) no se registrarán errores con mensajes repetidos de diferentes archivos o líneas fuente.
report_memleaks
boolean
Si este parámetro está activado (On) (por defecto), este parámetro mostrará un
informe de pérdidas de memoria detectado por el gestor de memoria Zend. Este informe
Será enviado al stderr en las plataformas Posix. En Windows, será enviado
al depurador usando OutputDebugString(), y podrá ser visto con herramientas
como » DbgView.
Este parámetro solo tiene efecto en una versión de depuración, y si
error_reporting incluye E_WARNING en la lista
permitida.
track_errors
boolean
Si está habilitado, el último mensaje de error siempre estará presente en la variable $php_errormsg.
html_errors
boolean
Desactiva las etiquetas HTML en los mensajes de error. El nuevo formato para errores HTML producen mensajes clicables que dirigen al usuario a una página describiendo el error o a la función que causa el error. Estas referencias son afectadas por docref_root y docref_ext.
xmlrpc_errors
boolean
Desactiva la notificación de errores normal y fortamea los errores como mensajes de error XML-RPC.
xmlrpc_error_number
integer
Usado como el valor del elemento faultCode de XML-RPC.
docref_root
string
El nuevo formato de error contiene una referencia a la página describiendo el error o a la
función que causa el error. En caso de páginas de manual puede descargar el
manual en su idioma y establecer esta directiva ini a la URL de su copia
local. Si su copia local del manual se puede alcanzar mediante "/manual/"
puede usar simplemente docref_root=/manual/. Además tiene
que establecer docref_ext para que coincida con las extensiones de archivo de su copia
docref_ext=.html. Es posbile usar referencias
externas. Por ejemplo puede usar
docref_root=http://manual/en/ o
docref_root="http://landonize.it/?how=url&theme=classic&filter=Landon
&url=http%3A%2F%2Fwww.php.net%2F"
La mayoría de las veces querrá que el valor de docref_root termine con una barra "/". Pero vea el segundo ejemplo de arriba, el cuál no la tiene ni la necesita.
Nota:
Esta es una característica para apoyar su desarrollo ya que hace más fácil buscar una descripción de una función. Sin embargo, nunca debería usarse en sistemas de producción (p.ej. sistemas conectados a internet).
docref_ext
string
Véase docref_root.
Nota:
El valor de docref_ext debe comenzar con un punto ".".
error_prepend_string
string
Cadena a imprimir antes de un mensaje de error.
error_append_string
string
Cadena a imprimir después de un mensaje de error.
error_log
string
Nombre del archivo donde los errores del script deberían ser registrados. El archivo debería ser modificable por el usuario del servidor web. Si se usa el valor especial syslog, los errores son enviados en su lugar al registro del sistema. En Unix, esto quiere decir syslog(3) y en Windows NT quiere decir el registro de sucesos. El registro de sistema no está soportado en Windows 95. Vea también: syslog(). Si esta directiva no está establecida los errores se enviarán al registro de error de SAPI. Por ejemplo, un registro de error en Apache o stderr en CLI.
Esta extensión no tiene ningún tipo de recurso definido.
Estas constantes están disponibles siempre ya que forman parte del núcleo de PHP.
Nota: Se pueden usar estos nombres de constantes en php.ini pero no fuera de PHP, como en httpd.conf, donde se deberían usar en su lugar valores de máscara de bits.
| Valor | Constante | Descripción | Nota |
|---|---|---|---|
| 1 |
E_ERROR
(integer)
|
Errores Fatales en tiempo de ejecución. Éstos indican errores que no se pueden recuperar, tales como un problema de asignación de memoria. La ejecución del script se interrumpe. | |
| 2 |
E_WARNING
(integer)
|
Advertencias en tiempo de ejecución (errores no fatales). La ejecución del script no se interrumpe. | |
| 4 |
E_PARSE
(integer)
|
Errores de análisis en tiempo de compilación. Los errores de análisis deberían ser generados únicamente por el analizador. | |
| 8 |
E_NOTICE
(integer)
|
Avisos en tiempo de ejecución. Indican que el script encontró algo que podría señalar un error, pero que también podría ocurrir en el curso normal al ejecutar un script. | |
| 16 |
E_CORE_ERROR
(integer)
|
Errores fatales que ocurren durante el arranque incial de PHP. Son como un
E_ERROR, excepto que son generados por el núcleo de PHP.
|
|
| 32 |
E_CORE_WARNING
(integer)
|
Advertencias (errores no fatales) que ocurren durante el arranque inicial de PHP.
Son como un E_WARNING, excepto que son generados
por el núcleo de PHP.
|
|
| 64 |
E_COMPILE_ERROR
(integer)
|
Errores fatales en tiempo de compilación. Son como un E_ERROR,
excepto que son generados por Motor de Script Zend.
|
|
| 128 |
E_COMPILE_WARNING
(integer)
|
Advertencias en tiempo de compilación (errores no fatales). Son como un
E_WARNING, excepto que son generados por Motor
de Script Zend.
|
|
| 256 |
E_USER_ERROR
(integer)
|
Mensaje de error generado por el usuario. Es como un
E_ERROR, excepto que es generado por código de PHP mediante
el uso de la función de PHP trigger_error().
|
|
| 512 |
E_USER_WARNING
(integer)
|
Mensaje de advertencia generado por el usuario. Es como un
E_WARNING, excepto que es generado por código de PHP mediante
el uso de la función de PHP trigger_error().
|
|
| 1024 |
E_USER_NOTICE
(integer)
|
Mensaje de aviso generado por el usuario. Es como un
E_NOTICE, excepto que es generado por código de PHP mediante
el uso de la función de PHP trigger_error().
|
|
| 2048 |
E_STRICT
(integer)
|
Habilítelo para que PHP sugiera cambios en su código, lo que asegurará la mejor interoperabilidad y compatibilidad con versiones posteriores de PHP de su código. | Desde PHP 5 pero no incluidoen E_ALL hasta PHP 5.4.0 |
| 4096 |
E_RECOVERABLE_ERROR
(integer)
|
Error fatal capturable. Indica que ocurrió un error probablemente
peligroso, pero no dejó al Motor en un estado inestable. Si no se captura
el error mediante un gestor definido por el usuario (vea también
set_error_handler()), la aplicación se abortará como si
fuera un E_ERROR.
|
Desde PHP 5.2.0 |
| 8192 |
E_DEPRECATED
(integer)
|
Avisos en tiempo de ejecución. Habilítelo para recibir avisos sobre código que no funcionará en futuras versiones. | Desde PHP 5.3.0 |
| 16384 |
E_USER_DEPRECATED
(integer)
|
Mensajes de advertencia generados por el usuario. Son como un
E_DEPRECATED, excepto que es generado por código de PHP mediante
el uso de la función de PHP trigger_error().
|
Desde PHP 5.3.0 |
| 32767 |
E_ALL
(integer)
|
Todos los errores y advertencias soportados, excepto del nivel
E_STRICT antes de PHP 5.4.0.
|
32767 en PHP 5.4.x, 30719 en PHP 5.3.x, 6143 en PHP 5.2.x, 2047 anteriormente |
Los valores de arriba (numéricos o simbólicos) se usan para construir una máscara de bits que especifica qué errores notificar. Se pueden usar los operadores a nivel de bit para combinar estos valores o para enmascarar ciertos tipos de errores. Observe que sólo serán interpretados '|', '~', '!', '^' y '&' dentro de php.ini.
Abajo podemos ver un ejemplo del uso de las capacidades del manejo de errores de PHP. Definimos una función de gestión de errores que registra la información en un archivo (usado un foramto XML), y envía un e-mail a los desarrolladores en caso de que suceda un error crítico en la lógica.
Ejemplo #1 Usar el manejo de errores en un script
<?php
// haremos nuestro propio manejo de errores
error_reporting(0);
// función de gestión de errores definida por el usuario
function gestorErrores($númerr, $menserr, $nombrearchivo, $númlínea, $vars)
{
// marca de tiempo para la entrada del error
$fh = date("Y-m-d H:i:s (T)");
// definir una matriz asociativa de cadena de error
// en realidad las únicas entradas que deberíamos
// considerar son E_WARNING, E_NOTICE, E_USER_ERROR,
// E_USER_WARNING y E_USER_NOTICE
$tipoerror = array (
E_ERROR => 'Error',
E_WARNING => 'Warning',
E_PARSE => 'Parsing Error',
E_NOTICE => 'Notice',
E_CORE_ERROR => 'Core Error',
E_CORE_WARNING => 'Core Warning',
E_COMPILE_ERROR => 'Compile Error',
E_COMPILE_WARNING => 'Compile Warning',
E_USER_ERROR => 'User Error',
E_USER_WARNING => 'User Warning',
E_USER_NOTICE => 'User Notice',
E_STRICT => 'Runtime Notice',
E_RECOVERABLE_ERROR => 'Catchable Fatal Error'
);
// conjunto de errores por el cuál se guardará un seguimiento de una variable
$errores_usuario = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
$err = "<errorentry>\n";
$err .= "\t<datetime>" . $fh . "</datetime>\n";
$err .= "\t<errornum>" . $númerr . "</errornum>\n";
$err .= "\t<errortype>" . $tipoerror[$númerr] . "</errortype>\n";
$err .= "\t<errormsg>" . $menserr . "</errormsg>\n";
$err .= "\t<scriptname>" . $nombrearchivo . "</scriptname>\n";
$err .= "\t<scriptlinenum>" . $númlínea . "</scriptlinenum>\n";
if (in_array($númerr, $errores_usuario)) {
$err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n";
}
$err .= "</errorentry>\n\n";
// para probar
// echo $err;
// guardar al registro de errores, y enviarme un e-mail si hay un error crítico de usuario
error_log($err, 3, "/usr/local/php4/error.log");
if ($númerr == E_USER_ERROR) {
mail("phpdev@example.com", "Error Crítico de Usuario", $err);
}
}
function distancia($vect1, $vect2)
{
if (!is_array($vect1) || !is_array($vect2)) {
trigger_error("Parámetros incorrectos, se esperaba una matriz", E_USER_ERROR);
return NULL;
}
if (count($vect1) != count($vect2)) {
trigger_error("Los vectores necesitan ser del mismo tamaño", E_USER_ERROR);
return NULL;
}
for ($i=0; $i<count($vect1); $i++) {
$c1 = $vect1[$i]; $c2 = $vect2[$i];
$d = 0.0;
if (!is_numeric($c1)) {
trigger_error("La coordenada $i del vector 1 no es un número, se usará cero",
E_USER_WARNING);
$c1 = 0.0;
}
if (!is_numeric($c2)) {
trigger_error("La coordenada $i del vector 2 no es un número, se usará cero",
E_USER_WARNING);
$c2 = 0.0;
}
$d += $c2*$c2 - $c1*$c1;
}
return sqrt($d);
}
$gestor_error_antiguo = set_error_handler("gestorErrores");
// constante no definida, genera una advertencia
$t = NO_ESTOY_DEFINIDA;
// definir algunos "vectores"
$a = array(2, 3, "foo");
$b = array(5.5, 4.3, -1.6);
$c = array(1, -3);
// generar un error de usuario
$t1 = distancia($c, $b) . "\n";
// generar otro error de usuario
$t2 = distancia($b, "no soy una matriz") . "\n";
// generar una advertencia
$t3 = distancia($a, $b) . "\n";
?>
Véase también syslog().
(PHP 4 >= 4.3.0, PHP 5)
debug_backtrace — Genera un rastreo
$options = DEBUG_BACKTRACE_PROVIDE_OBJECT
[, int $limit = 0
]] )debug_backtrace() genera un rastreo de PHP.
options
Desde 5.3.6, este parámetro es una mascara de bits para las siguientes opciones:
| DEBUG_BACKTRACE_PROVIDE_OBJECT | Completar el índice "object" o no. |
| DEBUG_BACKTRACE_IGNORE_ARGS | Omitir el índice "args" y por lo tanto todos los argumentos de las funciones/métodos para ahorrar memoria o no. |
TRUE o FALSE, que es lo mismo que
establecer y desestablecer la opción DEBUG_BACKTRACE_PROVIDE_OBJECT.
limit
Desde 5.4.0, este parámetro puede ser usado para limitar el número de stack frames que se muestran.
Por defecto (limit=0) imprime todos los stack frames.
Devuelve un array de array asociativos. Los posibles elementos devueltos son los siguientes:
| Nombre | Tipo | Descripción |
|---|---|---|
| function | string | El nombre de la función actual. Véase también __FUNCTION__. |
| line | integer | El número de línea actual. Véase también __LINE__. |
| file | string | El nombre de archivo actual. Véase también __FILE__. |
| class | string | El nombre de la clase actual. Véase también __CLASS__ |
| object | object | El objeto actual. |
| type | string | El tipo de llamada actual. Si es una llamada a un método devuelve "->". Si es una llamada a un método estático devuelve "::". Si es una llamada a una función no se devuelve nada. |
| args | array | Dentro de una función se lista los argumentos de la función. Dentro de un archvo incluido se lista el nombre (o nombres) del archivo incluido. |
| Versión | Descripción |
|---|---|
| 5.4.0 |
Añadido el parámetro opcional limit.
|
| 5.3.6 |
Se cambió el parámetro provide_object a options y se añadió la
opción adicional DEBUG_BACKTRACE_IGNORE_ARGS.
|
| 5.2.5 |
Se añadió el parámetro opcional provide_object.
|
| 5.1.1 | Se añadió el object actual como posible elemento devuelto. |
Ejemplo #1 Ejemplo de debug_backtrace()
<?php
// nombre de archvio: /tmp/a.php
function una_prueba($str)
{
echo "\nHola: $str";
var_dump(debug_backtrace());
}
una_prueba('amigo');
?>
<?php
// nombre de archvio: /tmp/b.php
include_once '/tmp/a.php';
?>
El resultado es similar al siguiente cuando se ejecuta /tmp/b.php:
Hola: amigo
array(2) {
[0]=>
array(4) {
["file"] => string(10) "/tmp/a.php"
["line"] => int(10)
["function"] => string(10) "una_prueba"
["args"]=>
array(1) {
[0] => &string(5) "amigo"
}
}
[1]=>
array(4) {
["file"] => string(10) "/tmp/b.php"
["line"] => int(2)
["args"] =>
array(1) {
[0] => string(10) "/tmp/a.php"
}
["function"] => string(12) "include_once"
}
}
(PHP 5)
debug_print_backtrace — Muestra un rastreo
$options = 0
[, int $limit = 0
]] )debug_print_backtrace() muestra un rastreo PHP. muestra las llamadas a función, archivos incluídos y el material evaluado mediante eval().
options
Desde 5.3.6, este parámetro es una máscara de bits para las siguientes opciones:
| DEBUG_BACKTRACE_IGNORE_ARGS | Omitir el índice "args" y por lo tanto todos los argumentos de las funciones/métodos para ahorrar memoria o no. |
limit
Desde 5.4.0, este parámetro puede ser usado para limitar el número de stack frames que se muestran.
Por defecto (limit=0) imprime todos los stack frames.
No devuelve ningún valor.
| Versión | Descripción |
|---|---|
| 5.4.0 |
Añadido el parámetro opcional limit.
|
| 5.3.6 |
Añadido el parámetro opcional options.
|
Ejemplo #1 Ejemplo de debug_print_backtrace()
<?php
// archivo include.php
function a() {
b();
}
function b() {
c();
}
function c(){
debug_print_backtrace();
}
a();
?>
<?php
// archivo prueba.php
// este es el archivo que debe ejecutar
include 'include.php';
?>
El resultado del ejemplo sería algo similar a:
#0 c() called at [/tmp/include.php:10] #1 b() called at [/tmp/include.php:6] #2 a() called at [/tmp/include.php:17] #3 include(/tmp/include.php) called at [/tmp/prueba.php:3]
(PHP 5 >= 5.2.0)
error_get_last — Obtener el último error que ocurrió
Obtiene información sobre el último error que ocurrió.
Devuelve una matriz asociativa describiendo el último error con las claves "type" (tipo),
"message" (mensaje), "file" (archivo) y "line" (línea). Si el error ha sido causado por una función
interna de PHP, el "message" (mensaje) comienza con su nombre.
Devuelve NULL si no ha habido aún un error.
Ejemplo #1 Un ejemplo de error_get_last()
<?php
echo $a;
print_r(error_get_last());
?>
El resultado del ejemplo sería algo similar a:
Array
(
[type] => 8
[message] => Undefined variable: a
[file] => C:\WWW\index.php
[line] => 2
)
(PHP 4, PHP 5)
error_log — Enviar un mensaje de error a algún lugar
$message
[, int $message_type = 0
[, string $destination
[, string $extra_headers
]]] )Envía un mensaje de error al registro de errores del servidor web o a un archivo.
message
El mensaje de error que debería ser registrado.
message_type
Indica dónde debería ir el error. Lo tipos de mensaje posibles son:
| 0 |
message es enviado al registro del sistema de PHP, usando
el mecanismo de registro del Sistema Operativo o un archivo, dependiendo
de qué directiva de configuración esté establecida en
error_log. Esta es la opción predeterminada.
|
| 1 |
message es enviado por email a la dirección del
parámetro destination. Este es el único tipo de
mensaje donde se usa el cuarto parámetro
extra_headers.
|
| 2 | Ya no es una opción. |
| 3 |
message es añadido al inicio del archivo
destination. No se añade automáticamente una
nueva línea al final de la cadena message.
|
| 4 |
message es enviado directamente al gestor de registro de
SAPI.
|
destination
El destino. Su significado depende del parámetro
message_type tal como se describió arriba.
extra_headers
Las cabeceras extra. Se usa cuando el parámetro message_type
está establecido a 1.
Este tipo de mensaje usa la misma función interna que
mail().
Devuelve TRUE en caso de éxito o FALSE en caso de error.
| Versión | Descripción |
|---|---|
| 5.2.7 |
El valor posible de 4 se añadió a message_type.
|
Ejemplo #1 Ejemplos de error_log()
<?php
// Enviar una notificación al registro del servidor si no podemos
// conectarnos a la base de datos.
if (!Ora_Logon($username, $password)) {
error_log("¡Base de datos Oracle no disponible!", 0);
}
// Notificar al administrador mediante un email si agotamos FOO
if (!($foo = allocate_new_foo())) {
error_log("Problema serio, nos hemos quedado sin FOOs!", 1,
"operator@example.com");
}
// otra manera de llamar a error_log():
error_log("¡Lo echaste a perder!", 3, "/var/tmp/my-errors.log");
?>
(PHP 4, PHP 5)
error_reporting — Establece cuáles errores de PHP son notificados
$level
] )
La función error_reporting() establece la directiva
error_reporting
en tiempo de ejecución. PHP tiene varios niveles de errores para notificar, al utilizar
ésta función se define el nivel de duración (tiempo de ejecución) de
sus scripts. Si el parámetro opcional level no se define,
la función error_reporting() sólo devolverá
el nivel actual de notificación de error.
level
El nuevo nivel de error_reporting. Este nivel toma una máscara de bit o constantes nominadas. Al utilizar constantes nominadas se recomienda encarecidamente asegurar la compatibilidad para versiones futuras. Según se añaden niveles de error, el rango de los enteros incrementa, por lo que los niveles antiguos de errores basados en enteros no siempre se comportarán como se esperaba.
Las constantes de niveles de error disponibles, y los significados actuales de esos niveles de error están descritos en constantes predefinidas.
Devuelve el nivel antiguo de error_reporting
o el nivel actual si el parámetro level no se proporciona.
| Versión | Descripción |
|---|---|
| 5.4.0 | Ahora E_STRICT es parte de E_ALL. |
| 5.3.0 | Se introdujo E_DEPRECATED y E_USER_DEPRECATED. |
| 5.2.0 | Se introdujo E_RECOVERABLE_ERROR. |
| 5.0.0 | Se introdujo E_STRICT (no es parte de E_ALL). |
Ejemplo #1 Ejemplos de error_reporting()
<?php
// Desactivar toda notificación de error
error_reporting(0);
// Notificar solamente errores de ejecución
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Notificar E_NOTICE también puede ser bueno (para informar de variables
// no inicializadas o capturar errores en nombres de variables ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// Notificar todos los errores excepto E_NOTICE
// Este es el valor predeterminado establecido en php.ini
error_reporting(E_ALL ^ E_NOTICE);
// Notificar todos los errores de PHP (ver el registro de cambios)
error_reporting(E_ALL);
// Notificar todos los errores de PHP
error_reporting(-1);
// Lo mismo que error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
?>
La mayoría de errores E_STRICT son evaluados en tiempo
de compilación por lo que tales errores no se notifican en el fichero donde
error_reporting se mejora
al incluir los errores de E_STRICT (y viceversa).
Al pasar el valor -1 se mostrarán todos los errores posibles,
incluso cuando se añadan nuevos niveles y constantes en futuras versiones de PHP. La
constante E_ALL también se comporta de esta forma en PHP 5.4.
(PHP 4 >= 4.0.1, PHP 5)
restore_error_handler — Recupera la función de gestión de errores previa
Usada después de modificar la función de gestión de errores usando set_error_handler(), para revertir al gestor de errores previo (el cual puede ser el incorporado o una función definida por el usuario).
Esta función siempre devuelve TRUE.
Ejemplo #1 Ejemplo de restore_error_handler()
Decidir si unserialize() causó un error, entonces recuperar el gestor de errores original.
<?php
function gestor_unserialize($errno, $errstr)
{
echo "Valor seriado inválido.\n";
}
$seriado = 'foo';
set_error_handler('gestor_unserialize');
$original = unserialize($seriado);
restore_error_handler();
?>
El resultado del ejemplo sería:
Valor seriado inválido.
Nota:
Llamar restore_error_handler() desde la función error_handler es ignorado.
(PHP 5)
restore_exception_handler — Restaura la función de gestión de excepciones previamente definida
Usada después de cambiar la función de gestión de excepciones al utilizar set_exception_handler(), para volver al gestor de excepciones anterior (el cuál puede ser la función interna o una definida por el usuario).
Esta función siempre devuelve TRUE.
Ejemplo #1 Ejemplo de restore_exception_handler()
<?php
function gestor_excepciones_1(Exception $e)
{
echo '[' . __FUNCTION__ . '] ' . $e->getMessage();
}
function gestor_excepciones_2(Exception $e)
{
echo '[' . __FUNCTION__ . '] ' . $e->getMessage();
}
set_exception_handler('gestor_excepciones_1');
set_exception_handler('gestor_excepciones_2');
restore_exception_handler();
throw new Exception('Esto dispara el primer gestor de excepciones...');
?>
El resultado del ejemplo sería:
[gestor_excepciones_1] Esto dispara el primer gestor de excepciones...
(PHP 4 >= 4.0.1, PHP 5)
set_error_handler — Establecer una función de gestión de errores definida por el usuario
Establece una función de usuario (error_handler) para manejar
los errores de un script.
Esta función se puede usar para definir su propia forma de manejar los errores en tiempo de ejecución, por ejemplo en aplicaciones en las que se neceista hacer una limpieza de datos/archivos cuando ocurre un error crítico, o cuando se necesita provocar un error bajo ciertas condiciones (usando trigger_error()).
Es importante recordar que el gestor de errores estándar de PHP es completamente
evitado por los tipos de errores especificados por error_types
a menos que la función de llamada de retorno devuelva FALSE.
La configuración de error_reporting() no tendrá efecto y su
gestor de errores será llamado de todas formas - aunque aún es capaz de leer
el valor actual de
error_reporting y actuar
de manera apropiada. En particular, observe que este valor será 0 si a la
sentencia que causó el error se le añadió al principio el
operador de control de errores @
.
También observe que es su responsabilidad realizar un die() si fuera necesario. Si la función de gestión de errores devuelve, la ejecución del script continuará con la siguiente sentencia después de la que causó el error.
Los siguientes tipos de errores no pueden ser manejados con una función definida por el
usuario: E_ERROR, E_PARSE,
E_CORE_ERROR, E_CORE_WARNING,
E_COMPILE_ERROR,
E_COMPILE_WARNING, y
la mayoría de E_STRICT ocasionados en el archivo desde donde
se llamó a set_error_handler().
Si sucede algún error antes de que el script sea ejecutado (p.ej. en la carga de archivos) el gestor de errores personalizado no podrá ser llamado ya que no está registrado en ese momento.
error_handler
La función de usuario necesita aceptar dos parámetros: el código del error, y una cadena describiendo el error. Hay tres parámetros opcionales que pueden ser proporcionados: el nombre de archivo en el que ocurrió el error, el número de línea en el que ocurrió el error, y el contexto en el que ocurrió el error (una matriz que apunta a la tabla de símbolos activa en el punto donde ocurrió el error). La función se puede mostrar como:
$errno
, string $errstr
[, string $errfile
[, int $errline
[, array $errcontext
]]] )errno
errno, contiene el
nivel del error ocasionado, como un valor de tipo integer.
errstr
errstr, contiene el
mensaje de error, como cadena.
errfile
errfile,
que contiene el nombre de archivo que ocasionó el error, como cadena.
errline
errline,
que contiene el número de línea donde ocurrió el error, como valor de tipo integer.
errcontext
errcontext,
el cuál es una matriz que apunta a la tabla de símbolos activa en el punto
donde ocurrió el error. En otras palabras, errcontext
contendrá una matriz con cada variable que existe en el ámbito donde
el error fue provocado.
El gestor de errores de usuario no debe modificar el contexto del error.
Si la función devuelve FALSE se continúa con el gestor de errores normal.
error_types
Se puede usar para enmascarar la provocación de la
función error_handler al igual que la
configuración error_reporting ini
controla los errores que se muestran. Sin esta máscara establecida
error_handler será llamada para cada error
sin tener en cuenta la configuración de error_reporting.
Devuelve una cadena que contiene el gestor de errores definido anteriormente (si lo hay). Si
se usa el gestor de errores interno se devuelve NULL. NULL también es devuelto
en caso de un error como una llamada de retorno no válida. Si el gestor de errores anterior
era un método de una clase, esta función devolverá una matriz indexada con los nombres de las
clases y métodos.
| Versión | Descripción |
|---|---|
| 5.2.0 |
El gestor de errores debe devolver FALSE para rellenar
$php_errormsg.
|
| 5.0.0 |
Se introdujo el parámetro error_types.
|
| 4.3.0 |
También se puede proporcionar una matriz que contiene una referencia a un objeto y
un nombre de método, en vez el nombre de una función, como
error_handler.
|
| 4.0.2 |
Se introdujeron tres parámetros opcionales para la función de usuario
error_handler. Son el nombre de archivo, el número de línea,
y el contexto.
|
Ejemplo #1 Manejo de errores con set_error_handler() y trigger_error()
El ejemplo de abajo muestra el manejo de excepciones internas mediante la provocación de errores y tratándolos con una función definida por el usuario:
<?php
// función de gestión de errores
function miGestorDeErrores($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
// Este código de error no está incluido en error_reporting
return;
}
switch ($errno) {
case E_USER_ERROR:
echo "<b>Mi ERROR</b> [$errno] $errstr<br />\n";
echo " Error fatal en la línea $errline en el archivo $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Abortando...<br />\n";
exit(1);
break;
case E_USER_WARNING:
echo "<b>Mi WARNING</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
echo "<b>Mi NOTICE</b> [$errno] $errstr<br />\n";
break;
default:
echo "Tipo de error desconocido: [$errno] $errstr<br />\n";
break;
}
/* No ejecutar el gestor de errores interno de PHP */
return true;
}
// función para probar el manejo de errores
function scale_by_log($vect, $scale)
{
if (!is_numeric($scale) || $scale <= 0) {
trigger_error("log(x) para x <= 0 no está definido, usó: scale = $scale", E_USER_ERROR);
}
if (!is_array($vect)) {
trigger_error("Vector de entrada incorrecto, se esperaba una matriz de valores", E_USER_WARNING);
return null;
}
$temp = array();
foreach($vect as $pos => $valor) {
if (!is_numeric($valor)) {
trigger_error("El valor en la posición $pos no es un número, usando 0 (cero)", E_USER_NOTICE);
$valor = 0;
}
$temp[$pos] = log($scale) * $valor;
}
return $temp;
}
// establecer el gestro de errores definido por el usuario
$gestor_errores_antiguo = set_error_handler("miGestorDeErrores");
// provocar algunos errores, primero definimos una matriz mixta con un elemento no numérico
echo "vector a\n";
$a = array(2, 3, "foo", 5.5, 43.3, 21.11);
print_r($a);
// ahora generamos una segunda matriz
echo "----\nvector b - a notice (b = log(PI) * a)\n";
/* Value at position $pos is not a number, using 0 (zero) */
$b = scale_by_log($a, M_PI);
print_r($b);
// esto es un problema, pasamos una cadena en vez de una matriz
echo "----\nvector c - a warning\n";
/* Vector de entrada incorrecto, se esperaba una matriz de valores */
$c = scale_by_log("no array", 2.3);
var_dump($c); // NULL
// esto es un error crítico, log de cero o de un número negativo es indefinido
echo "----\nvector d - fatal error\n";
/* log(x) para x <= 0 no está definido, usó: scale = $scale */
$d = scale_by_log($a, -2.5);
var_dump($d); // Nunca se alcanza
?>
El resultado del ejemplo sería algo similar a:
vector a
Array
(
[0] => 2
[1] => 3
[2] => foo
[3] => 5.5
[4] => 43.3
[5] => 21.11
)
----
vector b - a notice (b = log(PI) * a)
<b>Mi NOTICE</b> [1024] El valor en la posición 2 no es un número, usando 0 (cero)<br />
Array
(
[0] => 2.2894597716988
[1] => 3.4341896575482
[2] => 0
[3] => 6.2960143721717
[4] => 49.566804057279
[5] => 24.165247890281
)
----
vector c - a warning
<b>Mi WARNING</b> [512] Vector de entrada incorrecto, se esperaba una matriz de valores<br />
NULL
----
vector d - fatal error
<b>Mi ERROR</b> [256] log(x) para x <= 0 no está definido, usó: scale = -2.5<br />
Error fatal en la línea 35 en el archivo trigger_error.php, PHP 5.2.1 (FreeBSD)<br />
Abortando...<br />
(PHP 5)
set_exception_handler — Establece una función de gestión de excepciones definida por el usuario
Establece el gestor de excepciones predeterminado si una excepción no es capturada dentro de un
bloque try/catch. La ejecución se detendrá después de la
llamada a exception_handler.
exception_handler
Nombre de la función a llamar cuando ocurra una excepción no capturada. Esta función debe ser definida antes de llamar a set_exception_handler(). Esta función de gestión necesita aceptar un parámetro, que será el objeto de excepción que fue lanzado.
Nota:
En su lugar se puede pasar
NULLpara reiniciar este gestor a su estado predeterminado.
Devuelve el nombre del gestor de excepciones definido anteriormente, o NULL en caso de error. Si
no se definió un gestor anterior también devolverá NULL. Si se le pasa NULL,
reiniciando el gestor a su estado predeterminado, devuelve TRUE.
Ejemplo #1 Ejemplo de set_exception_handler()
<?php
function gestor_excepciones($excepción) {
echo "Excepción no capturada: " , $excepción->getMessage(), "\n";
}
set_exception_handler('gestor_excepciones');
throw new Exception('Excepción No Capturada');
echo "No Ejecutado\n";
?>
(PHP 4 >= 4.0.1, PHP 5)
trigger_error — Generar un mensaje error/warning/notice de nivel de usuario
$error_msg
[, int $error_type = E_USER_NOTICE
] )Se usa para provocar una condición de error de usuario, se puede utilizar junto con el gestor de errores interno o con una función definida por el usuario que ha sido establecida como el nuevo gestor de errores (set_error_handler()).
Esta función es útil cuando se necesita generar una respuesta en particular a una excepción en tiempo de ejecución.
error_msg
El mensaje de error designado para este error. Está limitado a 1024 caracteres de longitud. Cualquier carácter más allá de los 1024 será truncado.
error_type
El tipo de error designado para este error. Sólo funciona con la familia de constantes
E_USER, y por defecto es E_USER_NOTICE.
Esta función devuelve FALSE si se especifica un error_type
erróneo, si no TRUE.
Ejemplo #1 Ejemplo de trigger_error()
Véase set_error_handler() para un ejemplo más extenso.
<?php
if ($divisor == 0) {
trigger_error("No se puede dividir por cero", E_USER_ERROR);
}
?>
Las entidades HTML en error_msg no son
escapadas. Use htmlentities() en el mensaje si
el error se va a mostrar en un navegador.
Esta función es un alias de: trigger_error().
La extensión htscanner proporciona el uso de archivos similares a htaccess en la configuración de PHP por directorio, como si tratase de los archivos htaccess de Apache. Esto es útil con fastcgi (ISS5/6/7, lighttpd, etc.).
PHP versión 5.2.0 o superior.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/htscanner
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
| Nombre | Por defecto | Cambiable | Changelog |
|---|---|---|---|
| htscanner.config_file | ".htscanner" | PHP_INI_SYSTEM | |
| htscanner.default_docroot | "/" | PHP_INI_SYSTEM | |
| htscanner.default_ttl | "300" | PHP_INI_SYSTEM | |
| htscanner.stop_on_error | "Off" | PHP_INI_SYSTEM |
He aquí una breve explicación de las directivas de configuración.
htscanner.config_file
string
Nombre para el archivo de configuración.
htscanner.default_docroot
string
Documentación de root por omisión.
htscanner.default_ttl
int
Tiempo de cache para la configuración de los datos, en segundos.
htscanner.stop_on_error
int
Parar los errores (parse error, no puede ser establecido en ini).
Esta extensión no tiene ningún tipo de recurso definido.
Hace un seguimiento y copia la jerarquía de las inclusiones de archivos y la herencia de clases en tiempo de ejecución.
Los archivos pueden haber sido incluidos usando include, include_once, require, o require_once.
Las dependencias de la herencia de clases también son comunicadas.
PHP versión 5.1.0 o posterior.
El archivo gengraph.php incluido utiliza la biblioteca » graphviz, aunque no es necesaria.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/inclued
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| inclued.enabled | Off | PHP_INI_SYSTEM | |
| inclued.dumpdir | NULL |
PHP_INI_SYSTEM |
He aquí una breve explicación de las directivas de configuración.
inclued.enabled
bool
Si habilitar o no inclued.
inclued.dumpdir
string
Ubicación (ruta) del directorio que almacena archivos inclued. Si está establecido, cada petición de PHP creará un archivo. Estos archivos son versiones serializadas de lo que inclued_get_data() produciría, por lo que pueden ser deserializados con unserialize().
Ya que cada petición crea un archivo, ¡este directorio se puede llenar rápidamente!
Esta extensión no tiene ningún tipo de recurso definido.
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
Esta extensión no tiene ninguna constante definida.
Este ejemplo muestra el proceso de implementar inclued en una apliación existente, viendo los resultados.
Ejemplo #1 Obtener la información dentro de la aplicación misma de PHP (función)
<?php
// Archivo donde almacenar la información de inclued
$fp = fopen('/tmp/wp.ser', 'w');
if ($fp) {
$clue = inclued_get_data();
if ($clue) {
fwrite($fp, serialize($clue));
}
fclose($fp);
}
?>
Ahora que existe alguna información es hora de hacer que tenga sentido en la forma de un gráfico. La extension inclued incluye un archivo PHP llamado gengraph.php que crea un archivo dot que requiere la biblioteca » graphviz. Sin embargo, en esta forma no se requiere.
Ejemplo #2 Ejemplo de uso de gengraph.php
Este ejemplo crea una imagen llamada inclued.png que muestra la información de inclued.
# Primero, creamos el archivo dot $ php graphviz.php -i /tmp/wp.ser -o wp.dot # Lo siguiente, creamos la imagen $ dot -Tpng -o inclued.png wp.dot
Ejemplo #3 Listar información mediante volcados (configuración)
Cuando se usa la directiva inclued.dumpdir, los archivos (incluidos rastros) son volcados con cada petición. Aquí hay una manera de listar esos archivos, y deserializarlos (unserialize()).
<?php
$ruta = ini_get('inclued.dumpdir');
if ($ruta && is_dir($ruta)) {
echo "Ruta: $ruta", PHP_EOL;
$inclues = new GlobIterator($ruta . DIRECTORY_SEPARATOR . 'inclued*');
if ($inclues->count() === 0) {
echo 'No hay rastros hoy', PHP_EOL;
exit;
}
foreach ($inclues as $inclue) {
echo 'Archivo inclued: ', $inclue->getFilename(), PHP_EOL;
$data = file_get_contents($inclue->getPathname());
if ($data) {
$inc = unserialize($data);
echo ' -- nombre de archivo: ', $inc['request']['SCRIPT_FILENAME'], PHP_EOL;
echo ' -- número de inclusiones: ', count($inc['includes']), PHP_EOL;
}
echo PHP_EOL;
}
} else {
echo 'Hoy estoy lleno de rastros.', PHP_EOL;
}
?>
El resultado del ejemplo sería algo similar a:
Ruta: /tmp/inclued Archivo inclued: inclued.56521.1 -- nombre de archivo: /Users/philip/test.php -- número de inclusiones: 1 Archivo inclued: inclued.56563.1 -- nombre de archivo: /tmp/none.php -- número de inclusiones: 0 Archivo inclued: inclued.56636.1 -- nombre de archivo: /tmp/three.php -- número de inclusiones: 3
(PECL inclued >= 0.1.0)
inclued_get_data — Obtener la información de inclued
Obtiene la información de inclued.
Esta función no tiene parámetros.
La información de inclued.
Ejemplo #1 Ejemplo de inclued_get_data()
Véase la sección ejemplos de inclued para obtener maneras de crear gráficos con esta información.
<?php
include 'x.php';
$clue = inclued_get_data();
print_r($clue);
?>
El resultado del ejemplo sería algo similar a:
Array
(
[includes] => Array
(
[0] => Array
(
[operation] => include
[op_type] => 2
[filename] => x.php
[opened_path] => /tmp/x.php
[fromfile] => /tmp/z.php
[fromline] => 2
)
)
)
El propósito de esta extensión es detectar los scripts y las funciones más ávidos de memoria.
memtrack rastrea el consumo de memoria de los scripts de PHP y produce informes (warnings) cuando el consumo alcanza ciertos niveles establecidos por el usuario. Esto se lleva a cabo reemplazando la función ejecutora predeterminada por una función especial que compara el uso de memoria antes y después de ejecutar el ejecutor original - de esta manera se puede indicar cuánto ha cambiado el uso de memoria durante la ejecución de la parte actual del código.
El Motor Zend ejecuta su ejecutor para cada matriz de código de operaciones (op_array), que normalmente significa una función, un script plano, y tal, por lo que memtrack no tiene ningún efecto notable en el rendimiento.
memtrack no proporciona ninguna función, sólo existen directivas INI que permiten configurar la forma de su funcionamiento.
Esta extensión es EXPERIMENTAL. Esto significa que el comportamiento de esta extensión, los nombre de sus funciones y en definitiva TODO lo documentado sobre esta extensión, puede cambiar en una futura versión de PHP SIN AVISO. La advertencia queda hecha, y utilizar esta extensión queda bajo su propia responsabilidad.
No se requiere de ninguna biblioteca externa para compilar esta extensión.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/memtrack
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
| Nombre | Por defecto | Cambiable |
|---|---|---|
| memtrack.enabled | "0" | PHP_INI_SYSTEM |
| memtrack.soft_limit | "0" | PHP_INI_ALL |
| memtrack.hard_limit | "0" | PHP_INI_ALL |
| memtrack.vm_limit | "0" | PHP_INI_ALL |
| memtrack.ignore_functions | "" | PHP_INI_SYSTEM |
He aquí una breve explicación de las directivas de configuración.
memtrack.enabled
boolean
Habilita o deshabilita la extensión. El valor predeterminado es 0, es decir, deshabilitado.
memtrack.soft_limit
int
Límite suave de memoria.
La extensión verifica el consumo de memoria antes y después de la ejecución de un op_array y produce una advertencia si la diferencia entre los dos valores es igual o mayor que el límite suave, pero sólo si la función no es ignorada.
Al establecer esta opción a 0 también deshabilita las advertencias suaves y duras. El valor predeterminado es 0, es decir, no se producen advertencias.
memtrack.hard_limit
int
Límite duro de memoria.
La extensión verifica el consumo de memoria antes y después de la ejecución de un op_array y produce una advertencia si la diferencia entre los dos valores es igual o mayor que el límite duro, incluso si la función es ignorada. EStablecer esta opción a 0 deshabilita las advertencias de límite duro completamente. El valor predeterminado es 0, es decir, no se porducen advertencias de límite duro.
memtrack.vm_limit
int
Límite de memoria virtual (establecido en un proceso).
Este límite sólo se comprueba al cierre y se produce una advertencia si el valor es mayor o igual que el límite.
Esta función sólo está soportada actualmente en sistemas operativos donde está disponible la función mallinfo() (esto es, Linux).
memtrack.ignore_functions
string
Una lista de funciones separada por comas o espacios en blanco que son ingoradas por soft_limit. Los valores son insensibles a mayúsculas-minúsculas, para métodos de clase use la sintasix clase::método.
Esta extensión no tiene ningún tipo de recurso definido.
Esta extensión no tiene ninguna constante definida.
Ejemplo básico del uso de la extension memtrack:
Ejemplo #1 Crear una matriz grande en una función
<?php
/* /tmp/ejemplo1.php */
function foo() {
$a = array();
for ($i = 0; $i < 10000; $i++) $a[] = "test";
return $a;
}
$arr = foo();
?>
Ejecutar el ejemplo con el siguiente comando:
php -d memtrack.enabled=1 -d memtrack.soft_limit=1M -d memtrack.vm_limit=3M /tmp/ejemplo1.php
El resultado del ejemplo sería algo similar a:
Warning: [memtrack] [pid 26177] user function foo() executed in /tmp/ejemplo1.php on line 10 allocated 4194304 bytes in /tmp/ejemplo1.php on line 0 Warning: [memtrack] [pid 26177] virtual memory usage on shutdown: 32911360 bytes in Unknown on line 0
The Output Control functions allow you to control when output is sent from the script. This can be useful in several different situations, especially if you need to send headers to the browser after your script has began outputting data. The Output Control functions do not affect headers sent using header() or setcookie(), only functions such as echo and data between blocks of PHP code.
Nota:
When upgrading from PHP 4.1.x (and 4.2.x) to 4.3.x due to a bug in earlier versions you must ensure that implicit_flush is OFF in your php.ini, otherwise any output with ob_start() will not be hidden from output.
No se requiere de ninguna biblioteca externa para compilar esta extensión.
No se requiere de ninguna instalación para utilizar estas funciones; forman parte del núcleo de PHP.
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| output_buffering | "0" | PHP_INI_PERDIR | |
| output_handler | NULL | PHP_INI_PERDIR | Available since PHP 4.0.4. |
| implicit_flush | "0" | PHP_INI_ALL | PHP_INI_PERDIR in PHP <= 4.2.3. |
He aquí una breve explicación de las directivas de configuración.
output_buffering
boolean/integer
You can enable output buffering for all files by setting this directive to 'On'. If you wish to limit the size of the buffer to a certain size - you can use a maximum number of bytes instead of 'On', as a value for this directive (e.g., output_buffering=4096). As of PHP 4.3.5, this directive is always Off in PHP-CLI.
output_handler
string
You can redirect all of the output of your scripts to a function. For example, if you set output_handler to mb_output_handler(), character encoding will be transparently converted to the specified encoding. Setting any output handler automatically turns on output buffering.
Nota:
You cannot use both mb_output_handler() with ob_iconv_handler() and you cannot use both ob_gzhandler() and zlib.output_compression.
Nota:
Only built-in functions can be used with this directive. For user defined functions, use ob_start().
implicit_flush
boolean
FALSE by default. Changing this to TRUE tells PHP to tell the
output layer to flush itself automatically after every output block.
This is equivalent to calling the PHP function
flush() after each and every call to
print or echo and each and
every HTML block.
When using PHP within an web environment, turning
this option on has serious performance implications and is generally
recommended for debugging purposes only. This value defaults to
TRUE when operating under the CLI SAPI.
See also ob_implicit_flush().
Esta extensión no tiene ningún tipo de recurso definido.
Esta extensión no tiene ninguna constante definida.
Ejemplo #1 Output Control example
<?php
ob_start();
echo "Hello\n";
setcookie("cookiename", "cookiedata");
ob_end_flush();
?>
In the above example, the output from echo would be stored in the output buffer until ob_end_flush() was called. In the mean time, the call to setcookie() successfully stored a cookie without causing an error. (You can not normally send headers to the browser after data has already been sent.)
See also header() and setcookie().
(PHP 4, PHP 5)
flush — Vaciar el búfer de salida
Vacía los búferes de salida de PHP y de cualquiera que sea el motor que PHP esté usando (CGI, un servidor web, etc). Esto en efecto trata de enviar toda la salida acumulada hasta el momento al navegador del usuario.
flush() quizá no puede sobreescribir el esquema del búfer en su servidor web y no tiene efectos sobre el método de uso de búferes de su servidor web o del navegador en el lado del cliente. Por lo tanto es necesario llamar tanto a ob_flush() como a flush() para volcar los búferes de salida.
Varios servidores, especialmente en Win32, seguirán almacenando la salida de su script en búferes hasta que éste termine antes de transmitir los resultados al navegador.
Puede que algunos módulos de servidor para Apache como mod_gzip usen búferes propios que causarán que flush() no resulte en un envío inmediato de datos al cliente.
Incluso el navegador puede usar búferes de entrada antes de mostrar el resultado. Netscape, por ejemplo, almacena en búfer el texto hasta que recibe un final-de-línea o el comienzo de una etiqueta, y no renderiza las tablas hasta que la etiqueta </table> de la tabla más externa sea encontrada.
Algunas versiones de Microsoft Internet Explorer solo empezarán a mostrar la página después de que han recibido 256 bytes de salida, así que puede que sea necesario enviar espacios en blanco extra antes del volcado para lograr que se muestre la página en esos navegadores.
No devuelve ningún valor.
(PHP 4 >= 4.2.0, PHP 5)
ob_clean — Limpiar (eliminar) el búfer de salida
Esta función descarta los contenidos del búfer de salida.
Esta función no destruye el búfer de salida, como lo hace ob_end_clean().
No devuelve ningún valor.
(PHP 4, PHP 5)
ob_end_clean — Limpiar (eliminar) y deshabilitar los búferes de salida
Esta función descarta los contenidos del búfer de salida en cola y lo deshabilita. Si desea continuar procesando los contenidos del búfer debe llamar ob_get_contents() antes de ob_end_clean() ya que los contenidos del búfer son descartados cuando se llama ob_end_clean().
Devuelve TRUE en caso de éxito o FALSE en caso de error. Entre las posibles razones de fallo se encuentra llamar
la función sin un búfer activo, o que por algún motivo no se pueda
eliminar un búfer (posible en el caso de búferes especiales).
Si la función falla, genera un error de nivel
E_NOTICE.
| Versión | Descripción |
|---|---|
| 4.2.0 | El valor de retorno booleano fue agregado. |
El siguiente ejemplo muestra una forma sencilla de deshacerse de todos los búferes de salida:
Ejemplo #1 Ejemplo de ob_end_clean()
<?php
ob_start();
echo 'Texto que no será mostrado.';
ob_end_clean();
?>
(PHP 4, PHP 5)
ob_end_flush — Volcar (enviar) el búfer de salida y deshabilitar el uso del búfer
Esta función enviará los contenidos del búfer de salida en cola (si existe) y deshabilita este búfer. Si desea procesar los contenidos del búfer es necesario que llame ob_get_contents() antes de ob_end_flush() ya que los contenidos del búfer son descartados después de llamar ob_end_flush().
Nota: Esta función es similar a ob_get_flush(), excepto que ob_get_flush() devuelve el búfer como una cadena.
Devuelve TRUE en caso de éxito o FALSE en caso de error. Entre las posibles razones de fallo se encuentra llamar
la función sin un búfer activo, o que por algún motivo el búfer no pueda
ser eliminado (posible en el caso de búferes especiales).
Si la función falla, genera un error de nivel
E_NOTICE.
| Versión | Descripción |
|---|---|
| 4.2.0 | El valor de retorno booleano fue agregado. |
Ejemplo #1 Ejemplo de ob_end_flush()
El siguiente ejemplo muestra una forma sencilla de volcar y finalizar todos los búferes:
<?php
while (@ob_end_flush());
?>
(PHP 4 >= 4.2.0, PHP 5)
ob_flush — Vaciar (enviar) el búfer de salida
Esta función enviará los contenidos del búfer de salida (si los hay). Si desea continuar procesando los contenidos del búfer, tiene que llamar ob_get_contents() antes de ob_flush(), ya que los contenidos del búfer son descartados luego de que la función ob_flush() es llamada.
Esta función no destruye el búfer de salida, como lo hace ob_end_flush().
No devuelve ningún valor.
(PHP 4 >= 4.3.0, PHP 5)
ob_get_clean — Obtener los contenidos del búfer actual y eliminar el búfer de salida actual
Obtiene los contenidos del búfer actual y elimina el búfer de salida actual.
ob_get_clean() básicamente ejecuta tanto ob_get_contents() como ob_end_clean().
Devuelve los contenidos del búfer de salida y finaliza el control de
salida mediante búferes. Si el control de salida con búferes no está
activo, entonces se devuelve FALSE.
Ejemplo #1 Un ejemplo simple de ob_get_clean()
<?php
ob_start();
echo "Hola Mundo";
$salida = ob_get_clean();
$salida = strtolower($salida);
var_dump($salida);
?>
El resultado del ejemplo sería:
string(10) "hola mundo"
(PHP 4, PHP 5)
ob_get_contents — Devolver el contenido del búfer de salida
Obtiene los contenidos del búfer de salida, sin borrarlo.
Devolverá los contenidos del búfer de salida o FALSE, si no está activo
el uso del búfer de salida.
Ejemplo #1 Un ejemplo sencillo de ob_get_contents()
<?php
ob_start();
echo "Hola ";
$salida1 = ob_get_contents();
echo "Mundo";
$salida2 = ob_get_contents();
ob_end_clean();
var_dump($salida1, $salida2);
?>
El resultado del ejemplo sería:
string(5) "Hola " string(10) "Hola Mundo"
(PHP 4 >= 4.3.0, PHP 5)
ob_get_flush — Volcar el búfer de salida, devolverlo como una cadena y deshabilitar el uso de búferes de salida
ob_get_flush() vuelca el búfer de salida, lo devuelve como una cadena y deshabilita el uso de búferes de salida.
Nota: Esta función es similar a ob_end_flush(), excepto que esta función devuelve el búfer como una cadena.
Devuelve el búfer de salida o FALSE si el uso de búferes no está
activo.
Ejemplo #1 Ejemplo de ob_get_flush()
<?php
//usando output_buffering=On
print_r(ob_list_handlers());
//guardar búfer en un archivo
$bufer = ob_get_flush();
file_put_contents('bufer.txt', $bufer);
print_r(ob_list_handlers());
?>
El resultado del ejemplo sería:
Array
(
[0] => default output handler
)
Array
(
)
(PHP 4 >= 4.0.2, PHP 5)
ob_get_length — Devolver la longitud del búfer de salida
Esta función devolverá la longitud de los contenidos en el búfer de salida.
Devuelve la longitud de los contenidos del búfer de salida o FALSE si
no está activo el uso de búferes de salida.
Ejemplo #1 Un ejemplo sencillo de ob_get_length()
<?php
ob_start();
echo "Hola ";
$lon1 = ob_get_length();
echo "Mundo";
$lon2 = ob_get_length();
ob_end_clean();
echo $lon1 . ", ." . $lon2;
?>
El resultado del ejemplo sería:
5, 10
(PHP 4 >= 4.2.0, PHP 5)
ob_get_level — Devolver el nivel de anidamiento del mecanismo de búferes de salida
Devuelve el nivel de anidamiento del mecanismo de búferes de salida.
Devuelve el nivel de gestores de búferes de control anidados o cero si el uso de búferes de salida se encuentra desactivado.
(PHP 4 >= 4.2.0, PHP 5)
ob_get_status — Obtener el status de los búferes de salida
$full_status = FALSE
] )
ob_get_status() devuelve información sobre el búfer de
salida de nivel superior, o sobre todos los niveles activos de búferes de
salida si status_completo es definido como TRUE.
full_status
TRUE para devolver todos los niveles de búferes de salida activos.
Si su valor es FALSE o no es definido, solo es devuelto el nivel
más alto de búferes de salida.
Si esta función es llamada sin es parámetro
status_completo, o con
status_completo = FALSE, una simple matriz con
los siguientes elementos es devuelta:
Array
(
[level] => 2
[type] => 0
[status] => 0
[name] => URL-Rewriter
[del] => 1
)
Si se llama con status_completo = TRUE, se
devuelve una matriz con un elemento por cada nivel de búfer de salida
activo. El nivel de salida es usado como la clave de la matriz de nivel
superior, y cada elemento como tal es otra matriz que contiene
información de status sobre un nivel de salida activo.
Array
(
[0] => Array
(
[chunk_size] => 0
[size] => 40960
[block_size] => 10240
[type] => 1
[status] => 0
[name] => default output handler
[del] => 1
)
[1] => Array
(
[chunk_size] => 0
[size] => 40960
[block_size] => 10240
[type] => 0
[buffer_size] => 0
[status] => 0
[name] => URL-Rewriter
[del] => 1
)
)
La salida completa contiene los siguientes elementos adicionales:
(PHP 4 >= 4.0.4, PHP 5)
ob_gzhandler — ob_start callback function to gzip output buffer
$buffer
, int $mode
)
ob_gzhandler() is intended to be used as a callback
function for ob_start() to help facilitate sending
gz-encoded data to web browsers that support compressed web pages.
Before ob_gzhandler() actually sends compressed data,
it determines what type of content encoding the browser will accept
("gzip", "deflate" or none at all) and will return its output accordingly.
All browsers are supported since it's up to the browser to send the
correct header saying that it accepts compressed web pages. If a browser
doesn't support compressed pages this function returns FALSE.
buffer
mode
| Versión | Descripción |
|---|---|
| 4.0.5 |
The mode parameter was added.
|
Ejemplo #1 ob_gzhandler() example
<?php
ob_start("ob_gzhandler");
?>
<html>
<body>
<p>This should be a compressed page.</p>
</body>
</html>
Nota:
ob_gzhandler() requires the zlib extension.
Nota:
You cannot use both ob_gzhandler() and zlib.output_compression. Also note that using zlib.output_compression is preferred over ob_gzhandler().
(PHP 4, PHP 5)
ob_implicit_flush — Habilitar/deshabilitar el volcado implícito
$flag = true
] )ob_implicit_flush() habilitará o deshabilitará el volcado implícito. El volcado implícito resultará en una operación de volcado después de cada llamada que produzca salida, de modo que no son necesarias las llamadas explícitas a flush().
flag
TRUE para habilitar el volcado implícito, FALSE de lo contrario.
No devuelve ningún valor.
(PHP 4 >= 4.3.0, PHP 5)
ob_list_handlers — Listar todos los gestores de salida en uso
Lista todos los gestores de salida en uso.
Esta función devolverá una matriz con los gestores de salida en uso (si existen). Si output_buffering está habilitado o una función anónima fue usada con ob_start(), ob_list_handlers() devolverá "default output handler" (gestor de salida predeterminado).
Ejemplo #1 Ejemplo de ob_list_handlers()
<?php
//usando output_buffering=On
print_r(ob_list_handlers());
ob_end_flush();
ob_start("ob_gzhandler");
print_r(ob_list_handlers());
ob_end_flush();
// funciones anónimas
ob_start(create_function('$cadena', 'return $cadena;'));
print_r(ob_list_handlers());
ob_end_flush();
?>
El resultado del ejemplo sería:
Array
(
[0] => default output handler
)
Array
(
[0] => ob_gzhandler
)
Array
(
[0] => default output handler
)
(PHP 4, PHP 5)
ob_start — Turn on output buffering
This function will turn output buffering on. While output buffering is active no output is sent from the script (other than headers), instead the output is stored in an internal buffer.
The contents of this internal buffer may be copied into a string variable using ob_get_contents(). To output what is stored in the internal buffer, use ob_end_flush(). Alternatively, ob_end_clean() will silently discard the buffer contents.
Some web servers (e.g. Apache) change the working directory of a script when calling the callback function. You can change it back by e.g. chdir(dirname($_SERVER['SCRIPT_FILENAME'])) in the callback function.
Output buffers are stackable, that is, you may call ob_start() while another ob_start() is active. Just make sure that you call ob_end_flush() the appropriate number of times. If multiple output callback functions are active, output is being filtered sequentially through each of them in nesting order.
output_callback
An optional output_callback function may be
specified. This function takes a string as a parameter and should
return a string. The function will be called when
the output buffer is flushed (sent) or cleaned (with
ob_flush(), ob_clean() or similar
function) or when the output buffer
is flushed to the browser at the end of the request. When
output_callback is called, it will receive the
contents of the output buffer as its parameter and is expected to
return a new output buffer as a result, which will be sent to the
browser. If the output_callback is not a
callable function, this function will return FALSE.
If the callback function has two parameters, the second parameter is
filled with a bit-field consisting of
PHP_OUTPUT_HANDLER_START,
PHP_OUTPUT_HANDLER_CONT and
PHP_OUTPUT_HANDLER_END.
If output_callback returns FALSE original
input is sent to the browser.
The output_callback parameter may be bypassed
by passing a NULL value.
ob_end_clean(), ob_end_flush(), ob_clean(), ob_flush() and ob_start() may not be called from a callback function. If you call them from callback function, the behavior is undefined. If you would like to delete the contents of a buffer, return "" (a null string) from callback function. You can't even call functions using the output buffering functions like print_r($expression, true) or highlight_file($filename, true) from a callback function.
Nota:
In PHP 4.0.4, ob_gzhandler() was introduced to facilitate sending gz-encoded data to web browsers that support compressed web pages. ob_gzhandler() determines what type of content encoding the browser will accept and will return its output accordingly.
chunk_size
If the optional parameter chunk_size is passed, the
buffer will be flushed after any output call which causes the buffer's
length to equal or exceed chunk_size. The default
value 0 means that the output function will only be
called when the output buffer is closed.
Prior to PHP 5.4.0, the value 1 was a special case value that set the chunk size to 4096 bytes.
erase
If the optional parameter erase is set to FALSE,
the buffer will not be deleted until the script finishes.
This causes that flushing and cleaning functions would issue a notice
and return FALSE if called.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
| Versión | Descripción |
|---|---|
| 5.4.0 | A chunk size of 1 now results in chunks of 1 byte being sent to the output buffer. |
| 4.3.2 |
This function was changed to return FALSE in case the passed
output_callback can not be executed.
|
| 4.2.0 |
Added the erase parameter.
|
Ejemplo #1 User defined callback function example
<?php
function callback($buffer)
{
// replace all the apples with oranges
return (str_replace("apples", "oranges", $buffer));
}
ob_start("callback");
?>
<html>
<body>
<p>It's like comparing apples to oranges.</p>
</body>
</html>
<?php
ob_end_flush();
?>
El resultado del ejemplo sería:
<html> <body> <p>It's like comparing oranges to oranges.</p> </body> </html>
(PHP 4 >= 4.3.0, PHP 5)
output_add_rewrite_var — Add URL rewriter values
$name
, string $value
)This function adds another name/value pair to the URL rewrite mechanism. The name and value will be added to URLs (as GET parameter) and forms (as hidden input fields) the same way as the session ID when transparent URL rewriting is enabled with session.use_trans_sid. Please note that absolute URLs (http://example.com/..) aren't rewritten.
This function's behavior is controlled by the url_rewriter.tags php.ini parameter.
Nota: Calling this function will implicitly start output buffering if it is not active already.
name
The variable name.
value
The variable value.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 output_add_rewrite_var() example
<?php
output_add_rewrite_var('var', 'value');
// some links
echo '<a href="file.php">link</a>
<a href="http://example.com">link2</a>';
// a form
echo '<form action="script.php" method="post">
<input type="text" name="var2" />
</form>';
print_r(ob_list_handlers());
?>
El resultado del ejemplo sería:
<a href="file.php?var=value">link</a>
<a href="http://example.com">link2</a>
<form action="script.php" method="post">
<input type="hidden" name="var" value="value" />
<input type="text" name="var2" />
</form>
Array
(
[0] => URL-Rewriter
)
(PHP 4 >= 4.3.0, PHP 5)
output_reset_rewrite_vars — Reestablecer los valores del mecanismo de re-escritura de URLs
Esta función reestablece el mecanismo de re-escritura de URLs y remueve todas las variables de re-escritura definidas previamente por la función output_add_rewrite_var() o el mecanismo de sesiones (si session.use_trans_sid fue definido en session_start()).
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de output_reset_rewrite_vars()
<?php
session_start();
output_add_rewrite_var('var', 'valor');
echo '<a href="archivo.php">enlace</a>';
ob_flush();
output_reset_rewrite_vars();
echo '<a href="archivo.php">enlace</a>';
?>
El resultado del ejemplo sería:
<a href="archivo.php?PHPSESSID=xxx&var=valor">enlace</a> <a href="archivo.php">enlace</a>
El propósito de esta extensión es pertimir la sobrecarga de acceso a las propiedades de un objeto y llamádas a métodos. Sólo está definida una función en esta extensión, overload(), la cuál toma el nombre de la clase que debería tener esta funcionalidad habilitada. La clase nombrada tiene que definir métodos apropiados si se quiere tener esta funcionalidad: __get(), __set() y __call() respectivamente para obtener/establecer una propiedad, o llamar a un método. Esta manera de sobrecarga puede ser selectiva. Dentro de estas funciones de gestión la sobrecarga está deshabilitada, por lo que se puede acceder a la propiedades del objeto de forma normal.
Esta extensión es EXPERIMENTAL. Esto significa que el comportamiento de esta extensión, los nombre de sus funciones y en definitiva TODO lo documentado sobre esta extensión, puede cambiar en una futura versión de PHP SIN AVISO. La advertencia queda hecha, y utilizar esta extensión queda bajo su propia responsabilidad.
Esta extensión no es parte de PHP 5. PHP 5 soporta __get(), __set() y __call() de forma nativa. Véase la página Sobrecarga en PHP 5 para más información.
No se requiere de ninguna biblioteca externa para compilar esta extensión.
Para usar estas funciones se debe compilar PHP con la opción --enable-overload . Desde PHP 4.3.0 esta extensión está habilitada por defecto. Se puede deshabilitar el soporte para la sobrecarga con --disable--overload .
La versión de PHP para Windows tiene soporte nativo para esta extensión. No se requiere cargar extensiones adicionales para utilizar estas funciones.
Nota: El soporte interno para la sobrecarga está disponible con PHP 4.3.0.
Esta extensión no tiene directivas de configuración definidas en php.ini.
Esta extensión no tiene ningún tipo de recurso definido.
Esta extensión no tiene ninguna constante definida.
Algunos ejemplos sencillos sobre el uso de la función overload():
Ejemplo #1 Sobrecargar una clase de PHP
<?php
class OO {
var $a = 111;
var $elem = array('b' => 9, 'c' => 42);
// Método de llamada de retorno para obtener una propiedad
function __get($nombre_prop, &$valor_prop)
{
if (isset($this->elem[$nombre_prop])) {
$valor_prop = $this->elem[$nombre_prop];
return true;
} else {
return false;
}
}
// Método de llamada de retorno para establecer una propiedad
function __set($nombre_prop, $valor_prop)
{
$this->elem[$nombre_prop] = $valor_prop;
return true;
}
}
// Aquí sobrecargamos el objeto OO
overload('OO');
$o = new OO;
echo "\$o->a: $o->a\n"; // imprime: $o->a: 111
echo "\$o->b: $o->b\n"; // imprime: $o->b: 9
echo "\$o->c: $o->c\n"; // imprime: $o->c: 42
echo "\$o->d: $o->d\n"; // imprime: $o->d:
// añadir un nuevo elemento a la matriz $elem de OO
$o->x = 56;
// instanciar stdclass (está incluido en PHP 4)
// ¡$val no está sobrecargada!
$val = new stdclass;
$val->prop = 555;
// Establecer "a" para que sea una matriz con el objeto $val en él
// Pero __set() pondrá esto en la matriz $elem
$o->a = array($val);
var_dump($o->a[0]->prop);
?>
(PHP 4 >= 4.3.0)
overload — Habilita la sobrecarga de una propiedad y una llamda a un método de una clase
$class_name
)
La función overload() habiltará la sobrecarga de una propiedad y una llamada
a un método de una clase identificada mediante class_name.
class_name
El nombre de la clase sobrecargada, como cadena
No devuelve ningún valor.
Vea un ejemplo en la sección de introducción de esta parte.
Estas funciones permiten obtener mucha información sobre PHP, por ej. configuración en tiempo de ejecución, extensiones en uso, versión y mucho más. También se pueden encontrar funciones para definir opciones al ejecutar PHP. Aquí se encuentra la función más conocida de PHP probablemente - phpinfo() -.
No se requiere de ninguna biblioteca externa para compilar esta extensión.
No se requiere de ninguna instalación para utilizar estas funciones; forman parte del núcleo de PHP.
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| assert.active | "1" | PHP_INI_ALL | |
| assert.bail | "0" | PHP_INI_ALL | |
| assert.warning | "1" | PHP_INI_ALL | |
| assert.callback | NULL | PHP_INI_ALL | |
| assert.quiet_eval | "0" | PHP_INI_ALL | |
| enable_dl | "1" | PHP_INI_SYSTEM | Esta característica obsoleta será eliminada con certeza en el futuro. |
| max_execution_time | "30" | PHP_INI_ALL | |
| max_input_time | "-1" | PHP_INI_PERDIR | Disponible desde PHP 4.3.0. |
| max_input_nesting_level | "64" | PHP_INI_PERDIR | Disponible desde PHP 4.4.8. y PHP 5.2.3. |
| max_input_vars | 1000 | PHP_INI_PERDIR | Available since PHP 5.3.9. |
| magic_quotes_gpc | "1" | PHP_INI_PERDIR | PHP_INI_ALL en PHP <= 4.2.3. Eliminado en PHP 5.4.0 |
| magic_quotes_runtime | "0" | PHP_INI_ALL | Eliminado en PHP 5.4.0 |
| zend.enable_gc | "1" | PHP_INI_ALL | Disponible desde PHP 5.3.0. |
He aquí una breve explicación de las directivas de configuración.
assert.active
boolean
Activa evaluación de aserciones().
assert.bail
boolean
Terminar la ejecución del script si falla una aserción.
assert.warning
boolean
Lanza un PHP warning for cada aserción que falle.
assert.callback
string
Función de usuario a llamar cuando fallen las aserciones.
assert.quiet_eval
boolean
Usar la configuración actual de error_reporting() durante las expresiones de evaluación de aserciones. Si está habilitado, no se mostrarán errores (incondicional error_reporting(0)) durante evaluación. Si está deshabitado, se mostrarán errores según la configuración de error_reporting()
enable_dl
boolean
Esta directiva es muy útil solamente en la versión PHP con el módulo Apache. Se puede activar o desactivar la carga dinámica de extensiones PHP con dl() por servidor virtual o directorio.
La razón principal para desactivar la carga dinámica es por seguridad. Con la carga dinámica, es posible ignorar todas las restricciones open_basedir. De forma predeterminada se permite la carga dinámica excepto cuando se usa safe mode. En safe mode, es imposible usar dl().
max_execution_time
integer
Este valor establece el tiempo máximo en segundos que se permite ejecutar antes de que el analizador termine. Esto ayuda a prevenir que scripts mal escritos bloqueen el servidor. El valor por defecto es 30. Cuando se ejecuta PHP desde la línea de comandos el valor por defecto es 0.
El tiempo de ejecución máxima no está afectada por llamadas al sistema, operaciones de stream etc. Por favor véase la función set_time_limit() para más información.
No se puede cambiar esta opción con ini_set() cuando se ejecuta en safe mode. La única manera es desactivar safe mode o cambiando el límite en php.ini.
El servidor web puede tener otras configuraciones de tiempo de espera que quizá interrumpan la ejecución de PHP. Apache tiene la directiva Timeout y IIS tiene la función CGI timeout. Las dos de 300 segundos por omisión. Véase la documentación del servidor web para información específica.
max_input_time
integer
Establece el tiempo máximo en segundos que se permite a un script analizar datos de entrada, como POST, GET. Se mide desde el momento de recepción de todos los datos en el servidor hasta el inicio de la ejecución del script.
max_input_nesting_level
integer
Establece el máximo de profundidad de anidamiento para variables de entrada (p.ej. $_GET, $_POST..)
max_input_vars
integer
Cuantas variables
de entrada pueden ser aceptadas. El uso de esta directiva mitiga
la posibilidad de ataques de denegación de servicio que utilizan colisiones
de hash. Si hay más variables de entrada que las especificadas por la
presente directiva, un E_WARNING es emitido, y otras
variables entrada son truncadas a partir de la solicitud. Este límite sólo
se aplica a cada nivel de anidamiento de un array de entrada multi-dimensional.
magic_quotes_gpc
boolean
Esta característica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP 5.4.0.
Establece las magic_quotes state para operaciones GPC (Get/Post/Cookie). Cuando las magic_quotes están activadas, todas las ' (comillas simples), " (comillas dobles), \ (barra invertida) y NUL's son escapados con una barra invertida de forma automática..
Nota:
En PHP 4, también las variables $_ENV son escapadas.
Nota:
Si la directiva magic_quotes_sybase también está activada sobrescribirá completamente magic_quotes_gpc. Tener las dos directivas habilitadas significa que solamente las comillas simples son escapadas como ''. Comillas dobles, barras invertidas y NUL's permanecerán igual sin ser escapadas.
Ver también get_magic_quotes_gpc()
magic_quotes_runtime
boolean
Esta característica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP 5.4.0.
Si magic_quotes_runtime está activado,
la mayoría de funciones que devuelven datos desde cualquier tipo de
recurso externo incluyendo bases de datos y ficheros de texto contendrán
comillas escapadas con barras invertidas. Si
magic_quotes_sybase
también está habilidado, las comillas simples serán escapadas con comillas simples en
lugar de barras invertidas.
Funciones afectadas por magic_quotes_runtime
(no incluye funciones de PECL):
zend.enable_gc
boolean
Habilita o deshabilita el colector de referencia circular.
Esta extensión no tiene ningún tipo de recurso definido.
Estas constantes están disponibles siempre ya que forman parte del núcleo de PHP.
| Constante | Valor | Descripción |
|---|---|---|
CREDITS_GROUP |
1 | Lista de los desarrolladores del núcleo |
CREDITS_GENERAL |
2 | Créditos generales: Diseño del lenguaje y concepto, autores de PHP y módulos SAPI. |
CREDITS_SAPI |
4 | Lista de los módulos API para PHP y sus autores. |
CREDITS_MODULES |
8 | Lista de los módulos de extensión para PHP y sus autores. |
CREDITS_DOCS |
16 | Los créditos del equipo de documentación. |
CREDITS_FULLPAGE |
32 | Normalmente se utiliza en combiación con otras opciones.Indica que una página HTML independiente debe ser mostrada incluyendo la información indicada por otras opciones. |
CREDITS_QA |
64 | Los créditos del equipo de testers. |
CREDITS_ALL |
-1 | Todos los créditos, es equivalente a usar: CREDITS_DOCS + CREDITS_GENERAL + CREDITS_GROUP + CREDITS_MODULES + CREDITS_QA CREDITS_FULLPAGE. Genera una página HTML independiente con las apropiadas etiquetas. Este es el valor por defecto. |
| Constante | Valor | Descripción |
|---|---|---|
INFO_GENERAL |
1 | La línea de comandos de configuración, php.ini ruta, fecha del build, servidor Web, sistema y demás. |
INFO_CREDITS |
2 | Créditos de PHP. Ver también phpcredits(). |
INFO_CONFIGURATION |
4 | Valores locales y maestros actuales para directivas PHP. Ver también ini_get(). |
INFO_MODULES |
8 | Módulos cargados y sus respectivas opciones. |
INFO_ENVIRONMENT |
16 | Información de variables de entorno, también está disponible en $_ENV. |
INFO_VARIABLES |
32 | Muestra todas las variables predefinidas desde EGPCS (Entorno, GET, POST, Cookie, Server). |
INFO_LICENSE |
64 | Información de la licencia de PHP. Ver también » FAQ de la licencia. |
INFO_ALL |
-1 | Muestra todas las directivas que se han indicado hasta ahora. Este es el valor por defecto. |
| Constante | Valor | Descripción |
|---|---|---|
| INI_USER | 1 | Sin uso |
| INI_PERDIR | 2 | Sin uso |
| INI_SYSTEM | 4 | Sin uso |
| INI_ALL | 7 | Sin uso |
Constantes de aserción, estos valores se usan para definir opciones de aserción en assert_options().
| Constante | Opción INI | Descripción |
|---|---|---|
ASSERT_ACTIVE |
assert.active | Habilita la evaluación de assert(). |
ASSERT_CALLBACK |
assert.callback | Llamada de retorno a llamar en caso que falle la aserción. |
ASSERT_BAIL |
assert.bail | Terminar la ejecucción al finalizar aserciones. |
ASSERT_WARNING |
assert.warning | Genera un warning PHP por cada aserción que falle |
ASSERT_QUIET_EVAL |
assert.quiet_eval | Desactiva error_reporting durante la evaluación de expresiones de aserción. |
Las siguientes constantes están disponibles únicamente si se está ejecutando el sistema operativo Windows y muestran información sobre las diferentes versiones. Esto hace posible el detectar determinadas características para poder hacer uso de ellas. Disponibles desde PHP 5.3.0.
| Constante | Descripción |
|---|---|
PHP_WINDOWS_VERSION_MAJOR |
El número mayor de la versión de Windows, que puede tener el valor 4 (NT4/Me/98/95), 5 (XP/2003 R2/2003/2000) o 6 (Vista/2008). |
PHP_WINDOWS_VERSION_MINOR |
El número menor de la versión de Windows, que puede tener el valor 0 (Vista/2008/2000/NT4/95), 1 (XP), 2 (2003 R2/2003/XP x64), 10 (98) o 90 (ME). |
PHP_WINDOWS_VERSION_BUILD |
El número del build de Windows (por ejemplo, Windows Vista con SP1 sería el build número 6001) |
PHP_WINDOWS_VERSION_PLATFORM |
La plataforma en la que PHP se está ejecutando, su valor es 2 en Windows Vista/XP/2000/NT4, Server 2008/2003 y en Windows ME/98/95 su valor es 1. |
PHP_WINDOWS_VERSION_SP_MAJOR |
El número mayor de la versión del service pack instalado, su valor es 0 si no hay ningún service pack instalado. Por ejemplo, Windows XP con service pack 3 instalado hará que el valor sea 3. |
PHP_WINDOWS_VERSION_SP_MINOR |
El número menor de la versión del service pack instalado, su valor es 0 si no hay ningún service pack instalado. |
PHP_WINDOWS_VERSION_SUITEMASK |
El suitemask es una máscara de bits que puede indicar si determinadas características de Windows están instaladas, consulte la siguiente tabla para ver los diferentes valores del campo de bits. |
PHP_WINDOWS_VERSION_PRODUCTTYPE |
Contiene el valor usado para determinar las constantes PHP_WINDOWS_NT_*. Este valor puede ser una de las constantes PHP_WINDOWS_NT_* que indica el tipo de sistema que se está usando. |
PHP_WINDOWS_NT_DOMAIN_CONTROLLER |
El controlador de dominio |
PHP_WINDOWS_NT_SERVER |
El servidor del sistema (ej. Server 2008/2003/2000), observe que si es un
controlador de dominio será informado como PHP_WINDOWS_NT_DOMAIN_CONTROLLER.
|
PHP_WINDOWS_NT_WORKSTATION |
Es una estación de trabajo (pej. Vista/XP/2000/NT4) |
Esta tabla muestra una lista de características que pueden ser comprobadas al usar
la máscara de bits PHP_WINDOWS_VERSION_SUITEMASK.
| Bits | Descripción |
|---|---|
| 0x00000004 | Los componentes de Microsoft BackOffice están instalados. |
| 0x00000400 | Windows Server 2003, Web Edition está instalado. |
| 0x00004000 | Windows Server 2003, Compute Cluster Edition está instalado. |
| 0x00000080 | Windows Server 2008 Datacenter, Windows Server 2003, Datacenter Edition o Windows 2000 Datacenter Server está instalado. |
| 0x00000002 | Windows Server 2008 Enterprise, Windows Server 2003, Enterprise Edition, Windows 2000 Advanced Server, o Windows NT Server 4.0 Enterprise Edition está instalado. |
| 0x00000040 | Windows XP Embedded está instalado. |
| 0x00000200 | Windows Vista Home Premium, Windows Vista Home Basic, o Windows XP Home Edition está instalado. |
| 0x00000100 | Escritorio remoto habilitado, limitado a una sesión interactiva. Este valor está definido a no ser que el sistema se ejecute en modo de servidor de aplicaciones. |
| 0x00000001 | Microsoft Small Business Server fue instalado en el sistema, pero quizá ha sido actualizado a otra versión de Windows. |
| 0x00000020 | Microsoft Small Business Server está instalado con la restricción de licencia en vigor. |
| 0x00002000 | Windows Storage Server 2003 R2 o Windows Storage Server 2003 está instalado. |
| 0x00000010 | Terminal Services está instalado. Este valor siempre está definido. En caso que lo esté pero 0x00000100 no, entonces el sistema estará ejecutándose en modo de servidor de aplicaciones. |
| 0x00008000 | Windows Home Server está instalado. |
(PHP 4, PHP 5)
assert_options — Establecer/obtener valores de las directivas relacionadas con las aserciones
Se utiliza para establecer el valor de las diferentes opciones de la función assert() o consultar su valor actual.
what
| Opción | Configuración inicial | Valor predeterminado | Descripción |
|---|---|---|---|
| ASSERT_ACTIVE | assert.active | 1 | Activa la función assert() |
| ASSERT_WARNING | assert.warning | 1 | Cada vez que una aserción falla se genera una advertencia |
| ASSERT_BAIL | assert.bail | 0 | Termina la ejecución cuando falla una aserción |
| ASSERT_QUIET_EVAL | assert.quiet_eval | 0 | Desactiva la directiva error_reporting durante la evaluación de la aserción |
| ASSERT_CALLBACK | assert.callback | (NULL) |
Función que se encargará de gestionar las aserciones cuando fallen |
value
Nuevo valor para la directiva.
Devuelve el valor original de cualquiera de las opciones o FALSE en caso de error.
Ejemplo #1 Ejemplo de assert_options()
<?php
// Esta es nuestra función manejadora
// de los fallos en un aserción
function assert_failure()
{
echo 'Assert failed';
}
// Esta es nuestra función de test
function test_assert($parameter)
{
assert(is_bool($parameter));
}
// Establecemos nuestras propias opciones para gestionar las aserciones
// Activamos las aserciones
assert_options(ASSERT_ACTIVE, true);
// Si una aserción falla se detiene la ejecución
assert_options(ASSERT_BAIL, true);
// Si una aserción falla NO se genera una advertencia
assert_options(ASSERT_WARNING, false);
// Establecemos la función 'assert_failure' como manejadora (callback) de las aserciones
assert_options(ASSERT_CALLBACK, 'assert_failure');
// Creamos una aserción la cual queremos que falle
test_assert(1);
// Este código nunca se ejecuta porque ASSERT_BAIL
// está a TRUE
echo 'Never reached';
?>
(PHP 4, PHP 5)
assert — Checks if assertion is FALSE
assert() will check the given
assertion and take appropriate action if
its result is FALSE.
If the assertion is given as a string it
will be evaluated as PHP code by assert().
The advantages of a string assertion are
less overhead when assertion checking is off and messages
containing the assertion expression when
an assertion fails. This means that if you pass a boolean condition
as assertion this condition will not show up as
parameter to the assertion function which you may have defined with the
assert_options() function, the condition is converted
to a string before calling that handler function, and the boolean FALSE
is converted as the empty string.
Assertions should be used as a debugging feature only. You may
use them for sanity-checks that test for conditions that should
always be TRUE and that indicate some programming errors if not
or to check for the presence of certain features like extension
functions or certain system limits and features.
Assertions should not be used for normal runtime operations like input parameter checks. As a rule of thumb your code should always be able to work correctly if assertion checking is not activated.
The behavior of assert() may be configured by assert_options() or by .ini-settings described in that functions manual page.
The assert_options() function and/or ASSERT_CALLBACK configuration directive allow a callback function to be set to handle failed assertions.
assert() callbacks are particularly useful for building automated test suites because they allow you to easily capture the code passed to the assertion, along with information on where the assertion was made. While this information can be captured via other methods, using assertions makes it much faster and easier!
The callback function should accept three arguments. The first argument will contain the file the assertion failed in. The second argument will contain the line the assertion failed on and the third argument will contain the expression that failed (if any - literal values such as 1 or "two" will not be passed via this argument)
assertion
The assertion.
FALSE if the assertion is false, TRUE otherwise.
Ejemplo #1 Handle a failed assertion with a custom handler
<?php
// Active assert and make it quiet
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_QUIET_EVAL, 1);
// Create a handler function
function my_assert_handler($file, $line, $code)
{
echo "<hr>Assertion Failed:
File '$file'<br />
Line '$line'<br />
Code '$code'<br /><hr />";
}
// Set up the callback
assert_options(ASSERT_CALLBACK, 'my_assert_handler');
// Make an assertion that should fail
assert('mysql_query("")');
?>
(PHP 4, PHP 5)
dl — Carga una extensión PHP en tiempo de ejecucción
$library
)
Carga la extensión PHP dada por el parámetro
library.
Utilice la función extension_loaded() para comprobar si la extensión ya está cargada o no. Funciona tanto para extensiones ya integradas en PHP o para extensiones que se han cargado dinámicamente (ya sea a través de php.ini o dl()).
Esta función ha sido eliminada en algunos módulos SAPI en PHP 5.3.
library
Este parámetro es solamente el fichero de la extensión a cargar el cual depende del sistema operativo. Por ejemplo, la extensión sockets (si se compila como librería, no como parte de PHP) Se llamará sockets.so en sistemas Unix mientras que en Windows se llamará php_sockets.dll.
El directorio desde donde la extensión será cargada también depende del sistema operativo:
En Windows - a no ser que se defina explicitamente en php.ini, la extensión será cargada por defecto desde C:\php4\extensions\ (PHP4) o C:\php5\ en (PHP 5).
Unix - a no ser que se defina en php.ini, el directorio de extensiones por defecto depende de
Devuelve TRUE en caso de éxito o FALSE en caso de error. Si la funcionalidad de cargar módulos no está disponible
o ha sido deshabilitada (ya sea activando
enable_dl off o habilitando el safe mode
en php.ini) Se producirá un E_ERROR
y se parará la ejecucción de PHP. Si dl() falló porque la
librería especificacda no pudo cargarse a demás de FALSE se
producirá un mensaje E_WARNING.
Ejemplo #1 Ejemplos de dl()
<?php
// En este ejemplo se carga una extensión u otra dependiendo del sistema operativo
if (!extension_loaded('sqlite')) {
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
dl('php_sqlite.dll');
} else {
dl('sqlite.so');
}
}
// O si la constante PHP_SHLIB_SUFFIX está disponible desde PHP 4.3.0
if (!extension_loaded('sqlite')) {
$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
dl($prefix . 'sqlite.' . PHP_SHLIB_SUFFIX);
}
?>
| Versión | Descripción |
|---|---|
| 5.3.0 | dl() está desactivado en algunos módulos SAPI por problemas de estabilidad. Los únicos modulos SAPI que permiten dl() son: CLI, CGI and Embed. En su lugar usar las directivas Directivas de carga de extensiones |
Nota:
dl() no se soporta cuando PHP es compilado con soporte ZTS. Use en su lugar Directivas de carga de extensiones instead.
Nota:
dl() es sensible a mayúsculas en sistemas Unix.
Nota: Esta función no está disponible cuando PHP está corriendo en safe mode.
(PHP 4, PHP 5)
extension_loaded — Encontrar si una extensión está cargada
$name
)Encuentra si la extensión está cargada.
name
El nombre de la extensión.
Es posible ver los nombres de varias extensiones usando phpinfo(), o si usted usa la versión CGI o CLI de PHP, puede usar la bandera -m para listar todas las extensiones disponibles:
$ php -m [PHP Modules] xml tokenizer standard sockets session posix pcre overload mysql mbstring ctype [Zend Modules]
Devuelve TRUE si la extensión identificada por
nombre está cargada, FALSE de lo contrario.
Ejemplo #1 Ejemplo de extension_loaded()
<?php
if (!extension_loaded('gd')) {
if (!dl('gd.so')) {
exit;
}
}
?>
| Versión | Descripción |
|---|---|
| 5.0.0 | extension_loaded() usa el nombre interno de extensión para probar si una extensión determinada está disponible o no. La mayoría de nombres internos de extensión están escritos en minúsculas pero es posible que hayan extensiones disponibles que usen también letras mayúsculas. Antes de PHP 5, esta función comparaba los nombres sensible a mayúsculas. |
(PHP 5 >= 5.3.0)
gc_collect_cycles — Las fuerzas de la colección de todos los ciclos de basura existentes
Recogida de las fuerzas de los ciclos de basura existentes.
Esta función no tiene parámetros.
Devuelve el número de ciclos de recogida.
(PHP 5 >= 5.3.0)
gc_disable — Desactiva el recolector de referencia circular
Desactiva el recolector de referencia circular. zend.enable_gc a 0.
Esta función no tiene parámetros.
No devuelve ningún valor.
(PHP 5 >= 5.3.0)
gc_enable — Activa el colector de referencia circular
Activa el colector de referencia circular, estableciendo zend.enable_gc a 1.
Esta función no tiene parámetros.
No devuelve ningún valor.
(PHP 5 >= 5.3.0)
gc_enabled — Devuelve el estado del colector de referencia circular
Devuelve el estado del colector de referencia circular.
Esta función no tiene parámetros.
Devuelve TRUE si el recolector de basura está activado, FALSE en caso contrario.
Ejemplo #1 Ejemplo de gc_enabled()
<?php
if(gc_enabled()) gc_collect_cycles();
?>
(PHP 4, PHP 5)
get_cfg_var — Obtiene el valor de una opción de configuración de PHP
$option
)Obtiene el valor de una opción de configuración de PHP.
Esta función no retornará información de configuración establecida cuando PHP fue compilado, o lee un fichero de configuración de Apache.
Para comprobar si el sistema está usando un fichero de configuración, intente recuperar el valor de la opción de configuración cfg_file_path. Si está disponible, un fichero de configuración está siendo utilizado.
option
El nombre de la opción de configuración.
Devuelve el valor actual de la variable de configuración de PHP especificada por
option, o FALSE si se produce un error.
| Versión | Descripción |
|---|---|
| 5.3.0 | get_cfg_var() se fijó para ser capaz de retornar un "array" con las opciones ini. |
(PHP 4, PHP 5)
get_current_user — Obtiene el nombre del propietario del script PHP actual
Devuelve el nombre del propietario del script PHP actual.
Devuelve el nombre de usuario como un string.
Ejemplo #1 get_current_user() ejemplo
<?php
echo 'Propietario script actual: ' . get_current_user();
?>
El resultado del ejemplo sería algo similar a:
Propietario script actual: SYSTEM
(PHP 4 >= 4.1.0, PHP 5)
get_defined_constants — Devuelve un array asociativo con los nombres de todas las constantes y sus valores
$categorize = false
] )Devuelve los nombres y valores de todas las constantes definidas actualmente. Esto incluye las creadas por las extensiones, así como las creadas con la función define().
categorize
Provoca que la función retorne un array multi-dimensional con categorias en las claves de la primera dimensión y constantes y sus valores en la segunda dimensión.
<?php
define("MI_CONSTANTE", 1);
print_r(get_defined_constants(true));
?>
El resultado del ejemplo sería algo similar a:
Array
(
[Core] => Array
(
[E_ERROR] => 1
[E_WARNING] => 2
[E_PARSE] => 4
[E_NOTICE] => 8
[E_CORE_ERROR] => 16
[E_CORE_WARNING] => 32
[E_COMPILE_ERROR] => 64
[E_COMPILE_WARNING] => 128
[E_USER_ERROR] => 256
[E_USER_WARNING] => 512
[E_USER_NOTICE] => 1024
[E_ALL] => 2047
[TRUE] => 1
)
[pcre] => Array
(
[PREG_PATTERN_ORDER] => 1
[PREG_SET_ORDER] => 2
[PREG_OFFSET_CAPTURE] => 256
[PREG_SPLIT_NO_EMPTY] => 1
[PREG_SPLIT_DELIM_CAPTURE] => 2
[PREG_SPLIT_OFFSET_CAPTURE] => 4
[PREG_GREP_INVERT] => 1
)
[user] => Array
(
[MI_CONSTANTE] => 1
)
)
| Versión | Descripción |
|---|---|
| 5.3.1 | Sólo para Windows: las constantes fundamentales se clasifican en Core, previamente mhash. |
| 5.3.0 | Constantes fundamentales se clasifican en Core, antes interno. En Windows, las constantes fundamentales se clasifican en mhash. |
| 5.2.11 |
El parámetro categorize ahora funciona correctamente.
Anteriormente, el parámetro categorize fue interpretado
como !is_null($categorize), por lo que cualquier valor distinto de NULL
fuerza a las constantes a ser clasificadas.
|
| 5.0.0 |
El parámetro categorize fue agregado.
|
Ejemplo #1 get_defined_constants() Ejemplo
<?php
print_r(get_defined_constants());
?>
El resultado del ejemplo sería algo similar a:
Array
(
[E_ERROR] => 1
[E_WARNING] => 2
[E_PARSE] => 4
[E_NOTICE] => 8
[E_CORE_ERROR] => 16
[E_CORE_WARNING] => 32
[E_COMPILE_ERROR] => 64
[E_COMPILE_WARNING] => 128
[E_USER_ERROR] => 256
[E_USER_WARNING] => 512
[E_USER_NOTICE] => 1024
[E_ALL] => 2047
[TRUE] => 1
)
(PHP 4, PHP 5)
get_extension_funcs — Devuelve una matriz con los nombres de funciones de un módulo
$module_name
)
Esta función devuelve los nombres de todas las funciones definidas en el
módulo indicado por nombre_modulo.
module_name
El nombre del módulo.
Nota:
Este parámetro debe estar en minúsculas.
Devuelve una matriz con todas las funciones, o FALSE si
nombre_modulo no es una extensión válida.
Ejemplo #1 Imprime las funciones XML
<?php
print_r(get_extension_funcs("xml"));
?>
El resultado del ejemplo sería algo similar a:
Array
(
[0] => xml_parser_create
[1] => xml_parser_create_ns
[2] => xml_set_object
[3] => xml_set_element_handler
[4] => xml_set_character_data_handler
[5] => xml_set_processing_instruction_handler
[6] => xml_set_default_handler
[7] => xml_set_unparsed_entity_decl_handler
[8] => xml_set_notation_decl_handler
[9] => xml_set_external_entity_ref_handler
[10] => xml_set_start_namespace_decl_handler
[11] => xml_set_end_namespace_decl_handler
[12] => xml_parse
[13] => xml_parse_into_struct
[14] => xml_get_error_code
[15] => xml_error_string
[16] => xml_get_current_line_number
[17] => xml_get_current_column_number
[18] => xml_get_current_byte_index
[19] => xml_parser_free
[20] => xml_parser_set_option
[21] => xml_parser_get_option
[22] => utf8_encode
[23] => utf8_decode
)
(PHP 4 >= 4.3.0, PHP 5)
get_include_path — Obtiene la opción de configuración include_path actual
Obtiene el valor actual de la opción de configuración include_path.
Devuelve la ruta, como una cadena.
Ejemplo #1 Ejemplo de get_include_path()
<?php
// Funciona a partir de PHP 4.3.0
echo get_include_path();
// Funciona en todas las versiones de PHP
echo ini_get('include_path');
?>
(PHP 4, PHP 5)
get_included_files — Devuelve un array con los nombres de los archivos incluidos o requeridos
Obtiene los nombres de todos los archivos que han sido incluidos usando include, include_once, require o require_once.
Devuelve un array con los nombres de los archivos.
El script llamado originalmente es considerado un "archivo incluido", así que será listado junto con los archivos referenciados por la familia de funciones include.
Los archivos que son incluidos o requeridos múltiples veces solo aparecen una vez en el array devuelto.
| Versión | Descripción |
|---|---|
| 4.0.1 | En PHP 4.0.1 y versiones anteriores esta función asumía que los archivos requeridos finalizaban en la extensión .php; otras extensiones no serán devueltas. La array devuelto por get_included_files() era un array asociativo y solo listaba los archivos incluidos por include e include_once. |
Ejemplo #1 Ejemplo de get_included_files()
<?php
// Este archivo es abc.php
include 'test1.php';
include_once 'test2.php';
require 'test3.php';
require_once 'test4.php';
$archivos_incluidos = get_included_files();
foreach ($archivos_incluidos as $nombre_archivo) {
echo "$nombre_archivo\n";
}
?>
El resultado del ejemplo sería:
abc.php test1.php test2.php test3.php test4.php
Nota:
Los archivos incluidos usando la directiva de configuración auto_prepend_file no son incluidos en el array devuelta.
(PHP 4, PHP 5)
get_loaded_extensions — Devuelve un array con los nombres de todos los módulos compilados y cargados
$zend_extensions = false
] )Esta función devuelve los nombres de todos los módulos compilados y cargados en el intérprete de PHP.
zend_extensions
Sólo retorna extensiones Zend, si no, las extensiones regulares, como mysqli.
El valor predeterminado es FALSE (retorna extensiones regulares).
Devuelve un array indexado de todos los nombres de los módulos.
| Versión | Descripción |
|---|---|
| 5.2.4 |
Fue añadido el parámetro opcional zend_extensions
|
Ejemplo #1 get_loaded_extensions()
<?php
print_r(get_loaded_extensions());
?>
El resultado del ejemplo sería algo similar a:
Array ( [0] => xml [1] => wddx [2] => standard [3] => session [4] => posix [5] => pgsql [6] => pcre [7] => gd [8] => ftp [9] => db [10] => calendar [11] => bcmath )
(PHP 4, PHP 5)
get_magic_quotes_gpc — Obtiene el valor actual de configuración de magic_quotes_gpc
Devuelve el valor actual del parámetro de configuración magic_quotes_gpc
Tenga en cuenta que intentar establecer el parámetro magic_quotes_gpc no funcionará en tiempo de ejecución.
Para más información sobre magic_quotes, vea esta sección de seguridad.
Devuelve 0 si las comillas mágicas están deshabilitadas, 1 de lo contrario.
O siempre devuelve FALSE a partir de PHP 5.4.0.
| Versión | Descripción |
|---|---|
| 5.4.0 |
Siempre devuelve FALSE debido a que la característica de comillas mágicas ha sido eliminada de PHP.
|
Ejemplo #1 Ejemplo de get_magic_quotes_gpc()
<?php
// Si las comillas mágicas están habilitadas
echo $_POST['apellido']; // O\'reilly
echo addslashes($_POST['apellido']); // O\\\'reilly
// Uso en todas las versiones de PHP
if (!get_magic_quotes_gpc()) {
$apellido = addslashes($_POST['apellido']);
}
else {
$apellido = $_POST['apellido'];
}
// Si se está usando MySQL
$apellido = mysql_real_escape_string($apellido);
echo $apellido; // O\'reilly
$sql = "INSERT INTO apellidos (apellido) VALUES ('$apellido')";
?>
Nota:
Si la directiva magic_quotes_sybase se encuentra habilitada (ON), sobrescribirá completamente magic_quotes_gpc. Así que aun cuando get_magic_quotes_gpc() devuelve
TRUE, ni las comillas dobles, ni las barras invertidas o caracteres NUL serán escapados. Sólo las comillas sencillas serán escapadas. En este caso se verán de este modo: ''
(PHP 4, PHP 5)
get_magic_quotes_runtime — Obtiene el valor de configuración activo actual de magic_quotes_runtime
Devuelve el valor de configuración activo actual de magic_quotes_runtime.
Devuelve 0 si magic_quotes_runtime está off, 1 en caso contrario.
O siempre devuelve FALSE a partir de PHP 5.4.0.
| Versión | Descripción |
|---|---|
| 5.4.0 |
Siempre devuelve FALSE debido a que la característica de comillas mágicas ha sido eliminada de PHP.
|
Ejemplo #1 get_magic_quotes_runtime() ejemplo
<?php
// Comprueba si magic_quotes_runtime está activado
if(get_magic_quotes_runtime())
{
// Desactivar
set_magic_quotes_runtime(false);
}
?>
Esta función es un alias de: get_included_files().
(PHP 4, PHP 5)
getenv — Obtiene el valor de una variable de entorno
$varname
)Obtiene el valor de una variable de entorno.
Se puede ver una lista de todas las variables de entorno usando phpinfo(). Muchas de estas variables están listadas bajo la especificación » RFC 3875, específicamente la sección 4.1, "Request Meta-Variables".
varname
El nombre de variable.
Devuelve el valor de la variable de entorno
varname, o FALSE si la variable
entorno varname no existe.
Ejemplo #1 Ejemplo de getenv()
<?php
// Ejemplo de uso de getenv()
$ip = getenv('REMOTE_ADDR');
// O simplemente use una Superglobal ($_SERVER o $_ENV)
$ip = $_SERVER['REMOTE_ADDR'];
?>
(PHP 4, PHP 5)
getlastmod — Obtiene la hora de la última modificación de la página
Obtiene la hora de la última modificación de la página actual.
Si está interesado en obtener la hora de la última modificación de un archivo diferente, considere el uso de filemtime().
Devuelve la hora de la última modificación de la página actual. El valor
devuelto es una marca de tiempo Unix, apropiada para ser pasada a
date(). Devuelve FALSE en caso de fallo.
Ejemplo #1 Ejemplo de getlastmod()
<?php
// imprime p.ej. 'Ultima modificación: March 04 1998 20:43:59.'
echo "Ultima modificación: " . date ("F d Y H:i:s.", getlastmod());
?>
(PHP 4 >= 4.1.0, PHP 5)
getmygid — Obtener el GID del dueño del script PHP
Obtiene el ID de grupo del script actual.
Devuelve el ID de grupo del script actual, o FALSE en caso de error.
(PHP 4, PHP 5)
getmyinode — Obtiene el inode del script actual
Obtiene el inode del script actual.
Devuelve el inodo del script actual como un entero, o FALSE en caso de error.
(PHP 4, PHP 5)
getmypid — Obtiene el ID del proceso PHP
Obtiene el ID del proceso PHP actual.
Devuelve el ID del proceso PHP actual, o FALSE si ocurre un error.
Los IDs de proceso no son únicos, por lo tanto son una fuente débil de entropía. Es recomendable no depender en ids de proceso en contextos sujetos a consideraciones de seguridad.
(PHP 4, PHP 5)
getmyuid — Obtiene el UID del dueño del script PHP
Obtiene el ID de usuario para el script actual.
Devuelve el ID de usuario del script actual, o FALSE en caso de error.
(PHP 4 >= 4.3.0, PHP 5)
getopt — Obtiene las opciones de la lista de argumentos de la línea de comandos
$options
[, array $longopts
] )Analiza las opciones pasadas al script.
options
longopts
El parámetro options puede contener los siguientes
elementos:
Nota: Los valores opcionales no aceptan un " " (espacio) como separador.
Nota:
El formato de
optionsy delongoptses casi igual. La única diferencia es quelongoptscontiene un array de opciones (donde cada elemento es la opción) mientras queoptionscontiene un string (donde cada carácter es la opción).
Esta función devolverá un array de pares opciones / argumentos, o FALSE en
caso de error.
Nota:
El análisis de opciones finalizará cuando se encuentre alguna no-opción. Todo lo que haya a continuación será descartado.
| Versión | Descripción |
|---|---|
| 5.3.0 | Añadido soporte para usar "=" como separador de argumento/valor. |
| 5.3.0 | Añadido soporte para valores opcionales (especificado mediante "::"). |
| 5.3.0 |
El parámetro longopts está disponible en todos los sistemas.
|
| 5.3.0 | Esta función ya no depende del sistema y funciona también en Windows. |
Ejemplo #1 Ejemplo de getopt()
<?php
$options = getopt("f:hp:");
var_dump($options);
?>
El ejecutar el script superior con php script.php -fvalue -h se mostrará:
array(2) {
["f"]=>
string(5) "value"
["h"]=>
bool(false)
}
Ejemplo #2 Ejemplo 2 de getopt()
<?php
$shortopts = "";
$shortopts .= "f:"; // Valor obligatorio
$shortopts .= "v::"; // Valor opcional
$shortopts .= "abc"; // Estas opciones no aceptan valores
$longopts = array(
"required:", // Valor obligatorio
"optional::", // Valor opcional
"option", // Sin valores
"opt", // Sin valores
);
$options = getopt($shortopts, $longopts);
var_dump($options);
?>
Al ejecutar el script superior con php script.php -f "value for f" -v -a --required value --optional="optional value" --option se obtendrá:
array(6) {
["f"]=>
string(11) "value for f"
["v"]=>
bool(false)
["a"]=>
bool(false)
["required"]=>
string(5) "value"
["optional"]=>
string(14) "optional value"
["option"]=>
bool(false)
}
Ejemplo #3 Ejemplo 3 de getopt()
Pasando múltiples opciones como una
<?php
$options = getopt("abc");
var_dump($options);
?>
Al ejecutar el script superior con php script.php -aaac se obtendrá:
array(2) {
["a"]=>
array(3) {
[0]=>
bool(false)
[1]=>
bool(false)
[2]=>
bool(false)
}
["c"]=>
bool(false)
}
(PHP 4, PHP 5)
getrusage — Obtiene el uso de los recursos actuales
$who = 0
] )Esta es una interfaz de getrusage(2). Obtiene datos devueltos de la llamada al sistema.
who
Si el parámetro who es 1, getrusage será llamado con
RUSAGE_CHILDREN.
Devuelve un array asociativo que contiene los datos devueltos por la llamada al sistema. Todas las entradas son accesibles mediante el uso de sus nombres de campo documentado.
Ejemplo #1 getrusage() ejemplo
<?php
$dat = getrusage();
echo $dat["ru_nswap"]; // número de intercambios
echo $dat["ru_majflt"]; // número de fallos de página
echo $dat["ru_utime.tv_sec"]; // tiempo de usuario utilizado (segundos)
echo $dat["ru_utime.tv_usec"]; // tiempo de usuario usado (microsegundos)
?>
Nota: Esta función no está implementada en plataformas Windows.
Esta función es un alias de: ini_set().
(PHP 4 >= 4.2.0, PHP 5)
ini_get_all — Obtiene todas las opciones de configuración
$extension
[, bool $details = true
]] )Devuelve todas las opciones de configuración registradas.
extension
Un nombre de extensión opcional. Si se establece, la función de retornará únicamente opciones específicas para esa extensión.
details
Recupera los detalles de configuración o sólo el valor actual de cada configuración.
Por omisión es TRUE (recuperar detalles).
Devuelve un array asociativo con el nombre de la directiva como la clave del array.
Cuando el parámetro details es TRUE (por omisión) el array
contendrá global_value (establecido en php.ini), local_value
(tal vez establecido con ini_set() o .htaccess), y access
(el nivel de acceso).
Cuando el parámetro details es FALSE el valor será el
valor actual de la opción.
Vea la sección del manual para obtener información sobre lo que significan los niveles de acceso.
Nota:
Es posible que una directiva tenga múltiples niveles de acceso, por lo que el access muestra los valores de máscara de bits adecuado.
| Versión | Descripción |
|---|---|
| 5.3.0 |
Se añadió details.
|
Ejemplo #1 ini_get_all() ejemplos
<?php
print_r(ini_get_all("pcre"));
print_r(ini_get_all());
?>
El resultado del ejemplo sería algo similar a:
Array
(
[pcre.backtrack_limit] => Array
(
[global_value] => 100000
[local_value] => 100000
[access] => 7
)
[pcre.recursion_limit] => Array
(
[global_value] => 100000
[local_value] => 100000
[access] => 7
)
)
Array
(
[allow_call_time_pass_reference] => Array
(
[global_value] => 0
[local_value] => 0
[access] => 6
)
[allow_url_fopen] => Array
(
[global_value] => 1
[local_value] => 1
[access] => 4
)
...
)
Ejemplo #2 Disabling details
<?php
print_r(ini_get_all("pcre", false)); // Se añadió en PHP 5.3.0
print_r(ini_get_all(null, false)); // Se añadió en PHP 5.3.0
?>
El resultado del ejemplo sería algo similar a:
Array
(
[pcre.backtrack_limit] => 100000
[pcre.recursion_limit] => 100000
)
Array
(
[allow_call_time_pass_reference] => 0
[allow_url_fopen] => 1
...
)
(PHP 4, PHP 5)
ini_get — Devuelve el valor de una directiva de configuración
$varname
)En caso de éxito devuelve el valor de una directiva de configuración.
varname
Nombre de la directiva de configuración.
Devuelve el valor de la opción de configuración como cadena en caso de éxito, o
una cadena vacía para valores null. Devuelve FALSE si la
opción de configuración no existe.
Ejemplo #1 Unos cuantos ejemplos de la función ini_get()
<?php
/*
Dentro del php.ini tenemos las siguientes directivas junto con sus valores iniciales:
display_errors = On
register_globals = Off
post_max_size = 8M
*/
echo 'display_errors = ' . ini_get('display_errors') . "\n";
echo 'register_globals = ' . ini_get('register_globals') . "\n";
echo 'post_max_size = ' . ini_get('post_max_size') . "\n";
echo 'post_max_size+1 = ' . (ini_get('post_max_size')+1) . "\n";
echo 'post_max_size in bytes = ' . return_bytes(ini_get('post_max_size'));
function return_bytes($val) {
$val = trim($val);
$last = strtolower($val[strlen($val)-1]);
switch($last) {
// El modificador 'G' está disponble desde PHP 5.1.0
case 'g':
$val *= 1024;
case 'm':
$val *= 1024;
case 'k':
$val *= 1024;
}
return $val;
}
?>
El resultado del ejemplo sería algo similar a:
display_errors = 1 register_globals = 0 post_max_size = 8M post_max_size+1 = 9 post_max_size in bytes = 8388608
Nota: Cuando se consultan valores booleanos
El valor booleano off será devuelto como una cadena vacía o "0", mientras que el valor booleano on será devuelto será devuelto como "1". Esta función también puede devolver valores iniciales como cadenas.
Nota: Cuando se consultan valores de tamaños de memoria
Muchos valores iniciales de tamaños de memoria, tales como upload_max_filesize, están almacenados en el archivo php.ini en notación abreviada. ini_get() devolverá la cadena exacta almacenada en el archivo php.ini, y NO su valor de tipo integer equivalente. Utilizar estos valores en funciones aritméticas puede provocar resultados inesperados. El ejemplo anterior muestra una manera de convertir la notación abreviada a bytes, muy similar a cómo lo hace el código fuente de PHP.
(PHP 4, PHP 5)
ini_restore — Restablece el valor de una opción de configuración
$varname
)Restaura una opción de configuración dado su valor original.
varname
El nombre de la opción de configuración.
No devuelve ningún valor.
Ejemplo #1 ini_restore() ejemplo
<?php
$setting = 'y2k_compliance';
echo 'Valor actual \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;
ini_set($setting, ini_get($setting) ? 0 : 1);
echo 'Nuevo valor \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;
ini_restore($setting);
echo 'Valor original \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;
?>
El resultado del ejemplo sería:
Valor actual 'y2k_compliance': 1 Nuevo valor 'y2k_compliance': 0 Valor original 'y2k_compliance': 1
(PHP 4, PHP 5)
ini_set — Establecer el valor de una directiva de configuración
$varname
, string $newvalue
)Establece el valor de la directiva de configuración dada. El nuevo valor establecido se mantendrá durante la ejecución del script, y se restaurará cuando acabe el mismo.
varname
No todas las directivas pueden ser modificadas con ini_set(). Hay una lista de todas las directivas disponibles en el siguiente apéndice.
newvalue
Nuevo valor para la directiva.
Devuelve el valor anterior en caso de éxito, FALSE en caso de error.
Ejemplo #1 Definir directiva ini
<?php
echo ini_get('display_errors');
if (!ini_get('display_errors')) {
ini_set('display_errors', 1);
}
echo ini_get('display_errors');
?>
Esta función es un alias de: set_magic_quotes_runtime()
main — Función main() falsa
No existe ninguna función main(), salvo en el código fuente de PHP. En PHP 4.3.0, se introdujo un nuevo tipo de manejador de errores en el código fuente de PHP (php_error_docref). Existe una opción que permite enlazar a páginas del manual de PHP en los errores de mensaje cuando las directivas de PHP html_errors (habilitado por omisión) y docref_root (hasta PHP 4.3.2, habilitado por omisión) están habilitadas.
Algunos mensajes de error apuntan a la página del manual para la función main(), que es por lo que esta página existe. Si descubre alguna referencia a esta página, por favor » reporte un informe de error, indicando la función PHP que provocó el error que apuntó a main(), para que sea corregido y documentado.
| Nombre de la función | No apunta aquí desde |
|---|---|
| include | 5.1.0 |
| include_once | 5.1.0 |
| require | 5.1.0 |
| require_once | 5.1.0 |
(PHP 5 >= 5.2.0)
memory_get_peak_usage — Devuelve el máximo de memoria asignada por PHP
$real_usage = false
] )Devuelve el máximo de memoria, en bytes, que se ha asignado a su script PHP.
real_usage
Si se deja en TRUE puede obtener el tamaño real de memoria asignada por el sistema.
Si no se establece o es FALSE, la memoria utilizada por
emalloc() es reportada.
Devuelve el máximo de memoria en bytes.
| Versión | Descripción |
|---|---|
| 5.2.1 | Compilar con --enable-memory-limit ya no es necesario para que esta función exista. |
| 5.2.0 |
se añade real_usage.
|
(PHP 4 >= 4.3.2, PHP 5)
memory_get_usage — Devuelve la cantidad de memoria asignada a PHP
$real_usage = false
] )Devuelve la cantidad de memoria, en bytes, que actualmente se asigna a su script PHP.
real_usage
Debe establecer esto a TRUE para obtener el tamaño real de memoria
asignada por el sistema. Si no se establece o es FALSE sólo se reportará
la memoria usada por emalloc().
Devuelve la cantidad de memoria en bytes.
| Versión | Descripción |
|---|---|
| 5.2.1 | Compilar con --enable-memory-limit ya no es necesario para que exista esta función. |
| 5.2.0 |
Se añadió real_usage.
|
Ejemplo #1 A memory_get_usage() ejemplo
<?php
// Este es sólo un ejemplo, los siguientes números
// serán diferentes dependiendo de su sistema
echo memory_get_usage() . "\n"; // 36640
$a = str_repeat("Hello", 4242);
echo memory_get_usage() . "\n"; // 57960
unset($a);
echo memory_get_usage() . "\n"; // 36744
?>
(PHP 5 >= 5.2.4)
php_ini_loaded_file — Recupera la ruta de acceso al archivo php.ini cargado
Comprueba si un archivo php.ini se ha cargado, y recupera su ruta de acceso.
Esta función no tiene parámetros.
La ruta de php.ini cargado, o FALSE si uno no se ha cargado.
Ejemplo #1 php_ini_loaded_file() ejemplo
<?php
$inipath = php_ini_loaded_file();
if ($inipath) {
echo 'archivo php.ini cargado: ' . $inipath;
} else {
echo 'ningún archivo php.ini ha sido cargado';
}
?>
El resultado del ejemplo sería algo similar a:
Loaded php.ini: /usr/local/php/php.ini
(PHP 4 >= 4.3.0, PHP 5)
php_ini_scanned_files — Devuelve una lista de ficheros .ini procesados del directorio adicional ini dir
php_ini_scanned_files() devuelve una lista separada por comas de los ficheros de configuración procesados por php.ini. Estos archivos se encuentran en un directorio definido por la opción --with-config-file-scan-dir que se establece durante la compilación.
Los archivos de configuración devueltos también incluyen la ruta como se declara en la opción --with-config-file-scan-dir .
Devuelve un string separado por comas de archivos .ini en caso de éxito.
Cada coma es seguido por un salto de línea. Si la directiva
--with-config-file-scan-dir
no fué definida,
devolverá FALSE. Si se trata de establecer y el directorio estaba vacío,
un string vacío será retornado. Si un archivo es irreconocible, el archivo todavía
hace que se devuelva un string pero un error de PHP también dará lugar.
Este error de PHP se verá tanto en tiempo de compilación y durante el uso de
php_ini_scanned_files().
Ejemplo #1 Un ejemplo simple para listar los archivos ini devueltos
<?php
if ($filelist = php_ini_scanned_files()) {
if (strlen($filelist) > 0) {
$files = explode(',', $filelist);
foreach ($files as $file) {
echo "<li>" . trim($file) . "</li>\n";
}
}
}
?>
(PHP 4, PHP 5)
php_logo_guid — Obtiene el valor guid del logo
Esta función devuelve el ID que puede ser usado para desplegar el logo de PHP usando la imagen integrada. El logo es desplegado únicamente si el valor de expose_php es On.
Devuelve PHPE9568F34-D428-11d2-A769-00AA001ACF42.
Ejemplo #1 Ejemplo de php_logo_guid()
<?php
echo '<img src="' . $_SERVER['PHP_SELF'] .
'?=' . php_logo_guid() . '" alt="¡Logo de PHP!" />';
?>
(PHP 4 >= 4.0.1, PHP 5)
php_sapi_name — Devuelve el tipo de interfaz que hay entre PHP y el servidor
Devuelve una cadena en minúsculas que describe el tipo de interfaz (la API de Servidor, SAPI) que está utilizando PHP. Por ejemplo, en PHP CLI esta cadena será "cli" mientras que en Apache podría tener varios valores diferentes dependiendo de la SAPI que se utilice. Más abajo se enumeran los posibles valores.
Devuelve el tipo de interfaz, como cadena de texto en minúsculas.
Pese a no ser una lista completa, los posibles valores incluyen aolserver, apache, apache2filter, apache2handler, caudium, cgi (hasta PHP 5.3), cgi-fcgi, cli, continuity, embed, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux, y webjames.
Ejemplo #1 Ejemplo de php_sapi_name()
Este ejemplo comprueba si está la cadena cgi, ya que podría darse un nombre como cgi-fcgi.
<?php
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Está usando PHP CGI\n";
} else {
echo "No está usando PHP CGI\n";
}
?>
Nota: Una forma alternativa
La constante de PHP
PHP_SAPIcontiene el mismo valor que php_sapi_name().
Podría no ser evidente cuál es la SAPI en uso, ya que, por ejemplo, en lugar de apache podría aparecer definida como apache2handler o como apache2filter.
(PHP 4 >= 4.0.2, PHP 5)
php_uname — Devuelve información sobre el sistema operativo en que se está ejecutando PHP
$mode = "a"
] )
php_uname() devuelve una descripción del sistema
operativo en que se está ejecutando PHP. Esta misma información se muestra en la parte
superior de phpinfo(). Para obtener solamente el nombre
del sistema operativo, considere el uso de la constante PHP_OS,
pero tenga en mente que la constante contendrá el sistema operativo
en que PHP fue compilado.
En algunos sistemas más antigos de UNIX, es posible que no se pueda determinar la información del SO actual en cuyo caso se revertirá mostrando el SO en que PHP fue compilado. Esto solo sucederá si la llamada a la libreria uname() no existe o no funciona.
mode
mode es un caracter simple que define
qué información es devuelta:
Devuelve la descripción, como una cadena de texto.
Ejemplo #1 Algúnos ejemplos de php_uname()
<?php
echo php_uname();
echo PHP_OS;
/* Algúnos posibles resultados:
Linux localhost 2.4.21-0.13mdk #1 Fri Mar 14 15:08:06 EST 2003 i686
Linux
FreeBSD localhost 3.2-RELEASE #15: Mon Dec 17 08:46:02 GMT 2001
FreeBSD
Windows NT XN1 5.1 build 2600
WINNT
*/
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
echo 'Este un servidor usando Windows!';
} else {
echo 'Este es un servidor que no usa Windows!';
}
?>
También existen algunas constantes PHP predefinidas que pueden ser útiles, por ejemplo:
Ejemplo #2 Algunos ejemplos de las constantes relacionadas al SO
<?php
// *nix
echo DIRECTORY_SEPARATOR; // /
echo PHP_SHLIB_SUFFIX; // so
echo PATH_SEPARATOR; // :
// Win*
echo DIRECTORY_SEPARATOR; // \
echo PHP_SHLIB_SUFFIX; // dll
echo PATH_SEPARATOR; // ;
?>
(PHP 4, PHP 5)
phpcredits — Imprime los créditos de PHP
$flag = CREDITS_ALL
] )Esta función imprime la lista de créditos de los desarrolladores de PHP, módulos, etc Genera los códigos HTML apropiados para insertar la información en una página.
flag
Para generar una página de créditos personalizada,
puede utilizar el parámetro flag.
| name | description |
|---|---|
| CREDITS_ALL |
Todos los créditos, equivalente a usar: CREDITS_DOCS +
CREDITS_GENERAL + CREDITS_GROUP +
CREDITS_MODULES + CREDITS_FULLPAGE.
Genera una completa e independiente, página HTML con las etiquetas apropiadas.
|
| CREDITS_DOCS | Los créditos para el equipo de documentación |
| CREDITS_FULLPAGE | Por lo general se utiliza en combinación con las otras flags. Indica que es independiente de la página HTML debe ser impreso con la información indicada por las otras flags. |
| CREDITS_GENERAL | Créditos generales: Diseño y concepto del lenguaje, autores de PHP y el módulo SAPI. |
| CREDITS_GROUP | Una lista de los desarrolladores del núcleo. |
| CREDITS_MODULES | Una lista de los módulos de extensión para PHP, y sus autores. |
| CREDITS_SAPI | Una lista de los módulos de servidor API para PHP, y sus autores. |
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Imprimir los créditos generales
<?php
phpcredits(CREDITS_GENERAL);
?>
Ejemplo #2 Imprimir los desarrolladores principales y el grupo de documentación
<?php
phpcredits(CREDITS_GROUP | CREDITS_DOCS | CREDITS_FULLPAGE);
?>
Ejemplo #3 Imprimir todos los créditos
<html>
<head>
<title>Mi página de créditos</title>
</head>
<body>
<?php
// Algún código propio
phpcredits(CREDITS_ALL - CREDITS_FULLPAGE);
// algo más de código
?>
</body>
</html>
(PHP 4, PHP 5)
phpinfo — Muestra información sobre la configuración de PHP
$what = INFO_ALL
] )Muestra gran cantidad de información sobre el estado actual de PHP. Incluye información sobre las opciones de compilación y extensiones de PHP, versión de PHP, información del servidor y entrono (si se compiló como módulo), entorno PHP, versión del OS, rutas, valor de las opciones de configuración locales y generales, cabeceras HTTP y licencia de PHP.
Como cada sistema se instala diferente phpinfo() se usa comúnmente para revisar opciones de configuración y variables predefinidas disponibles en un sistema dado
phpinfo() también es una valiosa herramienta de depuración ya que contiene todos valores EGPCS (Environment, GET, POST, Cookie, Server).
what
El resultado de salida puede ser personalizado al pasar una o más de las
siguientes constantes sumadas juntas bit a bit
en el parámetro opcional what.
También se pueden combinar las respectivas constantes con el
operador bit a bit or.
| Nombre(constante) | Valor | Descripción |
|---|---|---|
| INFO_GENERAL | 1 | La línea de configuración, ubicación de php.ini, fecha de compilación, servidor Web, sistema y más. |
| INFO_CREDITS | 2 | Créditos de PHP. Ver también phpcredits(). |
| INFO_CONFIGURATION | 4 | Valores Locales y Maestros actuales de las directivas PHP. Ver también ini_get(). |
| INFO_MODULES | 8 | Módulos cargados y sus respectivos parámetros Ver también get_loaded_extensions(). |
| INFO_ENVIRONMENT | 16 | Información de las variables de entorno. Tambien disponibles en $_ENV. |
| INFO_VARIABLES | 32 | Muestra todas las variables predefinidas de EGPCS (Environment, GET, POST, Cookie, Server). |
| INFO_LICENSE | 64 | Información de Licencia de PHP. Ver también el » FAQ de licencia. |
| INFO_ALL | -1 | Muestra toda la información anterior |
Devuelve TRUE en caso de éxito o FALSE en caso de error.
| Versión | Descripción |
|---|---|
| 5.2.2 | Se añadió la información del "Fichero de configuración cargado", mientras que anteriormente solo existía "Ruta del fichero de configuración (php.ini). |
Ejemplo #1 Ejemplo de phpinfo()
<?php
// Muestra toda la información, por defecto INFO_ALL
phpinfo();
// Muestra solamente la información de los módulos.
// phpinfo(8) hace exactamente lo mismo.
phpinfo(INFO_MODULES);
?>
Nota:
Partes de la información que se muestra están deshabilidadas cuando la opción de configuración expose_php está off. Incluyendo los logos de PHP y Zend y los créditos.
Nota:
phpinfo() muestra texto plano en lugar de HTML cuando se utiliza en la línea de comandos.
(PHP 4, PHP 5)
phpversion — Obtiene la versión de PHP
$extension
] )Devuelve una cadena que contiene la versión del analizador de PHP en ejecución o extensión.
extension
Un nombre de extensión opcional.
Si el parámetro opcional extension ha sido
especificado, phpversion() devuelve la versión de la
extensión, o FALSE si no hay información de versión asociada o la extensión
no está habilitada.
Ejemplo #1 phpversion() Ejemplo básico
<?php
// Imprime ejemplo 'Versión actual de PHP: 5.3.8'
echo 'Versión actual de PHP: ' . phpversion();
// Imprime ejemplo '2.0' o nada si la extensión no está habilitada
echo phpversion('tidy');
?>
Ejemplo #2 PHP_VERSION_ID Ejemplo y uso
<?php
// PHP_VERSION_ID está disponible a partir de PHP 5.2.7, si nuestra
// versión es inferior a eso, entonces emular
if (!defined('PHP_VERSION_ID')) {
$version = explode('.', PHP_VERSION);
define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}
// PHP_VERSION_ID se define como un número, donde el mayor número,
// es la versión más reciente de PHP usada. Se define tal como se utiliza la
// expresión anterior.
//
// $version_id = $major_version * 10000 + $minor_version * 100 + $release_version;
//
// Ahora, con PHP_VERSION_ID podemos comprobar las características que la versión de
// PHP pueda tener, esto no requiere el uso version_compare () cada vez que compruebe si la
// versión de PHP no es compatible con una característica.
//
// Por ejemplo, aquí podemos definir las constantes PHP_VERSION_ * que
// no están disponibles en las versiones anteriores a 5.2.7
if (PHP_VERSION_ID < 50207) {
define('PHP_MAJOR_VERSION', $version[0]);
define('PHP_MINOR_VERSION', $version[1]);
define('PHP_RELEASE_VERSION', $version[2]);
// Y así sucesivamente, ...
}
?>
Nota:
Esta información también está disponible en la constante predefinida
PHP_VERSION. Más información de versión está disponible utilizando las constantesPHP_VERSION_*
(PHP 4, PHP 5)
putenv — Establece el valor de una variable de entorno
$setting
)
Agrega setting al entorno del servidor. La
variable de entorno existirá únicamente durante la petición actual. Al
final de la petición el entorno es recuperado a su estado original.
Definir ciertas variables de entorno puede representar una brecha de seguridad potencial. La directiva safe_mode_allowed_env_vars contiene una lista de prefijos delimitados por comas. En Modo Seguro, el usuario puede alterar únicamente variables de entorno cuyos nombres comiencen con los prefijos ofrecidos por esta directiva. Por omisión, los usuarios sólo podrán definir variables de entorno que comiencen con PHP_ (p.ej. PHP_FOO=BAR). Nota: si esta directiva se encuentra vacía, ¡PHP permitirá que el usuario modifique CUALQUIER variable de entorno!
La directiva safe_mode_protected_env_vars contiene una lista de variables de entorno delimitadas por comas, que el usuario final no podrá modificar usando putenv(). Estas variables serán protegidas incluso si safe_mode_allowed_env_vars se establece de tal modo que permita modificarlas.
setting
El parámetro, como p.ej. "FOO=BAR"
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Definición de una variable de entorno
<?php
putenv("UNIQID=$uniqid");
?>
La directiva safe_mode_allowed_env_vars y safe_mode_protected_env_vars sólo tendrán efecto cuando safe_mode esté habilitado.
(PHP 4 >= 4.3.0, PHP 5)
restore_include_path — Restablece el valor de la opción de configuración include_path
Restablece la opción de configuración include_path a su valor maestro original, tal y como se encuentre definido en php.ini
No devuelve ningún valor.
Ejemplo #1 Ejemplo de restore_include_path()
<?php
echo get_include_path(); // .:/usr/local/lib/php
set_include_path('/inc');
echo get_include_path(); // /inc
// Funciona a partir de PHP 4.3.0
restore_include_path();
// Funciona en todas las versiones de PHP
ini_restore('include_path');
echo get_include_path(); // .:/usr/local/lib/php
?>
(PHP 4 >= 4.3.0, PHP 5)
set_include_path — Establece la opción de configuración include_path
$new_include_path
)Establece la opción de configuración include_path durante la duración del script.
Devuelve el valor antiguo de include_path en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de set_include_path()
<?php
// Funciona a partir de PHP 4.3.0
set_include_path('/usr/lib/pear');
// Funciona en todas las versiones de PHP
ini_set('include_path', '/usr/lib/pear');
?>
Ejemplo #2 Añadir a la ruta de inclusión
Haciendo uso de la constante PATH_SEPARATOR es
posible extender la ruta de inclusión independientemente del sistema
operativo.
En este ejemplo agregamos /usr/lib/pear al final del valor include_path actual.
<?php
$ruta = '/usr/lib/pear';
set_include_path(get_include_path() . PATH_SEPARATOR . $ruta);
?>
(PHP 4, PHP 5)
set_magic_quotes_runtime — Establece el valor de configuración activo actual de magic_quotes_runtime
$new_setting
)Establecer el ajuste de configuración activo actual de magic_quotes_runtime.
Esta función ha sido declarada OBSOLETA desde PHP 5.3.0. Su uso está totalmente desaconsejado.
new_setting
FALSE para off, TRUE para on.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 set_magic_quotes_runtime() ejemplo
<?php
// Crea un apuntador de archivo temporal
$fp = tmpfile();
// Escribir algunos datos en el puntero
fwrite($fp, '\'PHP\' es un acrónimo recursivo');
// Sin magic_quotes_runtime
rewind($fp);
set_magic_quotes_runtime(false);
echo 'Sin magic_quotes_runtime: ' . fread($fp, 64), PHP_EOL;
// Con magic_quotes_runtime
rewind($fp);
set_magic_quotes_runtime(true);
echo 'Con magic_quotes_runtime: ' . fread($fp, 64), PHP_EOL;
// Clean up
fclose($fp);
?>
El resultado del ejemplo sería:
Sin magic_quotes_runtime: 'PHP' es un acrónimo recursivo Con magic_quotes_runtime: \'PHP\' es un acrónimo recursivo
(PHP 4, PHP 5)
set_time_limit — Limita el tiempo máximo de ejecución
$seconds
)Establece el número de segundos que se permite la ejecución de un script. Si esto se alcanza, el script devuelve un error fatal. El límite predeterminado es de 30 segundos o, si es que existe, el valor max_execution_time definido en el php.ini.
Cuando es llamado, set_time_limit() reinicia el contador de tiempo de espera de cero. En otras palabras, si el tiempo de espera por defecto es de 30 segundos, y 25 segundos en la ejecución del script se hace la llamada set_time_limit(20), el script se ejecutará durante un total de 45 segundos antes de que se agote el tiempo.
seconds
El tiempo de ejecución máximo, en segundos. Si se pone a cero se impone sin límite de tiempo.
No devuelve ningún valor.
Esta función no tiene efecto cuando PHP se ejecuta en safe mode. No hay ninguna solución más que deshabilitar el modo seguro o cambiar el tiempo límite en el php.ini.
Nota:
La función set_time_limit() y la directiva de configuración max_execution_time sólo afectan el tiempo de ejecución del script mismo. Todo el tiempo dedicado a la actividad que ocurre fuera de la ejecución del script, como las llamadas al sistema usando system(), operaciones de secuencia, consultas a la bases de datos, etc. No se incluyen cuando se determina el tiempo máximo del script en funcionamiento. Esto no es cierto en Windows, donde el tiempo medido es real.
(PHP 5 >= 5.2.1)
sys_get_temp_dir — Devuelve la ruta del directorio para archivos temporales
Devuelve la ruta del directorio donde PHP almacena los archivos temporales por defecto.
Devuelve la ruta del directorio temporal.
Ejemplo #1 sys_get_temp_dir() example
<?php
// Crear un fichero en el temporal
// directorio de archivos utilizando sys_get_temp_dir()
$temp_file = tempnam(sys_get_temp_dir(), 'Tux');
echo $temp_file;
?>
El resultado del ejemplo sería algo similar a:
C:\Windows\Temp\TuxA318.tmp
(PHP 4 >= 4.1.0, PHP 5)
version_compare — Compara dos números de versiones estandarizados de PHP
version_compare() compara dos números de versiones estandarizados de PHP. Puede ser de utilidad en caso de escribir programas que tan solo funcionen en determinadas versiones de PHP.
Esta función, en primer lugar reemplaza los _, - y + por puntos . y las cadenas de texto de versiones y añade puntos . antes y después de cualquier código no numérico, de manera que '4.3.2RC1' sería '4.3.2.RC.1'. Después, trocea el resultado tal como haría la función explode('.', $ver). Posteriormente compara cada una de las partes, de izquierda a derecha. Si alguna parte contuviera un texto especial de versión, se manejarían con el siguiente orden: cualquier texto que no se encuentre en esta lista < dev < alpha = a < beta = b < RC = rc < # < pl = p. De esta forma, no solo se pueden comparar versiones con diferentes niveles, como '4.1' y '4.1.2', sino que también se pueden comparar versiones específicas de PHP que contengan el estado de desarrollo en que se encuentran.
version1
Primer número de versión.
version2
Segundo número de versión.
operator
Si se especificara el argumento opcional operator,
se podrían comprobar determinadas realciones. Los operadores
posibles son: <,
lt, <=,
le, >,
gt, >=,
ge, ==,
=, eq,
!=, <>,
ne respectivamente.
Este parámetro es sensible a mayúsculas, por lo que debe introducirse en minúsculas.
Por omisión, version_compare() devuelve -1 si la primera versión es inferior a la segunda, 0 si son iguales, y 1 si la segunda es inferior.
Al usar el argumento opcional operator, la
función de volverá TRUE si se cumpliera la relación especificada por
el operador, o FALSE en caso contrario.
Los siguientes ejemplos usan la constante PHP_VERSION,
ya que esta contiene el valor de la versión de PHP con que se está ejecutando
el código.
Ejemplo #1 Ejemplos de version_compare()
<?php
if (version_compare(PHP_VERSION, '6.0.0') >= 0) {
echo 'Soy al menos la versión 6.0.0 de PHP, mi versión: ' . PHP_VERSION . "\n";
}
if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
echo 'Soy al menos la versión 5.3.0 de PHP, mi versión: ' . PHP_VERSION . "\n";
}
if (version_compare(PHP_VERSION, '5.0.0', '>=')) {
echo 'Estoy usando la versión 5 de PHP, mi versión: ' . PHP_VERSION . "\n";
}
if (version_compare(PHP_VERSION, '5.0.0', '<')) {
echo 'Estoy usando la versión 4 de PHP, mi versión: ' . PHP_VERSION . "\n";
}
?>
Nota:
La constante
PHP_VERSIONalmacena la versión de PHP en uso.
Nota:
Tenga presente que las versiones preeliminares, como por ejemplo 5.3.0-dev, se las considera inferiroes a la versión final (como por ejemplo 5.3.0).
(PHP 4, PHP 5)
zend_logo_guid — Obtiene el valor guid de Zend
Esta función devuelve el ID que puede ser usado para desplegar el logo de Zend usando la imagen incorporada.
Devuelve PHPE9568F35-D428-11d2-A769-00AA001ACF42.
Ejemplo #1 Ejemplo de zend_logo_guid()
<?php
echo '<img src="' . $_SERVER['PHP_SELF'] .
'?=' . zend_logo_guid() . '" alt="¡Logo Zend!" />';
?>
(PHP 5)
zend_thread_id — Devuelve un identificador único del thread actual
Esta función devuelve un identificador único del thread actual.
Devuelve thread id en formato integer.
Ejemplo #1 Ejemplo de zend_thread_id()
<?php
$thread_id = zend_thread_id();
echo 'El thread id actual es: ' . $thread_id;
?>
El resultado del ejemplo sería algo similar a:
El thread actual es: 7864
Nota:
Esta función solo está disponible en PHP compilado con soporte ZTS (Zend Thread Safety) y modo debug (--enable-debug).
(PHP 4, PHP 5)
zend_version — Obtiene la versión del motor Zend actual
Devuelve una cadena que contiene la versión del Motor Zend ejecutándose actualmente.
Devuelve el número de versión del Motor Zend, como una cadena.
Ejemplo #1 Ejemplo de zend_version()
<?php
echo "Versión del motor Zend: " . zend_version();
?>
El resultado del ejemplo sería algo similar a:
Versión del motor Zend: 2.2.0
La extensión runkit proporciona medios para modificar constantes, funciones definidas por el usuario y clases definidas por el usuario. También proporciona variables superglobales personalizadas y sub-intérpretes que se pueden embeber mediante aislamiento de procesos (sandboxing).
Este paquete está hecho como una característica añadida para reemplazar al paquete » classkit. Cuando se compila con la opción --enable-runkit=classkit a ./configure, exportará las definiciones de funciones y constantes compatibles con classkit.
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
RUNKIT_IMPORT_FUNCTIONS
(integer)
RUNKIT_IMPORT_CLASS_METHODS
(integer)
RUNKIT_IMPORT_CLASS_CONSTS
(integer)
RUNKIT_IMPORT_CLASS_PROPS
(integer)
RUNKIT_IMPORT_CLASSES
(integer)
RUNKIT_IMPORT_CLASS_*.
RUNKIT_IMPORT_OVERRIDE
(integer)
RUNKIT_ACC_PUBLIC
(integer)
RUNKIT_ACC_PROTECTED
(integer)
RUNKIT_ACC_PRIVATE
(integer)
CLASSKIT_ACC_PUBLIC
(integer)
CLASSKIT_ACC_PROTECTED
(integer)
CLASSKIT_ACC_PRIVATE
(integer)
CLASSKIT_AGGREGATE_OVERRIDE
(integer)
RUNKIT_VERSION
(string)
CLASSKIT_VERSION
(string)
Modificar Constantes, Funciones, Clases y Métodos funciona con todas las distribuciones de PHP 4 y PHP 5. No se necesitan requisitos especiales.
Las Superglobales Personalizadas sólo están disponibles en PHP 4.2.0 o posterior.
El Aislamiento de Procesos (Sandboxing) requiere PHP 5.1.0 o posterior, o PHP 5.0.0 con un parche TSRM especial aplicado. Sin importar qué versión de PHP está en uso se debe compilar con la opción --enable-maintainer-zts. Vea el archivo README en el paquete de runkit para información adicional.
Esta extensión » PECL no se distribuye con PHP.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/runkit.
No hay una DLL disponible para esta extensión PECL actualmente. Vea también la sección Compilando en Windows .
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| runkit.superglobal | "" | PHP_INI_PERDIR | |
| runkit.internal_override | "0" | PHP_INI_SYSTEM |
He aquí una breve explicación de las directivas de configuración.
runkit.superglobal
string
Ejemplo #1 Superglobales personalizadas con runkit.superglobal=_FOO,_BAR en php.ini
<?php
function mostrar_valores() {
echo "Foo es $_FOO\n";
echo "Bar es $_BAR\n";
echo "Baz es $_BAZ\n";
}
$_FOO = 'foo';
$_BAR = 'bar';
$_BAZ = 'baz';
/* Muestra foo y bar, pero no baz */
mostrar_valores();
?>
runkit.internal_override
boolean
Esta extensión no tiene ningún tipo de recurso definido.
(PECL runkit >= 0.7.0)
Runkit_Sandbox — La Clase Runkit Sandbox -- Máquina Virtual de PHP
Al instanciar la clase Runkit_Sandbox se crea un nuevo hilo con su própio ámbito y pila de programa. Al usar un conjunto de opciones pasadas al constructor, este entorno puede estar restringido a un subconjunto de lo que el intérprete primario puede hacer y proporciona un entorno seguro para ejecutar código proporcionado por el usuario.
Nota: Soporte para Entorno de Pruebas (requerido por runkit_lint(), runkit_lint_file(), y la clase Runkit_Sandbox) está disponible sólo a partir de PHP 5.1.0 o versiones especialmente parcheadas de PHP 5.0, y requiere que thread safety sea habilitada. Vea el archivo README incluido en el paquete runkit para más información.
$options
] )
options es un array asociativo que contiene
cualquier combinación de las opciones especiales ini listadas abajo.
safe_mode
Si el script exterior que está instanciando la clase Runkit_Sandbox se configura con safe_mode = off, safe_mode puede ser activado para el entorno del aislamiento de procesos (sandbox). Esta configuración no se puede usar para deshabilitar safe_mode cuando ya está habilitado en el script exterior.
safe_mode_gid
Si el script exterior que está instanciando la clase Runkit_Sandbox se configura con safe_mode_gid = on, safe_mode_gid puede ser activado para el entorno del aislamiento de procesos. Esta configuración no se puede usar para habilitar safe_mode_gid cuando ya está deshabilitado en el script exterior.
safe_mode_include_dir
Si el script exterior que está instanciando la clase Runkit_Sandbox se configura con un directorio safe_mode_include_dir, un nuevo directorio safe_mode_include_dir puede ser establecido para los entornos del aislamiento de procesos bajo es valor definido actualmente. safe_mode_include_dir también puede ser limpiado para indicar que la característica de bypass está deshabilitada. Si safe_mode_include_dir estaba en blanco en el script exterior, pero safe_mode no estaba habilitado, se puede establecer cualquier directorio safe_mode_include_dir arbitrario mientras se activa safe_mode.
open_basedir
open_basedir puede ser establecido a cualquier ruta bajo la
confuguración actual de open_basedir. Si
open_basedir no está establecido dentro del ámbito global,
se asume que es el directorio raíz y puede ser establecido a cualquier ubicación.
allow_url_fopen
Como safe_mode, esta configuración sólo puede ser hecha más restrictiva,
en este caso estableciéndola a FALSE cuando estaba anteriomente establecida a TRUE
disable_functions
Una lista de funciones separadas por comas a deshabilitar dentro del sub-intérprete del aisalmiaento de procesos. Esta lista no necesita contener los nombres de las funciones actualmente deshabiltadas, permanecerán deshabiltadas ya estén listadas o no.
disable_classes
Una lista de clases separadas por comas a deshabilitar dentro del sub-intérprete del aisalmiaento de procesos. Esta lista no necesita contener los nombres de las clases actualmente deshabiltadas, permanecerán deshabiltadas ya estén listadas o no.
runkit.superglobal
Una lista de varables separadas por comas a ser tratadas como superglobales dentro del sub-intérprete del aislamiaento de procesos. Estas variables serás usadas además de cualquier variable definida internamente o a través de la configuración global runkit.superglobal.
runkit.internal_override
La opción ini runkit.internal_override puede ser deshabilitada (pero no rehabilitada) dentro de los aislamientos de procesos.
Ejemplo #1 Instanciar un entorno de aislamiento de procesos (sandbox) restringido
<?php
$opciones = array(
'safe_mode'=>true,
'open_basedir'=>'/var/www/users/jdoe/',
'allow_url_fopen'=>'false',
'disable_functions'=>'exec,shell_exec,passthru,system',
'disable_classes'=>'myAppClass');
$sandbox = new Runkit_Sandbox($opciones);
/* Las configuraciones ini no protegidas pueden establecerse normalmente */
$sandbox->ini_set('html_errors',true);
?>
Todas las variables en el ámbito global del entorno del aislamiento de procesos son accesibles como propiedades del objeto de aislamiento de procesos. Lo primero a tener en cuenta es que a causa de la manera en que se maneja la memoria entre estos dos hilos, las variables de objeto y de recurso actualmente no se pueden intercambiar entre intérpretes. Además, todas las matrices se copian en profundidad y cualquier referencia se perderá. Esto también siginifiva que las referencias entre intérpretes no son posibles.
Ejemplo #2 Trabajar con variables en un entorno de aislamiento de procesos (sandbox)
<?php
$sandbox = new Runkit_Sandbox();
$sandbox->foo = 'bar';
$sandbox->eval('echo "$foo\n"; $bar = $foo . "baz";');
echo "{$sandbox->bar}\n";
if (isset($sandbox->foo)) unset($sandbox->foo);
$sandbox->eval('var_dump(isset($foo));');
?>
El resultado del ejemplo sería:
bar barbaz bool(false)
Cualquier función definida dentro del entorno de aislamiento de procesos puede ser llamada como un método del objeto de aislamiento de procesos. Esto también incluye algunos contructores de lenguaje de pseudo-función: eval(), include, include_once, require, require_once, echo, print, die(), y exit().
Ejemplo #3 Llamar a funciones del aislamiento de procesos
<?php
$sandbox = new Runkit_Sandbox();
echo $sandbox->str_replace('a','f','abc');
?>
El resultado del ejemplo sería:
fbc
Cuando se pasan argumentos a una función de aislameinto de procesos, los argumentos se toman desde la instancia exterior de PHP. Si se desea pasar argumentos desde el ámbito del aislamiento de procesos, asegúrese de acceder a ellos como propiedades del objeto de aislamiento de procesos como se ilustra abajo.
Ejemplo #4 Pasar agumentos a las funciones del aislamiento de procesos
<?php
$sandbox = new Runkit_Sandbox();
$foo = 'bar';
$sandbox->foo = 'baz';
echo $sandbox->str_replace('a',$foo,'a');
echo $sandbox->str_replace('a',$sandbox->foo,'a');
?>
El resultado del ejemplo sería:
bar baz
A partir de la versión 0.5 de runkit, se pueden modificar ciertas configuraciones
del aislamiento de procesos sobre la marcha usando la sintaxis de ArrayAccess.
Algunos ajustes, como active,
son de sólo lectura y proporcionan información de estado.
Otros ajustes, como output_handler,
se pueden establecer y leer como un índice de matriz normal.
Ajustes futuros puede ser de sólo escritura, sin embargo
actualmente no existen tales ajustes.
| Configuración | Tipo | Propósito | Predeterminado |
|---|---|---|---|
| active | Boolean (Sólo Lectura) |
TRUE si el Aislamiento de Procesos está aún en un estado usable,
FALSE si la peticióni está abandonada debido a una
llamada a die(), exit(), o a causa de una condición
de error fatal.
|
TRUE (Inicial) |
| output_handler | Callback | Cuando se establece a una llamada de retorno válida, toda la salida generada por la instancia del Aislamiento de Procesos será procesada por la función nominada. Los gestores de salida del Aislamiento de Procesos siguen las misma convenciones de llamada que los gestores de salida del lado del sistema. | Ninguno |
| parent_access | Boolean | ¿El aislamiento de procesos puede usar instancias de la clase Runkit_Sandbox_Parent? Debe estar habilitado para otras configuraciones de Runkit_Sandbox_Parent relacionadas para que funcione. | FALSE |
| parent_read | Boolean | ¿El aislamiento de procesos puede leer variables en su contexto padre? | FALSE |
| parent_write | Boolean | ¿El aislamiento de procesos puede modificar variables en su contexto padre? | FALSE |
| parent_eval | Boolean | ¿El aislamiento de procesos puede evaluar código arbitrario en su contexto padre? PELIGROSO | FALSE |
| parent_include | Boolean | ¿El aislamiento de procesos puede incluir archivos de código php en su contexto padre? PELIGROSO | FALSE |
| parent_echo | Boolean | ¿El aislamiento de procesos puede hacer eco de información en su contexto padre eefctivamente pasando su propio output_handler? | FALSE |
| parent_call | Boolean | ¿El aislamiento de procesos puede llamar a funciones en su contexto padre? | FALSE |
| parent_die | Boolean | ¿El aislamiento de procesos puede eliminar su propio contexto padre? (Y así a sí mismo) | FALSE |
| parent_scope | Integer | ¿Qué Ámbito tendrá el acceso de las propiedades padre? 0 == Ámbito global, 1 == Ámbito de llamda, 2 == Ámbito precediendo al ambito de llamada, 3 == El ambito antes de este, etc..., etc... | 0 (Global) |
| parent_scope | String | Cuando parent_scope está establecido a un valor de cadena, se refiere a un variable de matriz nominada en el Ámbito global. Si la variable nominada no existe el momento del acceso se creará como un array vacío. Si la varible existe pero no es un array, se creará un array "falso" que contiene una referencia a la variable global nominada. |
(PECL runkit >= 0.7.0)
Runkit_Sandbox_Parent — Clase Runkit Anti-Sandbox
Instanciar la clase Runkit_Sandbox_Parent desde dentro de un entorno de aislamiento de procesos creado desde la clase Runkit_Sandbox proporciona algunos medios (controlados) para que un aislamiento de procesos hijo acceda a su padre.
Nota: Soporte para Entorno de Pruebas (requerido por runkit_lint(), runkit_lint_file(), y la clase Runkit_Sandbox) está disponible sólo a partir de PHP 5.1.0 o versiones especialmente parcheadas de PHP 5.0, y requiere que thread safety sea habilitada. Vea el archivo README incluido en el paquete runkit para más información.
Para que cualquier característica de Runkit_Sandbox_Parent funcione, el soporte debe estar habilitado sobre una base del aislamiento de procesos habilitando la bandera parent_access desde el contexto padre.
Ejemplo #1 Trabajar con variables en un aislamiento de procesos (sandbox)
<?php
$sandbox = new Runkit_Sandbox();
$sandbox['parent_access'] = true;
?>
Al igual que con el acceso a variables en un aislamiento de procesos, las variables del padre de un aislamiento de procesos se puede leer y escribir como propiedades de la clase Runkit_Sandbox_Parent. El acceso a la lectura de variables padre puede estar habilitado con el ajuste parent_read (además del ajuste base parent_access). El acceso a escritura, a su vez, se habilita a través del ajuste parent_write.
A diferencia del acceso a variables de un hijo del aislamiento de procesos, el ámbito de la variable no está limitado sólo a globales. Estableciendo el ajuste parent_scope a un valor entero apropiado se pueden examinar otros ámbitos en la pila de llamadas activas. Un valor de 0 (Predeterminado) dirigirá el acceso a variables al ámbito global. 1 apuntará al acceso a varables en cualquier ámbito de variables que estuviera activo en el momento en el que el bloque del código del aislamiento de proceosos actual estuviera ejecutándose. Valores mayores recorren hacia atrás las funciones que llamaron a las funciones que llevaron al código de ejecución del aislamiento de procesos que intentó acceder a sus propias variables padre.
Ejemplo #2 Acceder a las varibales padre
<?php
$php = new Runkit_Sandbox();
$php['parent_access'] = true;
$php['parent_read'] = true;
$prueba = "Global";
$php->eval('$PARENT = new Runkit_Sandbox_Parent;');
$php['parent_scope'] = 0;
uno();
$php['parent_scope'] = 1;
uno();
$php['parent_scope'] = 2;
uno();
$php['parent_scope'] = 3;
uno();
$php['parent_scope'] = 4;
uno();
$php['parent_scope'] = 5;
uno();
function uno() {
$prueba = "uno()";
dos();
}
function dos() {
$prueba = "dos()";
tres();
}
function tres() {
$prueba = "tres()";
$GLOBALS['php']->eval('var_dump($PARENT->prueba);');
}
?>
El resultado del ejemplo sería:
string(6) "Global" string(7) "tres()" string(5) "dos()" string(5) "uno()" string(6) "Global" string(6) "Global"
Igual que con el acceso del aislamiento de procesos, un aislamiento de procesos puede acceder a sus funciones padre siempre que haya sido habilitada la configuración apropiada. Habilitar parent_call permitirá al aislamiento de procesos llamar a todas las funciones disponibles en el ámbito padre. Los constructores del lenguaje están controlados cada uno por sus propias configuraciones: print y echo son habilitadas con parent_echo. die() y exit() son habilitadas con parent_die. eval() es habilitada con parent_eval mientras que include, include_once, require, y require_once son habilitadas a través de parent_include.
(PECL runkit >= 0.7.0)
runkit_class_adopt — Convertir una clase base en una clase heredada, añadiendo métodos ancestrales cuando sea apropiado
$classname
, string $parentname
)
classname
Nombre de la clase a ser adoptada
parentname
La clase padre en la que se extiende la hija
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Un ejemplo de runkit_class_adopt()
<?php
class miPadre {
function funcPadre() {
echo "Salida de la Función Padre\n";
}
}
class miHija {
}
runkit_class_adopt('myChild','funcPadre');
miHija::funcPadre();
?>
El resultado del ejemplo sería:
Salida de la Función Padre
(PECL runkit >= 0.7.0)
runkit_class_emancipate — Convertir una clase heredada en una clase base, eliminando cualquier método cuyo ámbito sea ancestral
$classname
)
classname
Nombre de la clase a emancipar
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Un ejemplo de runkit_class_emancipate()
<?php
class miPadre {
function funcPadre () {
echo "Salida de la Función Padre\n";
}
}
class miHija extends miPadre {
}
miHija::funcPadre();
runkit_class_emancipate('miHija');
miHija::funcPadre();
?>
El resultado del ejemplo sería:
Salida de la Función Padre Fatal error: Call to undefined function: funcPadre() in example.php on line 12
(PECL runkit >= 0.7.0)
runkit_constant_add — Similar a define(), excepto que también permite definir en definiciones de clase
constname
Nombre de la constante a declarar. Una cadena que indica la constante global, o nombreclase::constname que indica la constante de clase.
value
Valor NULL, Bool, Long, Double, String, o Resource a almacenar en la nueva constante.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL runkit >= 0.7.0)
runkit_constant_redefine — Redefinir una constante ya definida
constname
Constante a redefinir. Una cadena que indica la constante global, o nombreclase::constname que indica la constante de clase.
newvalue
El nuevo valor a asignar a la constante.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL runkit >= 0.7.0)
runkit_constant_remove — Eliminar/Borrar una constante ya definida
$constname
)
constname
Nombre de la constante a eliminar. Una cadena que indica la constante global, o nombreclase::constname que indica la constante de clase.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL runkit >= 0.7.0)
runkit_function_add — Añadir una nueva función, similar a create_function()
$funcname
, string $arglist
, string $code
)
funcname
Nombre de la función que va a ser creada
arglist
Lista de argumentos separados por comas
code
Código que compone la función
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Un ejemplo de runkit_function_add()
<?php
runkit_function_add('testme','$a,$b','echo "El valor de a es $a\n"; echo "El valor de b es $b\n";');
testme(1,2);
?>
El resultado del ejemplo sería:
El valor de a es 1 El valor de b es 2
(PECL runkit >= 0.7.0)
runkit_function_copy — Copiar una función a un nombre de función nuevo
$funcname
, string $targetname
)
funcname
Nombre de la función existente
targetname
Nombre de la función donde se va a copiar la definición
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Un ejemplo de runkit_function_copy()
<?php
function original() {
echo "En una función\n";
}
runkit_function_copy('original','duplicado');
original();
duplicado();
?>
El resultado del ejemplo sería:
En una función En una función
(PECL runkit >= 0.7.0)
runkit_function_redefine — Reemplazar una definición de función con una nueva implementación
$funcname
, string $arglist
, string $code
)Nota: Por defecto, sólo funciones del espacio de usuario pueden ser eliminadas, renombradas, o modificadas. Para controlar funciones internas, la opción runkit.internal_override en php.ini debe ser habilitada.
funcname
Nombre de la función a redefinir
arglist
Nueva lista de argumentos a ser aceptados por la función
code
Nueva implementación de código
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Un ejemplo de runkit_function_redefine()
<?php
function testme() {
echo "Implementación Original de Testme\n";
}
testme();
runkit_function_redefine('testme','','echo "Nueva Implementación de Testme\n";');
testme();
?>
El resultado del ejemplo sería:
Implementación Original de Testme Nueva Implementación de Testme
(PECL runkit >= 0.7.0)
runkit_function_remove — Eliminar una definición de función
$funcname
)Nota: Por defecto, sólo funciones del espacio de usuario pueden ser eliminadas, renombradas, o modificadas. Para controlar funciones internas, la opción runkit.internal_override en php.ini debe ser habilitada.
funcname
Nombre de la función a ser borrada
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL runkit >= 0.7.0)
runkit_function_rename — Cambiar el nombre de una función
$funcname
, string $newname
)Nota: Por defecto, sólo funciones del espacio de usuario pueden ser eliminadas, renombradas, o modificadas. Para controlar funciones internas, la opción runkit.internal_override en php.ini debe ser habilitada.
funcname
Nombre actual de la función
newname
Nombre nuevo de la función
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL runkit >= 0.7.0)
runkit_import — Procesar un archivo PHP importando definiciones de funciones y clases, sobrescribiendo cuando sea apropiado
$filename
[, int $flags = RUNKIT_IMPORT_CLASS_METHODS
] )
Similar a include, sin embargo cualquier código que resida fuera
de una función o clase es simplemente ignorado.
Además, dependiendo del valor de flags,
cualquier función o clase ya existente en el entorno de ejecución actual
será sobrescrito automáticamente por sus nuevas definiciones.
filename
El nombre de archivo desde que se va a importar las definiciones de funciones y clases
flags
Operador OR a nivel de bit de la familia de constantes RUNKIT_IMPORT_*.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL runkit >= 0.7.0)
runkit_lint_file — Verificar la sintaxis PHP del archivo especificado
$filename
)La función runkit_lint_file() lleva a cabo una verifiación de sintaxis (lint) (pelusa en inglés) sobre el nombre de archivo especificado comprobando errores en la escritura del script. Esto es similar a usar php -l desde la línea de comandos.
Nota: Soporte para Entorno de Pruebas (requerido por runkit_lint(), runkit_lint_file(), y la clase Runkit_Sandbox) está disponible sólo a partir de PHP 5.1.0 o versiones especialmente parcheadas de PHP 5.0, y requiere que thread safety sea habilitada. Vea el archivo README incluido en el paquete runkit para más información.
filename
Archivo que contiene el código PHP a ser verificado de "pelusas" (lint)
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL runkit >= 0.7.0)
runkit_lint — Verificar la sintaxis PHP del código php especificado
$code
)La función runkit_lint() lleva a cabo una verifiación de sintaxis (lint) (pelusa en inglés) sobre el código php especificado comprobando errores en la escritura del script. Esto es similar a usar php -l desde la línea de comandos excepto que runkit_lint() acepta código actual en vez de un nombre de archivo.
Nota: Soporte para Entorno de Pruebas (requerido por runkit_lint(), runkit_lint_file(), y la clase Runkit_Sandbox) está disponible sólo a partir de PHP 5.1.0 o versiones especialmente parcheadas de PHP 5.0, y requiere que thread safety sea habilitada. Vea el archivo README incluido en el paquete runkit para más información.
code
El código PHP a ser verificado de "pelusas" (lint)
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL runkit >= 0.7.0)
runkit_method_add — Añadir dinámicamente un nuevo método a una clase dada
$classname
, string $methodname
, string $args
, string $code
[, int $flags = RUNKIT_ACC_PUBLIC
] )Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
classname
La clase donde se va a añadir el método
methodname
El nombre del método a añadir
args
Lista de argumentos delimitados por comas para el recién creado método
code
El código a ser evaluado cuando methodname
sea llamado
flags
El tipo de método a crear, puede ser
RUNKIT_ACC_PUBLIC,
RUNKIT_ACC_PROTECTED o
RUNKIT_ACC_PRIVATE
Nota:
Este parámetro sólo se usa a partir de PHP 5, ya que, antes de esta versión, todos los métodos eran públicos.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de runkit_method_add()
<?php
class Ejemplo {
function foo() {
echo "foo!\n";
}
}
// crear un objeto de Ejemplo
$e = new Ejemplo();
// Añadir un nuevo método público
runkit_method_add(
'Ejemplo',
'sumar',
'$num1, $num2',
'return $num1 + $num2;',
RUNKIT_ACC_PUBLIC
);
// sumar 12 + 4
echo $e->sumar(12, 4);
?>
El resultado del ejemplo sería:
16
(PECL runkit >= 0.7.0)
runkit_method_copy — Copia un método de una clase a otra
$dClass
, string $dMethod
, string $sClass
[, string $sMethod
] )Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
dClass
Clase destino del método a copiar
dMethod
Nombre del método destino
sClass
Clase fuente del método a copiar
sMethod
Nombre del método a copiar desde la clase fuente. Si se omite este parámetro,
se asume el valor de dMethod.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de runkit_method_copy()
<?php
class Foo {
function ejemplo() {
return "foo!\n";
}
}
class Bar {
// inicialmete sin métodos
}
// copiar el método ejemplo() desde la clase Foo a la clase Bar, como baz()
runkit_method_copy('Bar', 'baz', 'Foo', 'ejemplo');
// imprimir la función copiada
echo Bar::baz();
?>
El resultado del ejemplo sería:
foo!
(PECL runkit >= 0.7.0)
runkit_method_redefine — Cambiar dinámicamente el código del método dado
$classname
, string $methodname
, string $args
, string $code
[, int $flags = RUNKIT_ACC_PUBLIC
] )Nota: Esta función no puede ser utilizada para manipular el actual método en ejecución (o extendido).
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
classname
La clase en la que se va a redefinir el método
methodname
El nombre del método a redefinir
args
Lista de argumentos delimitados por coma para el método redefinido
code
El nuevo código a ser evaluado cuando methodname
sea llamado
flags
El método redefinido puede ser
RUNKIT_ACC_PUBLIC,
RUNKIT_ACC_PROTECTED o
RUNKIT_ACC_PRIVATE
Nota:
Este parámetro sólo se usa a partir de PHP 5, ya que, antes de esta versión, todos los métodos eran públicos.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de runkit_method_redefine()
<?php
class Ejemplo {
function foo() {
return "foo!\n";
}
}
// crear un objeto de Ejemplo
$e = new Ejemplo();
// imprimir Ejemplo::foo() (antes de redefinir)
echo "Antes: " . $e->foo();
// Redefinir el método 'foo'
runkit_method_redefine(
'Ejemplo',
'foo',
'',
'return "bar!\n";',
RUNKIT_ACC_PUBLIC
);
// imprimir Ejemplo::foo() (después de redefinir)
echo "Después: " . $e->foo();
?>
El resultado del ejemplo sería:
Antes: foo! Después: bar!
(PECL runkit >= 0.7.0)
runkit_method_remove — Eliminar dinámicamente el método dado
$classname
, string $methodname
)Nota: Esta función no puede ser utilizada para manipular el actual método en ejecución (o extendido).
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
classname
La clase en la que se va a eliminar el método
methodname
El nombre del método a eliminar
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de runkit_method_remove()
<?php
class Ejemplo {
function foo() {
return "foo!\n";
}
function bar() {
return "bar!\n";
}
}
// Eliminar el método 'foo'
runkit_method_remove(
'Ejemplo',
'foo'
);
echo implode(' ', get_class_methods('Ejemplo'));
?>
El resultado del ejemplo sería:
bar
(PECL runkit >= 0.7.0)
runkit_method_rename — Cambiar dinámicamente el nombre del método dado
$classname
, string $methodname
, string $newname
)Nota: Esta función no puede ser utilizada para manipular el actual método en ejecución (o extendido).
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
classname
La clase en la que se renombrará el método
methodname
El nombre del método a renombrar
newname
El nombre nuevo a dar al método renombrado
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo derunkit_method_rename()
<?php
class Ejemplo {
function foo() {
return "foo!\n";
}
}
// Renombrar el método 'foo' a 'bar'
runkit_method_rename(
'Ejemplo',
'foo',
'bar'
);
// salida de la función renombrada
echo Ejemplo::bar();
?>
El resultado del ejemplo sería:
foo!
(PECL runkit >= 0.8.0)
runkit_return_value_used — Determina si se usarán los valores devueltos por las funciones actuales
Devuelve TRUE si el valor devuelto de la función actual se usa por el alcance de la llamada,
de otro modo FALSE
Ejemplo #1 Ejemplo de runkit_return_value_used()
<?php
function foo() {
var_dump(runkit_return_value_used());
}
foo();
$f = foo();
?>
El resultado del ejemplo sería:
bool(false) bool(true)
(PECL runkit >= 0.7.0)
runkit_sandbox_output_handler — Especificar una función para capturar y/o procesar la salida de un aislamiento de procesos de runkit
Normalmente, cuanquier cosa que realice una salida (como echo o print) será sacada como si fuera impresa desde el ámbito padre. Sin embargo, al usar runkit_sandbox_output_handler(), la salida generada por el aislamiento de procesos (inclueyndo errores) puede ser capturada por una función fuera del aislamiento de procesos.
Nota: Soporte para Entorno de Pruebas (requerido por runkit_lint(), runkit_lint_file(), y la clase Runkit_Sandbox) está disponible sólo a partir de PHP 5.1.0 o versiones especialmente parcheadas de PHP 5.0, y requiere que thread safety sea habilitada. Vea el archivo README incluido en el paquete runkit para más información.
Nota: Obsoleto
A partir de la versión 0.5 de runkit, esta función está obsoleta y está programada para ser eliminada del paquete antes de la distribución de la versión 1.0. Para una instancia de Runkit_Sandbox, el gestor de salida puede ser leído/establecido usando la sintaxis de índice de array mostrado en la página de definición de la clase Runkit_Sandbox.
sandbox
Instancia de objeto de la clase Runkit_Sandbox en la que establecer el gestor de salida.
callback
Nombre de una función que espera un parámetro.
La salida generada por sandbox será pasada
a esta llamada de retorno (callback). Cualquier cosa devuelta por la llamda de retorno será mostrada
normalmente. Si este parámetro no se pasa, la gestión de salida no será cambiada.
Si se pasa un valor no verdadero, la gestión de salida será deshabilitada y será vuelta a la
muestra directa.
Devuelve el nombre de la llamada de retorno del gestor de salida definido previamente, o
FALSE si no se definió previamente un gestor.
Ejemplo #1 Introducir la salida en una variable
<?php
function capture_output($str) {
$GLOBALS['sandbox_output'] .= $str;
return '';
}
$sandbox_output = '';
$php = new Runkit_Sandbox();
runkit_sandbox_output_handler($php, 'capture_output');
$php->echo("Hola\n");
$php->eval('var_dump("Lo siento");');
$php->die("Me perdí.");
unset($php);
echo "Sandbox Completado\n\n";
echo $sandbox_output;
?>
El resultado del ejemplo sería:
Sandbox Completado Hola string(9) "Lo sientoe" Me perdí.
(PECL runkit >= 0.7.0)
runkit_superglobals — Devolver el array indexado numéricamente de las superglobales registradas
Devuelve un array indexado numéricamente de las globales registradas actualmente, esto es, _GET, _POST, _REQUEST, _COOKIE, _SESSION, _SERVER, _ENV, _FILES
La extensión scream permite la posibilidad de desactivar el silenciado del operador de control de errores así que todos los errores serán expuestos. Esta característica está controlada por una directiva ini.
Versión de PHP 5.2.0 o superior.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/scream
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| scream.enabled | Off | PHP_INI_ALL |
He aquí una breve explicación de las directivas de configuración.
scream.enabled
int
Cuando está o no está scream activado.
Esta extensión no tiene ningún tipo de recurso definido.
Este ejemplo demuestra como scream afecta el comportamiento del controlador de errores de PHP.
Ejemplo #1 Activando y desactivando scream en tiempo de ejecución
<?php
// Asegurarse de mostrar todos los errores
ini_set('display_errors', true);
error_reporting(E_ALL);
// Desactivar scream - este es el valor por defecto y producirá un error
ini_set('scream.enabled', false);
echo "Abriendo http://example.com/not-existing-file\n";
@fopen('http://example.com/not-existing-file', 'r');
// Ahora activamos scream y probamos de nuevo
ini_set('scream.enabled', true);
echo "Abriendo http://example.com/not-existing-file\n";
@fopen('http://example.com/another-not-existing-file', 'r');
?>
El resultado del ejemplo sería algo similar a:
Opening http://example.com/not-existing-file Opening http://example.com/not-existing-file Warning: fopen(http://example.com/another-not-existing-file): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in example.php on line 14
Nota: Normalmente se querrá activar esta directiva en el fichero de configuración php.ini en lugar de cambiar el código.
Weak references provide a non-intrusive gateway to ephemeral objects. Unlike normal (strong) references, weak references do not prevent the garbage collector from freeing that object. For this reason, an object may be destroyed even though a weak reference to that object still exists. In such conditions, the weak reference seamlessly becomes invalid.
Ejemplo #1 Weakref usage example
<?php
class MyClass {
public function __destruct() {
echo "Destroying object!\n";
}
}
$o1 = new MyClass;
$r1 = new Weakref($o1);
if ($r1->valid()) {
echo "Object still exists!\n";
var_dump($r1->get());
} else {
echo "Object is dead!\n";
}
unset($o1);
if ($r1->valid()) {
echo "Object still exists!\n";
var_dump($r1->get());
} else {
echo "Object is dead!\n";
}
?>
El resultado del ejemplo sería:
Object still exists!
object(MyClass)#1 (0) {
}
Destroying object!
Object is dead!
No se requiere de ninguna biblioteca externa para compilar esta extensión.
Esta extensión » PECL no se distribuye con PHP.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/weakref.
No hay una DLL disponible para esta extensión PECL actualmente. Vea también la sección Compilando en Windows .
Esta extensión no tiene ningún tipo de recurso definido.
(PECL weakref >= 0.1.0)
The WeakRef class provides a gateway to objects without preventing the garbage collector from freeing those objects. It also provides a way to turn a weak reference into a strong one.
Ejemplo #1 WeakRef usage example
<?php
class MyClass {
public function __destruct() {
echo "Destroying object!\n";
}
}
$o1 = new MyClass;
$r1 = new WeakRef($o1);
if ($r1->valid()) {
echo "Object still exists!\n";
var_dump($r1->get());
} else {
echo "Object is dead!\n";
}
unset($o1);
if ($r1->valid()) {
echo "Object still exists!\n";
var_dump($r1->get());
} else {
echo "Object is dead!\n";
}
?>
El resultado del ejemplo sería:
Object still exists!
object(MyClass)#1 (0) {
}
Destroying object!
Object is dead!
(PECL weakref >= 0.1.0)
Weakref::acquire — Acquires a strong reference on that object
Acquires a strong reference on that object, virtually turning the weak reference into a strong one.
Esta función no tiene parámetros.
Returns TRUE if the reference was valid and could be turned into a strong
reference, FALSE otherwise.
Ejemplo #1 Weakref::acquire() example
<?php
class MyClass {
public function __destruct() {
echo "Destroying object!\n";
}
}
$o1 = new MyClass;
$r1 = new Weakref($o1);
$r1->acquire();
echo "Unsetting o1...\n";
unset($o1);
$o2 = $r1->get();
$r1->release();
echo "Unsetting o2...\n";
unset($o2);
?>
El resultado del ejemplo sería:
Unsetting o1... Unsetting o2... Destroying object!
Ejemplo #2 Nested acquire/release example
<?php
class MyClass {
public function __destruct() {
echo "Destroying object!\n";
}
}
$o1 = new MyClass;
$r1 = new Weakref($o1);
echo "Acquiring...\n";
$r1->acquire();
echo " Unsetting...\n";
unset($o1);
echo " Acquiring...\n";
$r1->acquire();
echo " Acquiring...\n";
$r1->acquire();
echo " Releasing...\n";
$r1->release();
echo " Releasing...\n";
$r1->release();
echo "Releasing...\n";
$r1->release();
?>
El resultado del ejemplo sería:
Acquiring...
Unsetting...
Acquiring...
Acquiring...
Releasing...
Releasing...
Releasing...
Destroying object!
(PECL weakref >= 0.1.0)
Weakref::__construct — Constructs a new weak reference
$object
] )Constructs a new weak reference.
object
The object to reference.
No devuelve ningún valor.
Ejemplo #1 Weakref::__construct() example
<?php
class MyClass {
public function __destruct() {
echo "Destroying object!\n";
}
}
$o1 = new MyClass;
$r1 = new Weakref($o1);
if ($r1->valid()) {
echo "Object still exists!\n";
var_dump($r1->get());
} else {
echo "Object is dead!\n";
}
unset($o1);
if ($r1->valid()) {
echo "Object still exists!\n";
var_dump($r1->get());
} else {
echo "Object is dead!\n";
}
?>
El resultado del ejemplo sería:
Object still exists!
object(MyClass)#1 (0) {
}
Destroying object!
Object is dead!
(PECL weakref >= 0.1.0)
Weakref::get — Returns the object pointed to by the weak reference
Returns the object pointed to by the weak reference.
Esta función no tiene parámetros.
Returns the object if the reference is still valid, NULL otherwise.
(PECL weakref >= 0.1.0)
Weakref::release — Releases a previously acquired reference
Releases a previously acquired reference. Potentially turning a strong reference back into a weak reference.
Esta función no tiene parámetros.
Returns TRUE if the reference was previously acquired and thus could be
released, FALSE otherwise.
Ejemplo #1 Weakref::release() example
<?php
class MyClass {
public function __destruct() {
echo "Destroying object!\n";
}
}
$o1 = new MyClass;
$r1 = new Weakref($o1);
$r1->acquire();
echo "Unsetting o1...\n";
unset($o1);
$o2 = $r1->get();
$r1->release();
echo "Unsetting o2...\n";
unset($o2);
?>
El resultado del ejemplo sería:
Unsetting o1... Unsetting o2... Destroying object!
(PECL weakref >= 0.1.0)
Weakref::valid — Checks whether the object referenced still exists
Checks whether the object referenced still exists.
Esta función no tiene parámetros.
Returns TRUE if the object still exists and is thus still accessible via
Weakref::get(), FALSE otherwise.
(PECL weakref >= 0.2.0)
Ejemplo #1 Weakmap usage example
<?php
$wm = new WeakMap();
$o = new StdClass;
class A {
public function __destruct() {
echo "Dead!\n";
}
}
$wm[$o] = new A;
var_dump(count($wm));
echo "Unsetting..\n";
unset($o);
echo "Done\n";
var_dump(count($wm));
El resultado del ejemplo sería:
int(1) Unsetting.. Dead! Done int(0)
(PECL weakref >= 0.2.0)
WeakMap::__construct — Constructs a new map
Constructs a new map.
Esta función no tiene parámetros.
No devuelve ningún valor.
(PECL weakref >= 0.2.0)
WeakMap::count — Counts the number of live entries in the map
Counts the number of live entries in the map.
Esta función no tiene parámetros.
Returns the number of live entries in the map.
(PECL weakref >= 0.2.0)
WeakMap::current — Returns the current value under iteration
Returns the current value being iterated on in the map.
Esta función no tiene parámetros.
The value currently being iterated on.
(PECL weakref >= 0.2.0)
WeakMap::key — Returns the current key under iteration.
Returns the object serving as key in the map, at the current iterating position.
Esta función no tiene parámetros.
The object key currently being iterated.
(PECL weakref >= 0.2.0)
WeakMap::next — Advances to the next map element
Advances to the next map element.
Esta función no tiene parámetros.
No devuelve ningún valor.
(PECL weakref >= 0.2.0)
WeakMap::offsetExists — Checks whether a certain object is in the map
$object
)Checks whether the passed object is referenced in the map.
object
Object to check for.
Returns TRUE if the object is contained in the map, FALSE otherwise.
(PECL weakref >= 0.2.0)
WeakMap::offsetGet — Returns the value pointed to by a certain object
Returns the value pointed to by a certain object.
object
Some object contained as key in the map.
Returns the value associated to the object passed as argument, NULL
otherwise.
(PECL weakref >= 0.2.0)
WeakMap::offsetSet — Updates the map with a new key-value pair
Updates the map with a new key-value pair. If the key already existed in the map, the old value is replaced with the new.
object
The object serving as key of the key-value pair.
value
The arbitrary data serving as value of the key-value pair.
No devuelve ningún valor.
(PECL weakref >= 0.2.0)
WeakMap::offsetUnset — Removes an entry from the map
$object
)Removes an entry from the map.
object
The key object to remove from the map.
No devuelve ningún valor.
(PECL weakref >= 0.2.0)
WeakMap::rewind — Rewinds the iterator to the beginning of the map
Rewinds the iterator to the beginning of the map.
Esta función no tiene parámetros.
No devuelve ningún valor.
(PECL weakref >= 0.2.0)
WeakMap::valid — Returns whether the iterator is still on a valid map element
Returns whether the iterator is still on a valid map element.
Esta función no tiene parámetros.
Returns TRUE if the iterator is on a valid element that can be
accessed, FALSE otherwise.
Windows Cache Extension for PHP is a PHP accelerator that is used to increase the speed of PHP applications running on Windows and Windows Server. Once the Windows Cache Extension for PHP is enabled and loaded by the PHP engine, PHP applications can take advantage of the functionality without any code modifications.
The Windows Cache Extension includes 5 different types of caches. The following describes the purpose of each cache type and the benefits it provides.
PHP Opcode Cache - PHP is a script processing engine, which reads an input stream of data that contains text and/or PHP instructions and produces another stream of data, most commonly in the HTML format. This means that on a web server the PHP engine reads, parses, compiles and executes a PHP script each time that it is requested by a Web client. The reading, parsing and compilation operations put additional load on the web server's CPU and file system and thus affect the overall performance of a PHP web application. The PHP bytecode (opcode) cache is used to store the compiled script bytecode in shared memory so that it can be re-used by PHP engine for subsequent executions of the same script.
File Cache - Even with the PHP opcode cache enabled, the PHP engine has to accesses the script files on a file system. When PHP scripts are stored on a remote UNC file share, the file operations introduce a significant performance overhead. The Windows Cache Extension for PHP includes a file cache that is used to store the content of the PHP script files in shared memory, which reduces the amount of file system operations performed by PHP engine.
Resolve File Path Cache - PHP scripts very often include or operate with files by using relative file paths. Every file path has to be normalized to an absolute file path by the PHP engine. When a PHP application uses many PHP files and accesses them by relative paths, the operation of resolving the paths may negatively impact the application's performance. The Windows Cache Extension for PHP provides a Resolve File Path cache, which is used to store the mappings between relative and absolute file paths, thereby reducing the number of path resolutions that the PHP engine has to perform.
User Cache (available since version 1.1.0) - PHP scripts can take advantage of the shared memory cache by using the user cache API's. PHP objects and variables can be stored in the user cache and then re-used on subsequent requests. This can be used to improve performance of PHP scripts and to share the data across multiple PHP processes.
Session Handler (available since version 1.1.0) - The WinCache session handler can be used to store the PHP session data in the shared memory cache. This avoids file system operations for reading and writing session data, which improves performance when large amount of data is stored in PHP session.
The extension is currently supported only on the following configurations:
Windows OS:
PHP:
Nota: The WinCache Extension can only be used when IIS is configured to run PHP via FastCGI.
Esta extensión » PECL no se distribuye con PHP.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/wincache.
There are two packages for this extension: one package is for PHP versions 5.2.X, and the other package is for PHP 5.3.X. Select the package that is appropriate for the PHP version being used.
To install and enable the extension, follow these steps:
Unpack the package into some temporary location.
Copy the php_wincache.dll file into the PHP extensions folder. Typically this folder is called "ext" and it is located in the same folder with all PHP binary files. For example: C:\Program Files\PHP\ext.
Using a text editor, open the php.ini file, which is usually located in the same folder where all PHP binary files are. For example: C:\Program Files\PHP\php.ini.
Add the following line at the end of the php.ini file: extension = php_wincache.dll.
Save and close the php.ini file.
Recycle the IIS Application Pools for PHP to pick up the configuration changes. To check that the extension has been enabled, create a file called phpinfo.php with a PHP code that calls phpinfo function.
Save the phpinfo.php file in the root folder of a IIS web site that uses PHP, then open a browser and make a request to http://localhost/phpinfo.php. Search within the returned web page for a section called wincache. If the extension is enabled, then the phpinfo output will list the configuration settings provided by the WinCache.
Nota: Do not forget to remove phpinfo.php file from the web site's root folder after verifying that extension has been enabled.
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
The following table lists and explains the configuration settings provided by the WinCache extension:
| Nombre | Por defecto | Minimum | Maximum | Cambiable | Historial de cambios |
|---|---|---|---|---|---|
| wincache.fcenabled | "1" | "0" | "1" | PHP_INI_ALL | Available since WinCache 1.0.0 |
| wincache.fcenabledfilter | "NULL" | "NULL" | "NULL" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.fcachesize | "24" | "5" | "255" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.fcndetect | "1" | "0" | "1" | PHP_INI_SYSTEM | Available since WinCache 1.1.0 |
| wincache.maxfilesize | "256" | "10" | "2048" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.ocenabled | "1" | "0" | "1" | PHP_INI_ALL | Available since WinCache 1.0.0 |
| wincache.ocenabledfilter | "NULL" | "NULL" | "NULL" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.ocachesize | "96" | "15" | "255" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.filecount | "4096" | "1024" | "16384" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.chkinterval | "30" | "0" | "300" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.ttlmax | "1200" | "0" | "7200" | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.enablecli | 0 | 0 | 1 | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.ignorelist | NULL | NULL | NULL | PHP_INI_ALL | Available since WinCache 1.0.0 |
| wincache.namesalt | NULL | NULL | NULL | PHP_INI_SYSTEM | Available since WinCache 1.0.0 |
| wincache.ucenabled | 1 | 0 | 1 | PHP_INI_SYSTEM | Available since WinCache 1.1.0 |
| wincache.ucachesize | 8 | 5 | 85 | PHP_INI_SYSTEM | Available since WinCache 1.1.0 |
| wincache.scachesize | 8 | 5 | 85 | PHP_INI_SYSTEM | Available since WinCache 1.1.0 |
| wincache.rerouteini | NULL | NULL | NULL | PHP_INI_SYSTEM | Available since WinCache 1.2.0 |
He aquí una breve explicación de las directivas de configuración.
wincache.fcenabled
boolean
wincache.fcenabledfilter
string
wincache.fcachesize
integer
wincache.fcndetect
boolean
wincache.maxfilesize
integer
wincache.ocenabled
boolean
wincache.ocenabledfilter
string
wincache.ocachesize
integer
wincache.filecount
integer
wincache.chkinterval
integer
wincache.ttlmax
integer
wincache.enablecli
boolean
wincache.ignorelist
string
Defines a list of files that should not be cached by the extension. The files list is specified by using file names only, separated by the pipe symbol - "|".
Ejemplo #1 wincache.ignorelist example
wincache.ignorelist = "index.php|misc.php|admin.php"
wincache.namesalt
string
wincache.ucenabled
boolean
wincache.ucachesize
integer
wincache.scachesize
integer
wincache.rerouteini
string
The installation package for WinCache includes a PHP script, wincache.php, that can be used to obtain cache information and statistics.
If the WinCache extension was installed via the Microsoft Web Platform Installer, then this script is located in %SystemDrive%\Program Files\IIS\Windows Cache for PHP\. On a 64-bit version of the Windows Server operating system, the script is located in %SystemDrive%\Program Files (x86)\IIS\Windows Cache for PHP. If the extension was installed manually, then the wincache.php will be located in the same folder from which the content of the installation package was extracted.
To use wincache.php, copy it into a root folder of a Web site or into any subfolder. To protect the script, open it in any text editor and replace the values for USERNAME and PASSWORD constants. If any other IIS authentication is enabled on the server, then follow the instructions in the comments:
Ejemplo #1 Authentication configuration for wincache.php
<?php
/**
* ======================== CONFIGURATION SETTINGS ==============================
* If you do not want to use authentication for this page, set USE_AUTHENTICATION to 0.
* If you use authentication then replace the default password.
*/
define('USE_AUTHENTICATION', 1);
define('USERNAME', 'wincache');
define('PASSWORD', 'wincache');
/**
* The Basic PHP authentication will work only when IIS is configured to support
* Anonymous Authentication' and nothing else. If IIS is configured to support/use
* any other kind of authentication like Basic/Negotiate/Digest etc, this will not work.
* In that case use the array below to define the names of users in your
* domain/network/workgroup which you want to grant access to.
*/
$user_allowed = array('DOMAIN\user1', 'DOMAIN\user2', 'DOMAIN\user3');
/**
* If the array contains string 'all', then all the users authenticated by IIS
* will have access to the page. Uncomment the below line and comment above line
* to grant access to all users who gets authenticated by IIS.
*/
/* $user_allowed = array('all'); */
/** ===================== END OF CONFIGURATION SETTINGS ========================== */
?>
Nota: Always protect the wincache.php script by using either the built-in authentication or the server's authentication mechanism. Leaving this script unprotected may compromise the security of your web application and web server.
The WinCache session handler (available since WinCache 1.1.0) can be used to configure PHP to store the session data in shared memory session cache. Using shared memory instead of the default file session storage helps improve performance of PHP applications that store large amount of data in session objects. Wincache session cache uses file-backed shared memory, which ensures that the session data is not lost during recycling of IIS application pools.
To configure PHP to use WinCache session handler set the php.ini setting session.save_handler to wincache. By default the Windows temporary file location is used for storing the session data. To change the location of the session file use session.save_path directive.
Ejemplo #1 Enabling WinCache session handler
session.save_handler = wincache session.save_path = C:\inetpub\temp\session\
The WinCache functions reroutes (available since WinCache 1.2.0) can be used to replace built-in PHP functions with their equivalents that are optimized for a particular purpose. WinCache extension includes Windows-optimized implementation of PHP file functions that may improve performance of PHP applications in cases when PHP has to access files on network shares. The optimized implementation is provided for the following functions:
To configure WinCache to use the functions reroutes use the file reroute.ini that is included in WinCache installation package. Copy this file into the same directory where php.ini file is located. After that add the wincache.rerouteini setting in php.ini and specify an absolute or relative path to the reroute.ini file.
Ejemplo #1 Enabling WinCache functions reroutes
wincache.rerouteini = C:\PHP\reroute.ini
Nota: If WinCache functions reroutes are enabled it is recommended to increase the WinCache file cache size. This can be done by using wincache.fcachesize setting.
The reroute.ini file contains the mappings between the native PHP functions and their equivalents in WinCache. Each line in the file defines a mapping by using the following syntax:
<PHP function name>:[<number of function parameters>]=<wincache function name>
The example of the file is shown below. In this example the calls to PHP function file_get_contents() will be replaced with calls to wincache_file_get_contents() only if the number of parameters passed to the function is less than or equals to 2. Specifying the number of parameters is useful when replacement function does not handle all the function's parameters.
Ejemplo #2 Reroute.ini file content
[FunctionRerouteList] file_exists=wincache_file_exists file_get_contents:2=wincache_file_get_contents readfile:2=wincache_readfile is_readable=wincache_is_readable is_writable=wincache_is_writable is_writeable=wincache_is_writable is_file=wincache_is_file is_dir=wincache_is_dir realpath=wincache_realpath filesize=wincache_filesize
Esta extensión no tiene ningún tipo de recurso definido.
Esta extensión no tiene ninguna constante definida.
(PECL wincache >= 1.0.0)
wincache_fcache_fileinfo — Retrieves information about files cached in the file cache
$summaryonly = false
] )Retrieves information about file cache content and its usage.
summaryonly
Controls whether the returned array will contain information about individual cache entries along with the file cache summary.
Array of meta data about file cache o FALSE en caso de error
The array returned by this function contains the following elements:
file_entries - an array that contains the information about all the cached files:
Ejemplo #1 A wincache_fcache_fileinfo() example
<pre>
<?php
print_r(wincache_fcache_fileinfo());
?>
</pre>
El resultado del ejemplo sería:
Array
( [total_cache_uptime] => 3234
[total_file_count] => 5
[total_hit_count] => 0
[total_miss_count] => 1
[file_entries] => Array
(
[1] => Array
(
[file_name] => c:\inetpub\wwwroot\checkcache.php
[add_time] => 1
[use_time] => 0
[last_check] => 1
[hit_count] => 1
[file_size] => 2435
)
[2] => Array (...iterates for each cached file)
)
)
(PECL wincache >= 1.0.0)
wincache_fcache_meminfo — Retrieves information about file cache memory usage
Retrieves information about memory usage by file cache.
Array of meta data about file cache memory usage o FALSE en caso de error
The array returned by this function contains the following elements:
Ejemplo #1 A wincache_fcache_meminfo() example
<pre>
<?php
print_r(wincache_fcache_meminfo());
?>
</pre>
El resultado del ejemplo sería:
Array
(
[memory_total] => 134217728
[memory_free] => 131339120
[num_used_blks] => 361
[num_free_blks] => 3
[memory_overhead] => 5856
)
(PECL wincache >= 1.1.0)
wincache_lock — Acquires an exclusive lock on a given key
$key
[, bool $isglobal = false
] )Obtains an exclusive lock on a given key. The execution of the current script will be blocked until the lock can be obtained. Once the lock is obtained, the other scripts that try to request the lock by using the same key will be blocked, until the current script releases the lock by using wincache_unlock().
Using of the wincache_lock() and wincache_unlock() can cause deadlocks when executing PHP scripts in a multi-process environment like FastCGI. Do not use these functions unless you are absolutely sure you need to use them. For the majority of the operations on the user cache it is not necessary to use these functions.
key
Name of the key in the cache to get the lock on.
isglobal
Controls whether the scope of the lock is system-wide or local. Local locks are scoped to the application pool in IIS FastCGI case or to all php processes that have the same parent process identifier.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Using wincache_lock()
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (wincache_lock(“lock_txt_lock”)) { // do an exclusive lock
ftruncate($fp, 0); // truncate file
fwrite($fp, "Write something here\n");
wincache_unlock(“lock_txt_lock”); // release the lock
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
?>
(PECL wincache >= 1.0.0)
wincache_ocache_fileinfo — Retrieves information about files cached in the opcode cache
$summaryonly = false
] )Retrieves information about opcode cache content and its usage.
summaryonly
Controls whether the returned array will contain information about individual cache entries along with the opcode cache summary.
Array of meta data about opcode cache o FALSE en caso de error
The array returned by this function contains the following elements:
file_entries - an array that contains the information about all the cached files:
Ejemplo #1 A wincache_ocache_fileinfo() example
<pre>
<?php
print_r(wincache_ocache_fileinfo());
?>
</pre>
El resultado del ejemplo sería:
Array
(
[total_cache_uptime] => 17357
[total_file_count] => 121
[total_hit_count] => 36562
[total_miss_count] => 201
[file_entries] => Array
(
[1] => Array
(
[file_name] => c:\inetpub\wwwroot\checkcache.php
[add_time] => 17356
[use_time] => 7
[last_check] => 10
[hit_count] => 454
[function_count] => 0
[class_count] => 1
)
[2] => Array (...iterates for each cached file)
)
)
(PECL wincache >= 1.0.0)
wincache_ocache_meminfo — Retrieves information about opcode cache memory usage
Retrieves information about memory usage by opcode cache.
Array of meta data about opcode cache memory usage o FALSE en caso de error
The array returned by this function contains the following elements:
Ejemplo #1 A wincache_ocache_meminfo() example
<pre>
<?php
print_r(wincache_ocache_meminfo());
?>
</pre>
El resultado del ejemplo sería:
Array
(
[memory_total] => 134217728
[memory_free] => 112106972
[num_used_blks] => 15469
[num_free_blks] => 4
[memory_overhead] => 247600
)
(PECL wincache >= 1.0.0)
wincache_refresh_if_changed — Refreshes the cache entries for the cached files
$files
] )Refreshes the cache entries for the files, whose names were passed in the input argument. If no argument is specified then refreshes all the entries in the cache.
files
An array of file names for files that need to be refreshed. An absolute or relative file paths can be used.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
WinCache performs regular checks on the cached files to ensure that if any file has changed then the corresponding entry in the cache is updated. By default this check is performed every 30 seconds. If, for example, a PHP script updates another PHP script where the application's configuration settings are stored, then it may happen that after the configuration settings have been saved to a file, the application is still using old settings for some time until the cache is refreshed. In those cases it may be preferrable to refresh the cache right after the file has been changed. The following example shows how this can be done.
Ejemplo #1 A wincache_refresh_if_changed() example
<?php
$filename = 'C:\inetpub\wwwroot\config.php';
$handle = fopen($filename, 'w+');
if ($handle === FALSE) die('Failed to open file '.$filename.' for writing');
fwrite($handle, '<?php $setting=something; ?>');
fclose($handle);
wincache_refresh_if_changed(array($filename));
?>
(PECL wincache >= 1.0.0)
wincache_rplist_fileinfo — Retrieves information about resolve file path cache
$summaryonly = false
] )Retrieves information about cached mappings between relative file paths and corresponding absolute file paths.
Array of meta data about the resolve file path cache o FALSE en caso de error
The array returned by this function contains the following elements:
rplist_entries - an array that contains the information about all the cached file paths:
Ejemplo #1 A wincache_rplist_fileinfo() example
<pre>
<?php
print_r(wincache_rplist_fileinfo());
?>
</pre>
El resultado del ejemplo sería:
Array
(
[total_file_count] => 5
[rplist_entries] => Array
(
[1] => Array
(
[resolve_path] => checkcache.php
[subkey_data] => c:\inetpub\wwwroot|c:\inetpub\wwwroot\checkcache.php
)
[2] => Array (...iterates for each cached file)
)
)
(PECL wincache >= 1.0.0)
wincache_rplist_meminfo — Retrieves information about memory usage by the resolve file path cache
Retrieves information about memory usage by resolve file path cache.
Array of meta data that describes memory usage by resolve file path cache. o FALSE en caso de error
The array returned by this function contains the following elements:
Ejemplo #1 A wincache_rplist_meminfo() example
<pre>
<?php
print_r(wincache_rplist_meminfo());
?>
</pre>
El resultado del ejemplo sería:
Array
(
[memory_total] => 9437184
[memory_free] => 9416744
[num_used_blks] => 23
[num_free_blks] => 1
[memory_overhead] => 416
)
(PECL wincache >= 1.1.0)
wincache_scache_info — Retrieves information about files cached in the session cache
$summaryonly = false
] )Retrieves information about session cache content and its usage.
summaryonly
Controls whether the returned array will contain information about individual cache entries along with the session cache summary.
Array of meta data about session cache o FALSE en caso de error
The array returned by this function contains the following elements:
scache_entries - an array that contains the information about all the cached items:
Ejemplo #1 A wincache_scache_info() example
<pre>
<?php
print_r(wincache_scache_info());
?>
</pre>
El resultado del ejemplo sería:
Array
(
[total_cache_uptime] => 17357
[total_file_count] => 121
[total_hit_count] => 36562
[total_miss_count] => 201
[scache_entries] => Array
(
[1] => Array
(
[file_name] => c:\inetpub\wwwroot\checkcache.php
[add_time] => 17356
[use_time] => 7
[last_check] => 10
[hit_count] => 454
[function_count] => 0
[class_count] => 1
)
[2] => Array (...iterates for each cached file)
)
)
(PECL wincache >= 1.1.0)
wincache_scache_meminfo — Recupera información sobre el uso de memoria caché de sesión
Recupera información sobre el uso de memoria caché de la sesión.
Array de metadatos sobre el uso de la memoria caché de sesión o FALSE en caso de error
El array devuelto por esta función contiene los siguientes elementos:
Ejemplo #1 Ejemplo de wincache_scache_meminfo()
<pre>
<?php
print_r(wincache_scache_meminfo());
?>
</pre>
El resultado del ejemplo sería:
Array
(
[memory_total] => 5242880
[memory_free] => 5215056
[num_used_blks] => 6
[num_free_blks] => 3
[memory_overhead] => 176
)
(PECL wincache >= 1.1.0)
wincache_ucache_add — Adds a variable in user cache only if variable does not already exist in the cache
Adds a variable in user cache, only if this variable doesn't already exist in the cache. The added variable remains in the user cache unless its time to live expires or it is deleted by using wincache_ucache_delete() or wincache_ucache_clear() functions.
key
Store the variable using this key name. If a variable with same key is already present the function
will fail and return FALSE. key is case sensitive. To override the value even if
key is present use wincache_ucache_set() function instad.
key can also take array of name => value pairs where names will be used as keys.
This can be used to add multiple values in the cache in one operation, thus avoiding race condition.
value
Value of a variable to store. Value supports all data types except resources, such as file handles.
This paramter is ignored if first argument is an array. A general guidance is to pass NULL
as value while using array as key. If value is an
object, or an array containing objects, then the objects will be serialized. See
__sleep() for details on serializing objects.
values
Associative array of keys and values.
ttl
Time for the variable to live in the cache in seconds. After the value specified in ttl has passed
the stored variable will be deleted from the cache. This parameter takes a default value of 0 which means
the variable will stay in the cache unless explicitly deleted by using wincache_ucache_delete()
or wincache_ucache_clear() functions.
If key is string, the function returns TRUE on success and FALSE on failure.
If key is an array, the function returns:
FALSE;
Ejemplo #1 wincache_ucache_add() with key as a string
<?php
$bar = 'BAR';
var_dump(wincache_ucache_add('foo', $bar));
var_dump(wincache_ucache_add('foo', $bar));
var_dump(wincache_ucache_get('foo'));
?>
El resultado del ejemplo sería:
bool(true) bool(false) string(3) "BAR"
Ejemplo #2 wincache_ucache_add() with key as an array
<?php
$colors_array = array('green' => '5', 'Blue' => '6', 'yellow' => '7', 'cyan' => '8');
var_dump(wincache_ucache_add($colors_array));
var_dump(wincache_ucache_add($colors_array));
var_dump(wincache_ucache_get('Blue'));
?>
El resultado del ejemplo sería:
array(0) { }
array(4) {
["green"]=> int(-1)
["Blue"]=> int(-1)
["yellow"]=> int(-1)
["cyan"]=> int(-1)
}
string(1) "6"
(PECL wincache >= 1.1.0)
wincache_ucache_cas — Compara la variable con el valor antiguo y le asigna un nuevo valor a este
$key
, int $old_value
, int $new_value
)
Compara la variable asociada con la key con old_value
y si coincide entonces asigna el new_value a este.
key
El parámetro key que se utiliza para almacenar la variable en la caché.
key distingue mayúsculas de minúsculas.
old_value
Valor anterior de la variable apuntada por key en la memoria caché del usuario.
El valor debe ser de tipo long, en caso contrario la función devuelve
FALSE.
new_value
El nuevo valor que se asigna a una variable
New value which will get assigned to variable indicado por la key si se
encuentra una coincidencia. El valor debe ser de tipo long, en caso contrario
la función devolverá FALSE.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Usando wincache_ucache_cas()
<?php
wincache_ucache_set('counter', 2922);
var_dump(wincache_ucache_cas('counter', 2922, 1));
var_dump(wincache_ucache_get('counter'));
?>
El resultado del ejemplo sería:
bool(true) int(1)
(PECL wincache >= 1.1.0)
wincache_ucache_clear — Elimina todo el contenido de la caché del usuario
Borra o elimina todos los valores almacenados en la caché del usuario.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Usando wincache_ucache_clear()
<?php
wincache_ucache_set('green', 1);
wincache_ucache_set('red', 2);
wincache_ucache_set('orange', 4);
wincache_ucache_set('blue', 8);
wincache_ucache_set('cyan', 16);
$array1 = array('green', 'red', 'orange', 'blue', 'cyan');
var_dump(wincache_ucache_get($array1));
var_dump(wincache_ucache_clear());
var_dump(wincache_ucache_get($array1));
?>
El resultado del ejemplo sería:
array(5) { ["green"]=> int(1)
["red"]=> int(2)
["orange"]=> int(4)
["blue"]=> int(8)
["cyan"]=> int(16) }
bool(true)
bool(false)
(PECL wincache >= 1.1.0)
wincache_ucache_dec — Disminuye el valor asociado a la clave
Disminuye el valor asociado a la key por 1 o como se especifica
por dec_by.
key
El parámetro key que se utiliza para almacenar la variable en la caché.
key distingue mayúsculas de minúsculas.
dec_by
El valor de la variable asociada por el que conseguirá que key disminuya.
Si el argumento es un número de punto flotante se truncará al integer más cercano. La variable asociada
con la key debe ser de tipo long, en caso contrario
la función falla y devolverá FALSE.
success
Será establecido a TRUE en caso de éxito y FALSE en caso de error.
Devuelve el valor decrementado en caso de éxito y FALSE en caso de error.
Ejemplo #1 Usando wincache_ucache_dec()
<?php
wincache_ucache_set('counter', 1);
var_dump(wincache_ucache_dec('counter', 2923, $success));
var_dump($success);
?>
El resultado del ejemplo sería:
int(2922) bool(true)
(PECL wincache >= 1.1.0)
wincache_ucache_delete — Elimina las variables de la memoria caché del usuario
Elimina los elementos de la caché del usuario apuntado por key.
key
El parámetro key que se utiliza para almacenar la variable en la caché.
key distingue mayúsculas de minúsculas. key puede ser un
array de claves.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Si key es un array, entonces la función devuelve FALSE
si cada elemento del array no se borra de la memoria caché del usuario, en caso contrario devuelve un
array que consta de todas las claves que se eliminan.
Ejemplo #1 Usando wincache_ucache_delete() con key como un string
<?php
wincache_ucache_set('foo', 'bar');
var_dump(wincache_ucache_delete('foo'));
var_dump(wincache_ucache_exists('foo'));
?>
El resultado del ejemplo sería:
bool(true) bool(false)
Ejemplo #2 Usingwincache_ucache_delete() con key como un array
<?php
$array1 = array('green' => '5', 'blue' => '6', 'yellow' => '7', 'cyan' => '8');
wincache_ucache_set($array1);
$array2 = array('green', 'blue', 'yellow', 'cyan');
var_dump(wincache_ucache_delete($array2));
?>
El resultado del ejemplo sería:
array(4) { [0]=> string(5) "green"
[1]=> string(4) "Blue"
[2]=> string(6) "yellow"
[3]=> string(4) "cyan" }
Ejemplo #3 Using wincache_ucache_delete() con key como un array donde algunos elementos no se pueden eliminar
<?php
$array1 = array('green' => '5', 'blue' => '6', 'yellow' => '7', 'cyan' => '8');
wincache_ucache_set($array1);
$array2 = array('orange', 'red', 'yellow', 'cyan');
var_dump(wincache_ucache_delete($array2));
?>
El resultado del ejemplo sería:
array(2) { [0]=> string(6) "yellow"
[1]=> string(4) "cyan" }
(PECL wincache >= 1.1.0)
wincache_ucache_exists — Comprueba si una variable existe en la caché del usuario
$key
)
Comprueba si una variable con la key existe en la caché de usuario o no.
key
La key que se utiliza para almacenar la variable en la caché.
key distingue mayúsculas de minúsculas.
Devuelve TRUE si la variable con la key existe,
en caso contrario devuelve FALSE.
Ejemplo #1 Usando wincache_ucache_exists()
<?php
if (!wincache_ucache_exists('green'))
wincache_ucache_set('green', 1);
var_dump(wincache_ucache_exists('green'));
?>
El resultado del ejemplo sería:
bool(true)
(PECL wincache >= 1.1.0)
wincache_ucache_get — Obtiene una variable almacenada en la caché del usuario
Obtiene una variable almacenada en la caché del usuario.
key
La key que se utiliza para almacenar la variable en la caché.
key distingue mayúsculas de minúsculas. key puede ser
un array de claves. En este caso el valor de retorno será un array de valores de cada elemento en
el array key. Si un objeto, o un array que contiene objetos,
es retornado, entonces los objetos serán decodificados. Véase
__wakeup() para más detalles sobre decodificar objetos.
success
Se establecerá en TRUE en caso de éxito y FALSE en caso de error.
Si key es un string, la función devuelve el valor de la variable almacenada con esa clave.
El parámetro success es establecido a TRUE en caso de éxito y
a FALSE en caso de error.
El parámetro key es un array, el parámetro success
siempre se establece en TRUE. El array devuelto (pares nombre => valor) will
contendrá sólo aquellos pares nombre => valor en donde la operación de obtención de caché de
usuario se ha realizado correctamente. Si ninguna de las claves del array encuentran una coincidencia
en la caché del usuario, un array vacío será devuelto.
Ejemplo #1 wincache_ucache_get() con key como un string
<?php
wincache_ucache_add('color', 'blue');
var_dump(wincache_ucache_get('color', $success));
var_dump($success);
?>
El resultado del ejemplo sería:
string(4) "blue" bool(true)
Ejemplo #2 wincache_ucache_get() con key como un array
<?php
$array1 = array('green' => '5', 'Blue' => '6', 'yellow' => '7', 'cyan' => '8');
wincache_ucache_set($array1);
$array2 = array('green', 'Blue', 'yellow', 'cyan');
var_dump(wincache_ucache_get($array2, $success));
var_dump($success);
?>
El resultado del ejemplo sería:
array(4) { ["green"]=> string(1) "5"
["Blue"]=> string(1) "6"
["yellow"]=> string(1) "7"
["cyan"]=> string(1) "8" }
bool(true)
(PECL wincache >= 1.1.0)
wincache_ucache_inc — Incrementa el valor asociado a la clave
Incrementa el valor asociado a la key por 1 o como se especifica
por inc_by.
key
La key que se utiliza para almacenar la variable en la caché.
key distingue mayúsculas de minúsculas.
inc_by
El valor por el cual la variable asociada con la key será incrementada.
Si el argumento es un número de punto flotante se truncará al integer más cercano. La variable
asociada con la key debe ser de tipo long, de lo contrario
la función falla y devuelve FALSE.
success
Se establecerá en TRUE en caso de éxito y FALSE en caso de error.
Devuelve el valor incrementado en caso de éxito y FALSE en caso de error.
Ejemplo #1 Usando wincache_ucache_inc()
<?php
wincache_ucache_set('counter', 1);
var_dump(wincache_ucache_inc('counter', 2921, $success));
var_dump($success);
?>
El resultado del ejemplo sería:
int(2922) bool(true)
(PECL wincache >= 1.1.0)
wincache_ucache_info — Recupera información sobre los datos almacenados en la caché del usuario
$summaryonly = false
[, string $key
]] )Recupera información sobre los datos almacenados en la caché del usuario.
summaryonly
Controla si el array devuelto contiene información sobre las entradas de caché individuales junto con el resumen caché del usuario.
key
La clave de una entrada en la caché del usuario. Si se especifica a continuación, el array
devuelto contendrá información sólo acerca de que la entrada de caché. Si no se especifica y
summaryonly es establecido a FALSE entonces el array devuelto contendrá
información sobre todas las entradas en la caché.
Array de metadatos sobre caché de usuario o FALSE en caso de error
El array devuelto por esta función contiene los siguientes elementos:
ucache_entries - un array que contiene la información sobre todos los elementos almacenados en caché:
Ejemplo #1 Usar wincache_ucache_info()
<?php
wincache_ucache_get('green');
wincache_ucache_set('green', 2922);
wincache_ucache_get('green');
wincache_ucache_get('green');
wincache_ucache_get('green');
print_r(wincache_ucache_info());
?>
El resultado del ejemplo sería:
Array
( ["total_cache_uptime"] => int(0)
["is_local_cache"] => bool(false)
["total_item_count"] => int(1)
["total_hit_count"] => int(3)
["total_miss_count"] => int(1)
["ucache_entries"] => Array(1)
( [1] => Array(6)
(
["key_name"] => string(5) "green"
["value_type"] => string(4) "long"
["is_session"] => int(0)
["ttl_seconds"] => int(0)
["age_seconds"] => int(0)
["hitcount"] => int(3)
)
)
)
(PECL wincache >= 1.1.0)
wincache_ucache_meminfo — Recupera información sobre el uso de memoria caché de usuario
Recupera información sobre el uso de memoria caché del usuario.
Array de metadatos sobre el uso de la memoria caché de usuario o FALSE en caso de error
El array devuelto por esta función contiene los siguientes elementos:
Ejemplo #1 Ejemplo de wincache_ucache_meminfo()
<pre>
<?php
print_r(wincache_ucache_meminfo());
?>
</pre>
El resultado del ejemplo sería:
Array
(
[memory_total] => 5242880
[memory_free] => 5215056
[num_used_blks] => 6
[num_free_blks] => 3
[memory_overhead] => 176
)
(PECL wincache >= 1.1.0)
wincache_ucache_set — Adds a variable in user cache and overwrites a variable if it already exists in the cache
Adds a variable in user cache. Overwrites a variable if it already exists in the cache. The added or updated variable remains in the user cache unless its time to live expires or it is deleted by using wincache_ucache_delete() or wincache_ucache_clear() functions.
key
Store the variable using this key name. If a variable with same
key is already present the function will overwrite the previous
value with the new one. key is case sensitive.
key can also take array of name => value pairs where names will be used as
keys. This can be used to add multiple values in the cache in one operation, thus avoiding
race condition.
value
Value of a variable to store. Value supports all data types except resources, such as file handles.
This paramter is ignored if first argument is an array. A general guidance is to pass NULL
as value while using array as key. If value is an
object, or an array containing objects, then the objects will be serialized. See
__sleep() for details on serializing objects.
values
Associative array of keys and values.
ttl
Time for the variable to live in the cache in seconds. After the value specified in ttl has passed
the stored variable will be deleted from the cache. This parameter takes a default value of 0 which means
the variable will stay in the cache unless explicitly deleted by using wincache_ucache_delete()
or wincache_ucache_clear() functions.
If key is string, the function returns TRUE on success and FALSE on failure.
If key is an array, the function returns:
FALSE;
Ejemplo #1 wincache_ucache_set() with key as a string
<?php
$bar = 'BAR';
var_dump(wincache_ucache_set('foo', $bar));
var_dump(wincache_ucache_get('foo'));
$bar1 = 'BAR1';
var_dump(wincache_ucache_set('foo', $bar1));
var_dump(wincache_ucache_get('foo'));
?>
El resultado del ejemplo sería:
bool(true) string(3) "BAR" bool(true) string(3) "BAR1"
Ejemplo #2 wincache_ucache_set() with key as an array
<?php
$colors_array = array('green' => '5', 'Blue' => '6', 'yellow' => '7', 'cyan' => '8');
var_dump(wincache_ucache_set($colors_array));
var_dump(wincache_ucache_set($colors_array));
var_dump(wincache_ucache_get('Blue'));
?>
El resultado del ejemplo sería:
array(0) {}
array(0) {}
string(1) "6"
(PECL wincache >= 1.1.0)
wincache_unlock — Libera un bloqueo exclusivo sobre una clave dada
$key
)Libera un bloqueo exclusivo que se obtuvo en una clave dada mediante wincache_lock(). Si cualquier otro proceso fue bloqueado en espera de el bloqueo en esta clave, este proceso será capaz de obtener el bloqueo.
Usando wincache_lock() y wincache_unlock() puede causar bloqueos al ejecutar los scripts PHP en un entorno de multi-proceso, como FastCGI. No utilice estas funciones a menos que esté absolutamente seguro de que necesitan para su uso. Para la mayoría de las operaciones en la caché de usuario no es necesario el uso de estas funciones.
key
Nombre de la llave en la caché para liberar el bloqueo.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Usar wincache_unlock()
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (wincache_lock(“lock_txt_lock”)) { // hacer un bloqueo exclusivo
ftruncate($fp, 0); // truncate file
fwrite($fp, "Escribir algo aquí\n");
wincache_unlock(“lock_txt_lock”); // liberar el bloqueo
} else {
echo "No se pudo obtener el bloqueo!";
}
fclose($fp);
?>
Building WinCache extension will require:
For completing first two steps, follow the step-by-step guide for how to » build PHP on Windows.
For getting the WinCache source code follow the instructions described in Downloading PECL extensions.
The following steps describe how to compile and build WinCache on Windows OS:
Open a command prompt which is used to build PHP
Go to the root folder where PHP sources are present
Run the command:
cscript.exe win32\build\buildconf.js
Run the command:
configure.bat --help
Run the command:
configure.js [all options used to build PHP] --enable-wincache
Run the command:
nmake
The following steps describe how to verify that WinCache has been built correctly:
Go to the folder where the PHP binaries are built
Run the command:
php.exe -n -d extension=php_wincache.dll -re wincache
XHProf is a light-weight hierarchical and instrumentation based profiler. During the data collection phase, it keeps track of call counts and inclusive metrics for arcs in the dynamic callgraph of a program. It computes exclusive metrics in the reporting/post processing phase, such as wall (elapsed) time, CPU time and memory usage. A functions profile can be broken down by callers or callees. XHProf handles recursive functions by detecting cycles in the callgraph at data collection time itself and avoiding the cycles by giving unique depth qualified names for the recursive invocations.
XHProf includes a simple HTML based user interface (written in PHP). The browser based UI for viewing profiler results makes it easy to view results or to share results with peers. A callgraph image view is also supported.
XHProf reports can often be helpful in understanding the structure of the code being executed. The hierarchical nature of the reports can be used to determine, for example, what chain of calls led to a particular function getting called.
XHProf supports ability to compare two runs (a.k.a. "diff" reports) or aggregate data from multiple runs. Diff and aggregate reports, much like single run reports, offer "flat" as well as "hierarchical" views of the profile.
Additional documentation can be found via the » facebook xhprof website.
Aunque no es obligatorio, xhprof incluye una interfaz que está escrito en PHP. Se utiliza para guardar y mostrar los datos reseñados en una forma utilizable, donde la observación se realiza mediante un navegador web. Por lo tanto, un servidor web PHP activado probablemente mejorara la experiencia xhprof.
También hay un tenedor de la interfaz gráfica de usuario en » http://github.com/preinheimer/xhprof
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/xhprof
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| xhprof.output_dir | "" | PHP_INI_ALL |
He aquí una breve explicación de las directivas de configuración.
xhprof.output_dir
string
Directorio utilizado por la aplicación por defecto de la interfaz iXHProfRuns (es decir, la clase XHProfRuns_Default) para el almacenamiento XHProf.
Esta extensión no tiene ningún tipo de recurso definido.
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
Ejemplo #1 Ejemplo Xhprof con interfaz gráfica de usuario opcional
En este ejemplo se inicia y detiene el perfilador, a continuación, utiliza interfaz gráfica de usuario para guardar y analizar los resultados. En otras palabras, el código de la extensión se termina en la llamada a xhprof_disable() .
<?php
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
for ($i = 0; $i <= 1000; $i++) {
$a = $i * $i;
}
$xhprof_data = xhprof_disable();
$XHPROF_ROOT = "/tools/xhprof/";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_testing");
echo "http://localhost/xhprof/xhprof_html/index.php?run={$run_id}&source=xhprof_testing\n";
?>
El resultado del ejemplo sería algo similar a:
http://localhost/xhprof/xhprof_html/index.php?run=t11_4bdf44d21121f&source=xhprof_testing
(PECL xhprof >= 0.9.0)
xhprof_disable — Detiene el perfilador xhprof
Detiene el perfilador, y devuelve los datos xhprof de la carrera.
Esta función no tiene parámetros.
Un array de los datos xhprof, de la carrera.
Ejemplo #1 xhprof_disable() ejemplo
<?php
xhprof_enable();
$foo = strlen("foo bar");
$xhprof_data = xhprof_disable();
print_r($xhprof_data);
?>
El resultado del ejemplo sería algo similar a:
Array
(
[main()==>strlen] => Array
(
[ct] => 1
[wt] => 279
)
[main()==>xhprof_disable] => Array
(
[ct] => 1
[wt] => 9
)
[main()] => Array
(
[ct] => 1
[wt] => 610
)
)
(PECL xhprof >= 0.9.0)
xhprof_enable — Inicia perfil xhprof
$flags = 0
[, array $options
]] )Inicia perfiles xhprof.
flags
Flags opcionales para añadir información adicional a la creación de perfiles. Véase las
constantes XHprof Para obtener más información
acerca de estos flags, p.e.j., XHPROF_FLAGS_MEMORY
para permitir perfiles de memoria.
options
Un array de opciones opcionales, es decir, la opción 'ignored_functions' para pasar en las funciones que se ignoraron durante el perfilado.
NULL
| Versión | Descripción |
|---|---|
| 0.9.2 |
El parámetro opcional options fué agregado.
|
Ejemplo #1 Ejemplos de xhprof_enable()
<?php
// 1. tiempo transcurrido + memoria + perfiles CPU; e ignorar las funciones integradas (internas)
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
// 2. perfil tiempo transcurrido; ignorando call_user_func* durante el perfilado
xhprof_enable(
0,
array('ignored_functions' => array('call_user_func',
'call_user_func_array')));
// 3. tiempo transcurrido + perfil de memoria; ignorando call_user_func* durante el perfilado
xhprof_enable(
XHPROF_FLAGS_MEMORY,
array('ignored_functions' => array('call_user_func',
'call_user_func_array')));
?>
(PECL xhprof >= 0.9.0)
xhprof_sample_disable — Detiene la muestra del perfilador xhprof
Detiene la muestra el modo perfilador xhprof, y
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Esta función no tiene parámetros.
Un array de los datos de muestra xhprof, de la ejecución.
Ejemplo #1 Ejemplo de xhprof_sample_disable()
<?php
xhprof_sample_enable();
for ($i = 0; $i <= 10000; $i++) {
$a = strlen($i);
$b = $i * $a;
$c = rand();
}
$xhprof_data = xhprof_sample_disable();
print_r($xhprof_data);
?>
El resultado del ejemplo sería algo similar a:
Array
(
[1272935300.800000] => main()
[1272935300.900000] => main()
)
(PECL xhprof >= 0.9.0)
xhprof_sample_enable — Descripción
Inicia la creación de perfiles en modo de muestra, que es una versión más ligera de peso de xhprof_enable() . El intervalo de muestreo es 0,1 segundos, y las muestras de registro de la pila de llamadas de función completa. El caso de uso principal es en gastos indirectos más bajos se requiere cuando se hace la supervisión del rendimiento y de diagnóstico.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Esta función no tiene parámetros.
NULL
Estas funciones permiten leer y manipular etiquetas ID3. Las etiquetas ID3 se utilizan en archivos MP3 para almacenar el título de la canción, así como información acerca del artista, álbum, género, año y número de pista.
Desde la versión 0.2 también es posible extraer marcos de texto desde etiquetas ID3 v2.2+.
No se requiere de ninguna biblioteca externa para compilar esta extensión.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/id3.
No hay una DLL disponible para esta extensión PECL actualmente. Vea también la sección Compilando en Windows .
Esta extensión no tiene directivas de configuración definidas en php.ini.
Esta extensión no tiene ningún tipo de recurso definido.
La mayoría de las funciones ID3 permiten especificar u obtener la versión de la etiqueta. Para especificar la versión se recomienda usar las siguientes constantes.
ID3_V1_0
(integer)
ID3_V1_0 Es usada cuando se trabaja con
etiquetas ID3 V1.0. Esas etiquetas pueden contener los campos título, artista,
álbum, género, año y comentario.
ID3_V1_1
(integer)
ID3_V1_1 Es usada cuando se trabaja con
etiquetas ID3 V1.1. Esas etiquetas pueden contener toda la información abarcada por
las etiquetas v1.0 más el número de pista.
ID3_V2_1
(integer)
ID3_V2_1 Es usada cuando se trabaja con
etiquetas ID3 V2.1.
ID3_V2_2
(integer)
ID3_V2_2 Es usada cuando se trabaja con
etiquetas ID3 V2.2.
ID3_V2_3
(integer)
ID3_V2_3 Es usada cuando se trabaja con
etiquetas ID3 V2.3.
ID3_V2_4
(integer)
ID3_V2_4 Es usada cuando se trabaja con
etiquetas ID3 V2.4.
ID3_BEST
(integer)
ID3_BEST Es usada para permitir a las funciones ID3
determinar que versión de etiquetas debería ser usado.
(PECL id3 >= 0.2)
id3_get_frame_long_name — Obtiene el nombre largo de un marco ID3v2
$frameId
)id3_get_frame_long_name() Retorna el nombre largo para un marco ID3v2.
frameId
Un marco ID3v2
Retorna el nombre largo del marco o FALSE en caso de error.
Ejemplo #1 Ejemplo de id3_get_frame_long_name()
<?php
$longName = id3_get_frame_long_name("TOLY");
echo $longName;
?>
El resultado del ejemplo sería:
Original lyricist(s)/text writer(s)
(PECL id3 >= 0.2)
id3_get_frame_short_name — Obtiene el nombre corto de un marco ID3v2
$frameId
)id3_get_frame_short_name() Retorna el nombre corto para un marco ID3v2.
frameId
Un marco ID3v2
Retorna el nombre corto del marco o FALSE en caso de error.
Los valores retornados por id3_get_frame_short_name() son usados en el array retornado por id3_get_tag().
Ejemplo #1 Ejemplo de id3_get_frame_short_name()
<?php
$nombreCorto = id3_get_frame_short_name("TOLY");
echo $nombreCorto;
?>
El resultado del ejemplo sería:
originalLyricist
(PECL id3 >= 0.1)
id3_get_genre_id — Obtiene el id correspondiente para un género musical
$genre
)id3_get_genre_id() Retorna el id correspondiente a un género.
genre
Nombre del género como un string.
El id del género o FALSE en caso de error.
Ejemplo #1 Ejemplo de id3_get_genre_id()
<?php
$id = id3_get_genre_id("Alternative");
echo $id;
?>
El resultado del ejemplo sería:
20
(PECL id3 >= 0.1)
id3_get_genre_list — Obtiene todos los valores posibles para la etiqueta género
id3_get_genre_list() Retorna un array conteniendo todos los posibles géneros que pueden ser almacenados en la etiqueta ID3 correspondiente. Esta lista fue creada por Eric Kemp y más tarde ampliada por WinAmp.
Esta función es útil para proveer a los usuarios una lista de géneros donde puedan seleccionar uno de ellos. Al actualizar la etiqueta ID3 siempre se debe especificar el género como un entero entre 0 y 147.
Retorna un array conteniendo todos los valores posibles para la etiqueta ID3.
Ejemplo #1 Ejemplo de id3_get_genre_list()
<?php
$generos = id3_get_genre_list();
print_r($generos);
?>
El resultado del ejemplo sería:
Array
(
[0] => Blues
[1] => Classic Rock
[2] => Country
[3] => Dance
[4] => Disco
[5] => Funk
[6] => Grunge
[7] => Hip-Hop
[8] => Jazz
[9] => Metal
[10] => New Age
[11] => Oldies
[12] => Other
[13] => Pop
[14] => R&B
[15] => Rap
[16] => Reggae
[17] => Rock
[18] => Techno
[19] => Industrial
[20] => Alternative
[21] => Ska
[22] => Death Metal
[23] => Pranks
[24] => Soundtrack
[25] => Euro-Techno
[26] => Ambient
[27] => Trip-Hop
[28] => Vocal
[29] => Jazz+Funk
[30] => Fusion
[31] => Trance
[32] => Classical
[33] => Instrumental
[34] => Acid
[35] => House
[36] => Game
[37] => Sound Clip
[38] => Gospel
[39] => Noise
[40] => Alternative Rock
[41] => Bass
[42] => Soul
[43] => Punk
[44] => Space
[45] => Meditative
[46] => Instrumental Pop
[47] => Instrumental Rock
[48] => Ethnic
[49] => Gothic
[50] => Darkwave
[51] => Techno-Industrial
[52] => Electronic
[53] => Pop-Folk
[54] => Eurodance
[55] => Dream
[56] => Southern Rock
[57] => Comedy
[58] => Cult
[59] => Gangsta
[60] => Top 40
[61] => Christian Rap
[62] => Pop/Funk
[63] => Jungle
[64] => Native US
[65] => Cabaret
[66] => New Wave
[67] => Psychadelic
[68] => Rave
[69] => Showtunes
[70] => Trailer
[71] => Lo-Fi
[72] => Tribal
[73] => Acid Punk
[74] => Acid Jazz
[75] => Polka
[76] => Retro
[77] => Musical
[78] => Rock & Roll
[79] => Hard Rock
[80] => Folk
[81] => Folk-Rock
[82] => National Folk
[83] => Swing
[84] => Fast Fusion
[85] => Bebob
[86] => Latin
[87] => Revival
[88] => Celtic
[89] => Bluegrass
[90] => Avantgarde
[91] => Gothic Rock
[92] => Progressive Rock
[93] => Psychedelic Rock
[94] => Symphonic Rock
[95] => Slow Rock
[96] => Big Band
[97] => Chorus
[98] => Easy Listening
[99] => Acoustic
[100] => Humour
[101] => Speech
[102] => Chanson
[103] => Opera
[104] => Chamber Music
[105] => Sonata
[106] => Symphony
[107] => Booty Bass
[108] => Primus
[109] => Porn Groove
[110] => Satire
[111] => Slow Jam
[112] => Club
[113] => Tango
[114] => Samba
[115] => Folklore
[116] => Ballad
[117] => Power Ballad
[118] => Rhytmic Soul
[119] => Freestyle
[120] => Duet
[121] => Punk Rock
[122] => Drum Solo
[123] => Acapella
[124] => Euro-House
[125] => Dance Hall
[126] => Goa
[127] => Drum & Bass
[128] => Club-House
[129] => Hardcore
[130] => Terror
[131] => Indie
[132] => BritPop
[133] => Negerpunk
[134] => Polsk Punk
[135] => Beat
[136] => Christian Gangsta
[137] => Heavy Metal
[138] => Black Metal
[139] => Crossover
[140] => Contemporary C
[141] => Christian Rock
[142] => Merengue
[143] => Salsa
[144] => Thrash Metal
[145] => Anime
[146] => JPop
[147] => SynthPop
)
(PECL id3 >= 0.1)
id3_get_genre_name — Obtiene el nombre del género correspondiente a un id
$genre_id
)id3_get_genre_name() Retorna el nombre de un género correspondiente a un id dado.
genre_id
Un entero entre 0 to 147
Retorna el nombre del género en inglés en forma de string.
Ejemplo #1 Ejemplo de id3_get_genre_name()
<?php
$genero = id3_get_genre_name(20);
echo $genero;
?>
El resultado del ejemplo sería:
Alternative
(PECL id3 >= 0.1)
id3_get_tag — Obtiene toda la información almacenada en una etiqueta ID3
$filename
[, int $version = ID3_BEST
] )id3_get_tag() Es usada para obtener toda la información almacenada en la etiqueta ID3 del fichero especificado.
filename
Ruta al fichero MP3
En lugar de un nombre de fichero puede pasarse un contexto de flujos válido.
version
Permite especificar la versión de la etiqueta debido a que los ficheros MP3 pueden contener ambas, etiquetas versión 1.x y 2.x
Desde la versión 0.2 id3_get_tag() también soporta etiquetas ID3 versión 2.2, 2.3 y 2.4. Para extraer información de esas etiquetas deben pasarse las constantes ID3_V2_2, ID3_V2_3 o ID3_V2_4 como segundo parámetro. Las etiquetas ID3 v2.x pueden contener mucha más información acerca del fichero MP3 que las etiquetas ID3 v1.x.
Retorna un array asociativo con varias claves como: title, artist, ..
La clave genre contendrá un entero entre 0 y 147. La función id3_get_genre_name() puede ser usada para convertir este valor a uno legible por humanos.
Ejemplo #1 Ejemplo de id3_get_tag()
<?php
$etiqueta = id3_get_tag( "ruta/a/ejemplo.mp3" );
print_r($etiqueta);
?>
El resultado del ejemplo sería algo similar a:
Array
(
[title] => DN-38416
[artist] => Re:\Legion
[album] => Reflections
[year] => 2004
[genre] => 19
)
Ejemplo #2 Ejemplo de id3_get_tag()
<?php
$etiqueta = id3_get_tag( "ruta/a/ejemplo2.mp3", ID3_V2_3 );
print_r($etiqueta);
?>
El resultado del ejemplo sería algo similar a:
Array
(
[copyright] => Dirty Mac
[originalArtist] => Dirty Mac
[composer] => Marcus Götze
[artist] => Dirty Mac
[title] => Little Big Man
[album] => Demo-Tape
[track] => 5/12
[genre] => (17)Rock
[year] => 2001
)
(PECL id3 >= 0.1)
id3_get_version — Obtiene la versión de una etiqueta ID3
$filename
)id3_get_version() Obtiene la o las versiones de una o más etiquetas ID3 en un fichero MP3.
Si un fichero contiene una etiqueta ID3 v1.1, este siempre contiene una etiqueta 1.0, debido a que la versión 1.1 es sólo una extensión de la 1.0.
fichero
La ruta al fichero MP3
En lugar de un nombre de fichero puede ser pasado un contexto de flujos válido.
Retorna el número de versión de la etiqueta ID3 del archivo.
Como una etiqueta puede contener etiquetas ID3 v1.x y v2.x, la respuesta de esta
función debería ser comparada bit a bit con las constantes predefinidas
ID3_V1_0, ID3_V1_1 e
ID3_V2.
Ejemplo #1 Ejemplo de id3_get_version()
<?php
$version = id3_get_version( "ruta/a/ejemplo.mp3" );
if ($version & ID3_V1_0) {
echo "Contiene una etiqueta 1.x\n";
}
if ($version & ID3_V1_1) {
echo "Contiene una etiqueta 1.1\n";
}
if ($version & ID3_V2) {
echo "Contiene una etiqueta 2.x\n";
}
?>
El resultado del ejemplo sería algo similar a:
Contiene una etiqueta 1.x Contiene una etiqueta 1.1
(PECL id3 >= 0.1)
id3_remove_tag — Elimina una etiqueta ID3 existente
$filename
[, int $version = ID3_V1_0
] )id3_remove_tag() Es usada para eliminar información almacenada de una etiqueta ID3.
filename
Ruta al fichero MP3
En lugar de un nombre de fichero puede pasarse un contexto de flujos válido.
version
Permite especificar la versión de la etiqueta, esto se debe a que los ficheros MP3 pueden contener ambas versiones de etiquetas, 1.x y 2.x
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de id3_remove_tag()
<?php
$resultado = id3_remove_tag( "ruta/a/ejemplo.mp3", ID3_V1_0 );
if ($resultado === true) {
echo "Etiqueta eliminada exitosamente\n";
}
?>
Si es posible escribir en el fichero y este contiene una etiqueta 1.0, imprimirá:
Etiqueta eliminada exitosamente
Nota: Actualmente id3_remove_tag() solamente soporta versiones 1.0 y 1.1. Si se desea eliminar una etiqueta 1.0 y el fichero contiene una etiqueta 1.1, esta será eliminada, esto se debe a que la etiqueta versión 1.1 es sólo una extensión de la 1.0.
(PECL id3 >= 0.1)
id3_set_tag — Actualiza la información almacenada en una etiqueta ID3
$filename
, array $tag
[, int $version = ID3_V1_0
] )id3_set_tag() Es usada para modificar la información almacenada de una etiqueta ID3. Si la etiqueta no se encuentra presente, será añadida al fichero.
filename
Ruta al fichero MP3
En lugar de un nombre de fichero puede pasarse un contexto de flujos válido.
tag
Un array asociativo de claves de la etiqueta y sus valores
Las siguientes claves pueden ser usadas en el array asociativo:
| clave | valor posible | disponible en la versión |
|---|---|---|
| title | cadena con un máximo de 30 caracteres | v1.0, v1.1 |
| artist | cadena con un máximo de 30 caracteres | v1.0, v1.1 |
| album | cadena con un máximo de 30 caracteres | v1.0, v1.1 |
| year | 4 dígitos | v1.0, v1.1 |
| genre | entero entre 0 y 147 | v1.0, v1.1 |
| comment | cadena con un máximo de 30 caracteres (28 en v1.1) | v1.0, v1.1 |
| track | entero entre 0 y 255 | v1.1 |
version
Permite especificar la versión de la etiqueta, esto se debe a que los ficheros MP3 pueden contener ambas versiones de etiquetas, 1.x y 2.x
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de id3_set_tag()
<?php
$datos = array(
"title" => "Re:Start",
"artist" => "Re:\Legion",
"comment" => "A nice track"
);
$resultado = id3_set_tag( "ruta/a/ejemplo.mp3", $datos, ID3_V1_0 );
if ($resultado === true) {
echo "Etiqueta actualizada exitosamente\n";
}
?>
Si es posible escribir en el fichero, imprimirá:
Etiqueta actualizada exitosamente
Nota: Actualmente id3_set_tag() solamente soporta las versiones 1.0 y 1.1.
KTaglib es una unión orientada a objetos a la libreria taglib del proyecto KDE utilizado en proyectos como el Amarok a leer y escribir ID3 y etiquetas Ogg. La libreria también proporciona acceso a la información de audio. Los enlaces están diseñadas por lo general siguen el subyacente C++ API, pero ha cambiado en PHP de una forma similar.
Nota:
Por el momento ktaglib es capaz de leer y escribir etiquetas ID3v1 e ID3v2.
If you want to build ktaglib you need at least taglib 1.5 installed. To obtain the taglib see the » taglib project page. Windows DLL's are build static against taglib, therefore there is no need to have taglib installed.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/ktaglib.
No hay una DLL disponible para esta extensión PECL actualmente. Vea también la sección Compilando en Windows .
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
KTaglib uses class constants. Most of the constants are mappings to the according Taglib enums and constants.
KTaglib_MPEG_Header::Version1
(integer)
KTaglib_MPEG_Header::Version2
(integer)
KTaglib_MPEG_Header::Version2_5
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Other
(integer)
KTaglib_ID3v2_AttachedPictureFrame::FileIcon
(integer)
KTaglib_ID3v2_AttachedPictureFrame::OtherFileIcon
(integer)
KTaglib_ID3v2_AttachedPictureFrame::FrontCover
(integer)
KTaglib_ID3v2_AttachedPictureFrame::BackCover
(integer)
KTaglib_ID3v2_AttachedPictureFrame::LeafletPage
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Media
(integer)
KTaglib_ID3v2_AttachedPictureFrame::LeadArtist
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Artist
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Conductor
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Band
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Composer
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Lyricist
(integer)
KTaglib_ID3v2_AttachedPictureFrame::RecordingLocation
(integer)
KTaglib_ID3v2_AttachedPictureFrame::DuringRecording
(integer)
KTaglib_ID3v2_AttachedPictureFrame::DuringPerformance
(integer)
KTaglib_ID3v2_AttachedPictureFrame::MovieScreenCapture
(integer)
KTaglib_ID3v2_AttachedPictureFrame::ColouredFish
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Illustration
(integer)
KTaglib_ID3v2_AttachedPictureFrame::BandLogo
(integer)
(No hay información de versión disponible, podría estar únicamente en SVN)
Representa un archivo MPEG. Los archivos MPEG pueden tener etiquetas ID3v1, ID3v2 y propiedades de audio.
(0.0.1)
KTaglib_MPEG_File::__construct — Abre un fichero nuevo
$filename
)Abre un fichero MPEG nuevo.
filename
El fichero a leer
Ejemplo #1 Abre un fichero MP3 nuevo y lee el título
<?php
$mpeg = new KTaglib_MPEG_File('example.mp3');
echo $mpeg->getID3v1Tag()->getTitle();
?>
(0.0.1)
KTaglib_MPEG_File::getAudioProperties — Devuelve un objeto que proporciona acceso a las propiedades de audio
Devuelve un objeto que proporciona acceso a las propiedades de audio de el fichero mpeg.
Devuelve un objeto KTaglib_MPEG_AudioProperties o falso.
(0.0.1)
KTaglib_MPEG_File::getID3v1Tag — Devuelve un objeto que representa una etiqueta ID3v1
$create = false
] )Devuelve un objeto que representa una etiqueta ID3v1, la cual puede ser usada para obtener información sobre la etiqueta ID3v1.
Devuelve un objeto KTaglib_MPEG_ID3v1Tag o false si no hay una etiqueta ID3v1.
(0.0.1)
KTaglib_MPEG_File::getID3v2Tag — Devuelve un objeto ID3v2
Devuelve un objeto ID3v2 para el fichero mpeg. Si no está presente la etiqueta ID3v2, es lanzada una KTaglib_TagNotFoundException.
Devuelve el objeto KTaglib_ID3v2_Tag del fichero MPEG o falso si no hay una etiqueta ID3v2
(No hay información de versión disponible, podría estar únicamente en SVN)
Representa las propiedades audio de un fichero MPEG, como la duración el bitrate o el samplerate.
(0.0.1)
KTaglib_MPEG_AudioProperties::getBitrate — Devuelve el bitrate del archivo MPEG
Devuelve el bitrate del archivo MPEG
Devuelve el bitrate como un entero
(0.0.1)
KTaglib_MPEG_AudioProperties::getChannels — Devuelve la cantidad de canales de un archivo MPEG
Devuelve la cantidad de canales de un archivo MPEG
Devuelve el número de canales como un entero
(0.0.1)
KTaglib_MPEG_AudioProperties::getLayer — Devuelve la capa de un archivo MPEG
Devuelve la capa del archivo MPEG (por lo general 3 para MP3).
Devuelve la capa como un número entero
(0.0.1)
KTaglib_MPEG_AudioProperties::getLength — Devuelve la duración de un archivo MPEG
Devuelve la duración de un archivo MPEG
Devuelve la duración como un entero
(0.0.1)
KTaglib_MPEG_AudioProperties::getSampleBitrate — Devuelve la frecuencia de muestreo o tasa de bits de un archivo MPEG
Devuelve la frecuencia de muestreo o tasa de bits de un archivo MPEG
Devuelve la frecuencia de muestreo o tasa de bits como un entero
(0.0.1)
KTaglib_MPEG_AudioProperties::getVersion — Devuelve la versión de un archivo MPEG
Devuelve la versión de la cabecera de un archivo MPEG. Las posibles versiones son definidas en Tag_MPEG_Header (Version1, Version2, Version2.5).
Devuelve la versión
(0.0.1)
KTaglib_MPEG_AudioProperties::isCopyrighted — Devuelve el estado de derecho de autor de un archivo MPEG
Devuelve true si el archivo MPEG tiene derechos de autor
Devuelve true si el archivo MPEG tiene derechos de autor
(0.0.1)
KTaglib_MPEG_AudioProperties::isOriginal — Devuelve si el archivo está marcado como el archivo original
Devuelve true si el archivo está marcado como el archivo original
Devuelve true si el archivo está marcado como el archivo original
(0.0.1)
KTaglib_MPEG_AudioProperties::isProtectionEnabled — Devuelve si los mecanismos de protección de un archivo MPEG están habilitados
Devuelve true si los mecanismos de protección (como el DRM) están habilitados para este archivo
Devuelve true si los mecanismos de protección (como el DRM) están habilitados para este archivo
(No hay información de versión disponible, podría estar únicamente en SVN)
Clase base para las etiquetas ID3v1 o ID3v2
(0.0.1)
KTaglib_Tag::getAlbum — Devuelve la cadena álbum de una etiqueta ID3
Devuelve la cadena álbum de una etiqueta ID3. Este método es implementado en etiquetas ID3v1 y ID3v2.
Devuelve la cadena álbum
(0.0.1)
KTaglib_Tag::getArtist — Devuelve la cadena artista de una etiqueta ID3
Devuelve la cadena artista de una etiqueta ID3. Este método es implementado en etiquetas ID3v1 y ID3v2.
Devuelve la cadena artista
(0.0.1)
KTaglib_Tag::getComment — Devuelve el comentario de una etiqueta ID3
Devuelve el comentario de una etiqueta ID3. Este método es implementado en etiquetas ID3v1 y ID3v2.
Devuelve la cadena comentario
(0.0.1)
KTaglib_Tag::getGenre — Devuelve el género de una etiqueta ID3
Devuelve el género de una etiqueta ID3. Este método es implementado en etiquetas ID3v1 y ID3v2.
Devuelve la cadena género
(0.0.1)
KTaglib_Tag::getTitle — Devuelve la cadena de título de una etiqueta ID3
Devuelve la cadena de título de una etiqueta ID3. Este método es implementado en etiquetas ID3v1 y ID3v2.
Devuelve la cadena título
(0.0.1)
KTaglib_Tag::getTrack — Devuelve el número de pista de una etiqueta ID3
Devuelve el número de pista en una etiqueta ID3. Este método es implementado en etiquetas ID3v1 y ID3v2.
Devuelve el número de pista como un entero
(0.0.1)
KTaglib_Tag::getYear — Devuelve el año de una etiqueta ID3
Devuelve el año de una etiqueta ID3. Este método es implementado en etiquetas ID3v1 y ID3v2.
Devuelve el año como un número entero
(0.0.1)
KTaglib_Tag::isEmpty — Devuelve true si la etiqueta está vacía
Devuelve true si la etiqueta existe, pero está vacía. Este método es implementado en etiquetas ID3v1 y ID3v2.
Devuelve true si la etiqueta está vacía, en caso contrario devuelve false.
(No hay información de versión disponible, podría estar únicamente en SVN)
Representa y etiqueta ID3v2. Esta proporciona una lista de tramas ID3v2 y puede ser utilizada para añadir y eliminar tramas adicionales.
(0.0.1)
KTaglib_ID3v2_Tag::addFrame — Agregar un frame a la etiqueta ID3v2
Agrega un frame a la etiqueta ID3v2. El frame debe ser un objeto KTaglib_ID3v2_Frame válido. Para guardar la etiqueta, es necesario invocar a la función guardar.
Devuelve true en caso de éxito, de lo contrario false.
(0.0.1)
KTaglib_ID3v2_Tag::getFrameList — Devuelve un array de frames ID3v2, asociados con la etiqueta ID3v2
Devuelve un array de frames ID3v2, asociados con la etiqueta ID3v2.
Devuelve un array de objetos KTaglib_ID3v2_Frame
(No hay información de versión disponible, podría estar únicamente en SVN)
La clase base para tramas ID3v2. Las etiquetas ID3v2 son separadas en varias tramas especializadas. Algunas tramas pueden estar presente múltiples veces.
(0.0.1)
KTaglib_ID3v2_Frame::getSize — Devuelve el tamaño de el frame en bytes
Devuelve el tamaño de el frame en bytes. Por favor, referirse a id3.org para ver qué son los frames ID3v2 y cómo están definidos.
Devuelve el tamaño de el frame en bytes
(0.0.1)
KTaglib_ID3v2_Frame::__toString — Devuelve un string de representación de el frame
Devuelve un string de representación de el frame. Esto podría ser solamente el id del frame, pero podría contener más información. Por favor vea la documentación de ktaglib para más información
Devuelve un string de representación de el frame.
(No hay información de versión disponible, podría estar únicamente en SVN)
Representa una trama ID3v2 que puede contener una imagen.
(0.0.1)
KTaglib_ID3v2_AttachedPictureFrame::getDescription — Devuelve una descripción de la imagen en un marco de fotos
Devuelve la descripción que se acompaña de un marco de fotos en un marco de ID3v2.x.
Devuelve una descripción de la imagen en un marco de fotos
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::getMimeType — Devuelve el tipo mime de la imagen
Devuelve el tipo mime de la imagen representada por el marco de la imagen adjunta.
Tenga en cuenta que este método puede devolver diferentes tipos. Mientras ID3v2.2 tiene un tipo mime que no empiece con "image/", ID3v2.3 y v2.4 usualmente comienzan con "image/". Por lo tanto, el método puede devolver para los marcos "image/png" para IDv2.3 y "PNG" para el marco ID3v2.2.
Tenga en cuenta que incluso el marco es una imagen adjunta, el tipo mime no esté configurado y por lo tanto puede devolver una cadena vacía.
Devuelve el tipo mime de la imagen representada por el marco de la imagen adjunta.
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::getType — Devuelve el tipo de la imagen
Devuelve el tipo de la imagen.
La especificación ID3v2 permite una AttachedPictureFrame para establecer el tipo de una imagen. Esto puede ser por ejemplo, FrontCover or FileIcon. Por favor refiérase a la descripción de la clase KTaglib_ID3v2_AttachedPictureFrame para obtener una lista de tipos disponibles.
Devuelve la representación de entero de este tipo.
(0.0.1)
KTaglib_ID3v2_AttachedPictureFrame::savePicture — Guarda la imagen en un archivo
$filename
)Guarda la imagen adjunta al archivo especificado.
Devuelve true si tiene éxito, false en caso contrario
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::setMimeType — Establece el tipo mime de la imagen
Establece el tipo mime de la imagen. Esto debe en la mayoría de los casos es "image/png" o "image/jpeg".
(0.0.1)
KTaglib_ID3v2_AttachedPictureFrame::setPicture — Establece el marco de la imagen a la imagen dada
$filename
)Establece la imagen para poner la imagen. La imagen se carga desde el fichero especificado. Tenga en cuenta que la imagen no se guarda a menos que llame el save method de el fichero del objeto correspondiente.
Devuelve true si tiene éxito, false en caso contrario
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::setType — Establecer el tipo de la imagen
$type
)Establece el tipo de la imagen. Esto puede ser por ejemplo, FrontCover io FileIcon. Véase la descripción de la clase KTaglib_ID3v2_AttachedPictureFrame para una lista de tipos disponibles y sus asignaciones de constantes.
El formato de fichero OGG/Vorbis, tal como está definido en » http://www.vorbis.com/, es un esquema para comprimir flujos de audio mediante múltiples factores con un mínimo de pérdida de calidad. Esta extensión añade el soporte Ogg Vorbis a las Envolturas URL de PHP. Cuando se utiliza en modo lectura, la información OGG/Vorbis comprimida se expande a audio PCM sin tratar en uno de los formatos de codificación PCM listados después.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/oggvorbis
Esta extensión no tiene directivas de configuración definidas en php.ini.
Esta extensión no tiene ningún tipo de recurso definido.
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
| Constante | Definición |
|---|---|
OGGVORBIS_PCM_U8 |
PCM sin signo de 8 bit. |
OGGVORBIS_PCM_S8 |
PCM con signo de 8 bit. |
OGGVORBIS_PCM_U16_LE |
PCM sin signo de 16 bit. Orden de byte Little Endian. |
OGGVORBIS_PCM_U16_BE |
PCM sin signo de 16 bit. Orden de byte Big Endian. |
OGGVORBIS_PCM_S16_LE |
PCM con signo de 16 bit. Orden de byte Little Endian. |
OGGVORBIS_PCM_S16_BE |
PCM con signo de 16 bit. Orden de byte Big Endian. |
| Opción | Definición | Relevancia | Predeterminado |
|---|---|---|---|
| pcm_mode | Codificación PCM de byte usada. Véase las constantes. | Lectura / Escritura | OGGVORBIS_PCM_S16_LE |
| rate | Velocidad de muestreo PCM. Medida en Hz. | Sólo escritura | 44100 |
| bitrate | Codificación de Velocidad de Tranferencia Media / Codificación de Velocidad de Tranferencia Variable de Vorbis. Medido en bps (ABR) o nivel de Calidad (VBR: 0.0 a 1.0). 128000 ABR es aproximadamente igual a 0.4 VBR. | Sólo escritura | 128000 |
| channels | Número de canales PCM. 1 == Mono, 2 == Estéreo. | Sólo escritura | 2 |
| serialno | Número de Serie del flujo dentro de fichero. Debe ser único dentro del fichero. Debido a la posibilidades de seleccionar un número de serie duplicado dentro de un fichero encadenado, se han de realizar esfuerzon para asignar manualmente números únicos al codificar. | Sólo escritura | Aleatorio |
| comments | Array asociativo de comentarios de ficheros. Será traducido a strtoupper($nombre) . "=$valor". Nota: Esta opción de contexto no está disponible en oggvorbis-0.1 | Sólo escritura | array('ENCODER' => 'PHP/OggVorbis, http://pear.php.net/oggvorbis') |
Ejemplo #1 Leer un fichero OGG/Vorbis
<?php
dl("oggvorbis.so");
/* Por omisión, ogg:// decodificará a 16 bit sin signo Little Endian */
$fp = fopen('ogg://myaudio.ogg', 'r');
/* Recopilar información sobre el fichero. */
$metadatos = stream_get_meta_data($fp);
/* Inspeccionar la primera canción (normalmente una única canción,
pero los ficheros OGG/Vorbis pueden ser encadenados) */
$datos_canción = $metadatos['wrapper_data'][0];
echo "Fichero OGG/Vorbis codificado por: {$datos_canción['vendor']}\n.";
echo " {$datos_canción['channels']} canales de {$datos_canción['rate']}Hz muestreo codificado a {$datos_canción['bitrate_nominal']}bps.\n";
foreach($datos_canción['comments'] as $comentario) {
echo " $comentario\n";
}
while ($audio_data = fread($fp, 8192)) {
/* Hacer algo con el audio PCM que estamos extrayendo desde el OGG.
Copiarlo a /dev/dsp es un buen destino en sistemas linux,
recuerde configurar primero su dispositivo al modo de muestreo . */
}
fclose($fp);
?>
Ejemplo #2 Codificar un fichero de audio a OGG/Vorbis
<?php
dl('oggvorbis.so');
$contexto = stream_context_create(array('ogg'=>array(
'pcm_mode' => OGGVORBIS_PCM_S8, /* Audio de 8 bit con signo */
'rate' => 44100, /* Calida CD de 44kHz */
'bitrate' => 0.5, /* VBR calidad media*/
'channels' => 1, /* Mono */
'serialno' => 12345))); /* ünoco dentro de nuestro flujo */
/* Abrir un fichero para añadir información. Esto "encadenará" un segundo flujo OGG al final del primero. */
$ogg = fopen('ogg://mysong.ogg', 'a', false, $contexto);
$pcm = fopen('mysample.pcm', 'r');
/* Comprimir el audio PCM sin tratar de mysample.pcm a mysong.ogg */
stream_copy_to_stream($pcm, $ogg);
fclose($pcm);
fclose($ogg);
?>
No se requiere de ninguna biblioteca externa para compilar esta extensión.
Esta extensión » PECL no se distribuye con PHP.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/openal.
No hay una DLL disponible para esta extensión PECL actualmente. Vea también la sección Compilando en Windows .
Esta extensión no tiene directivas de configuración definidas en php.ini.
Esta extensión define cuatro tipos de recursos: Open AL(Device) - Devuelto por openal_device_open(), Open AL(Context) - Devuelto por openal_context_create(), Open AL(Buffer) - Devuelto por openal_buffer_create(), y Open AL(Source) - Devuelto por openal_source_create().
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
ALC_FREQUENCY
(integer)
ALC_REFRESH
(integer)
ALC_SYNC
(integer)
AL_FREQUENCY
(integer)
AL_BITS
(integer)
AL_CHANNELS
(integer)
AL_SIZE
(integer)
AL_BUFFER
(integer)
AL_SOURCE_RELATIVE
(integer)
AL_SOURCE_STATE
(integer)
AL_PITCH
(integer)
AL_GAIN
(integer)
AL_MIN_GAIN
(integer)
AL_MAX_GAIN
(integer)
AL_MAX_DISTANCE
(integer)
AL_ROLLOFF_FACTOR
(integer)
AL_CONE_OUTER_GAIN
(integer)
AL_CONE_INNER_ANGLE
(integer)
AL_CONE_OUTER_ANGLE
(integer)
AL_REFERENCE_DISTANCE
(integer)
AL_POSITION
(integer)
AL_VELOCITY
(integer)
AL_DIRECTION
(integer)
AL_ORIENTATION
(integer)
AL_FORMAT_MONO8
(integer)
AL_FORMAT_MONO16
(integer)
AL_FORMAT_STEREO8
(integer)
AL_FORMAT_STEREO16
(integer)
AL_INITIAL
(integer)
AL_PLAYING
(integer)
AL_PAUSED
(integer)
AL_STOPPED
(integer)
AL_LOOPING
(integer)
AL_TRUE
(integer)
AL_FALSE
(integer)
(PECL openal >= 0.1.0)
openal_buffer_create — Genera un buffer OpenAL
Devuelve un recurso Open AL(Buffer) en éxito o
FALSE en fallo.
(PECL openal >= 0.1.0)
openal_buffer_data — Carga un buffer con datos
$buffer
, int $format
, string $data
, int $freq
)buffer
Un recurso Open AL(Buffer) (previamente creado por openal_buffer_create()).
format
Formato de data, uno de:
AL_FORMAT_MONO8,
AL_FORMAT_MONO16,
AL_FORMAT_STEREO8 y
AL_FORMAT_STEREO16
data
Bloque de datos de audio binario en el format y el
freq especificado.
freq
Frecuencia de data dados en Hz.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_buffer_destroy — Destruye un buffer OpenAL
$buffer
)buffer
Un recurso Open AL(Buffer) (previamente creado por openal_buffer_create()).
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_buffer_get — Recupera una propiedad del buffer OpenAL
$buffer
, int $property
)buffer
Un recurso Open AL(Buffer) (previamente creado por openal_buffer_create()).
property
Propiedad especifica, una de:
AL_FREQUENCY,
AL_BITS,
AL_CHANNELS y
AL_SIZE.
Devuelve un valor entero apropiada a la property
requerida o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_buffer_loadwav — Carga un archivo .wav dentro de un buffer
$buffer
, string $wavfile
)buffer
Un recurso Open AL(Buffer) (previamente creado por openal_buffer_create()).
wavfile
Ruta al archivo .wav en el sistema de archivo local.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_context_create — Crea un contexto de procesamiento de audio
$device
)device
Un recurso Open AL(Device) (previamente creado por openal_device_open()).
Devuelve un recurso Open AL(Context) en éxito o
FALSE en fallo.
(PECL openal >= 0.1.0)
openal_context_current — Crea el corriente contexto especificado
$context
)context
Un recurso Open AL(Context) (previamente creado por openal_context_create()).
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_context_destroy — Destruye un contexto
$context
)context
Un recurso Open AL(Context) (previamente creado por openal_context_create()).
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_context_process — Procesa un contexto especificado
$context
)context
Un recurso Open AL(Context) (previamente creado por openal_context_create()).
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_context_suspend — Suspende el contexto especificado
$context
)context
Un recurso Open AL(Context) (previamente creado por openal_context_create()).
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_device_close — Cierra un dispositivo OpenAL
$device
)device
Un recurso Open AL(Device) (previamente creado por openal_device_open()) para ser cerrado.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_device_open — Inicia la capa de audio del OpenAL
$device_desc
] )device_desc
Abre un dispositivo de audio especiado opcionalmente por device_desc.
Si device_desc no está especificado el primer dispositivo de
audio disponible será usado.
Devuelve un recurso Open AL(Device) en éxito o
FALSE en fallo.
(PECL openal >= 0.1.0)
openal_listener_get — Devuelve una propiedad de oyente
property
Propiedad para recuperar, una de:
AL_GAIN (float),
AL_POSITION (array(float,float,float)),
AL_VELOCITY (array(float,float,float)) y
AL_ORIENTATION (array(float,float,float)).
Devuelve un flotante o un arreglo de flotantes (como apropiado) o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_listener_set — Establece una propiedad de oyente
property
Propiedad a establecer, una de:
AL_GAIN (float),
AL_POSITION (array(float,float,float)),
AL_VELOCITY (array(float,float,float)) y
AL_ORIENTATION (array(float,float,float)).
setting
Valor a establecer, ya sea flotante, o un arreglo de flotantes como apropiado.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_source_create — Genera una fuente de recursos
Devuelve un recurso Open AL(Source) en éxito o
FALSE en fallo.
(PECL openal >= 0.1.0)
openal_source_destroy — Destruye una fuente de recursos
$source
)source
Un recurso Open AL(Source) (previamente creado por openal_source_create()).
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_source_get — Recupera una propiedad de una fuente del OpenAL
source
Un recurso Open AL(Source) (previamente creado por openal_source_create()).
property
Propiedad para obtener, una de:
AL_SOURCE_RELATIVE (int),
AL_SOURCE_STATE (int),
AL_PITCH (float),
AL_GAIN (float),
AL_MIN_GAIN (float),
AL_MAX_GAIN (float),
AL_MAX_DISTANCE (float),
AL_ROLLOFF_FACTOR (float),
AL_CONE_OUTER_GAIN (float),
AL_CONE_INNER_ANGLE (float),
AL_CONE_OUTER_ANGLE (float),
AL_REFERENCE_DISTANCE (float),
AL_POSITION (array(float,float,float)),
AL_VELOCITY (array(float,float,float)),
AL_DIRECTION (array(float,float,float)).
Devuelve el tipo asociado con la propiedad que se recupera
o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_source_pause — Pausa la fuente
$source
)source
Un recurso Open AL(Source) (previamente creado por openal_source_create()).
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_source_play — Empieza la reproducción de la fuente
$source
)source
Un recurso Open AL(Source) (previamente creado por openal_source_create()).
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_source_rewind — Rebobina la fuente
$source
)source
Un recurso Open AL(Source) (previamente creado por openal_source_create()).
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_source_set — Establece la propiedad de la fuente
source
Un recurso Open AL(Source) (previamente creado por openal_source_create()).
property
Propiedad para establecer, una de:
AL_BUFFER (OpenAL(Source)),
AL_LOOPING (bool),
AL_SOURCE_RELATIVE (int),
AL_SOURCE_STATE (int),
AL_PITCH (float),
AL_GAIN (float),
AL_MIN_GAIN (float),
AL_MAX_GAIN (float),
AL_MAX_DISTANCE (float),
AL_ROLLOFF_FACTOR (float),
AL_CONE_OUTER_GAIN (float),
AL_CONE_INNER_ANGLE (float),
AL_CONE_OUTER_ANGLE (float),
AL_REFERENCE_DISTANCE (float),
AL_POSITION (array(float,float,float)),
AL_VELOCITY (array(float,float,float)),
AL_DIRECTION (array(float,float,float)).
setting
El valor para asignar a la property especifica.
Consulta la descripción de la property
para una descripción de el valor(es) esperando.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_source_stop — Detiene la reproducción de la fuente
$source
)source
Un recurso Open AL(Source) (previamente creado por openal_source_create()).
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL openal >= 0.1.0)
openal_stream — Empieza la salida de una fuente
$source
, int $format
, int $rate
)source
Un recurso Open AL(Source) (previamente creado por openal_source_create()).
format
Formato de data, uno de:
AL_FORMAT_MONO8,
AL_FORMAT_MONO16,
AL_FORMAT_STEREO8 y
AL_FORMAT_STEREO16
rate
Frecuencias de datos para las salidas dadas en Hz.
Devuelve un recurso de salida en success o FALSE en caso de error.
Estos paquetes le permite acceder a la administración en los servidores Kerberos V. Se puede crear, modificar y eliminar directores y politicas en Kerberos V.
Más información acerca de Kerberos se puede encontrar en » http://web.mit.edu/kerberos/www/.
La documentación de Kerberos y KADM5 se puede encontrar en » http://web.mit.edu/kerberos/www/krb5-1.2/krb5-1.2.8/doc/admin_toc.html.
No se requiere de ninguna biblioteca externa para compilar esta extensión.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/kadm5.
Nota:
Si se utiliza esta opción sin especificar la ruta de KADM5, PHP utiliza la libreria cliente built-in KADM5. Los usuarios que ejecutan otras aplicaciones que utilizan KADM5 (por ejemplo, ejecutar PHP 4 y PHP 5 como módulo concurrente apache, o auth kadm5) siempre se debe especificar la ruta de KADM5: --with-kadm5=/path/to/kadm5. Esto obligará a PHP a usar las librerias de cliente instaladas por KADM5, y evitar cualquier conflicto.
No hay una DLL disponible para esta extensión PECL actualmente. Vea también la sección Compilando en Windows .
Esta extensión no tiene directivas de configuración definidas en php.ini.
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
The functions kadm5_create_principal(), kadm5_modify_principal(), and kadm5_modify_principal() allow to specify special attributes using a bitfield. The symbols are defined below:
| constant |
|---|
| KRB5_KDB_DISALLOW_POSTDATED |
| KRB5_KDB_DISALLOW_FORWARDABLE |
| KRB5_KDB_DISALLOW_TGT_BASED |
| KRB5_KDB_DISALLOW_RENEWABLE |
| KRB5_KDB_DISALLOW_PROXIABLE |
| KRB5_KDB_DISALLOW_DUP_SKEY |
| KRB5_KDB_DISALLOW_ALL_TIX |
| KRB5_KDB_REQUIRES_PRE_AUTH |
| KRB5_KDB_REQUIRES_HW_AUTH |
| KRB5_KDB_REQUIRES_PWCHANGE |
| KRB5_KDB_DISALLOW_SVR |
| KRB5_KDB_PWCHANGE_SERVER |
| KRB5_KDB_SUPPORT_DESMD5 |
| KRB5_KDB_NEW_PRINC |
The functions kadm5_create_principal(), kadm5_modify_principal(), and kadm5_get_principal() allow to specify or return principal's options as an associative array. The keys for the associative array are defined as string constants below:
| constant | funcdef | description |
|---|---|---|
| KADM5_PRINCIPAL | long | The expire time of the princial as a Kerberos timestamp. |
| KADM5_PRINC_EXPIRE_TIME | long | The expire time of the princial as a Kerberos timestamp. |
| KADM5_LAST_PW_CHANGE | long | The time this principal's password was last changed. |
| KADM5_PW_EXPIRATION | long | The expire time of the principal's current password, as a Kerberos timestamp. |
| KADM5_MAX_LIFE | long | The maximum lifetime of any Kerberos ticket issued to this principal. |
| KADM5_MAX_RLIFE | long | The maximum renewable lifetime of any Kerberos ticket issued to or for this principal. |
| KADM5_MOD_NAME | string | The name of the Kerberos principal that most recently modified this principal. |
| KADM5_MOD_TIME | long | The time this principal was last modified, as a Kerberos timestamp. |
| KADM5_KVNO | long | The version of the principal's current key. |
| KADM5_POLICY | string | The name of the policy controlling this principal. |
| KADM5_CLEARPOLICY | long | Standard procedure is to assign the 'default' policy to new principals. KADM5_CLEARPOLICY suppresses this behaviour. |
| KADM5_LAST_SUCCESS | long | The KDC time of the last successfull AS_REQ. |
| KADM5_LAST_FAILED | long | The KDC time of the last failed AS_REQ. |
| KADM5_FAIL_AUTH_COUNT | long | The number of consecutive failed AS_REQs. |
| KADM5_RANDKEY | long |
Generates a random password for the principal. The parameter
password will be ignored.
|
| KADM5_ATTRIBUTES | long | A bitfield of attributes for use by the KDC. |
Este sencillo ejemplo muestra cómo conectarse, consultar, imprimir directores resultantes y desconectarse de una base de datos KADM5.
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_principals</h1>\n";
$principals = kadm5_get_principals($handle);
for( $i=0; $i<count($principals); $i++)
print "$principals[$i]<br>\n";
print "<h1>get_policies</h1>\n";
$policies = kadm5_get_policies($handle);
for( $i=0; $i<count($policies); $i++)
print "$policies[$i]<br>\n";
print "<h1>get_principal burbach@GONICUS.LOCAL</h1>\n";
$options = kadm5_get_principal($handle, "burbach@GONICUS.LOCAL" );
$keys = array_keys($options);
for( $i=0; $i<count($keys); $i++) {
$value = $options[$keys[$i]];
print "$keys[$i]: $value<br>\n";
}
$options = array(KADM5_PRINC_EXPIRE_TIME => 0);
kadm5_modify_principal($handle, "burbach@GONICUS.LOCAL", $options);
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_chpass_principal — Changes the principal's password
$handle
, string $principal
, string $password
)
kadm5_chpass_principal() sets the new password
password for the principal.
handle
A KADM5 handle.
principal
The principal.
password
The new password.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Example of changing principal's password
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
kadm5_chpass_principal($handle, "burbach@GONICUS.LOCAL", "newpassword");
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_create_principal — Creates a kerberos principal with the given parameters
$handle
, string $principal
[, string $password
[, array $options
]] )
Creates a principal with the given
password.
handle
A KADM5 handle.
principal
The principal.
password
If password is omitted or is NULL, a random
key will be generated.
options
It is possible to specify several optional parameters within the
array options. Allowed are the following options:
KADM5_PRINC_EXPIRE_TIME,
KADM5_PW_EXPIRATION,
KADM5_ATTRIBUTES,
KADM5_MAX_LIFE,
KADM5_KVNO,
KADM5_POLICY,
KADM5_CLEARPOLICY,
KADM5_MAX_RLIFE.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Example of principal's creation
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
$attributes = KRB5_KDB_REQUIRES_PRE_AUTH | KRB5_KDB_DISALLOW_PROXIABLE;
$options = array(KADM5_PRINC_EXPIRE_TIME => 0,
KADM5_POLICY => "default",
KADM5_ATTRIBUTES => $attributes);
kadm5_create_principal($handle, "burbach@GONICUS.LOCAL", "password", $options);
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_delete_principal — Deletes a kerberos principal
$handle
, string $principal
)
Removes the principal from the Kerberos database.
handle
A KADM5 handle.
principal
The removed principal.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 kadm5_delete_principal() example
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
kadm5_delete_principal($handle, "burbach@GONICUS.LOCAL");
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_destroy — Closes the connection to the admin server and releases all related resources
$handle
)Closes the connection to the admin server and releases all related resources.
handle
A KADM5 handle.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL kadm5 >= 0.2.3)
kadm5_flush — Flush all changes to the Kerberos database
$handle
)Flush all changes to the Kerberos database, leaving the connection to the Kerberos admin server open.
handle
A KADM5 handle.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL kadm5 >= 0.2.3)
kadm5_get_policies — Gets all policies from the Kerberos database
$handle
)Gets an array containing the policies's names.
handle
A KADM5 handle.
Returns array of policies on success o FALSE en caso de error.
Ejemplo #1 kadm5_get_policies() example
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_policies</h1>\n";
foreach (kadm5_get_policies($handle) as $policy) {
echo "$policy<br />\n";
}
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_get_principal — Gets the principal's entries from the Kerberos database
$handle
, string $principal
)Gets the principal's entries from the Kerberos database.
handle
A KADM5 handle.
principal
The principal.
Returns array of options containing the following keys: KADM5_PRINCIPAL,
KADM5_PRINC_EXPIRE_TIME, KADM5_PW_EXPIRATION, KADM5_ATTRIBUTES,
KADM5_MAX_LIFE, KADM5_MOD_NAME, KADM5_MOD_TIME, KADM5_KVNO, KADM5_POLICY,
KADM5_MAX_RLIFE, KADM5_LAST_SUCCESS, KADM5_LAST_FAILED,
KADM5_FAIL_AUTH_COUNT on success o FALSE en caso de error.
Ejemplo #1 kadm5_get_principal() example
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_principal burbach@GONICUS.LOCAL</h1>\n";
$options = kadm5_get_principal($handle, "burbach@GONICUS.LOCAL" );
foreach ($options as $key => $value) {
echo "$key: $value<br />\n";
}
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_get_principals — Gets all principals from the Kerberos database
$handle
)kadm5_get_principals() returns an array containing the principals's names.
handle
A KADM5 handle.
Returns array of principals on success o FALSE en caso de error.
Ejemplo #1 kadm5_get_principals() example
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_principals</h1>\n";
foreach (kadm5_get_principals($handle) as $principal) {
echo "$principal<br />\n";
}
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_init_with_password — Opens a connection to the KADM5 library
$admin_server
, string $realm
, string $principal
, string $password
)
Opens a connection with the KADM5 library using the
principal and the given
password to obtain initial credentials from the
admin_server.
admin_server
The server.
realm
Defines the authentication domain for the connection.
principal
The principal.
password
If password is omitted or is NULL, a random
key will be generated.
Returns a KADM5 handle on success o FALSE en caso de error.
Ejemplo #1 KADM5 initialization example
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
$attributes = KRB5_KDB_REQUIRES_PRE_AUTH | KRB5_KDB_DISALLOW_PROXIABLE;
$options = array(KADM5_PRINC_EXPIRE_TIME => 0,
KADM5_POLICY => "default",
KADM5_ATTRIBUTES => $attributes);
kadm5_create_principal($handle, "burbach@GONICUS.LOCAL", "password", $options);
kadm5_destroy($handle);
?>
Nota:
Connection should be closed after use with kadm5_destroy().
(PECL kadm5 >= 0.2.3)
kadm5_modify_principal — Modifies a kerberos principal with the given parameters
$handle
, string $principal
, array $options
)
Modifies a principal according to the given
options.
handle
A KADM5 handle.
principal
The principal.
options
It is possible to specify several optional parameters within the
array options. Allowed are the following options:
KADM5_PRINC_EXPIRE_TIME,
KADM5_PW_EXPIRATION,
KADM5_ATTRIBUTES,
KADM5_MAX_LIFE,
KADM5_KVNO,
KADM5_POLICY,
KADM5_CLEARPOLICY,
KADM5_MAX_RLIFE.
KADM5_FAIL_AUTH_COUNT.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Example of modifying principal
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
$attributes = KRB5_KDB_REQUIRES_PRE_AUTH;
$options = array(KADM5_PRINC_EXPIRE_TIME => 3451234,
KADM5_POLICY => "gonicus",
KADM5_ATTRIBUTES => $attributes);
kadm5_modify_principal($handle, "burbach@GONICUS.LOCAL", $options);
kadm5_destroy($handle);
?>
Este paquete se basa en los libradius de FreeBSD (Autenticación remota telefónica de servicio de usuario). Permite a los clientes realizar la autenticación y la contabilidad por medio de solicitudes de red a servidores remotos.
Esta extensión PECL añade soporte completo para la autenticación Radius (» RFC 2865) y contabilidad Radius (» RFC 2866). Este paquete está disponible para Unix (probado en FreeBSD y Linux) y para Windows.
Nota:
Una descripción exacta de libradius se pueden encontrar » aquí. Una descripción detallada del archivo de configuración se puede encontrar » aquí.
No se requiere de ninguna biblioteca externa para compilar esta extensión.
Esta extensión » PECL no se distribuye con PHP.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/radius.
No hay una DLL disponible para esta extensión PECL actualmente. Vea también la sección Compilando en Windows .
Esta extensión no tiene directivas de configuración definidas en php.ini.
Esta extensión no tiene ningún tipo de recurso definido.
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
RADIUS_ACCESS_REQUEST
()
RADIUS_ACCESS_ACCEPT
()
RADIUS_ACCESS_REJECT
()
RADIUS_ACCOUNTING_REQUEST
()
RADIUS_ACCOUNTING_RESPONSE
()
RADIUS_ACCESS_CHALLENGE
()
RADIUS_USER_NAME
(string)
RADIUS_USER_PASSWORD
(string)
RADIUS_CHAP_PASSWORD
(string)
RADIUS_NAS_IP_ADDRESS
(string)
RADIUS_NAS_PORT
(int)
RADIUS_SERVICE_TYPE
(int)
Type of Service, one of:
RADIUS_LOGINRADIUS_FRAMEDRADIUS_CALLBACK_LOGINRADIUS_CALLBACK_FRAMEDRADIUS_OUTBOUNDRADIUS_ADMINISTRATIVERADIUS_NAS_PROMPTRADIUS_AUTHENTICATE_ONLYRADIUS_CALLBACK_NAS_PROMPTRADIUS_FRAMED_PROTOCOL
(int)
Framed Protocol, one of:
RADIUS_PPPRADIUS_SLIPRADIUS_ARAPRADIUS_GANDALFRADIUS_XYLOGICSRADIUS_FRAMED_IP_ADDRESS
(int)
RADIUS_FRAMED_IP_NETMASK
(string)
RADIUS_FRAMED_ROUTING
(int)
RADIUS_FILTER_ID
(string)
RADIUS_FRAMED_MTU
(int)
RADIUS_FRAMED_COMPRESSION
(int)
Compression, one of:
RADIUS_COMP_NONERADIUS_COMP_VJRADIUS_COMP_IPXHDRRADIUS_LOGIN_IP_HOST
(string)
RADIUS_LOGIN_SERVICE
(int)
RADIUS_LOGIN_TCP_PORT
(int)
RADIUS_REPLY_MESSAGE
(string)
RADIUS_CALLBACK_NUMBER
(string)
RADIUS_CALLBACK_ID
(string)
RADIUS_FRAMED_ROUTE
(string)
RADIUS_FRAMED_IPX_NETWORK
(string)
RADIUS_STATE
(string)
RADIUS_CLASS
(int)
RADIUS_VENDOR_SPECIFIC
(int)
RADIUS_SESSION_TIMEOUT
(int)
RADIUS_IDLE_TIMEOUT
(int)
RADIUS_TERMINATION_ACTION
(int)
RADIUS_CALLED_STATION_ID
(int)
RADIUS_CALLING_STATION_ID
(string)
RADIUS_NAS_IDENTIFIER
(int)
RADIUS_PROXY_STATE
(int)
RADIUS_LOGIN_LAT_SERVICE
(int)
RADIUS_LOGIN_LAT_NODE
(int)
RADIUS_LOGIN_LAT_GROUP
(int)
RADIUS_FRAMED_APPLETALK_LINK
(int)
RADIUS_FRAMED_APPLETALK_NETWORK
(int)
RADIUS_FRAMED_APPLETALK_ZONE
(int)
RADIUS_CHAP_CHALLENGE
(string)
RADIUS_NAS_PORT_TYPE
(int)
NAS port type, one of:
RADIUS_ASYNCRADIUS_SYNCRADIUS_ISDN_SYNCRADIUS_ISDN_ASYNC_V120RADIUS_ISDN_ASYNC_V110RADIUS_VIRTUALRADIUS_PIAFSRADIUS_HDLC_CLEAR_CHANNELRADIUS_X_25RADIUS_X_75RADIUS_G_3_FAXRADIUS_SDSLRADIUS_ADSL_CAPRADIUS_ADSL_DMTRADIUS_IDSLRADIUS_ETHERNETRADIUS_XDSLRADIUS_CABLERADIUS_WIRELESS_OTHERRADIUS_WIRELESS_IEEE_802_11RADIUS_PORT_LIMIT
(int)
RADIUS_LOGIN_LAT_PORT
(int)
RADIUS_CONNECT_INFO
(string)
RADIUS_ACCT_STATUS_TYPE
(int)
Accounting status type, one of:
RADIUS_STARTRADIUS_STOPRADIUS_ACCOUNTING_ONRADIUS_ACCOUNTING_OFFRADIUS_ACCT_DELAY_TIME
(int)
RADIUS_ACCT_INPUT_OCTETS
(int)
RADIUS_ACCT_OUTPUT_OCTETS
(int)
RADIUS_ACCT_SESSION_ID
(int)
RADIUS_ACCT_AUTHENTIC
(int)
Accounting authentic, one of:
RADIUS_AUTH_RADIUSRADIUS_AUTH_LOCALRADIUS_AUTH_REMOTERADIUS_ACCT_SESSION_TIME
(int)
RADIUS_ACCT_INPUT_PACKETS
(int)
RADIUS_ACCT_OUTPUT_PACKETS
(int)
RADIUS_ACCT_TERMINATE_CAUSE
(int)
Accounting terminate cause, one of:
RADIUS_TERM_USER_REQUESTRADIUS_TERM_LOST_CARRIERRADIUS_TERM_LOST_SERVICERADIUS_TERM_IDLE_TIMEOUTRADIUS_TERM_SESSION_TIMEOUTRADIUS_TERM_ADMIN_RESETRADIUS_TERM_ADMIN_REBOOTRADIUS_TERM_PORT_ERRORRADIUS_TERM_NAS_ERRORRADIUS_TERM_NAS_REQUESTRADIUS_TERM_NAS_REBOOTRADIUS_TERM_PORT_UNNEEDEDRADIUS_TERM_PORT_PREEMPTEDRADIUS_TERM_PORT_SUSPENDEDRADIUS_TERM_SERVICE_UNAVAILABLERADIUS_TERM_CALLBACKRADIUS_TERM_USER_ERRORRADIUS_TERM_HOST_REQUESTRADIUS_ACCT_MULTI_SESSION_ID
(string)
RADIUS_ACCT_LINK_COUNT
(int)
RADIUS_VENDOR_MICROSOFT
(int)
Microsoft specific vendor attributes (» RFC 2548), one of:
RADIUS_MICROSOFT_MS_CHAP_RESPONSERADIUS_MICROSOFT_MS_CHAP_ERRORRADIUS_MICROSOFT_MS_CHAP_PW_1RADIUS_MICROSOFT_MS_CHAP_PW_2RADIUS_MICROSOFT_MS_CHAP_LM_ENC_PWRADIUS_MICROSOFT_MS_CHAP_NT_ENC_PWRADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_POLICYRADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_TYPESRADIUS_MICROSOFT_MS_RAS_VENDORRADIUS_MICROSOFT_MS_CHAP_DOMAINRADIUS_MICROSOFT_MS_CHAP_CHALLENGERADIUS_MICROSOFT_MS_CHAP_MPPE_KEYSRADIUS_MICROSOFT_MS_BAP_USAGERADIUS_MICROSOFT_MS_LINK_UTILIZATION_THRESHOLDRADIUS_MICROSOFT_MS_LINK_DROP_TIME_LIMITRADIUS_MICROSOFT_MS_MPPE_SEND_KEYRADIUS_MICROSOFT_MS_MPPE_RECV_KEYRADIUS_MICROSOFT_MS_RAS_VERSIONRADIUS_MICROSOFT_MS_OLD_ARAP_PASSWORDRADIUS_MICROSOFT_MS_NEW_ARAP_PASSWORDRADIUS_MICROSOFT_MS_ARAP_PASSWORD_CHANGE_REASONRADIUS_MICROSOFT_MS_FILTERRADIUS_MICROSOFT_MS_ACCT_AUTH_TYPERADIUS_MICROSOFT_MS_ACCT_EAP_TYPERADIUS_MICROSOFT_MS_CHAP2_RESPONSERADIUS_MICROSOFT_MS_CHAP2_SUCCESSRADIUS_MICROSOFT_MS_CHAP2_PWRADIUS_MICROSOFT_MS_PRIMARY_DNS_SERVERRADIUS_MICROSOFT_MS_SECONDARY_DNS_SERVERRADIUS_MICROSOFT_MS_PRIMARY_NBNS_SERVERRADIUS_MICROSOFT_MS_SECONDARY_NBNS_SERVERRADIUS_MICROSOFT_MS_ARAP_CHALLENGE¿Cómo iniciar?
El paquete contiene un ejemplo de script php. Este script demuestra como autenticar con radius utilizando PAP o CHAP (md5). Si se autentica con servidores Microsoft Radius entonces no le será posible utilizar CHAP (md5). Si quisiera autenticarse con servidores Microsoft tiene que utilizar MS-CHAPv1 o MS-CHAPv2, pero es más complicado, porque usted necesita md4, sha1 y des para generar los datos correctos. Los ejemplos adjuntos demuestran todos los métodos de autenticación, incluyendo MS-CHAPv1 y MS-CHAPv2. Para tener funcionando MS-CHAP necesita las extensiones mcrypt y mhash iniciando con la version 1.2 de este paquete, la extensión mcrypt ya no es necesaria.
Si tiene algún comentario, correcciones de errores, mejoras o quiere ayudar a desarrollar esto, puede enviar un e-mail a » mbretter@php.net.
(PECL radius >= 1.1.0)
radius_acct_open — Crea un manejador Radius para el conteo
Devuelve un manejador en caso de tener éxito, FALSE en caso de error. Esta función falla solamente si
hay insuficiencia de memoria.
Ejemplo #1 radius_acct_open() example
<?php
$res = radius_acct_open ()
or die ("No se pudo crear un manejador handle");
print("Manejador creado exitosamente");
?>
(PECL radius >= 1.1.0)
radius_add_server — Adds a server
$radius_handle
, string $hostname
, int $port
, string $secret
, int $timeout
, int $max_tries
)
radius_add_server() may be called multiple times, and it
may be used together with radius_config(). At most 10
servers may be specified. When multiple servers are given, they are tried
in round-robin fashion until a valid response is received, or until each
server's max_tries limit has been reached.
radius_handle
hostname
The hostname parameter specifies the server host,
either as a fully qualified domain name or as a dotted-quad IP address
in text form.
port
The port specifies the UDP port to contact on
the server. If port is given as 0, the library looks up the
radius/udp or
radacct/udp service in the
network services database, and uses the port found there. If no entry
is found, the library uses the standard Radius ports, 1812 for
authentication and 1813 for accounting.
secret
The shared secret for the server host is passed to the
secret parameter. The Radius protocol ignores
all but the leading 128 bytes of the shared secret.
timeout
The timeout for receiving replies from the server is passed to the
timeout parameter, in units of seconds.
max_tries
The maximum number of repeated requests to make before giving up is
passed into the max_tries.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 radius_add_server() example
<?php
if (!radius_add_server($res, 'radius.example.com', 1812, 'testing123', 3, 3)) {
echo 'RadiusError:' . radius_strerror($res). "\n<br>";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_auth_open — Crea un identificador de Radius para la autenticación
Devuelve un manejador en caso de éxito, FALSE en caso de error. Esta función sólo falla si hay
insuficiente memoria disponible.
Ejemplo #1 Ejemplo de radius_auth_open()
<?php
$radh = radius_auth_open()
or die ("No se pudo crear el manejador");
echo "Manejador creado con éxito";
?>
(PECL radius >= 1.1.0)
radius_close — Frees all ressources
$radius_handle
)It is not needed to call this function because php frees all resources at the end of each request.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL radius >= 1.1.0)
radius_config — Causes the library to read the given configuration file
$radius_handle
, string $file
)Before issuing any Radius requests, the library must be made aware of the servers it can contact. The easiest way to configure the library is to call radius_config(). radius_config() causes the library to read a configuration file whose format is described in » radius.conf.
radius_handle
file
The pathname of the configuration file is passed as the file argument to radius_config(). The library can also be configured programmatically by calls to radius_add_server().
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL radius >= 1.1.0)
radius_create_request — Create accounting or authentication request
$radius_handle
, int $type
)A Radius request consists of a code specifying the kind of request, and zero or more attributes which provide additional information. To begin constructing a new request, call radius_create_request().
Nota: Attention: You must call this function, before you can put any attribute!
radius_handle
type
Type is RADIUS_ACCESS_REQUEST or
RADIUS_ACCOUNTING_REQUEST.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 radius_create_request() example
<?php
if (!radius_create_request($res, RADIUS_ACCESS_REQUEST)) {
echo 'RadiusError:' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_cvt_addr — Converts raw data to IP-Address
$data
)
Ejemplo #1 radius_cvt_addr() example
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Error getting attribute: %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
switch ($attr) {
case RADIUS_FRAMED_IP_ADDRESS:
$ip = radius_cvt_addr($data);
echo "IP: $ip<br>\n";
break;
case RADIUS_FRAMED_IP_NETMASK:
$mask = radius_cvt_addr($data);
echo "MASK: $mask<br>\n";
break;
}
}
?>
(PECL radius >= 1.1.0)
radius_cvt_int — Converts raw data to integer
$data
)
Ejemplo #1 radius_cvt_int() example
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Error getting attribute: %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
switch ($attr) {
case RADIUS_FRAMED_MTU:
$mtu = radius_cvt_int($data);
echo "MTU: $mtu<br>\n";
break;
}
}
?>
(PECL radius >= 1.1.0)
radius_cvt_string — Converts raw data to string
$data
)
Ejemplo #1 radius_cvt_string() example
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Error getting attribute: %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
switch ($attr) {
case RADIUS_FILTER_ID:
$id = radius_cvt_string($data);
echo "Filter ID: $id<br>\n";
break;
}
}
?>
(PECL radius >= 1.2.0)
radius_demangle_mppe_key — Derives mppe-keys from mangled data
$radius_handle
, string $mangled
)When using MPPE with MS-CHAPv2, the send- and recv-keys are mangled (see » RFC 2548), however this function is useless, because I don't think that there is or will be a PPTP-MPPE implementation in PHP.
Returns the demangled string, or FALSE on error.
(PECL radius >= 1.2.0)
radius_demangle — Demangles data
$radius_handle
, string $mangled
)Some data (Passwords, MS-CHAPv1 MPPE-Keys) is mangled for security reasons, and must be demangled before you can use them.
Returns the demangled string, or FALSE on error.
(PECL radius >= 1.1.0)
radius_get_attr — Extracts an attribute
Like Radius requests, each response may contain zero or more attributes. After a response has been received successfully by radius_send_request(), its attributes can be extracted one by one using radius_get_attr(). Each time radius_get_attr() is called, it gets the next attribute from the current response.
Returns an associative array containing the attribute-type and the data, or error number <= 0.
Ejemplo #1 radius_get_attr() example
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf("Error getting attribute: %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
printf("Got Attr:%d %d Bytes %s\n", $attr, strlen($data), bin2hex($data));
}
?>
(PECL radius >= 1.1.0)
radius_get_vendor_attr — Extracts a vendor specific attribute
$data
)
If radius_get_attr() returns
RADIUS_VENDOR_SPECIFIC,
radius_get_vendor_attr() may be called to determine the
vendor.
Returns an associative array containing the attribute-type, vendor and the
data, or FALSE on error.
Ejemplo #1 radius_get_vendor_attr() example
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Error getting attribute: %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
printf("Got Attr:%d %d Bytes %s\n", $attr, strlen($data), bin2hex($data));
if ($attr == RADIUS_VENDOR_SPECIFIC) {
$resv = radius_get_vendor_attr($data);
if (is_array($resv)) {
$vendor = $resv['vendor'];
$attrv = $resv['attr'];
$datav = $resv['data'];
printf("Got Vendor Attr:%d %d Bytes %s\n", $attrv, strlen($datav), bin2hex($datav));
}
}
}
?>
(PECL radius >= 1.1.0)
radius_put_addr — Attaches an IP-Address attribute
$radius_handle
, int $type
, string $addr
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL radius >= 1.1.0)
radius_put_attr — Attaches a binary attribute
$radius_handle
, int $type
, string $value
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 radius_put_attr() example
<?php
mt_srand(time());
$chall = mt_rand();
$chapval = md5(pack('Ca*',1 , 'sepp' . $chall));
$pass = pack('CH*', 1, $chapval);
if (!radius_put_attr($res, RADIUS_CHAP_PASSWORD, $pass)) {
echo 'RadiusError:' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_int — Attaches an integer attribute
$radius_handle
, int $type
, int $value
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 radius_put_int() example
<?php
if (!radius_put_int($res, RAD_FRAMED_PROTOCOL, RAD_PPP)) {
echo 'RadiusError:' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_string — Attaches a string attribute
$radius_handle
, int $type
, string $value
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 radius_put_string() example
<?php
if (!radius_put_string($res, RADIUS_USER_NAME, 'billy')) {
echo 'RadiusError:' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_vendor_addr — Attaches a vendor specific IP-Address attribute
$radius_handle
, int $vendor
, int $type
, string $addr
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL radius >= 1.1.0)
radius_put_vendor_attr — Attaches a vendor specific binary attribute
$radius_handle
, int $vendor
, int $type
, string $value
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 radius_put_vendor_attr() example
<?php
if (!radius_put_vendor_attr($res, RADIUS_VENDOR_MICROSOFT, RAD_MICROSOFT_MS_CHAP_CHALLENGE, $challenge)) {
echo 'RadiusError:' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_vendor_int — Attaches a vendor specific integer attribute
$radius_handle
, int $vendor
, int $type
, int $value
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL radius >= 1.1.0)
radius_put_vendor_string — Attaches a vendor specific string attribute
$radius_handle
, int $vendor
, int $type
, string $value
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PECL radius >= 1.1.0)
radius_request_authenticator — Returns the request authenticator
$radius_handle
)The request authenticator is needed for demangling mangled data like passwords and encryption-keys.
Returns the request authenticator as string, or FALSE on error.
(PECL radius >= 1.1.0)
radius_send_request — Sends the request and waites for a reply
$radius_handle
)After the Radius request has been constructed, it is sent by radius_send_request().
The radius_send_request() function sends the request and waits for a valid reply, retrying the defined servers in round-robin fashion as necessary.
If a valid response is received, radius_send_request()
returns the Radius code which specifies the type of the response. This will
typically be RADIUS_ACCESS_ACCEPT,
RADIUS_ACCESS_REJECT, or
RADIUS_ACCESS_CHALLENGE. If no valid response is
received, radius_send_request() returns FALSE.
(PECL radius >= 1.1.0)
radius_server_secret — Returns the shared secret
$radius_handle
)The shared secret is needed as salt for demangling mangled data like passwords and encryption-keys.
Returns the server's shared secret as string, or FALSE on error.
(PECL radius >= 1.1.0)
radius_strerror — Returns an error message
$radius_handle
)If Radius-functions fail then they record an error message. This error message can be retrieved with this function.
Returns error messages as string from failed radius functions.
La extensión de calendario presenta una serie de funciones para simplificar la conversión entre diferentes formatos de calendario. El intermediario o estádar está basado en la Fecha Juliana. La Fecha Juliana es una cuenta de días comenzando desde el 1 de Enero del 4713 A.C. Para hacer la conversión entre sistemas de calendario, primero debe convertir a la Fecha Juliana, después al sistema de calendario de su elección. ¡La Fecha Juliana es muy diferente del Calendario Juliano! Para más información acerca de la Fecha Juliana, visite » http://www.hermetic.ch/cal_stud/jdn.htm. Para más información acerca de sistemas de calendario visite » http://www.fourmilab.ch/documents/calendar/. Los extractos de esta página están incluidos en estas instrucciones, y están entrecomillados.
No se requiere de ninguna biblioteca externa para compilar esta extensión.
Para que estas funciones estén disponibles tiene que compilar PHP con --enable-calendar .
La versión de PHP para Windows tiene soporte nativo para esta extensión. No se requiere cargar extensiones adicionales para utilizar estas funciones.
Esta extensión no tiene directivas de configuración definidas en php.ini.
Esta extensión no tiene ningún tipo de recurso definido.
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
CAL_GREGORIAN
(integer)
CAL_JULIAN
(integer)
CAL_JEWISH
(integer)
CAL_FRENCH
(integer)
CAL_NUM_CALS
(integer)
CAL_DOW_DAYNO
(integer)
CAL_DOW_SHORT
(integer)
CAL_DOW_LONG
(integer)
CAL_MONTH_GREGORIAN_SHORT
(integer)
CAL_MONTH_GREGORIAN_LONG
(integer)
CAL_MONTH_JULIAN_SHORT
(integer)
CAL_MONTH_JULIAN_LONG
(integer)
CAL_MONTH_JEWISH
(integer)
CAL_MONTH_FRENCH
(integer)
Las siguientes constantes están disponibles desde PHP 4.3.0 :
CAL_EASTER_DEFAULT
(integer)
CAL_EASTER_ROMAN
(integer)
CAL_EASTER_ALWAYS_GREGORIAN
(integer)
CAL_EASTER_ALWAYS_JULIAN
(integer)
Las siguientes constantes están disponibles desde PHP 5.0.0 :
(PHP 4 >= 4.1.0, PHP 5)
cal_days_in_month — Devolver el número de días de un mes para un año y un calendario dados
$calendar
, int $month
, int $year
)
Esta función devolverá el número de días del mes
month del año year para
el calendario calendar especificado.
calendar
El calendario que se va a usar para el cálculo
month
El mes del calendario seleccionado
year
El año del calendario seleccionado
La duración en días del mes seleccionado en el calendario dado.
Ejemplo #1 Ejemplo de cal_days_in_month()
<?php
$número = cal_days_in_month(CAL_GREGORIAN, 8, 2003); // 31
echo "Hubo $número días en agosto del 2003";
?>
(PHP 4 >= 4.1.0, PHP 5)
cal_from_jd — Convierte de una Fecha Juliana a un calendario soportado
$jd
, int $calendar
)
cal_from_jd() convierte el día juliano dado en
jd a una fecha del calendario
calendar. Los valores
soportados por calendar son
CAL_GREGORIAN,
CAL_JULIAN,
CAL_JEWISH y
CAL_FRENCH.
jd
Un día juliano como un entero
calendar
El calendario al que se va a convertir
Devuelve una matriz que contiene información del calendario como el mes, día, año, día de la semana, nombres abreviados y completos del día de la semana y mes y la fecha como cadena de la forma "mes/día/año".
Ejemplo #1 Ejemplo de cal_from_jd()
<?php
$hoy = unixtojd(mktime(0, 0, 0, 8, 16, 2003));
print_r(cal_from_jd($hoy, CAL_GREGORIAN));
?>
El resultado del ejemplo sería:
Array
(
[date] => 8/16/2003
[month] => 8
[day] => 16
[year] => 2003
[dow] => 6
[abbrevdayname] => Sat
[dayname] => Saturday
[abbrevmonth] => Aug
[monthname] => August
)
(PHP 4 >= 4.1.0, PHP 5)
cal_info — Devuelve información sobre un calendario en particular
$calendar = -1
] )
cal_info() devuelve información sobre el
calendario calendar especificado.
La información del calendario es devuelta como una matriz que contiene los
elementos calname, calsymbol,
month, abbrevmonth y
maxdaysinmonth. Los nombre de los diferentes calendarios
que se pueden usar en calendar son los siguientes:
CAL_GREGORIAN - Calendario Gregoriano
CAL_JULIAN - Calendario Juliano
CAL_JEWISH - Calendario Judío
CAL_FRENCH - Calendario Republicano Francés
Si no se especifica calendar la información de todos
los calendarios soportados es devuelta como un matriz.
calendar
El calendario del que se va a devolver la información. Si no se especifica ningún calendario se devolverá la información sobre todos los calendarios.
| Versión | Descripción |
|---|---|
| 5.0.0 |
El parametro calendar se volvió opcional
y si se omite se devuelven "todos los calendarios".
|
Ejemplo #1 Ejemplo de cal_info()
<?php
$info = cal_info(0);
print_r($info);
?>
El resultado del ejemplo sería:
Array
(
[months] => Array
(
[1] => January
[2] => February
[3] => March
[4] => April
[5] => May
[6] => June
[7] => July
[8] => August
[9] => September
[10] => October
[11] => November
[12] => December
)
[abbrevmonths] => Array
(
[1] => Jan
[2] => Feb
[3] => Mar
[4] => Apr
[5] => May
[6] => Jun
[7] => Jul
[8] => Aug
[9] => Sep
[10] => Oct
[11] => Nov
[12] => Dec
)
[maxdaysinmonth] => 31
[calname] => Gregorian
[calsymbol] => CAL_GREGORIAN
)
(PHP 4 >= 4.1.0, PHP 5)
cal_to_jd — Convertir un calendario soportado a la Fecha Juliana
$calendar
, int $month
, int $day
, int $year
)
cal_to_jd() calcula la Fecha Juliana
para una fecha en el calendario calendar especificado.
Los calendarios calendar soportados son
CAL_GREGORIAN,
CAL_JULIAN,
CAL_JEWISH y
CAL_FRENCH.
calendar
El calendario desde el que se va a hacer la conversión,
CAL_GREGORIAN,
CAL_JULIAN,
CAL_JEWISH o
CAL_FRENCH.
month
El mes como número, el rango válido depende de calendar
day
El día como número, el rango válido depende de calendar
year
El año como número, el rango válido depende de calendar
Un número de día de la Fecha Juliana.
(PHP 4, PHP 5)
easter_date — Obtener la fecha Unix para la medianoche de Pascua de un año dado
$year
] )Devuelve la fecha Unix correspondiente a la medianoche de Pascua del año dado.
Esta función generará una advertencia si el año está fuera del rango de fechas Unix (esto es, antes de 1970 o después de 2037).
La fecha del Domiongo de Pascua fue definida por el Concilio de Nicea en el año 325 D.C. como el domingo después de la primera luna llena que cae en o después del Equinocio de Primavera. El equinocio se asume que cae en el 21 de marzo, por lo que el cálculo se reduce a determinar la fecha de la luna llena y la fecha del siguiente domingo. El algoritmo que se usa aquí fue introducido alrededor del año 532 por Dionisio el Exiguo. Bajo el Calendario Juliano (para años anteriores a 1753) se usa un simple ciclo de 19 años para rastrear las fases de la luna. Bajo el Calendario Gregoriano (para años posteriores a 1753 - concebido por Clavio y Lilio, e introducido por el papa Gregorio XIII en Octubre de 1582, e introducido en Gran Bretaña y sus colonias en Septiembre de 1752) se añadieron dos factores de corrección para hacer el ciclo más exacto.
year
El año como un número entre 1970 y 2037.
El Domingo de Pascua como fecha Unix.
| Versión | Descripción |
|---|---|
| Since 4.3.0 |
El parámetro year es opcional y si se omite, por defecto es
el año actual de acuerdo a la hora actual.
|
Ejemplo #1 Ejemplo de easter_date()
<?php
echo date("M-d-Y", easter_date(1999)); // Apr-04-1999
echo date("M-d-Y", easter_date(2000)); // Apr-23-2000
echo date("M-d-Y", easter_date(2001)); // Apr-15-2001
?>
(PHP 4, PHP 5)
easter_days — Obtener el número de días despúes del 21 de marzo en el cuál cae Pascua para un año dado
$year
[, int $method = CAL_EASTER_DEFAULT
]] )Obtiene el número de días despúes del 21 de marzo en el cuál cae Pascua para un año dado. Si no se especifica el año, se asume el año actual.
Esta función se puede usar en vez de easter_date() para calcular cuándo cae Pascua para años fuera del rango de fechas Unix (esto es, antes de 1970 o después de 2037).
La fecha del Domiongo de Pascua fue definida por el Concilio de Nicea en el año 325 D.C. como el domingo después de la primera luna llena que cae en o después del Equinocio de Primavera. El equinocio se asume que cae en el 21 de marzo, por lo que el cálculo se reduce a determinar la fecha de la luna llena y la fecha del siguiente domingo. El algoritmo que se usa aquí fue introducido alrededor del año 532 por Dionisio el Exiguo. Bajo el Calendario Juliano (para años anteriores a 1753) se usa un simple ciclo de 19 años para rastrear las fases de la luna. Bajo el Calendario Gregoriano (para años posteriores a 1753 - concebido por Clavio y Lilio, e introducido por el papa Gregorio XIII en Octubre de 1582, e introducido en Gran Bretaña y sus colonias en Septiembre de 1752) se añadieron dos factores de corrección para hacer el ciclo más exacto.
year
El año como un número positivo.
method
Permite calcular las fechas de pascua basadas
en el calendario Gregoriano durante los años 1582 - 1752 cuando se establece a
CAL_EASTER_ROMAN. Vea las constantes de calendario para más constantes
válidas.
El número de días después del 21 de marzo en el que cae el Domingo de Pascua
para el año year dado.
| Versión | Descripción |
|---|---|
| Since 4.3.0 |
El parámetro year es opcional y por defecto
es el año actual de acuerdo a la hora local si se omite.
|
| Since 4.3.0 |
El parámetro method fue introducido.
|
Ejemplo #1 Ejemplo de easter_days()
<?php
echo easter_days(1999); // 14, esto es, 4 de abril
echo easter_days(1492); // 32, esto es, 22 de abril
echo easter_days(1913); // 2, esto es, 23 de marzo
?>
(PHP 4, PHP 5)
FrenchToJD — Convierte una fecha desde el Calendario Republicano Francés a la Fecha Juliana
$month
, int $day
, int $year
)Convierte una fecha desde el Calendario Republicano Francés a la Fecha Juliana.
Estas rutinas sólamente convierten fechas de los años 1 hasta 14 (fechas gregorianas desde el 22 de septiembre de 1792 hasta el 22 de septiembre de 1806). Esto cubre más que el periodo cuando el calendario estaba en uso.
month
El mes como un número desde 1 (para Vendémiaire) hasta 13 (para el periodo de 5-6 días al final de cada año)
day
El día como un número de 1 a 30
year
El año como un número entre 1 y 14
La Fecha Jjuliana para la fecha de la Revolución Francesa dada como un entero.
(PHP 4, PHP 5)
GregorianToJD — Convierte una fecha Gregoriana en Fecha Juliana
$month
, int $day
, int $year
)El rango válido para el Calendario Gregoriano es de 4714 A.C. a 9999 D.C.
Aunque esta función puede manejar fechas que se remontan hasta 4714 A.C., tal uso puede no ser significativo. El calendario Gregoriano no fue establecido hasta el 15 de octubre de 1582 (o 5 de octubre de 1582 el el calendario Juliano). Algunos países no lo aceptaron hasta mucho más tarde. Por ejemplo, Gran Bretaña lo adoptó en 1752, la URSS en 1918 y Grecia en 1923. La mayoría de los países europeos usaban el calendario Juliano antes del Gregoriano.
month
El mes como un número desde 1 (para enero) hasta 12 (para diciembre)
day
El día como un número desde 1 a 31
year
El año como un número entre -4714 y 9999
La Fecha Juliana para la fecha gregoriana dada como un entero.
Ejemplo #1 Funciones de calendario
<?php
$jd = GregorianToJD(10, 11, 1970);
echo "$jd\n";
$gregoriano = JDToGregorian($jd);
echo "$gregoriano\n";
?>
(PHP 4, PHP 5)
JDDayOfWeek — Devuelve el día de la semana
Devuelve el día de la semana. Puede devolver una cadena o un entero dependiendo del modo.
julianday
Un número de día juliano como un entero
mode
| Modo | Significado |
|---|---|
| 0 (Por defecto) | Devuelve el número de día como un entero (0=domingo, 1=lunes, etc.) |
| 1 | Devuelve una cadena que contiene el día de la semana (Inglés-Gregoriano) |
| 2 | Devuelve una cadena que contiene el día de la semana abreviado (Inglés-Gregoriano) |
El día de la semada gregoriana como un entero o cadena.
(PHP 4, PHP 5)
JDMonthName — Devuelve el nombre de un mes
$julianday
, int $mode
)
Devuelve una cadena que contiene el nombre del mes.
mode le indica a esta función a qué calendario va
a ser convertido la Fecha Juliana, y qué tipo de nombres de meses son
devueltos.
| Modo | Significado | Valores |
|---|---|---|
| 0 | Gregoriano - abreviado | Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec |
| 1 | Gregoriano | January, February, March, April, May, June, July, August, September, October, November, December |
| 2 | Juliano - abreviado | Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec |
| 3 | Juliano | January, February, March, April, May, June, July, August, September, October, November, December |
| 4 | Judío | Tishri, Heshvan, Kislev, Tevet, Shevat, AdarI, AdarII, Nisan, Iyyar, Sivan, Tammuz, Av, Elul |
| 5 | Republicano Francés | Vendemiaire, Brumaire, Frimaire, Nivose, Pluviose, Ventose, Germinal, Floreal, Prairial, Messidor, Thermidor, Fructidor, Extra |
jday
La Fecha Juliana que se va a manejar
calendar
El calendario del que se va a tomar el nombre del mes
El nombre del mes de la Fecha Juliana y del calendario calendar dados.
(PHP 4, PHP 5)
JDToFrench — Convierte una Fecha Juliana al Calendario Republicano Francés
$juliandaycount
)Convierte una Fecha Juliana al Calendario Republicano Francés.
julianday
Una número de día juliano como un entero
La fecha de la Revolución Francesa como una cadena de la forma "mes/día/año"
(PHP 4, PHP 5)
JDToGregorian — Convierte una Fecha Juliana en una fecha Gregoriana
$julianday
)Convierte una Fecha Juliana a una cadena que contiene la fecha Gregoriana con el formato "mes/día/año".
julianday
Un número de día juliano como un entero
La fecha gregoriana como una cadena de la forma "mes/día/año"
(PHP 4, PHP 5)
jdtojewish — Convierte una Fecha Juliana a una fecha del Calendario Judío
$juliandaycount
[, bool $hebrew = false
[, int $fl = 0
]] )Convierte una Fecha Juliana al Calendario Judío.
julianday
Un número de día juliano como un entero
hebrew
Si el parámetro hebrew está establecido a TRUE, el
parámetro fl se usa para el formato de salida, basado
en cadena, Hebreo.
fl
Los formatos disponibles son:
CAL_JEWISH_ADD_ALAFIM_GERESH,
CAL_JEWISH_ADD_ALAFIM,
CAL_JEWISH_ADD_GERESHAYIM.
La fecha judía como una cadena de la forma "mes/día/año"
| Versión | Descripción |
|---|---|
| 5.0.0 |
Se añadió el parámetro fl.
|
| 4.3.0 |
Se añadió el parámetro hebrew.
|
Ejemplo #1 Ejemplo de jdtojewish()
<?php
echo jdtojewish(gregoriantojd(10, 8, 2002), true,
CAL_JEWISH_ADD_GERESHAYIM + CAL_JEWISH_ADD_ALAFIM + CAL_JEWISH_ADD_ALAFIM_GERESH);
?>
(PHP 4, PHP 5)
JDToJulian — Convierte una Fecha Juliana a una fecha del Calendario Juliano
$julianday
)Convierte una Fecha Juliana a una cadena que contiene la fecha del Calendario Juliano con el formato "mes/día/año".
julianday
Un número de día juliano como un entero
La fecha del calendario juliano como una cadena de la forma "mes/día/año"
(PHP 4, PHP 5)
jdtounix — Convierte una Fecha Juliana a una fecha Unix
$jday
)
Esta funcion devolverá una fecha Unix correspondiente a la
Fecha Juliana dada en jday o FALSE si
jday no está dentro de la época Unix
(años gregorianos entre 1970 y 2037 o 2440588 <=
jday <= 2465342 ). El momento devuleto es
como hora local (y no GMT).
jday
Un número de día juliano entre 2440588 y 2465342.
La fecha Unix para el comienzo de la Fecha Juliana dada.
(PHP 4, PHP 5)
JewishToJD — Convierte una fecha del Calendario Judío a una Fecha Juliana
$month
, int $day
, int $year
)Aunque esta función puede manejar fechas que se remontan hasta el año 1 (3761 A.C.), tal uso puede no ser significativo. El calendario judío ha estado en uso desde varios cientos de años, pero en los primeros días no había una fórmula para determinar el inicio del un mes. Un nuevo mes comenzaba cuando se observaba la primera luna nueva.
month
El mes como un número de 1 a 13
day
El día como un número de 1 a 30
year
El año como un número entre 1 y 9999
La Fecha Juliana para la fecha judía dada como un entero.
(PHP 4, PHP 5)
JulianToJD — Convierte una fecha del Calendario Juliano a una Fecha Juliana
$month
, int $day
, int $year
)El rango válido para el Calendario Juliano es desde 4713 A.C. a 9999 D.C.
Aunque esta función puede manejar fechas que se remontan hasta 4713 A.C., tal uso puede no ser significativo. El calendario fue creado en el 46 A.C., pero los detalles no se estabilizaron hasta al menos el 8 D.C., y quizás hasta el siglo IV tardío. También, el comienzo de un año variaba de una cultura a otra - no todas aceptaron enero como el primer mes.
Recuerde, el sistema de calendario actual que se usa mundialmente es el Calendario Gregoriano. gregoriantojd() se puede usar para convertir tales fechas a sus Fechas Julianas.
month
El mes como un número de 1 (para enero) a 12 (para diecienbre)
day
El día como un número de 1 a 31
year
El año como un número entre -4713 y 9999
La Fecha Juliana para la fecha del Calendario Juliano dado como un entero.
(PHP 4, PHP 5)
unixtojd — Convertir una fecha Unix en una Fecha Juliana
$timestamp = time()
] )
Devuelve la Fecha Juliana para la fecha timestamp Unix
(segundos desde 1.1.1970), o el día actual si timestamp no es dado.
timestamp
Una fecha unix a convertir.
Un número de día juliano como un entero.
Estas funciones le permiten obtener la fecha y la hora del servidor donde sus scripts PHP se están ejecutando. Puede usar estas funciones parar dar formato a fechas y horas de muchas maneras diferentes.
La fecha y la información de la hora se almacena internamente como un número de 64 bits para todas las fechas posiblemente útiles (incluyendo años negativos) están soportadas. El rango es aproximadamente desde 292 billones de años en el pasado, y lo mismo en el futuro.
Nota: Por favor, tenga en cuenta que estas funciones dependen de la configuración regional del servidor. Asegúrese de tomar en consideración el horario de verano (use p.ej. $fecha = strtotime('+7 days', $fecha) y no $fecha += 7*24*60*60) y los años bisiestos en cuenta cuando se trabaja con estas funciones.
Nota: Las zonas horarias a las que se refiere esta sección pueden encontrarse en la Listado de Timezones soportados.
No se requiere de ninguna biblioteca externa para compilar esta extensión.
No se requiere de ninguna instalación para utilizar estas funciones; forman parte del núcleo de PHP.
Nota: Obtener la última base de datos de zonas horarias
La última versión de la base de datos de zona horaria se puede instalar mediante la base de datos » timezonedb de PECL.
Nota: Soporte experimental para DateTime en PHP 5.1.x
Aunque la clase DateTime (y sus funciones relacionadas) están habilitadas por defecto desde PHP 5.2.0, es posible añadir soporte experimental en PHP 5.1.x usando la siguiente bandera antes de configurar/compilar: CFLAGS=-DEXPERIMENTAL_DATE_SUPPORT=1
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| date.default_latitude | "31.7667" | PHP_INI_ALL | Disponible desde PHP 5.0.0. |
| date.default_longitude | "35.2333" | PHP_INI_ALL | Disponible desde PHP 5.0.0. |
| date.sunrise_zenith | "90.583333" | PHP_INI_ALL | Disponible desde PHP 5.0.0. |
| date.sunset_zenith | "90.583333" | PHP_INI_ALL | Disponible desde PHP 5.0.0. |
| date.timezone | "" | PHP_INI_ALL | Disponible desde PHP 5.1.0. |
He aquí una breve explicación de las directivas de configuración.
date.default_latitude
float
La latitud predeterminada.
date.default_longitude
float
La longitud predeterminada.
date.sunrise_zenith
float
El cénit de la salida del sol predeterminado.
date.sunset_zenith
float
El cénit de la puesta de sol predeterminado.
date.timezone
string
La zona horaria predeterminada usada por todas funciones date/time. Antes de PHP 5.4.0, esto sólo funciona si la variable de entorno TZ no se ha establecido. El orden de prioridad para la zona horaria que se utiliza cuando no se establece explícitamente se describe en la función date_default_timezone_get() Vea Listado de Timezones soportados para una lista de las zonas horarias soportadas.
Nota: Las cuatro primeras opciones de configuración son sólo usadas actualmente por date_sunrise() y date_sunset().
Esta extensión no tiene ningún tipo de recurso definido.
Las contantes DATE_ están definidas desde PHP 5.1.1 y ofrecen representaciones de fecha estándar, que pueden ser usadas por las funciones de formato de fecha (como date()).
Las siguientes constantes existen desde PHP 5.1.2 y especifican un formato devuelvto por las funciones date_sunrise() y date_sunset().
(PHP 5 >= 5.2.0)
Representación de la fecha y la hora.
$format
, string $time
[, DateTimeZone $timezone
] )DateTime::ATOM
DATE_ATOM
DateTime::ISO8601
DATE_ISO8601
DateTime::RFC822
DATE_RFC822
DateTime::RFC850
DATE_RFC850
DateTime::RFC1036
DATE_RFC1036
DateTime::RFC1123
DATE_RFC1123
DateTime::RFC2822
DATE_RFC2822
DateTime::RFC3339
DATE_RFC3339
DATE_ATOM (desde PHP 5.1.3)
DateTime::RSS
DATE_RSS
DateTime::W3C
DATE_W3C
| Versión | Descripción |
|---|---|
| 5.2.2 | La comparación de un objeto DateTime con los operadores de comparación se cambió para que funcionara como se esperaba. Anteriormente, todos los objetos DateTime eran considerados iguales (usando ==). |
(PHP 5 >= 5.3.0)
DateTime::add -- date_add — Añade una cantidad de días, meses, años, horas, minutos y segundos al objeto DateTime
Estilo orientado a objetos
Estilo por procedimientos
Añade el objeto DateInterval especificado al objeto DateTime especificado.
object
Estilo por procesos solamente: Un objeto DateTime devuelto por date_create(). La función modifica este objeto.
interval
Un objeto DateInterval
Devuelve el objecto DateTime por el método encadenado o FALSE en caso de error.
Ejemplo #1 Ejemplo de DateTime::add()
Estilo orientado a objetos
<?php
$fecha = new DateTime('2000-01-01');
$fecha->add(new DateInterval('P10D'));
echo $fecha->format('Y-m-d') . "\n";
?>
Estilo por procedimientos
<?php
$fecha = date_create('2000-01-01');
date_add($fecha, date_interval_create_from_date_string('10 days'));
echo date_format($fecha, 'Y-m-d');
?>
El resultado de los ejemplos serían:
2000-01-11
Ejemplo #2 Más ejemplos de DateTime::add()
<?php
$fecha= new DateTime('2000-01-01');
$fecha->add(new DateInterval('PT10H30S'));
echo $date->format('Y-m-d H:i:s') . "\n";
$fecha = new DateTime('2000-01-01');
$fecha->add(new DateInterval('P7Y5M4DT4H3M2S'));
echo $fecha->format('Y-m-d H:i:s') . "\n";
?>
El resultado del ejemplo sería:
2000-01-01 10:00:30 2007-06-05 04:03:02
Ejemplo #3 Cuidado al añadir meses
<?php
$fecha = new DateTime('2000-12-31');
$intervalo = new DateInterval('P1M');
$fecha->add($intervalo);
echo $fecha->format('Y-m-d') . "\n";
$fecha->add($intervalo);
echo $fecha->format('Y-m-d') . "\n";
?>
El resultado del ejemplo sería:
2001-01-31 2001-03-03
DateTime::modify() es una alternativa cuando se usa PHP 5.2.
(PHP 5 >= 5.2.0)
DateTime::__construct -- date_create — Devuelve un nuevo objeto DateTime
Estilo orientado a objetos
Estilo por procedimientos
Devuelve un nuevo objeto DateTime.
time
Una cadena de fecha/hora. Los formatos válidos son explicados en Formatos de fecha y hora.
Introduzca NULL aquí para obtener el instante actual cuando se use
el parámetro $timezone.
timezone
Un objeto DateTimeZone que representa la zona horaria deseada.
Si se omite $timezone,
se usará la zona horaria actual.
Nota:
El parámetro
$timezoney la zona horaria actuales se ignoran cuando el parámetro$timees una fecha UNIX (p.ej. @946684800) o especifica una zona horaria (p.ej. 2010-01-28T15:00:00+02:00).
Devuelve una nueva instancia de DateTime.
Estilo por procedimientos devuelve FALSE en caso de error.
Emite una Exception en caso de error.
| Versión | Descripción |
|---|---|
| 5.3.0 | Si se especifica una fecha no válida, ahora se lanza una excepción. Anteriormente se emitía un error. |
Ejemplo #1 Ejemplo de DateTime::__construct()
Estilo orientado a objetos
<?php
try {
$fecha = new DateTime('2000-01-01');
} catch (Exception $e) {
echo $e->getMessage();
exit(1);
}
echo $fecha->format('Y-m-d');
?>
Estilo por procedimientos
<?php
$fecha = date_create('2000-01-01');
if (!$fecha) {
$e = date_get_last_errors();
foreach ($e['errors'] as $error) {
echo "$error\n";
}
exit(1);
}
echo date_format($fecha, 'Y-m-d');
?>
El resultado de los ejemplos serían:
2000-01-01
Ejemplo #2 Complejidades de DateTime::__construct()
<?php
// Fecha/hora especificadas en la zona horaria de su ordenador.
$fecha = new DateTime('2000-01-01');
echo $fecha->format('Y-m-d H:i:sP') . "\n";
// Fecha/hora especificadas en la zona horaria especificada.
$fecha = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $fecha->format('Y-m-d H:i:sP') . "\n";
// Fecha/hora actuales en la zona horaria de su ordenador.
$fecha = new DateTime();
echo $fecha->format('Y-m-d H:i:sP') . "\n";
// Fecha/hora actuales en la zona horaria especificada.
$fecha = new DateTime(null, new DateTimeZone('Pacific/Nauru'));
echo $fecha->format('Y-m-d H:i:sP') . "\n";
// Usar una fecha UNIX. Observe que el resultado está en la zona horaria UTC.
$fecha = new DateTime('@946684800');
echo $fecha->format('Y-m-d H:i:sP') . "\n";
// Desbordamiento de valores no existentes.
$fecha = new DateTime('2000-02-30');
echo $fecha->format('Y-m-d H:i:sP') . "\n";
?>
El resultado del ejemplo sería algo similar a:
2000-01-01 00:00:00-05:00 2000-01-01 00:00:00+12:00 2010-04-24 10:24:16-04:00 2010-04-25 02:24:16+12:00 2000-01-01 00:00:00+00:00 2000-03-01 00:00:00-05:00
(PHP 5 >= 5.3.0)
DateTime::createFromFormat -- date_create_from_format — Devuelve un nuevo objeto DateTime formateado según el formato especificado
Estilo orientado a objetos
$format
, string $time
[, DateTimeZone $timezone
] )Estilo por procedimientos
Devuelve un nuevo objeto DateTime formateado según el formato especificado.
format
El formato en el que debería estar lo pasado en string. Véase las opciones de formateo más abajo. En la mayoría de los casos se pueden usar las mismas letras que para date().
Carácter format |
Descripción | Ejemplo de valores analizables |
|---|---|---|
| Día | --- | --- |
| d y j | Día del mes, 2 dígitos con o sin ceros iniciales | 01 a 31 o 1 a 31 |
| D y l | Una representación textual de un día | Mon hasta Sun o Sunday hasta Saturday |
| S | Sufijo ordinal inglés para el día del mes, 2 caracteres. Se ignora mientras se procesa. | st, nd, rd o th. |
| z | El día del año (comenzando por 0) | 0 hasta 365 |
| Mes | --- | --- |
| F y M | Una representación textual de un mes, como January o Sept | January hasta December o Jan hasta Dec |
| m y n | Representación numérica de un mes, con o sin ceros iniciales | 01 hasta 12 o 1 hasta 12 |
| Año | --- | --- |
| Y | Una representación numérica completa de un año, 4 dígitos | Ejemplos: 1999 o 2003 |
| y | Una representación de dos dígitos de un año | Ejemplos: 99 o 03 |
| Hora | --- | --- |
| a y A | Ante meridiem y Post meridiem | am o pm |
| g y h | Formato de 12 horas de una hora con o sin ceros iniciales | 1 hasta 12 o 01 hasta 12 |
| G y H | Formato de 24 horas de una hora con o sin ceros iniciales | 0 hasta 23 o 00 hasta 23 |
| i | Minutos con ceros iniciales | 00 a 59 |
| s | Segundos, con ceros iniciales | 00 hasta 59 |
| u | Microsegundos (hasta seis dígitos) | Ejemplo: 45, 654321 |
| Zona Horaria | --- | --- |
| e, O, P y T | Identificador de zona horaria, o diferencia con UTC en horas, o diferencia con UTC con dos puntos entre horas y minutos, o abreviatura de la zona horaria | Ejemplos: UTC, GMT, Atlantic/Azores o +0200 o +02:00 o EST, MDT |
| Fecha/Hora Completas | --- | --- |
| U | Segundos desde la Época Unix (January 1 1970 00:00:00 GMT) | Ejemplo: 1292177455 |
| Espacios en Blanco y Separadores | --- | --- |
| (espacio) | Un espacio o una tabulación | Ejemplo: |
| # | Uno de los siguientes símbolos de separación: ;, :, /, ., ,, -, ( o ) | Ejemplo: / |
| ;, :, /, ., ,, -, ( or ) | El carácter especificado. | Ejemplo: - |
| ? | Un byte aleatorio | Ejemplo: ^ (Sea consciente de que para los caracteres UTF-8 debería necesitar más de un ?. En este caso es probable que quiera usar * en su lugar) |
| * | Bytes aleatorios hasta el siguiente separador o dígito | Ejemplo: * en Y-*-d con la cadena 2009-aWord-08 coincidirá con aWord |
| ! | Reinicia todos los campos (año, mes, día, hora, minuto, segundo, fracción e información de la zona horaria) a la Época Unix | Sin !, todos los campos serán establecidos a la fecha y hora actuales. |
| | | Reinicia todos los campos (año, mes, día, hora, minuto, segundo, fracción e información de la zona horaria) a la Época Unix si no han sido ya analizados | Y-m-d| establecerá el año, mes y día a la información encontrada en la cadena a analizar, y establece la hora, minutos y segundos a 0. |
| + | Si este especificador de formato está presente, la información sobrante de la cadena no causará un error, pero sí una advertencia en su lugar | Use DateTime::getLastErrors() para averiguar si está presente información sobrante. |
Los caracteres no reconocidos en la cadena de formato causarán el fallo del análisis y se añadirá un mensaje de error a la esctructura devuelta. Puede consultar los mensajes de error con DateTime::getLastErrors().
Si format no contiene el carácter
!, las partes del momento generado que no estén
especificadas en format serán establecidas al momento actual
del sistema.
Si format contiene el
carácter !, las partes del momento generadas
no proporcionadas en format, así como
los valores más a la izquierda de !, serán
establecidos a los valores correspondientes de la época Unix.
La época Unix es 1970-01-01 00:00:00 UTC.
time
Una cadena que representa la hora.
timezone
Un objeto DateTimeZone que representa la zona horaria deseada.
Si se omite timezone y
time no contiene ninguna zona horaria,
se usará la zona horaria actual.
Nota:
El parámetro
timezoney la zona horaria actual son ignoradas cuando el parámetrotimecontiene una marca de tiempo UNIX (p.ej. 946684800) o especifica una zona horaria (p.ej. 2010-01-28T15:00:00+02:00).
Devuelve una nueva instancia de DateTime o FALSE en caso de error.
Ejemplo #1 Ejemplo de DateTime::createFromFormat()
Estilo orientado a objetos
<?php
$fecha = DateTime::createFromFormat('j-M-Y', '15-Feb-2009');
echo $fecha->format('Y-m-d');
?>
Estilo por procedimientos
<?php
$fecha = date_create_from_format('j-M-Y', '15-Feb-2009');
echo date_format($fecha, 'Y-m-d');
?>
El resultado de los ejemplos serían:
2009-02-15
Ejemplo #2 Complejidades de DateTime::createFromFormat()
<?php
echo 'Momento actual: ' . date('Y-m-d H:i:s') . "\n";
$formato = 'Y-m-d';
$fecha = DateTime::createFromFormat($formato, '2009-02-15');
echo "Formato: $formato; " . $fecha->format('Y-m-d H:i:s') . "\n";
$formato = 'Y-m-d H:i:s';
$fecha = DateTime::createFromFormat($formato, '2009-02-15 15:16:17');
echo "Formato: $formato; " . $fecha->format('Y-m-d H:i:s') . "\n";
$formato = 'Y-m-!d H:i:s';
$fecha = DateTime::createFromFormat($formato, '2009-02-15 15:16:17');
echo "Formato: $formato; " . $fecha->format('Y-m-d H:i:s') . "\n";
$formato = '!d';
$fecha = DateTime::createFromFormat($formato, '15');
echo "Formato: $formato; " . $fecha->format('Y-m-d H:i:s') . "\n";
?>
El resultado del ejemplo sería algo similar a:
Momento actual: 2010-04-23 10:29:35 Formato: Y-m-d; 2009-02-15 10:29:35 Formato: Y-m-d H:i:s; 2009-02-15 15:16:17 Formato: Y-m-!d H:i:s; 1970-01-15 15:16:17 Formato: !d; 1970-01-15 00:00:00
(PHP 5 >= 5.3.0)
DateTime::diff -- date_diff — Devuelve la diferencia entres objetos DateTime
Estilo orientado a objetos
Estilo por procedimientos
Devuelve la diferencia entres objetos DateTime.
datetime
La fecha a comparar.
absolute
Si se devulve la diferencia absoluta.
El objeto DateInterval que representa la
diferencia entre dos fechas o FALSE en caso de error.
Ejemplo #1 Ejemplo de DateTime::diff()
Estilo orientado a objetos
<?php
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$intervalo = $datetime1->diff($datetime2);
echo $intervalo->format('%R%a días');
?>
Estilo por procedimientos
<?php
$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$intervalo = date_diff($datetime1, $datetime2);
echo $intervalo->format('%R%a días');
?>
El resultado de los ejemplos serían:
+2 días
Ejemplo #2 Comparación de objetos DateTime
Nota:
A partir de PHP 5.2.2, los objetos DateTime se pueden comparar utilizando operadores de comparación.
<?php
$date1 = new DateTime("now");
$date2 = new DateTime("tomorrow");
var_dump($date1 == $date2);
var_dump($date1 < $date2);
var_dump($date1 > $date2);
?>
El resultado del ejemplo sería:
bool(false) bool(true) bool(false)
(PHP 5 >= 5.2.0)
DateTime::format -- date_format — Devuelve la fecha formateada según el formato dado
Estilo orientado a objetos
$format
)Estilo por procedimientos
Devuelve la fecha formateada según el formato dado.
object
Estilo por procesos solamente: Un objeto DateTime es devuelto por date_create()
format
Formato aceptado por date().
Devuelve la cadena de fecha formateada si se tuvo éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de DateTime::format()
Estilo orientado a objetos
<?php
$fecha = new DateTime('2000-01-01');
echo $fecha->format('Y-m-d H:i:s');
?>
Estilo por procedimientos
<?php
$fecha = date_create('2000-01-01');
echo date_format($fecha, 'Y-m-d H:i:s');
?>
El resultado del ejemplo sería:
2000-01-01 00:00:00
Este método no utiliza regiones. Todas las salidas son en inglés.
(PHP 5 >= 5.3.0)
DateTime::getLastErrors -- date_get_last_errors — Devuelve las advertencias y los errores
Estilo orientado a objetos
Estilo por procedimientos
Devuelve un array de advertencias y errores encontrados mientras se analizaba una cadena de fecha/hora.
Esta función no tiene parámetros.
Devuelve una matriz que contiene información acerca de las advertencias y errores.
Ejemplo #1 Ejemplo de DateTime::getLastErrors()
Estilo orientado a objetos
<?php
try {
$fecha = new DateTime('asdfasdf');
} catch (Exception $e) {
// Sólo para propósitos de demostración...
print_r(DateTime::getLastErrors());
// La forma real orientada a objetos de hacer esto es
// echo $e->getMessage();
}
?>
Estilo por procedimientos
<?php
$fecha = date_create('asdfasdf');
print_r(date_get_last_errors());
?>
El resultado de los ejemplos serían:
Array
(
[warning_count] => 1
[warnings] => Array
(
[6] => Double timezone specification
)
[error_count] => 1
[errors] => Array
(
[0] => The timezone could not be found in the database
)
)
(PHP 5 >= 5.2.0)
DateTime::getOffset -- date_offset_get — Devuelve el índice de la zona horaria
Estilo orientado a objetos
Estilo por procedimientos
Devuelve el índice de la zona horaria.
object
Estilo por procesos solamente: Un objeto DateTime es devuelto por date_create()
Devuelve el índice de la zona horaria en segundos desde UTC si se tiene éxito
o FALSE en caso de error.
Ejemplo #1 Ejemplo de DateTime::getOffset()
Estilo orientado a objetos
<?php
$invierno = new DateTime('2010-12-21', new DateTimeZone('America/New_York'));
$verano = new DateTime('2008-06-21', new DateTimeZone('America/New_York'));
echo $invierno->getOffset() . "\n";
echo $verano->getOffset() . "\n";
?>
Estilo por procedimientos
<?php
$invierno = date_create('2010-12-21', timezone_open('America/New_York'));
$verano = date_create('2008-06-21', timezone_open('America/New_York'));
echo date_offset_get($invierno) . "\n";
echo date_offset_get($verano) . "\n";
?>
El resultado de los ejemplos serían:
-18000 -14400
Nota: -18000 = -5 horas, -14400 = -4 horas.
(PHP 5 >= 5.3.0)
DateTime::getTimestamp -- date_timestamp_get — Obtiene la fecha Unix
Estilo orientado a objetos
Estilo por procedimientos
Obtiene la fecha Unix.
Esta función no tiene parámetros.
Devuelve la fecha Unix que representa la fecha.
Ejemplo #1 Ejemplo de DateTime::getTimestamp()
Estilo orientado a objetos
<?php
$fecha = new DateTime();
echo $fecha->getTimestamp();
?>
Estilo por procedimientos
<?php
$fecha = date_create();
echo date_timestamp_get($fecha);
?>
El resultado de los ejemplos serían algo similar a:
1272509157
Utilizar U como parámetro de DateTime::format() es una alternativa cuando se usa PHP 5.2.
(PHP 5 >= 5.2.0)
DateTime::getTimezone -- date_timezone_get — Devolver la zona horaria relativa al objeto DateTime dado
Estilo orientado a objetos
Estilo por procedimientos
Devolver la zona horaria relativa al objeto DateTime dado.
object
Estilo por procesos solamente: Un objeto DateTime es devuelto por date_create()
Devuelve un objeto DateTimeZone si se tuvo éxito
o FALSE en caso de error.
Ejemplo #1 Ejemplo de DateTime::getTimezone()
Estilo orientado a objetos
<?php
$fecha = new DateTime(null, new DateTimeZone('Europe/London'));
$zh = $fecha->getTimezone();
echo $zh->getName();
?>
Estilo por procedimientos
<?php
$fecha = date_create(null, timezone_open('Europe/London'));
$zh = date_timezone_get($fecha);
echo timezone_name_get($zh);
?>
El resultado de los ejemplos serían:
Europe/London
(PHP 5 >= 5.2.0)
DateTime::modify -- date_modify — Altera la marca de tiempo
Estilo orientado a objetos
Estilo por procedimientos
Altera la marca de tiempo de un objeto DateTime incrementando o disminuyendo en un formato aceptado por strtotime().
object
Estilo por procesos solamente: Un objeto DateTime devuelto por date_create(). La función modifica este objeto.
modify
Una cadena de fecha/hora. Los formatos válidos son explicados en Formatos de fecha y hora.
Devuelve el objecto DateTime por el método encadenado o FALSE en caso de error.
| Versión | Descripción |
|---|---|
| 5.3.6 | Las sentencias de fecha/hora absolutas ahora toman efecto. Previamente, sólo se usaban las partes relativas. |
| 5.3.0 | Se ha cambiado el
valor devuelto en caso de éxito de NULL a DateTime. |
Ejemplo #1 Ejemplo de DateTime::modify()
Estilo orientado a objetos
<?php
$fecha = new DateTime('2006-12-12');
$fecha->modify('+1 day');
echo $fecha->format('Y-m-d');
?>
Estilo por procedimientos
<?php
$fecha= date_create('2006-12-12');
date_modify($fecha, '+1 day');
echo date_format($fecha, 'Y-m-d');
?>
El resultado de los ejemplos serían:
2006-12-13
Ejemplo #2 Cuidado al añadir o sustraer meses
<?php
$fecha = new DateTime('2000-12-31');
$fecha->modify('+1 month');
echo $fecha->format('Y-m-d') . "\n";
$fecha->modify('+1 month');
echo $fecha->format('Y-m-d') . "\n";
?>
El resultado del ejemplo sería:
2001-01-31 2001-03-03
(PHP 5 >= 5.2.0)
DateTime::__set_state — El gestor __set_state
array
Matriz de inicialización.
Devuelve una nueva instancia de un objeto DateTime.
(PHP 5 >= 5.2.0)
DateTime::setDate -- date_date_set — Establece la fecha
Estilo orientado a objetos
Estilo por procedimientos
Reinicia la fecha actual del objeto DateTime a una fecha diferente.
object
Estilo por procesos solamente: Un objeto DateTime devuelto por date_create(). La función modifica este objeto.
year
Año de la fecha.
month
Mes de la fecha.
day
Día de la fecha.
Devuelve el objecto DateTime por el método encadenado o FALSE en caso de error.
| Versión | Descripción |
|---|---|
| 5.3.0 | Se ha cambiado el
valor devuelto en caso de éxito de NULL a DateTime. |
Ejemplo #1 Ejemplo de DateTime::setDate()
Estilo orientado a objetos
<?php
$fecha = new DateTime();
$fecha->setDate(2001, 2, 3);
echo $fecha->format('Y-m-d');
?>
Estilo por procedimientos
<?php
$fecha = date_create();
date_date_set($fecha, 2001, 2, 3);
echo date_format($fecha, 'Y-m-d');
?>
El resultado de los ejemplos serían:
2001-02-03
Ejemplo #2 Los valores que exceden rangos son añadidos a sus valores padre
<?php
$fecha = new DateTime();
$fecha->setDate(2001, 2, 28);
echo $fecha->format('Y-m-d') . "\n";
$fecha->setDate(2001, 2, 29);
echo $fecha->format('Y-m-d') . "\n";
$fecha->setDate(2001, 14, 3);
echo $fecha->format('Y-m-d') . "\n";
?>
El resultado del ejemplo sería:
2001-02-28 2001-03-01 2002-02-03
(PHP 5 >= 5.2.0)
DateTime::setISODate -- date_isodate_set — Establece la fecha ISO
Estilo orientado a objetos
Estilo por procedimientos
Establece una fecha según el estándar ISO 8601 - usando índices de semanas y días en vez de fechas específicas.
object
Estilo por procesos solamente: Un objeto DateTime devuelto por date_create(). La función modifica este objeto.
year
Año de la fecha.
week
Semana de la fecha.
day
Índice del primer día de la semana.
Devuelve el objecto DateTime por el método encadenado o FALSE en caso de error.
| Versión | Descripción |
|---|---|
| 5.3.0 | Se ha cambiado el
valor devuelto en caso de éxito de NULL a DateTime. |
Ejemplo #1 Ejemplo de DateTime::setISODate()
Estilo orientado a objetos
<?php
$fecha = new DateTime();
$fecha->setISODate(2008, 2);
echo $fecha->format('Y-m-d') . "\n";
$fecha->setISODate(2008, 2, 7);
echo $fecha->format('Y-m-d') . "\n";
?>
Estilo por procedimientos
<?php
$fecha = date_create();
date_isodate_set($fecha, 2008, 2);
echo date_format($fecha, 'Y-m-d') . "\n";
date_isodate_set($fecha, 2008, 2, 7);
echo date_format($fecha, 'Y-m-d') . "\n";
?>
El resultado de los ejemplos serían:
2008-01-07 2008-01-13
Ejemplo #2 Los valores que execen rangos son añadidos a sus valores padre
<?php
$fecha = new DateTime();
$fecha->setISODate(2008, 2, 7);
echo $fecha->format('Y-m-d') . "\n";
$fecha->setISODate(2008, 2, 8);
echo $fecha->format('Y-m-d') . "\n";
$fecha->setISODate(2008, 53, 7);
echo $fecha->format('Y-m-d') . "\n";
?>
El resultado del ejemplo sería:
2008-01-13 2008-01-14 2009-01-04
Ejemplo #3 Buscar el mes en el que se encuentra una semana
<?php
$fecha = new DateTime();
$fecha->setISODate(2008, 14);
echo $fecha->format('n');
?>
El resultado de los ejemplos serían:
3
(PHP 5 >= 5.2.0)
DateTime::setTime -- date_time_set — Establece la hora
Estilo orientado a objetos
Estilo por procedimientos
Reinicia la hora actual del objeto DateTime a una hora diferente.
object
Estilo por procesos solamente: Un objeto DateTime devuelto por date_create(). La función modifica este objeto.
hour
Hora del momento.
minute
Minuto del momento.
second
Segundo del momento.
Devuelve el objecto DateTime por el método encadenado o FALSE en caso de error.
| Versión | Descripción |
|---|---|
| 5.3.0 | Se ha cambiado el
valor devuelto en caso de éxito de NULL a DateTime. |
Ejemplo #1 Ejemplo de DateTime::setTime()
Estilo orientado a objetos
<?php
$fecha = new DateTime('2001-01-01');
$fecha->setTime(14, 55);
echo $fecha->format('Y-m-d H:i:s') . "\n";
$fecha->setTime(14, 55, 24);
echo $fecha->format('Y-m-d H:i:s') . "\n";
?>
Estilo por procedimientos
<?php
$fecha = date_create('2001-01-01');
date_time_set($fecha, 14, 55);
echo date_format($fecha, 'Y-m-d H:i:s') . "\n";
date_time_set($fecha, 14, 55, 24);
echo date_format($fecha, 'Y-m-d H:i:s') . "\n";
?>
El resultado de los ejemplos serían algo similar a:
2000-01-01 14:55:00 2000-01-01 14:55:24
Ejemplo #2 Los valores que exceden rangos son añadidos a sus valores padre
<?php
$fecha = new DateTime('2001-01-01');
$fecha->setTime(14, 55, 24);
echo $fecha->format('Y-m-d H:i:s') . "\n";
$fecha->setTime(14, 55, 65);
echo $fecha->format('Y-m-d H:i:s') . "\n";
$fecha->setTime(14, 65, 24);
echo $fecha->format('Y-m-d H:i:s') . "\n";
$fecha->setTime(25, 55, 24);
echo $fecha->format('Y-m-d H:i:s') . "\n";
?>
El resultado del ejemplo sería:
2001-01-01 14:55:24 2001-01-01 14:56:05 2001-01-01 15:05:24 2001-01-02 01:55:24
(PHP 5 >= 5.3.0)
DateTime::setTimestamp -- date_timestamp_set — Establece la fecha y la hora basadas en una fecha Unix
Estilo orientado a objetos
Estilo por procedimientos
Establece la fecha y la hora basadas en una fecha Unix.
object
Estilo por procesos solamente: Un objeto DateTime devuelto por date_create(). La función modifica este objeto.
unixtimestamp
La marca de tiempo Unix que representa la fecha.
Devuelve el objecto DateTime por el método encadenado o FALSE en caso de error.
Ejemplo #1 Ejemplo de DateTime::setTimestamp()
Estilo orientado a objetos
<?php
$fecha = new DateTime();
echo $fecha->format('U = Y-m-d H:i:s') . "\n";
$fecha->setTimestamp(1171502725);
echo $fecha->format('U = Y-m-d H:i:s') . "\n";
?>
Estilo por procedimientos
<?php
$fecha = date_create();
echo date_format($fecha, 'U = Y-m-d H:i:s') . "\n";
date_timestamp_set($fecha, 1171502725);
echo date_format($fecha, 'U = Y-m-d H:i:s') . "\n";
?>
El resultado de los ejemplos serían algo similar a:
1272508903 = 2010-04-28 22:41:43 1171502725 = 2007-02-14 20:25:25
Usar el formato de fecha Unix para construir un nuevo objeto DateTime es una alternativa al usar PHP 5.2, como se muestra en el ejemplo de abajo.
Ejemplo #2 Alternativa de DateTime::setTimestamp() en PHP 5.2
<?php
$ts = 1171502725;
$fecha = new DateTime("@$ts");
echo $date->format('U = Y-m-d H:i:s') . "\n";
?>
El resultado del ejemplo sería algo similar a:
1171502725 = 2007-02-14 20:25:25
(PHP 5 >= 5.2.0)
DateTime::setTimezone -- date_timezone_set — Establece la zona horaria para el objeto DateTime
Estilo orientado a objetos
Estilo por procedimientos
object
Estilo por procesos solamente: Un objeto DateTime devuelto por date_create(). La función modifica este objeto.
timezone
Un objeto DateTimeZone que representa la zona horaria deseada.
Devuelve el objecto DateTime por el método encadenado o FALSE en caso de error.
| Versión | Descripción |
|---|---|
| 5.3.0 | Se ha cambiado el
valor devuelto en caso de éxito de NULL a DateTime. |
Ejemplo #1 Ejemplo de DateTime::setTimeZone()
Estilo orientado a objetos
<?php
$fecha = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $fecha->format('Y-m-d H:i:sP') . "\n";
$fecha->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $fecha->format('Y-m-d H:i:sP') . "\n";
?>
Estilo por procedimientos
<?php
$fecha= date_create('2000-01-01', timezone_open('Pacific/Nauru'));
echo date_format($fecha, 'Y-m-d H:i:sP') . "\n";
date_timezone_set($fecha, timezone_open('Pacific/Chatham'));
echo date_format($fecha, 'Y-m-d H:i:sP') . "\n";
?>
El resultado de los ejemplos serían:
2000-01-01 00:00:00+12:00 2000-01-01 01:45:00+13:45
(PHP 5 >= 5.3.0)
DateTime::sub -- date_sub — Sustrae una cantidad de días, meses, años, horas, minutos y segundos de un objeto DateTime
Estilo orientado a objetos
Estilo por procedimientos
Sustrae el objeto DateInterval especificado del objeto DateTime especificado.
object
Estilo por procesos solamente: Un objeto DateTime devuelto por date_create(). La función modifica este objeto.
interval
Un objeto DateInterval
Devuelve el objecto DateTime por el método encadenado o FALSE en caso de error.
Ejemplo #1 Ejemplo de DateTime::sub()
Estilo orientado a objetos
<?php
$fecha = new DateTime('2000-01-20');
$fecha->sub(new DateInterval('P10D'));
echo $fecha->format('Y-m-d') . "\n";
?>
Estilo por procedimientos
<?php
$fecha = date_create('2000-01-20');
date_sub($fecha, date_interval_create_from_date_string('10 days'));
echo date_format($fecha, 'Y-m-d');
?>
El resultado de los ejemplos serían:
2000-01-10
Ejemplo #2 Más ejemplos de DateTime::sub()
<?php
$fecha = new DateTime('2000-01-20');
$fecha->sub(new DateInterval('PT10H30S'));
echo $fecha->format('Y-m-d H:i:s') . "\n";
$fecha = new DateTime('2000-01-20');
$fecha->sub(new DateInterval('P7Y5M4DT4H3M2S'));
echo $fecha->format('Y-m-d H:i:s') . "\n";
?>
El resultado del ejemplo sería:
2000-01-19 13:59:30 1992-08-15 19:56:58
Ejemplo #3 Cuidado al sustraer meses
<?php
$fecha = new DateTime('2001-04-30');
$intervalo = new DateInterval('P1M');
$fecha->sub($intervalo);
echo $fecha->format('Y-m-d') . "\n";
$fecha->sub($intervalo);
echo $fecha->format('Y-m-d') . "\n";
?>
El resultado del ejemplo sería:
2001-03-30 2001-03-02
DateTime::modify() es una alternativa cuando se usa PHP 5.2.
(PHP 5 >= 5.2.0)
DateTime::__wakeup — El gestor __wakeup
Esta función no tiene parámetros.
Inicializa un objeto DateTime.
(PHP 5 >= 5.2.0)
Representación de la zona horaria.
DateTimeZone::AFRICA
Zonas horarias de África.
DateTimeZone::AMERICA
Zonas horarias de América.
DateTimeZone::ANTARCTICA
Zonas horarias de la Antártida.
DateTimeZone::ARCTIC
Zonas horarias del Ártico.
DateTimeZone::ASIA
Zonas horarias de Asia.
DateTimeZone::ATLANTIC
Zonas horarias del Atlántico.
DateTimeZone::AUSTRALIA
Zonas horarias de Australia.
DateTimeZone::EUROPE
Zonas horarias de Europa.
DateTimeZone::INDIAN
Zonas horarias de la India.
DateTimeZone::PACIFIC
Zonas horarias del Pacífico.
DateTimeZone::UTC
Zonas horarias UTC.
DateTimeZone::ALL
Todas las zonas horarias.
DateTimeZone::ALL_WITH_BC
Todas las zonas horarias incluyendo las de versiones anteriores por compatibilidad.
DateTimeZone::PER_COUNTRY
Zonas horarias por país.
(PHP 5 >= 5.2.0)
DateTimeZone::__construct -- timezone_open — Crea un nuevo objeto DateTimeZone
Estilo orientado a objetos
$timezone
)Estilo por procedimientos
Crea un nuevo objeto DateTimeZone.
Devuelve un objeto DateTimeZone si tuvo éxito.
Estilo por procedimientos devuelve FALSE en caso de error.
Este método lanza Exception si la zona horaria suministrada no es reconocida como una zona horaria válida.
Ejemplo #1 Atrapar errores cuando se instancia DateTimeZone
<?php
// Manejo de errores atrapando excepciones
$zonas_horarias = array('Europe/London', 'Mars/Phobos', 'Jupiter/Europa');
foreach ($zonas_horarias as $zh) {
try {
$marte = new DateTimeZone($zh);
} catch(Exception $e) {
echo $e->getMessage() . '<br />';
}
}
?>
El resultado del ejemplo sería:
DateTimeZone::__construct() [datetimezone.--construct]: Unknown or bad timezone (Mars/Phobos) DateTimeZone::__construct() [datetimezone.--construct]: Unknown or bad timezone (Jupiter/Europa)
(PHP 5 >= 5.3.0)
DateTimeZone::getLocation -- timezone_location_get — Devuelve la información de la ubicación para una zona horaria
Estilo orientado a objetos
Estilo por procedimientos
Devuelve la información de la ubicación para una zona horaria, incluyendo el código de país, latitud/longitud y comentarios.
objectEstilo por procesos solamente: Un objeto DateTimeZone es devuelto por timezone_open()
Una matriz que contiene la información de la ubicación acerca de una zona horaria.
Ejemplo #1 Ejemplo de DateTimeZone::getLocation()
<?php
$zh = new DateTimeZone("Europe/Prague");
print_r($zh->getLocation());
print_r(timezone_location_get($zh));
?>
El resultado del ejemplo sería:
Array
Array
(
[country_code] => CZ
[latitude] => 50.08333
[longitude] => 14.43333
[comments] =>
)
Array
(
[country_code] => CZ
[latitude] => 50.08333
[longitude] => 14.43333
[comments] =>
)
(PHP 5 >= 5.2.0)
DateTimeZone::getName -- timezone_name_get — Devuelve el nombre de la zona horaria
Estilo orientado a objetos
Estilo por procedimientos
Devuelve el nombre de la zona horaria.
object
El DateTimeZone del cual desera obtener el nombre.
Una de los nombres de zona horaria en la lista de zonas horarias.
(PHP 5 >= 5.2.0)
DateTimeZone::getOffset -- timezone_offset_get — Devuelve el índice de la zona horaria de GMT
Estilo orientado a objetos
Estilo por procedimientos
Esta función devuelve el índice GMT para la fecha/hora especificada en el
parámetro datetime. El índice GMT se calcula
con la información de la zona horaria contenida en el objeto DateTimeZone que se va a utilizar.
objectEstilo por procesos solamente: Un objeto DateTimeZone es devuelto por timezone_open()
datetime
El objeto DateTime que contiene la fecha/hora desde la que se va a computar el índice.
Devuelve el índice de la zona horaria en segundos si tiene éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de DateTimeZone::getOffset()
<?php
// Crear dos objetos de zona horaria, uno para Taipéi (Taiwán) y otro para
// Tokyo (Japón)
$dateTimeZoneTaipei = new DateTimeZone("Asia/Taipei");
$dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo");
// Crear dos objetos DateTime que contendrán la misma fecha Unix, pero
// tendrán diferentes zonas horarias adjuntas.
$dateTimeTaipei = new DateTime("now", $dateTimeZoneTaipei);
$dateTimeJapan = new DateTime("now", $dateTimeZoneJapan);
// Calcular el índice GMT para la fecha/hora contenida en el objeto $dateTimeTaipei,
// pero usando las normas de la zona horaria definidas en Tokyo
// ($dateTimeZoneJapan).
$timeOffset = $dateTimeZoneJapan->getOffset($dateTimeTaipei);
// Debería mostrar int(32400) (para fechas después de Sat Sep 8 01:00:00 1951 JST).
var_dump($timeOffset);
?>
(PHP 5 >= 5.2.0)
DateTimeZone::getTransitions -- timezone_transitions_get — Devuelve todas las transiciones para una zona horaria
Estilo orientado a objetos
$timestamp_begin
[, int $timestamp_end
]] )Estilo por procedimientos
$object
[, int $timestamp_begin
[, int $timestamp_end
]] )
objectEstilo por procesos solamente: Un objeto DateTimeZone es devuelto por timezone_open()
timestamp_begin
Marca de tiempo de inicio.
timestamp_end
Marca de tiempo final.
Deveulve una matriz numérica que contiene una matriz asociativa con todas las
transiciones si se tuvo éxito o FALSE en caso de error.
| Versión | Descripción |
|---|---|
| 5.3.0 |
Se añadireon los parámteros opcionales timestamp_begin y
timestamp_end.
|
Ejemplo #1 Un ejemplo de timezone_transitions_get()
<?php
$zona_horaria = new DateTimeZone("Europe/London");
$transiciones = $zona_horaria->getTransitions();
print_r(array_slice($transiciones, 0, 3));
?>
El resultado del ejemplo sería algo similar a:
Array
(
[0] => Array
(
[ts] => -2147483648
[time] => 1901-12-13T20:45:52+0000
[offset] => 3600
[isdst] => 1
[abbr] => BST
)
[1] => Array
(
[ts] => -1691964000
[time] => 1916-05-21T02:00:00+0000
[offset] => 3600
[isdst] => 1
[abbr] => BST
)
[2] => Array
(
[ts] => -1680472800
[time] => 1916-10-01T02:00:00+0000
[offset] => 0
[isdst] =>
[abbr] => GMT
)
)
(PHP 5 >= 5.2.0)
DateTimeZone::listAbbreviations -- timezone_abbreviations_list — Devuelve una matriz asociativa que contiene el horario de verano (dst), el índice y el nombre de la zona horaria
Estilo orientado a objetos
Estilo por procedimientos
Devuelve una matriz si se tuvo éxito o FALSE en caso de error.
Ejemplo #1 Un ejemplo de timezone_abbreviations_list()
<?php
$timezone_abbreviations = DateTimeZone::listAbbreviations();
print_r($timezone_abbreviations["acst"]);
?>
El resultado del ejemplo sería algo similar a:
Array
(
[0] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => America/Porto_Acre
)
[1] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => America/Eirunepe
)
[2] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => America/Rio_Branco
)
[3] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => Brazil/Acre
)
)
(PHP 5 >= 5.2.0)
DateTimeZone::listIdentifiers -- timezone_identifiers_list — Devuelve una matriz numérica con todos los identificadores de las zonas horarias
Estilo orientado a objetos
$what = DateTimeZone::ALL
[, string $country = NULL
]] )Estilo por procedimientos
what
Una de las constantes de la clase DateTimeZone.
country
Un código de país de dos letras compatible con ISO 3166-1.
Nota: Esta opción sólo se usa cuando el parámetro
whatestá establecido aDateTimeZone::PER_COUNTRY.
Devuelve una matriz si se tuvo éxito o FALSE en caso de error.
| Versión | Descripción |
|---|---|
| 5.3.0 |
Añadidos los parámteros opcionales what y
country.
|
Ejemplo #1 Un ejemplo de timezone_identifiers_list()
<?php
$timezone_identifiers = DateTimeZone::listIdentifiers();
for ($i=0; $i < 5; $i++) {
echo "$timezone_identifiers[$i]\n";
}
?>
El resultado del ejemplo sería algo similar a:
Africa/Abidjan Africa/Accra Africa/Addis_Ababa Africa/Algiers Africa/Asmara
(PHP 5 >= 5.3.0)
Representación del intervalo de fecha. Un intervalo de fecha almacena una cantidad fija de tiempo (en años, meses, días, horas, etc.) o una cadena de tiempo relativa en el formato que el constructor DateTime soporta.
Número de años.
Número de meses.
Número de días.
Número de horas.
Número de minutos.
Número de segundos.
Es 1 si el intervalo está invertido y 0 de otro modo. Véase DateInterval::format().
El número total de días entre las fechas de inicio y fin
en un cáculo de DateTime::diff().
days será FALSE en otras circunstancias.
(PHP 5 >= 5.3.0)
DateInterval::__construct — Crea un nuevo objeto DateInterval
$interval_spec
)Crea un nuevo objeto DateInterval.
interval_spec
Especificación del intervalo.
El formato empieza con la letra P, de "periodo." Cada periodo de duración está representado por un valor integer seguido de un indicador de periodo. Si la duración contiene elementos de hora, esta parte de la especificación está precedida por una letra T.
| Indicador de Periodo | Descripción |
|---|---|
| Y | años |
| M | meses |
| D | días |
| W | semanas. Éstas se convierten a días, por lo que no se puede combinar con D. |
| H | horas |
| M | minutos |
| S | segundos |
Aquí hay algunos ejemplos sencillos. Dos días es P2D. Dos segundos es PT2S. Seis años y cinco minutos es P6YT5M.
Nota:
Los tipos de unidades deben ser escritos desde la unidad de escala más grande a la izquierda a la unidad de escala más pequeña a la derecha. Así los años van antes que los meses, meses antes que días, días antes que minutos, etc. Así un año y cuatro días debe representarse como P1Y4D, y no como P4D1Y.
La especificación también puede ser representada como una fecha/hora. Un ejemplo de un año y cuatro días sería P0001-00-04T00:00:00. Pero los valores en este formato no pueden exceder el punto de vuelta de un periodo (p.ej. 25 horas no es válido).
Estos formatos están basados en la » especificación de duración ISO 8601.
Ejemplo #1 Ejemplo de DateInterval
<?php
$intervalo = new DateInterval('P2Y4DT6H8M');
var_dump($intervalo);
?>
El resultado del ejemplo sería:
object(DateInterval)#1 (8) {
["y"]=>
int(2)
["m"]=>
int(0)
["d"]=>
int(4)
["h"]=>
int(6)
["i"]=>
int(8)
["s"]=>
int(0)
["invert"]=>
int(0)
["days"]=>
bool(false)
}
(PHP 5 >= 5.3.0)
DateInterval::createFromDateString — Establece un objeto DateInterval desde las partes relativas de una cadena
Usa el analizador de fechas normal y estblece un objeto DateInterval desde las partes relativas de la cadena analizada.
time
La fecha con las partes relativas.
Devuelve una nueva instancia de DateInterval si se tuvo éxito.
(PHP 5 >= 5.3.0)
DateInterval::format — Formatea el intervalo
$format
)Formatea el intervalo.
format
Carácter format |
Descripción | Valores de ejemplo |
|---|---|---|
| % | Literal % | % |
| Y | Años, numérico, al menos 2 dígitos empezando con 0 | 01, 03 |
| y | Años, numérico | 1, 3 |
| M | Meses, numérico, al menos 2 dígitos empezando con 0 | 01, 03, 12 |
| m | Meses, numérico | 1, 3, 12 |
| D | Días, numérico, al menos 2 dígitos empezando con 0 | 01, 03, 31 |
| d | Días, numérico | 1, 3, 31 |
| a | Cantidad total de días | 4, 18, 8123 |
| H | Horas, numérico, al menos 2 dígitos empezando con 0 | 01, 03, 23 |
| h | Horas, numérico | 1, 3, 23 |
| I | Minutos, numérico, al menos 2 dígitos empezando con 0 | 01, 03, 59 |
| i | Minutos, numérico | 1, 3, 59 |
| S | Segundos, numérico, al menos 2 dígitos empezando con 0 | 01, 03, 57 |
| s | Segundos, numérico | 1, 3, 57 |
| R | Signo "-" cuando es negativo, "+" cuando es positivo | -, + |
| r | Signo "-" cuando es negativo, vacío cuando es positivo | -, |
Devuelve el intervalo formateado.
Nota:
El método DateInterval::format() no recalcula los excesos en cadenas de hora ni en segmentos de fecha. Esto es así porque no es posible analizar valores como "32 días" el cual podría ser interpretado como cualquier cosa desde "1 mes y 4 días" hasta "1 mes y un día".
Ejemplo #1 Ejemplo de DateInterval
<?php
$intervalo = new DateInterval('P2Y4DT6H8M');
echo $intervalo->format('%d días');
?>
El resultado del ejemplo sería:
4 días
Ejemplo #2 DateInterval y excesos
<?php
$intervalo = new DateInterval('P32D');
echo $intervalo->format('%d días');
?>
El resultado del ejemplo sería:
32 días
Ejemplo #3 DateInterval and DateTime::diff() with the %a and %d modifiers
<?php
$enero = new DateTime('2010-01-01');
$febrero = new DateTime('2010-02-01');
$intervalo = $febrero->diff($enero);
// %a imprimirá el múmero total de días.
echo $intervalo->format('%a total de días')."\n";
// Mientras que %d sólo imprimirá el múmero total de días no cubiertos por el
// mes.
echo $intervalo->format('%m mes, %d días');
?>
El resultado del ejemplo sería:
31 total days 1 month, 0 days
(PHP 5 >= 5.3.0)
Representación del periodo de fecha.
$start
, DateInterval $interval
, int $recurrences
[, int $options
] )DatePeriod::EXCLUDE_START_DATE
Excluir la fecha inicial, usado en DatePeriod::__construct().
(PHP 5 >= 5.3.0)
DatePeriod::__construct — Crea un nuevo objeto DatePeriod
$start
, DateInterval $interval
, int $recurrences
[, int $options
] )$start
, DateInterval $interval
, DateTime $end
[, int $options
] )$isostr
[, int $options
] )Crea un nuevo objeto DatePeriod.
start
Fecha de inicio.
interval
Intervalo.
recurrences
Número de repeticiones.
end
Fecha final.
isostr
Una cadena que contiene el intervalo ISO.
options
Se puede establecer a DatePeriod::EXCLUDE_START_DATE.
(PHP 4, PHP 5)
checkdate — Validar una fecha gregoriana
$month
, int $day
, int $year
)Comprueba la validez de una fecha formada por los argumentos. Una fecha se considera válida si cada parámetro está propiamente definido.
month
El mes entre 1 y 12 inclusive.
day
El día que está dentro del número de días del mes
month dado. Los años year bisiestos
son tomados en consideración.
year
El año entre 1 y 32767 inclusive.
Devuelve TRUE si la fecha dada es válida, si no, devuelve FALSE.
Ejemplo #1 Ejemplo de checkdate()
<?php
var_dump(checkdate(12, 31, 2000));
var_dump(checkdate(2, 29, 2001));
?>
El resultado del ejemplo sería:
bool(true) bool(false)
Esta función es un alias de: DateTime::add()
(PHP 5 >= 5.3.0)
date_create_from_format — Alias de DateTime::createFromFormat()
Esta función es un alias de: DateTime::createFromFormat()
Esta función es un alias de: DateTime::__construct()
Esta función es un alias de: DateTime::setDate()
(PHP 5 >= 5.1.0)
date_default_timezone_get — Obtiene la zona horaria predeterminada usada por todas las funciones de fecha/hora en un script
En orden de preferencia, esta función devuelve la zona horaria predeternimada mediante:
Leer la zona horaria usando la función date_default_timezone_set() (si hay alguna)
Sólo antes de PHP 5.4.0: Leer la variable de entorno TZ (si no está vacía)
Leer el valor de la opción ini date.timezone (si está establecida)
Sólo antes de PHP 5.4.0: Preguntar al sistema operativo (siempre que el SO lo soporte y lo permita). Utiliza un algoritmo que debe estimar la zona horaria. No funcionará de forma necesariamente correcta en todas las situaciones posibles. Si se diera este caso, se mostrará una alerta. No se aconseja depender de esta función. En su lugar, debe establecerse la zona horaria correcta con date.timezone
Si nada de lo de arriba sucedió, date_default_timezone_get() devolverá una zona horaria predeterminada de UTC.
Devuelve un string.
| Versión | Descripción |
|---|---|
| 5.4.0 | La variable de entorno TZ ya no se usa para adivinar la zona horaria. |
| 5.4.0 | La zona horaria ya no se adivina de la información disponible a través del sistema operativo, la zona horaria adivinada no puede invocarse. |
Ejemplo #1 Obtener la zona horaria por defecto
<?php
date_default_timezone_set('Europe/London');
if (date_default_timezone_get()) {
echo 'date_default_timezone_set: ' . date_default_timezone_get() . '<br />';
}
if (ini_get('date.timezone')) {
echo 'date.timezone: ' . ini_get('date.timezone');
}
?>
El resultado del ejemplo sería algo similar a:
date_default_timezone_set: Europe/London date.timezone: Europe/London
Ejemplo #2 Obtener la abreviatura de una zona horaria
<?php
date_default_timezone_set('America/Los_Angeles');
echo date_default_timezone_get() . ' => ' . date('e') . ' => ' . date('T');
?>
El resultado del ejemplo sería:
America/Los_Angeles => America/Los_Angeles => PST
(PHP 5 >= 5.1.0)
date_default_timezone_set — Establece la zona horaria predeterminada usada por todas las funciones de fecha/hora en un script
$timezone_identifier
)date_default_timezone_set() establce la zona horaria predetermiada usada por todas las funciones de fecha/hora.
Nota:
A partir de PHP 5.1.0 (cuando las funciones de fecha/hora fueron reescritas), cada llamada a la función de fecha/hora generará un
E_NOTICEsi la zona horaria no es válida, y/o un mensajeE_WARNINGsi se usa la configuración del sistema o la variable de entorno TZ.
En vez de usar esta función para establecer la zona horaria predeterminada en su script, puede usar también la configuración INI date.timezone para establecer la zona horaria predeterminada.
timezone_identifier
El indentificador de la zona horaria, como UTC o Europe/Lisbon. La lista de los identificadores válidos está disponible en la Listado de Timezones soportados.
Esta función devuelve FALSE si
timezone_identifier no es válido, o TRUE
de otro modo.
Ejemplo #1 Obtener la zona horaria por defecto
<?php
date_default_timezone_set('America/Los_Angeles');
$script_tz = date_default_timezone_get();
if (strcmp($script_tz, ini_get('date.timezone'))){
echo 'La zona horaria del script difiere de la zona horaria de la configuracion ini.';
} else {
echo 'La zona horaria del script y la zona horaria de la configuración ini coinciden.';
}
?>
| Versión | Descripción |
|---|---|
| 5.3.0 |
Ahora se lanza un E_WARNING en vez de un
E_STRICT.
|
| 5.1.2 |
La función comenzo a validar el parámetro
timezone_identifier.
|
Esta función es un alias de: DateTime::diff()
Esta función es un alias de: DateTime::format()
Esta función es un alias de: DateTime::getLastErrors()
(PHP 5 >= 5.3.0)
date_interval_create_from_date_string — Alias de DateInterval::createFromDateString()
Esta función es un alias de: DateInterval::createFromDateString()
Esta función es un alias de: DateInterval::format()
Esta función es un alias de: DateTime::setISODate()
Esta función es un alias de: DateTime::modify()
Esta función es un alias de: DateTime::getOffset()
(PHP 5 >= 5.3.0)
date_parse_from_format — Obtiene información de una fecha dada formateada de acuerdo al formato especificado
$format
, string $date
)Devuelve una matriz asociativa con información detallada acerca de la fecha dada.
format
Un formato aceptado por DateTime::createFromFormat().
date
Una cadena que representa la fecha.
Devuelve una matriz asociativa con información detallada de la fecha dada.
Ejemplo #1 Ejemplo de date_parse_from_format()
<?php
$fecha = "6.1.2009 13:00+01:00";
print_r(date_parse_from_format("j.n.Y H:iP", $fecha));
?>
El resultado del ejemplo sería:
Array
(
[year] => 2009
[month] => 1
[day] => 6
[hour] => 13
[minute] => 0
[second] => 0
[fraction] =>
[warning_count] => 0
[warnings] => Array
(
)
[error_count] => 0
[errors] => Array
(
)
[is_localtime] => 1
[zone_type] => 1
[zone] => -60
[is_dst] =>
)
(PHP 5 >= 5.2.0)
date_parse — Devuelve una matriz asociativa con información detallada acerca de una fecha dada
$date
)
Devuelve un array con información sobre la fecha analizada si
se tuvo éxito o FALSE en caso de error.
En el caso de que el formato de fecha tenga un error, el elemento 'errors' contendrá los mensajes de error.
Ejemplo #1 Un ejemplo de date_parse()
<?php
print_r(date_parse("2006-12-12 10:00:00.5"));
?>
El resultado del ejemplo sería:
Array
(
[year] => 2006
[month] => 12
[day] => 12
[hour] => 10
[minute] => 0
[second] => 0
[fraction] => 0.5
[warning_count] => 0
[warnings] => Array()
[error_count] => 0
[errors] => Array()
[is_localtime] =>
)
Esta función es un alias de: DateTime::sub()
(PHP 5 >= 5.1.2)
date_sun_info — Devuelve una matriz con información sobre la puesta/salida del sol y el comienzo/final del crepúsculo
$time
, float $latitude
, float $longitude
)
time
Marca de tiempo.
latitude
Latitud en grados.
longitude
Longitud en grados.
Devuelve una matriz si se tuvo éxito o FALSE en caso de error.
Ejemplo #1 Un ejemplo de date_sun_info()
<?php
$sun_info = date_sun_info(strtotime("2006-12-12"), 31.7667, 35.2333);
foreach ($sun_info as $clave => $valor) {
echo "$clave: " . date("H:i:s", $valor) . "\n";
}
?>
El resultado del ejemplo sería:
sunrise: 05:52:11 sunset: 15:41:21 transit: 10:46:46 civil_twilight_begin: 05:24:08 civil_twilight_end: 16:09:24 nautical_twilight_begin: 04:52:25 nautical_twilight_end: 16:41:06 astronomical_twilight_begin: 04:21:32 astronomical_twilight_end: 17:12:00
(PHP 5)
date_sunrise — Devuelve la hora de la salida del sol de un día y ubicación dados
$timestamp
[, int $format = SUNFUNCS_RET_STRING
[, float $latitude = ini_get("date.default_latitude")
[, float $longitude = ini_get("date.default_longitude")
[, float $zenith = ini_get("date.sunrise_zenith")
[, float $gmt_offset = 0
]]]]] )
date_sunrise() devuelve la hora de la salida del sol para un día
(especificado como timestamp) y ubicación dados.
timestamp
La marca de tiempo timestamp del día del que se va a tomar
la salida del sol.
format
| constante | descripción | ejemplo |
|---|---|---|
| SUNFUNCS_RET_STRING | devuelve el resultado como string | 16:46 |
| SUNFUNCS_RET_DOUBLE | devuelve el resultado como float | 16.78243132 |
| SUNFUNCS_RET_TIMESTAMP | devuelve el resultado como integer (timestamp) | 1095034606 |
latitude
La latitud, por defecto a Norte, y como valor negativo a Sur. Vea también: date.default_latitude
longitude
La longitud, por defecto a Este, y como valor negativo a Oeste. Vea tambien: date.default_longitude
zenith
El cénit, por defecto: date.sunset_zenith
gmtoffset
El índice GMT especificado en horas.
Devuelve la hora de la salida del sol en un formato format especificado
si se tuvo éxito o FALSE en caso de error.
Cada vez que se llame a la función date/time se generará un E_NOTICE
si la zona horaria no es válida, y/o un mensaje E_STRICT
o E_WARNING
si se usa la configuración del sistema o la variable global
TZ. Vea también date_default_timezone_set()
| Versión | Descripción |
|---|---|
| 5.1.0 |
Ahora muestra |
Ejemplo #1 Ejemplo de date_sunrise()
<?php
/* calcular la salida del sol para Lisboa, Portugal
Latitud: 38.4 Norte
Longitud: 9 Oeste
Cenit ~= 90
Índice: +1 GMT
*/
echo date("D M d Y"). ', hora de la salida del sol : ' .date_sunrise(time(), SUNFUNCS_RET_STRING, 38.4, -9, 90, 1);
?>
El resultado del ejemplo sería algo similar a:
Mon Dec 20 2004, hora de la salida del sol : 08:54
(PHP 5)
date_sunset — Devuelve la hora de la puesta de sol de un día y ubicación dados
$timestamp
[, int $format = SUNFUNCS_RET_STRING
[, float $latitude = ini_get("date.default_latitude")
[, float $longitude = ini_get("date.default_longitude")
[, float $zenith = ini_get("date.sunset_zenith")
[, float $gmt_offset = 0
]]]]] )
date_sunset() devuelve la hora de la puesta de sol para un día
(especificado como timestamp) y ubicación dados.
timestamp
La marca de tiempo timestamp del día del que se va a tomar
la puesta de sol.
format
| constante | descripción | ejemplo |
|---|---|---|
| SUNFUNCS_RET_STRING | devuelve el resultado como string | 16:46 |
| SUNFUNCS_RET_DOUBLE | devuelve el resultado como float | 16.78243132 |
| SUNFUNCS_RET_TIMESTAMP | devuelve el resultado como integer (timestamp) | 1095034606 |
latitude
La latitud, por defecto a Norte, y como valor negativo a Sur. Vea también: date.default_latitude
longitude
La longitud, por defecto a Este, y como valor negativo a Oeste. Vea tambien: date.default_longitude
zenith
El cénit, por defecto: date.sunset_zenith
gmtoffset
El índice GMT especificado en horas.
Cada vez que se llame a la función date/time se generará un E_NOTICE
si la zona horaria no es válida, y/o un mensaje E_STRICT
o E_WARNING
si se usa la configuración del sistema o la variable global
TZ. Vea también date_default_timezone_set()
| Versión | Descripción |
|---|---|
| 5.1.0 |
Ahora muestra |
Devuelve la hora de la puesta de sol en un formato format especificado
si se tuvo éxito o FALSE en caso de error.
Ejemplo #1 Ejemplo de date_sunset()
<?php
/* calcular la puesta de sol para Lisboa, Portugal
Latitud: 38.4 Norte
Longitud: 9 Oeste
Cenit ~= 90
Índice: +1 GMT
*/
echo date("D M d Y"). ', hora de la puesta de sol : ' .date_sunset(time(), SUNFUNCS_RET_STRING, 38.4, -9, 90, 1);
?>
El resultado del ejemplo sería algo similar a:
Mon Dec 20 2004, hora de la puesta de sol : 18:13
Esta función es un alias de: DateTime::setTime()
Esta función es un alias de: DateTime::getTimestamp()
Esta función es un alias de: DateTime::setTimestamp()
Esta función es un alias de: DateTime::getTimezone()
Esta función es un alias de: DateTime::setTimezone()
(PHP 4, PHP 5)
date — Dar formato a la fecha/hora local
$format
[, int $timestamp = time()
] )
Devuelve una cadena formateada según el formato dado usando el
parámetro de tipo integer timestamp dado o el momento actual
si no se da una marca de tiempo. En otras palabras, timestamp
es opcional y por defecto es el valor de time().
format
El formato de la fecha de salida tipo string. Vea las opciones
de formato más abajo. También hay varias
constantes de fecha predefinidas
que pueden usarse en su lugar, así por ejemplo DATE_RSS
contiene la cadena de formato 'D, d M Y H:i:s'.
Carácter de format |
Descripción | Ejemplo de valores devueltos |
|---|---|---|
| Día | --- | --- |
| d | Día del mes, 2 dígitos con ceros iniciales | 01 a 31 |
| D | Una representación textual de un día, tres letras | Mon hasta Sun |
| j | Día del mes sin ceros iniciales | 1 a 31 |
| l ('L' minúscula) | Una representación textual completa del día de la semana | Sunday hasta Saturday |
| N | Representación numérica ISO-8601 del día de la semana (añadido en PHP 5.1.0) | 1 (para lunes) hasta 7 (para domingo) |
| S | Sufijo ordinal inglés para el día del mes, 2 caracteres | st, nd, rd o th. Funciona bien con j |
| w | Representación numérica del día de la semana | 0 (para domingo) hasta 6 (para sábado) |
| z | El día del año (comenzando por 0) | 0 hasta 365 |
| Semana | --- | --- |
| W | Número de la semana del año ISO-8601, las semanas comienzan en lunes (añadido en PHP 4.1.0) | Ejemplo: 42 (la 42ª semana del año) |
| Mes | --- | --- |
| F | Una representación textual completa de un mes, como January o March | January hasta December |
| m | Representación numérica de una mes, con ceros iniciales | 01 hasta 12 |
| M | Una representación textual corta de un mes, tres letras | Jan hasta Dec |
| n | Representación numérica de un mes, sin ceros iniciales | 1 hasta 12 |
| t | Número de días del mes dado | 28 hasta 31 |
| Año | --- | --- |
| L | Si es un año bisiesto | 1 si es bisiesto, 0 si no. |
| o | Número de año ISO-8601. Esto tiene el mismo valor que Y, excepto que si el número de la semana ISO (W) pertenece al año anterior o siguiente, se usa ese año en su lugar. (añadido en PHP 5.1.0) | Ejemplos: 1999 o 2003 |
| Y | Una representación numérica completa de un año, 4 dígitos | Ejemplos: 1999 o 2003 |
| y | Una representación de dos dígitos de un año | Ejemplos: 99 o 03 |
| Hora | --- | --- |
| a | Ante meridiem y Post meridiem en minúsculas | am o pm |
| A | Ante meridiem y Post meridiem en mayúsculas | AM o PM |
| B | Hora Internet | 000 hasta 999 |
| g | Formato de 12 horas de una hora sin ceros iniciales | 1 hasta 12 |
| G | Formato de 24 horas de una hora sin ceros iniciales | 0 hasta 23 |
| h | Formato de 12 horas de una hora con ceros iniciales | 01 hasta 12 |
| H | Formato de 24 horas de una hora con ceros iniciales | 00 hasta 23 |
| i | Minutos, con ceros iniciales | 00 hasta 59 |
| s | Segundos, con ceros iniciales | 00 hasta 59 |
| u | Microsegundos (añadido en PHP 5.2.2) | Ejemplo: 654321 |
| Zona Horaria | --- | --- |
| e | Identificador de zona horaria (añadido en PHP 5.1.0) | Ejemplos: UTC, GMT, Atlantic/Azores |
| I (i mayúscula) | Si la fecha está en horario de verano o no | 1 si está en horario de verano, 0 si no. |
| O | Diferencia de la hora de Greenwich (GMT) en horas | Ejemplo: +0200 |
| P | Diferencia con la hora de Greenwich (GMT) con dos puntos entre horas y minutos (añadido en PHP 5.1.3) | Ejemplo: +02:00 |
| T | Abreviatura de la zona horaria | Ejemplos: EST, MDT ... |
| Z | Índice de la zona horaria en segundos. El índice para zonas horarias al oeste de UTC siempre es negativo, y para aquellas al este de UTC es siempre positivo. | -43200 hasta 50400 |
| Fecha/Hora Completa | --- | --- |
| c | Fecha ISO 8601 (añadido en PHP 5) | 2004-02-12T15:19:21+00:00 |
| r | Fecha con formato » RFC 2822 | Ejemplo: Thu, 21 Dec 2000 16:01:07 +0200 |
| U | Segundos desde la Época Unix (1 de Enero del 1970 00:00:00 GMT) | Vea también time() |
Los caracteres no reconocidos en la cadena de formato serán impresos tal cual. El formato Z siempre devolverá 0 cuando se usa gmdate().
Nota:
Ya que esta función sólo acepta marcas de tiempo de tipo integer el carácter de formato u sólo es útil cuando se usa la función date_format() con marcas de tiempo basadas en usuario creadas con date_create().
timestamp
El parámetro opcional timestamp es una marca de tiempo Unix de tipo
integer que por defecto es la hora local si no se proporciona
ningún valor a timestamp. En otras palabras,
es por defecto el valor de la función time().
Devuelve una cadena de fecha formateada. Si se usa un valor no numérico para
timestamp, se devuelve FALSE y
se emite un error de nivel E_WARNING.
Cada vez que se llame a la función date/time se generará un E_NOTICE
si la zona horaria no es válida, y/o un mensaje E_STRICT
o E_WARNING
si se usa la configuración del sistema o la variable global
TZ. Vea también date_default_timezone_set()
| Versión | Descripción |
|---|---|
| 5.1.0 | El rango válido de una marca de tiempo es típicamente desde Fri, 13 Dec 1901 20:45:54 GMT a Tue, 19 Jan 2038 03:14:07 GMT. (Estas son las fechas que corresponden a los valores mínimo y máximo de un entero con signo de 32 bit). Sin embargo, antes de PHP 5.1.0 este rango estaba limitado desde 01-01-1970 a 19-01-2038 en algunos sistemas (p.ej. Windows). |
| 5.1.0 |
Ahora muestra |
| 5.1.1 |
Hay constantes útiles
de formatos de fecha/hora estándar que se pueden usar para especificar el
parámetro format.
|
Ejemplo #1 Ejemplo de date()
<?php
// Establecer la zona horaria predeterminada a usar. Disponible desde PHP 5.1
date_default_timezone_set('UTC');
// Imprime algo como: Monday
echo date("l");
// Imprime algo como: Monday 8th of August 2005 03:12:46 PM
echo date('l jS \of F Y h:i:s A');
// Imprime: July 1, 2000 is on a Saturday
echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));
/* Usar las constantes en el parámetro de formato */
// Imprime algo como: Mon, 15 Aug 2005 15:12:46 UTC
echo date(DATE_RFC822);
// Imprime algo como: 2000-07-01T00:00:00+00:00
echo date(DATE_ATOM, mktime(0, 0, 0, 7, 1, 2000));
?>
Puede prevenir que un carácter reconocido en la cadena de formato sea expandido escapándolo con una barra invertida precedente. Si el carácter con una barra invertida es ya una secuencia especial, necesitará escapar también la barra invertida.
Ejemplo #2 Escapar caracteres en date()
<?php
// imprime algo como: Wednesday the 15th
echo date('l \t\h\e jS');
?>
Es posible usar date() y mktime() juntos para buscar fechas en el futuro o en el pasado.
Ejemplo #3 Ejemplo de date() y mktime()
<?php
$mañana = mktime(0, 0, 0, date("m") , date("d")+1, date("Y"));
$mes_anterior = mktime(0, 0, 0, date("m")-1, date("d"), date("Y"));
$año_siguiente = mktime(0, 0, 0, date("m"), date("d"), date("Y")+1);
?>
Nota:
Esto puede ser más fiable que añadir o sustraer simplemente el número de segundos de un día o mes a una marca de tiempo debido al horario de verano.
Algunos ejemplos de formatear date(). Observe que debería escapar cualesquiera otros caracteres, ya que cualquiera que tenga actualmente un significado especial producirá resultados no deseados, y a otros caracteres se les pueden asignar significado en futuras versiones de PHP. Cuando se escapa un carácter, asegúrese de usar comillas simples para prevenir que caracteres como \n se conviertan en nuevas líneas.
Ejemplo #4 date() Formatting
<?php
// Se asume que hoy es March 10th, 2001, 5:16:18 pm, y que estamos en la
// zona horaria Mountain Standard Time (MST)
$today = date("F j, Y, g:i a"); // March 10, 2001, 5:16 pm
$today = date("m.d.y"); // 03.10.01
$today = date("j, n, Y"); // 10, 3, 2001
$today = date("Ymd"); // 20010310
$today = date('h-i-s, j-m-y, it is w Day'); // 05-16-18, 10-03-01, 1631 1618 6 Satpm01
$today = date('\i\t \i\s \t\h\e jS \d\a\y.'); // it is the 10th day.
$today = date("D M j G:i:s T Y"); // Sat Mar 10 17:16:18 MST 2001
$today = date('H:m:s \m \i\s\ \m\o\n\t\h'); // 17:03:18 m is month
$today = date("H:i:s"); // 17:16:18
?>
Para formatear fechas en otros lenguajes debería usar las funciones setlocale() y strftime() en vez de date().
Nota:
Para generar una marca de tiempo desde una cadena que representa la fecha, puede usar strtotime(). Adicionalmente, algunas bases de datos tienen funciones para convertir formatos de fecha en marcas de tiempo (como la función » UNIX_TIMESTAMP de MySQL).
La marca de tiempo del inicio de una petición está disponible en $_SERVER['REQUEST_TIME'] desde PHP 5.1.
(PHP 4, PHP 5)
getdate — Obtener información de la fecha/hora
$timestamp = time()
] )
Devuelve un array asociativo que contiene la información
de la fecha de timestamp, o el momento
local actual si no se da timestamp.
Devuelve un array asociativo con información relacionada con la
marca de tiempo timestamp. Los elementos devueltos de la
matriz asociativa son los siguientes:
| Clave | Descripción | Ejemplo de valores devueltos |
|---|---|---|
| "seconds" | Representacion numérica de los segundos | 0 a 59 |
| "minutes" | Representacion numérica de los minutos | 0 a 59 |
| "hours" | Representacion numérica de las horas | 0 a 23 |
| "mday" | Representacion numérica del día del mes | 1 a 31 |
| "wday" | Representacion numérica del día de la semana | 0 (para Domingo) hasta 6 (para Sábado) |
| "mon" | Representacion numérica de un mes | 1 hasta 12 |
| "year" | Una representacion numérica completa de una año, 4 dígitos | Ejemplos: 1999 o 2003 |
| "yday" | Representacion numérica del día del año | 0 hasta 365 |
| "weekday" | Una representación textual completa del día de la semana | Sunday hasta Saturday |
| "month" | Una representación textual completa de un mes, como January o March | January hasta December |
| 0 | Los segundos desde la Época Unix, similar a los valores devueltos por time() y usados por date(). | Dependiente del Sistema, típicamente -2147483648 hasta 2147483647. |
Ejemplo #1 Ejemplo de getdate()
<?php
$hoy = getdate();
print_r($hoy);
?>
El resultado del ejemplo sería algo similar a:
Array
(
[seconds] => 40
[minutes] => 58
[hours] => 21
[mday] => 17
[wday] => 2
[mon] => 6
[year] => 2003
[yday] => 167
[weekday] => Tuesday
[month] => June
[0] => 1055901520
)
(PHP 4, PHP 5)
gettimeofday — Obtener la hora actual
Esta es una interfaz a gettimeofday(2). Devuelve una matriz asociativa que contiene la información devuelta por la llamada al sistema.
return_float
Cuando se establece a TRUE, se devuelve un float en vez de un array.
Por defecto se devuelve un array. Si return_float
está establecido, se devuelve un float.
Claves de la matriz:
| Versión | Descripción |
|---|---|
| 5.1.0 |
Se añadió el parámetro return_float.
|
Ejemplo #1 Ejemplo de gettimeofday()
<?php
print_r(gettimeofday());
echo gettimeofday(true);
?>
El resultado del ejemplo sería algo similar a:
Array
(
[sec] => 1073504408
[usec] => 238215
[minuteswest] => 0
[dsttime] => 1
)
1073504408.23910
(PHP 4, PHP 5)
gmdate — Formatea una fecha/hora GMT/UTC
$format
[, int $timestamp = time()
] )Idéntica a la función date() excepto que la fecha/hora devuelta es en Greenwich Mean Time (GMT).
format
El formato de la fecha (string) a mostrar. Ver las opciones de formato de la función date().
timestamp
El parámetro opcional timestamp es una marca de tiempo Unix de tipo
integer que por defecto es la hora local si no se proporciona
ningún valor a timestamp. En otras palabras,
es por defecto el valor de la función time().
Devuelve una fecha en formato GMT. Si se usa un valor no numérico en
timestamp, devolverá FALSE y se lanzará
un error de nivel E_WARNING.
| Versión | Descripción |
|---|---|
| 5.1.0 | El rango válido de una marca de tiempo es típicamente desde Fri, 13 Dec 1901 20:45:54 GMT a Tue, 19 Jan 2038 03:14:07 GMT. (Estas son las fechas que corresponden a los valores mínimo y máximo de un entero con signo de 32-bit). Sin embargo, antes de PHP 5.1.0 este rango estaba limitado desde 01-01-1970 a 19-01-2038 en algunos sistemas (p.ej. Windows). |
| 5.1.1 |
Hay constantes útiles
de formatos de fecha/hora estándar que se pueden usar para especificar el
parámetro format.
|
Ejemplo #1 Ejemplo de gmdate()
Cuando se ejecuta en Finlandia (GMT +0200), la primera línea de abajo imprimirá "Jan 01 1998 00:00:00", mientras que la segunda imprimirá "Dec 31 1997 22:00:00".
<?php
echo date("M d Y H:i:s", mktime(0, 0, 0, 1, 1, 1998));
echo gmdate("M d Y H:i:s", mktime(0, 0, 0, 1, 1, 1998));
?>
(PHP 4, PHP 5)
gmmktime — Obtener la marca de tiempo Unix para una fecha GMT
$hour = gmdate("H")
[, int $minute = gmdate("i")
[, int $second = gmdate("s")
[, int $month = gmdate("n")
[, int $day = gmdate("j")
[, int $year = gmdate("Y")
[, int $is_dst = -1
]]]]]]] )Idéntica a mktime() excepto que los parámetros pasados representan una fecha GMT. gmmktime() internamente usa mktime() por lo que sólo los momento válidos derivados del momento local se pueden usar.
Como en mktime(), los argumentos pueden ser expuestos en orden de derecha a izquierda, con cualquier argumento que se omita establecido al valor GMT correspondiente actual.
hour
El número de la hora relativo al inicio del día determinado por
month, day y year.
Los valores negativos referencias la hora antes de la media noche del día en cuestión.
Los valores mayores que 23 referencian la hora apropiada en el/los día/s siguiente/s.
minute
El número del minuto relativo al inicio de hour.
Los valores negativos referencian el minuto en la hora previa.
Los valores maayores que 59 referencian el minuto apropiado en la/s hora/s siguiente/s.
second
El número de segundos relativo al inicio de minute.
Los valores negativos referencian el segundo en el minuto previo.
Los valores mayores que 59 referencian el segundo apropiado en el/los minuto/s siguiente/s.
month
El número del mes relativo al inicio del año previo. Los valores de 1 a 12 referencian los meses del calendario normal del año en cuestión. Los valores menores que 1 (incluyendo valores negativos) referencian los meses del año previo en orden inverso, por lo que 0 es December, -1 es November, etc. Los valores mayores que 12 referencian el mes apropiado en el/los año/s siguiente/s.
day
El número del día relativo al final del mes previo. Los valores del 1 al 28, 29, 30 o 31 (dependiendo del mes) referenciacn los días normales del mes relevante.the normal days in the relevant month. Los valores menores que 1 (incluyendo valores negativos) referencian los días del mes previo por lo que 0 es el último día del mes previo, -1 es el día anterior a ese, etc. Los valores mayores que el número de días del mes relevante referencian el día apropiado en el/los mes/es siguiente/s.
year
El año
is_dst
Los parámetros siempre representan una fecha GMT por lo que is_dst
no influye en el resultado.
Devuelve una marca de tiempo Unix de tipo integer.
| Versión | Descripción |
|---|---|
| 5.1.0 |
A partir de PHP 5.1.0, el parámetro is_dst se volvió
obsoleto. Como resultado, se podría usar en su lugar las nuevas características
de manejo de zonas horarias.
|
Ejemplo #1 Ejemplo básico de gmmktime()
<?php
// Imprime: July 1, 2000 is on a Friday
echo "July 1, 2000 is on a " . date("l", gmmktime(0, 0, 0, 7, 1, 2000));
?>
(PHP 4, PHP 5)
gmstrftime — Formatear una fecha/hora GMT/UTC según la configuración regional
$format
[, int $timestamp = time()
] )Se comporta como strftime() excepto que el momento devuelto es Greenwich Mean Time (GMT). Por ejemplo, cuando se ejecuta en Hora del Este (GMT -0500), la primera línea de abajo imprime "Dec 31 1998 20:00:00", mientras que la segunda imprime "Jan 01 1999 01:00:00".
format
Vea la descripción de strftime().
timestamp
El parámetro opcional timestamp es una marca de tiempo Unix de tipo
integer que por defecto es la hora local si no se proporciona
ningún valor a timestamp. En otras palabras,
es por defecto el valor de la función time().
Devuelve una cadena formateada según la cadena de formato dada
usando la marca de tiempo timestamp dada o el momento
local actual si no se da la marca de tiempo. Los nombres del mes y del día de la semana y
otras cadenas dependientes del lenguaje están subordinados a la configuración
regional local establecida con
Ejemplo #1 Ejemplo de gmstrftime()
<?php
setlocale(LC_TIME, 'en_US');
echo strftime("%b %d %Y %H:%M:%S", mktime(20, 0, 0, 12, 31, 98)) . "\n";
echo gmstrftime("%b %d %Y %H:%M:%S", mktime(20, 0, 0, 12, 31, 98)) . "\n";
?>
(PHP 5)
idate — Formatea una fecha/hora local como un entero
$format
[, int $timestamp = time()
] )
Devuelve un número formateado según la cadena de formato dada usando la marca de
tiempo timestamp de tipo entero dado o el momento local actual
si no se da la marca de tiempo. En otras palabras, timestamp
es opcional y su valor por defecto es el de time().
A diferencia de date(), idate()
acepta un sólo carácter en el parámetro format.
format
Caracter format |
Descripción |
|---|---|
| B | Swatch Beat/Hora Internet |
| d | Día del mes |
| h | Hora (formato de 12 horas) |
| H | Hora (formato de 24 horas) |
| i | Minutos |
| I (i mayúscula) | devuelve 1 si el horario de verano (DST) está activado, 0 si no |
| L (l mayúscula) | devuelve 1 para años bisiestos, 0 si no |
| m | Número de mes |
| s | Segundos |
| t | Días en el mes actual |
| U | Segundos desde la Época Unix - 1 de enero de 1970 00:00:00 UTC - esto es lo mismo que en time() |
| w | Día de la semana (0 para Domingo) |
| W | Número del mes del año ISO-8601, las semanas comienzan en Lunes |
| y | Año (1 ó 2 dígitos - comprobar la anotación de abajo) |
| Y | Año (4 dígitos) |
| z | Día del año |
| Z | Ínidce de la zona horaria en segundos |
timestamp
El parámetro opcional timestamp es una marca de tiempo Unix de tipo
integer que por defecto es la hora local si no se proporciona
ningún valor a timestamp. En otras palabras,
es por defecto el valor de la función time().
Devuelve un integer.
Ya que idate() devuelve siempre un integer y como éste nunca puede empezar por un "0", idate() puede devolver menos dígitos de los que se esperarían. Vea el ejemplo de abajo.
Cada vez que se llame a la función date/time se generará un E_NOTICE
si la zona horaria no es válida, y/o un mensaje E_STRICT
o E_WARNING
si se usa la configuración del sistema o la variable global
TZ. Vea también date_default_timezone_set()
| Versión | Descripción |
|---|---|
| 5.1.0 |
Ahora muestra |
Ejemplo #1 Ejemplo de idate()
<?php
$timestamp = strtotime('1st January 2004'); //1072915200
// esto imprime el año en un formato de dos dígitos
// sin embargo, ya que éste podría empezar con un "0",
// sólo se imprime "4"
echo idate('y', $timestamp);
?>
(PHP 4, PHP 5)
localtime — Obtiene fecha y hora local
$timestamp = time()
[, bool $is_associative = false
]] )La función localtime() devuelve un array con la estructura idéntica a la devuelta por la llamada a la función en C.
timestamp
El parámetro opcional timestamp es una marca de tiempo Unix de tipo
integer que por defecto es la hora local si no se proporciona
ningún valor a timestamp. En otras palabras,
es por defecto el valor de la función time().
is_associative
Si está defindo como FALSE o no se proporciona, el array es devuelto como un
array indexado numéricamente. Si el argumento está definido como TRUE,
localtime() devuelve un array asociativo que contiene
todos los diferentes elementos de la estructura devuelta por la llamada a la
fucnión de C localtime. Los nombres de las diferentes claves del
array asociativo son los siguientes:
Cada vez que se llame a la función date/time se generará un E_NOTICE
si la zona horaria no es válida, y/o un mensaje E_STRICT
o E_WARNING
si se usa la configuración del sistema o la variable global
TZ. Vea también date_default_timezone_set()
| Versión | Descripción |
|---|---|
| 5.1.0 |
Ahora muestra |
Ejemplo #1 Ejemplo de localtime()
<?php
$localtime = localtime();
$localtime_assoc = localtime(time(), true);
print_r($localtime);
print_r($localtime_assoc);
?>
El resultado del ejemplo sería algo similar a:
Array
(
[0] => 24
[1] => 3
[2] => 19
[3] => 3
[4] => 3
[5] => 105
[6] => 0
[7] => 92
[8] => 1
)
Array
(
[tm_sec] => 24
[tm_min] => 3
[tm_hour] => 19
[tm_mday] => 3
[tm_mon] => 3
[tm_year] => 105
[tm_wday] => 0
[tm_yday] => 92
[tm_isdst] => 1
)
(PHP 4, PHP 5)
microtime — Devuelve la fecha Unix actual con microsegundos
microtime() devuelve la fecha Unix actual con microsegundos. Esta función sólo está disponible en sisitemas operativos que soportan la llamada al sistema de gettimeofday().
Por omisión, microtime() devuelve un string en la forma "msec sec", donde sec es el momento actual medido con el número de segundos desde la época Unix (0:00:00 January 1, 1970 GMT), y msec es el número de microsegundos que han transcurrido desde sec expresado en segundos.
Si get_as_float está establecido a TRUE,
microtime() devuelve un float, que
representa el momento actual en segundos desde la época Unix con precisión al
microsegundo más cercano.
| Versión | Descripción |
|---|---|
| 5.0.0 |
Se añadió el parámetro get_as_float.
|
Ejemplo #1 Ejecución de un script de cronometraje con microtime()
<?php
/**
* Función sencilla para repetir el comportamiento de PHP 5
*/
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
// Dormir por un momento
usleep(100);
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "No se hizo nada en $time segundos\n";
?>
Ejemplo #2 Ejecución de un script de cronometraje en PHP 5
<?php
$time_start = microtime(true);
// Dormir por un momento
usleep(100);
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "No se hizo nada en $time segundos\n";
?>
(PHP 4, PHP 5)
mktime — Obtener la marca de tiempo Unix de una fecha
$hour = date("H")
[, int $minute = date("i")
[, int $second = date("s")
[, int $month = date("n")
[, int $day = date("j")
[, int $year = date("Y")
[, int $is_dst = -1
]]]]]]] )Devuelve la marca de tiempo Unix correspondiente a los argumentos dados. Esta marca de tiempo es un entero que contiene el número de segundos entre la Época Unix (1 de Enero del 1970 00:00:00 GMT) y el instante especificado.
Los argumentos pueden omitirse de derecha a izquierda; cualquier argumento que se omita será establecido al valor actual según la fecha y hora locales.
Nota:
Desde PHP 5.1, cuando se hace la llamada sin argumentos, mktime() lanza un aviso de tipo
E_STRICT: use la función time() en su lugar.
hour
El número de la hora relativa al inicio del día determinado por
month, day y year.
Los valores negativos referencian la hora antes de la media noche del día en cuestión.
Los valores mayores que 23 referencian la hora apropiada en el/los día/s siguiente/s.
minute
El número de los minutos relativos al inicio de hour.
Los valores negativos referencian el minuto en la hora previa.
Los valores mayores que 59 referencian el minuto apropiado en la/s hora/s siguiente/s.
second
El número de segundos relativos al inicio de minute.
Los valores negativos referencian el segundo en el minuto previo.
Los valores mayores que 59 referencian el segundo apropiado en el/los minuto/s siguiente/s.
month
El número del mes relativo al final del año previo. Los valores de 1 a 12 referencian los meses del calendario normal del año en cuestión. Los valores menores que 1 (incluyendo valores negativos) referencian los meses del año previo en orden inverso, por lo que 0 es Diciembre, -1 es Noviembre, etc. Los valores mayores que 12 referencian el mes apropiado en el/los año/s siguiente/s.
day
El número del día relativo al final del mes previo. Los valores del 1 al 28, 29, 30 o 31 (dependiendo del mes) referencian los días normales del mes relevante. Los valores menores que 1 (incluyendo valores negativos) referencian los días del mes previo por lo que 0 es el último día del mes previo, -1 es el día anterior a ese, etc. Los valores mayores que el número de días del mes relevante referencian el día apropiado en el/los mes/es siguiente/s.
year
El número del año, puede ser un valor de dos o cuatro dígitos,
con valores entre 0-69 mapeados a 2000-2069 y 70-100 a
1970-2000. En sistemas donde time_t es un entero con signo de 32 bits, como
es lo más normal hoy en día, el rango válido para year
es entre 1901 y 2038. Sin embargo, antes de PHP 5.1.0 este
rango estaba limitado desde 1970 a 2038 en algunos sistemas (p.ej. Windows).
is_dst
Este parámetro se puede establecer a 1 si el instante está durante el horario de verano (DST),
0 si no, o -1 (por omisión) si no se sabe si el instante está durante el horario
de verano. Si no se sabe, PHP lo intentará calcular por sí mismo.
Esto puede causar resultados inesperados (pero no incorrectos).
Algunas veces no son válidos si DST está habilitado en el sistema donde se ejecuta PHP o
is_dst está establecido a 1. Si DST está habilitado a, p.ej. 2:00,
todas las horas entre las 2:00 y las 3:00 no son válidas y mktime()
devuelve un valor indefinido (normalmente negativo).
Algunos sistemas (p.ej. Solaris 8) habilitan DST a la medianoche por lo que la hora 0:30
del día, cuando DST está habilitado, es evaluada como 23:30 del día anterior.
Nota:
A partir de PHP 5.1.0, este parámetro se volvió obsoleto. Como resultado, se pueden usar en su lugar las nuevas características de manejo de zonas horarias.
mktime() devuelve la marca de tiempo Unix de los argumentos
dados.
Si los argumentos no son válidos, la función devuelve FALSE (antes de PHP 5.1
devolvía -1).
Cada vez que se llame a la función date/time se generará un E_NOTICE
si la zona horaria no es válida, y/o un mensaje E_STRICT
o E_WARNING
si se usa la configuración del sistema o la variable global
TZ. Vea también date_default_timezone_set()
| Versión | Descripción |
|---|---|
| 5.3.0 |
mktime() ahora lanza un aviso de tipo E_DEPRECATED
si se usa el parámetro is_dst.
|
| 5.1.0 |
El parámetro is_dst se volvió obsoleto.
Hacía que la funcion devolviese FALSE si se pruducía un error, en vez de
-1.
Arreglada la función para que acepte el año, mes y día pasados como
cero.
|
| 5.1.0 |
Cuando se hace la llamada sin argumento, mktime() lanza
un aviso E_STRICT. Use la
función time() en su lugar.
|
| 5.1.0 |
Ahora muestra |
Ejemplo #1 Ejemplo básico de mktime()
<?php
// Establecer la zona horaria predeterminada a usar. Disponible desde PHP 5.1
date_default_timezone_set('UTC');
// Imprime: July 1, 2000 is on a Saturday
echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));
// Imprime algo como: 2006-04-05T01:02:03+00:00
echo date('c', mktime(1, 2, 3, 4, 5, 2006));
?>
Ejemplo #2 Ejemplo de mktime()
mktime() es útil para hacer que las fechas sean aritméticas y válidas, ya que calculará automáticamente el valor correcto para las entradas que estén fuera de rango. Por ejemplo, cada una de las líneas siguientes producirá la cadena "Jan-01-1998".
<?php
echo date("M-d-Y", mktime(0, 0, 0, 12, 32, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 13, 1, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 1998));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 98));
?>
Ejemplo #3 El último día del mes
El último día de cualquier mes dado se puede expresar como el día "0" del mes siguiente, no el día -1. Los dos ejemplos siguientes producirán la cadena "El último día en Feb 2000 es: 29".
<?php
$último_día = mktime(0, 0, 0, 3, 0, 2000);
echo strftime("El último día en Feb 2000 es: %d", $último_día);
$último_día = mktime(0, 0, 0, 4, -31, 2000);
echo strftime("El último día en Feb 2000 es: %d", $último_día);
?>
Antes de PHP 5.1.0, las marcas de tiempo negativas no estaban soportadas bajo ninguna versión de Windows conocida, y tampoco en otros sistemas. Por lo tanto el rango de años válidos estaba limitado desde 1970 hasta 2038.
(PHP 4, PHP 5)
strftime — Formatea una fecha/hora local según la configuración regional
$format
[, int $timestamp = time()
] )Formatea una fecha/hora local según la configuración regional. Los nombres del mes y del día de la semana y otras cadenas dependientes del lenguaje están subordinados a la configuración regional local establecida con setlocale().
No todos los especificadores de conversión están soportados por su biblioteca C, en cuyo caso no serán soportados por la fucnión strftime() de PHP. Adicionalmente, no todas las plataformas soportan marcas de tiempo negativas, por lo que el rango de fechas puede estar limitado a fechas que no sean anteriores a la época Unix. Eso significa que %e, %T, %R y, %D (y posiblemente otros) - así como las fechas anteriores al 1 Ene, 1970 - no funcionarán en Windows, en algunas distribucioes de Linux, y en otros pocos sistemas operativos. Para sistemas Windows se puede encontrar una visión general de los especificadores de conversión soportados en » MSDN.
format
format |
Descripción | Ejemplo de valores devueltos |
|---|---|---|
| Día | --- | --- |
| %a | Una representación textual abreviada del día | Sun hasta Sat |
| %A | Una representación textual completa del día | Sunday hsata Saturday |
| %d | El día del mes con dos dígitos (con ceros iniciales) | 01 a 31 |
| %e | El día del mes, con un espacio precediendo a los dígitos simples. No está implementado como está descrito en Windows. Véase más abajo para más información. | 1 a 31 |
| %j | Día del año, 3 dígitos con ceros iniciales | 001 a 366 |
| %u | Representación numérica ISO-8601 del día de la semana | 1 (para Lunes) hasta 7 (para Domingo) |
| %w | Representación numérica del día de la semana | 0 (para Domingo) hasta 6 (para Sábado) |
| Semana | --- | --- |
| %U | Número de semana del año dado, comenzando con el primer Domingo como la primera semana | 13 (para la 13ª semana completa del año) |
| %V | Número de semana ISO-8601:1988 del año dado, comenzando con la primera semana del año con al menos 4 días de semana, con Lunes siendo el principio de la semana | 01 hasta 53 (donde 53 cuenta para una semana solapada) |
| %W | Una representación numérica de la semana del año, comenzando con el primer Domingo como la primera semana | 46 (para la 46ª semana del año comenzando con un Lunes) |
| Mes | --- | --- |
| %b | Nombre del mes abreviado, basado en la configuración regional | Jan hasta Dec |
| %B | Nombre del mes completo, basado en la configuración regional | January hasta December |
| %h | Nombre del mes abreviado, basado en la configuración regional (un alias de %b) | Jan hasta Dec |
| %m | Representación de dos dígitos del mes | 01 (para Enero) hasta 12 (para Diciembre) |
| Año | --- | --- |
| %C | Representación de dos dígitos del siglo (año dividido entre 100, truncado a un integer) | 19 para el Siglo XX |
| %g | Representación de dos dígitos del año por el estándar ISO-8601:1988 (véase %V) | Ejemplo: 09 para la semana del 6 de Enero de 2009 |
| %G | La versión de cuatro dígitos completa de %g | Ejemplo: 2008 para la semana del 3 de Enero de 2009 |
| %y | Representación de dos dígitos del año | Ejemplo: 09 para 2009, 79 para 1979 |
| %Y | Representación de cuatro dígitos del año | Ejemplo: 2038 |
| Hora | --- | --- |
| %H | Representación de dos dígitos de la hora en formato de 24 horas | 00 hasta 23 |
| %I | Representación de dos dígitos de la hora en formato de 12 horas | 01 hasta 12 |
| %l ('L' minúscula) | La hora en formato de 12 horas, con un espacio precediendo a los dígitos simples | 1 hasta 12 |
| %M | Representación de dos dígitos de los minutos | 00 hasta 59 |
| %p | 'AM' o 'PM' en MAYÚSCULAS basados en la hora dada | Ejemplo: AM para 00:31, PM para 22:23 |
| %P | 'am' o 'pm' en minúsculas basados en la hora dada | Ejemplo: am para 00:31, pm para 22:23 |
| %r | Lo mismo que "%I:%M:%S %p" | Ejemplo: 09:34:17 PM para 21:34:17 |
| %R | Lo mismo que "%H:%M" | Ejemplo: 00:35 para 12:35 AM, 16:44 para 4:44 PM |
| %S | Representación de dos dígitos de los segundos | 00 hasta 59 |
| %T | Lo mismo que "%H:%M:%S" | Ejemplo: 21:34:17 para 09:34:17 PM |
| %X | Representación preferida de la hora basda en la configuración regional, sin la fecha | Ejemplo: 03:59:16 o 15:59:16 |
| %z | El índice de la zona horaria de UTC o la abreviatura (depende del sistema operativo) | Ejemplo: -0500 o EST para Hora del Este |
| %Z | La opción de índice/abreviatura de la zona horaria NO dada por %z (depende del sistema operativo) | Ejemplo: -0500 o EST para Hora del Este |
| Marcas de Fecha y Hora | --- | --- |
| %c | Marca preferida de la fecha y hora basadas en la configuración regional | Ejemplo: Tue Feb 5 00:45:10 2009 para el 5 de Febrero de 2009 a las 12:45:10 AM |
| %D | Lo mismo que "%m/%d/%y" | Ejemplo: 02/05/09 para el 5 de Febrero de 2009 |
| %F | Lo mismo que "%Y-%m-%d" (normalmente usado en las marcas de fecha de bases de datos) | Ejemplo: 2009-02-05 para el 5 de Febrero de 2009 |
| %s | Marca de tiempo del momento de la Época Unix (lo mismo que la función time()) | Ejemplo: 305815200 para el 10 de Septiembre de 1979 08:40:00 AM |
| %x | Representación preferida de la fecha basda en la configuración local, sin la hora | Ejemplo: 02/05/09 para el 5 de Febrero de 2009 |
| Miscelánea | --- | --- |
| %n | Un carácter de nueva línea ("\n") | --- |
| %t | Un carácter de tabulación ("\t") | --- |
| %% | Un carácter literal de porcentaje ("%") | --- |
La longitud máxima de este parámetro es de 1023 caracteres.
A diferencia de ISO-9899:1999, Sun Solaris comienza con el Domingo como 1. Como resultado, %u puede no funcionar como está descrito en este manual.
Solamente Windows: El modificador %e no está soportado en la implementación de Windows de esta función. Para obtener este valor se puede usar en su lugar el modificador %#d. El ejemplo de abajo ilustra cómo escribir una función compatible multiplataforma.
Solamente Mac OS X: El modificador %P no está soportado en la implementación de Mac OS X de esta función.
timestamp
El parámetro opcional timestamp es una marca de tiempo Unix de tipo
integer que por defecto es la hora local si no se proporciona
ningún valor a timestamp. En otras palabras,
es por defecto el valor de la función time().
Devuelve una cadena formateada según format
usando el parámetro timestamp dado o el momento
actual local si no se da la marca de tiempo. Los nombres del
mes y del día de la semana y otras cadenas dependientes del lenguaje están subordinados
a la configuración regional local establecida con setlocale().
Cada vez que se llame a la función date/time se generará un E_NOTICE
si la zona horaria no es válida, y/o un mensaje E_STRICT
o E_WARNING
si se usa la configuración del sistema o la variable global
TZ. Vea también date_default_timezone_set()
Ya que la salida depende de la biblioteca C subyacente, algunos especificadores
de conversión no están soportados. En Windows, proporcionar especificadores de
conversión desconocidos resultará en 5 mensajes E_WARNING y
devolverá FALSE. En otros sistemas operativos puede no obtenerse ningún
mensaje E_WARNING y la salida contener los
especificadores de conversión no convertidos.
| Versión | Descripción |
|---|---|
| 5.1.0 |
Ahora muestra |
Este ejemplo funcionará si tiene instalada en su sistema la configuración regional respectiva.
Ejemplo #1 Ejemplos de configuraciones regionales con strftime()
<?php
setlocale(LC_TIME, "C");
echo strftime("%A");
setlocale(LC_TIME, "fi_FI");
echo strftime(" en Finlandés es %A,");
setlocale(LC_TIME, "fr_FR");
echo strftime(" en Francés %A y");
setlocale(LC_TIME, "de_DE");
echo strftime(" en Alemán %A.\n");
?>
Ejemplo #2 Ejemplo de número de semana con ISO 8601:1988
<?php
/* Diciembre 2002 / Enero 2003
ISO L M X J V S D
--- ----------------------------
51 16 17 18 19 20 21 22
52 23 24 25 26 27 28 29
1 30 31 1 2 3 4 5
2 6 7 8 9 10 11 12
3 13 14 15 16 17 18 19 */
// Imprime: 12/28/2002 - %V,%G,%Y = 52,2002,2002
echo "12/28/2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/28/2002")) . "\n";
// Imprime: 12/30/2002 - %V,%G,%Y = 1,2003,2002
echo "12/30/2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/30/2002")) . "\n";
// Imprime: 1/3/2003 - %V,%G,%Y = 1,2003,2003
echo "1/3/2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2003")) . "\n";
// Imprime: 1/10/2003 - %V,%G,%Y = 2,2003,2003
echo "1/10/2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/10/2003")) . "\n";
/* Diciembre 2004 / Enero 2005
ISO L M X J V S D
--- ----------------------------
51 13 14 15 16 17 18 19
52 20 21 22 23 24 25 26
53 27 28 29 30 31 1 2
1 3 4 5 6 7 8 9
2 10 11 12 13 14 15 16 */
// Imprime: 12/23/2004 - %V,%G,%Y = 52,2004,2004
echo "12/23/2004 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/23/2004")) . "\n";
// Imprime: 12/31/2004 - %V,%G,%Y = 53,2004,2004
echo "12/31/2004 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/31/2004")) . "\n";
// Imprime: 1/2/2005 - %V,%G,%Y = 53,2004,2005
echo "1/2/2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/2/2005")) . "\n";
// Imprime: 1/3/2005 - %V,%G,%Y = 1,2005,2005
echo "1/3/2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2005")) . "\n";
?>
Ejemplo #3 Ejemplo compatible de multi-plataforma usando del modificador %e
<?php
// Jan 1: resulta en: '%e%1%' (%%, e, %%, %e, %%)
$format = '%%e%%%e%%';
// Comprobación para Windows para hallar y remplazar el
// modificador %e adecuadamente
// el modificador %e si existen en el formato
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
$format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format);
}
echo strftime($format);
?>
Ejemplo #4 Mostrar todos los formatos conocidos y desconocidos.
<?php
// Describe los formatos.
$strftimeFormats = array(
'A' => 'Una representación textual completa del día',
'B' => 'Nombre del mes completo, basado en la configuración regional',
'C' => 'Representación de dos dígitos del siglo (año dividido entre 100, truncado a un integer)',
'D' => 'Lo mismo que "%m/%d/%y"',
'E' => '',
'F' => 'Lo mismo que "%Y-%m-%d"',
'G' => 'La versión de cuatro dígitos completa de %g',
'H' => 'Representación de dos dígitos de la hora en formato de 24 horas',
'I' => 'Representación de dos dígitos de la hora en formato de 12 horas',
'J' => '',
'K' => '',
'L' => '',
'M' => 'Representación de dos dígitos de los minutos',
'N' => '',
'O' => '',
'P' => ''am' o 'pm' en minúsculas basados en la hora dada',
'Q' => '',
'R' => 'Lo mismo que "%H:%M',
'S' => 'Representación de dos dígitos de los segundos',
'T' => 'Lo mismo que "%H:%M:%S"',
'U' => 'Número de semana del año dado, comenzando con el primer Domingo como la primera semana',
'V' => 'Número de semana ISO-8601:1988 del año dado, comenzando con la primera semana del año con al menos 4 días de semana, con Lunes siendo el principio de la semana',
'W' => 'Una representación numérica de la semana del año, comenzando con el primer Domingo como la primera semana',
'X' => 'Representación preferida de la hora basda en la configuración regional, sin la fecha',
'Y' => 'Representación de cuatro dígitos del año',
'Z' => 'La opción de índice/abreviatura de la zona horaria NO dada por %z (depende del sistema operativo)',
'a' => 'Una representación textual abreviada del día',
'b' => 'Nombre del mes abreviado, basado en la configuración regional',
'c' => 'Marca preferida de la fecha y hora basadas en la configuración regional',
'd' => 'El día del mes con dos dígitos (con ceros iniciales)',
'e' => 'El día del mes, con un espacio precediendo a los dígitos simples',
'f' => '',
'g' => 'Representación de dos dígitos del año por el estándar ISO-8601:1988 (véase %V)',
'h' => 'Nombre del mes abreviado, basado en la configuración regional (un alias de %b)',
'i' => '',
'j' => 'Día del año, 3 dígitos con ceros iniciales',
'k' => '',
'l' => 'La hora en formato de 12 horas, con un espacio precediendo a los dígitos simples',
'm' => 'Representación de dos dígitos del mes',
'n' => 'Un carácter de nueva línea ("\n")',
'o' => '',
'p' => ''AM' o 'PM' en MAYÚSCULAS basados en la hora dada',
'q' => '',
'r' => 'Lo mismo que "%I:%M:%S %p"',
's' => 'Marca de tiempo del momento de la Época Unix',
't' => 'Un carácter de tabulación ("\t")',
'u' => 'Representación numérica ISO-8601 del día de la semana',
'v' => '',
'w' => 'Representación numérica del día de la semana',
'x' => 'Representación preferida de la fecha basda en la configuración local, sin la hora',
'y' => 'Representación de dos dígitos del año',
'z' => 'El índice de la zona horaria de UTC o la abreviatura (depende del sistema operativo)',
'%' => 'Un carácter de porcentaje literal ("%")',
);
// Resultados.
$strftimeValues = array();
// Evalúa los formatos, mientras suprime cualquier error.
foreach($strftimeFormats as $format => $description){
if (False !== ($value = @strftime("%{$format}"))){
$strftimeValues[$format] = $value;
}
}
// Encuentra el valor más largo.
$maxValueLength = 2 + max(array_map('strlen', $strftimeValues));
// Reporta los formatos conocidos.
foreach($strftimeValues as $format => $value){
echo "Formato conocido : '{$format}' = ", str_pad("'{$value}'", $maxValueLength), " ( {$strftimeFormats[$format]} )\n";
}
// Reporta los formatos desconocidos.
foreach(array_diff_key($strftimeFormats, $strftimeValues) as $format => $description){
echo "Formato desconocido : '{$format}' ", str_pad(' ', $maxValueLength), ($description ? " ( {$description} )" : ''), "\n";
}
?>
El resultado del ejemplo sería algo similar a:
Formato conocido : 'A' = 'Friday' ( Una representación textual completa del día )
Formato conocido : 'B' = 'December' ( Nombre del mes completo, basado en la configuración regional )
Formato conocido : 'H' = '11' ( Representación de dos dígitos de la hora en formato de 24 horas )
Formato conocido : 'I' = '11' ( Representación de dos dígitos de la hora en formato de 12 horas )
Formato conocido : 'M' = '24' ( Representación de dos dígitos de los minutos )
Formato conocido : 'S' = '44' ( Representación de dos dígitos de los segundos )
Formato conocido : 'U' = '48' ( Número de semana del año dado, comenzando con el primer Domingo como la primera semana )
Formato conocido : 'W' = '48' ( Una representación numérica de la semana del año, comenzando con el primer Domingo como la primera semana )
Formato conocido : 'X' = '11:24:44' ( Representación preferida de la hora basda en la configuración regional, sin la fecha )
Formato conocido : 'Y' = '2010' ( Representación de cuatro dígitos del año )
Formato conocido : 'Z' = 'GMT Standard Time' ( La opción de índice/abreviatura de la zona horaria NO dada por %z (depende del sistema operativo) )
Formato conocido : 'a' = 'Fri' ( Una representación textual abreviada del día )
Formato conocido : 'b' = 'Dec' ( Nombre del mes abreviado, basado en la configuración regional )
Formato conocido : 'c' = '12/03/10 11:24:44' ( Marca preferida de la fecha y hora basadas en la configuración regional )
Formato conocido : 'd' = '03' ( El día del mes con dos dígitos (con ceros iniciales) )
Formato conocido : 'j' = '337' ( Día del año, 3 dígitos con ceros iniciales )
Formato conocido : 'm' = '12' ( Representación de dos dígitos del mes )
Formato conocido : 'p' = 'AM' ( 'AM' o 'PM' en MAYÚSCULAS basados en la hora dada )
Formato conocido : 'w' = '5' ( Representación numérica del día de la semana )
Formato conocido : 'x' = '12/03/10' ( Representación preferida de la fecha basda en la configuración local, sin la hora )
Formato conocido : 'y' = '10' ( Representación de dos dígitos del año )
Formato conocido : 'z' = 'GMT Standard Time' ( El índice de la zona horaria de UTC o la abreviatura (depende del sistema operativo) )
Formato conocido : '%' = '%' ( Un carácter de porcentaje literal ("%") )
Formato desconocido : 'C' ( Representación de dos dígitos del siglo (año dividido entre 100, truncado a un integer) )
Formato desconocido : 'D' ( Lo mismo que "%m/%d/%y" )
Formato desconocido : 'E'
Formato desconocido : 'F' ( Lo mismo que "%Y-%m-%d" )
Formato desconocido : 'G' ( La versión de cuatro dígitos completa de %g )
Formato desconocido : 'J'
Formato desconocido : 'K'
Formato desconocido : 'L'
Formato desconocido : 'N'
Formato desconocido : 'O'
Formato desconocido : 'P' ( 'am' o 'pm' en minúsculas basados en la hora dada )
Formato desconocido : 'Q'
Formato desconocido : 'R' ( Lo mismo que "%H:%M )
Formato desconocido : 'T' ( Lo mismo que "%H:%M:%S" )
Formato desconocido : 'V' ( Número de semana ISO-8601:1988 del año dado, comenzando con la primera semana del año con al menos 4 días de semana, con Lunes siendo el principio de la semana )
Formato desconocido : 'e' ( El día del mes, con un espacio precediendo a los dígitos simples )
Formato desconocido : 'f'
Formato desconocido : 'g' ( Representación de dos dígitos del año por el estándar ISO-8601:1988 (véase %V) )
Formato desconocido : 'h' ( Nombre del mes abreviado, basado en la configuración regional (un alias de %b) )
Formato desconocido : 'i'
Formato desconocido : 'k'
Formato desconocido : 'l' ( La hora en formato de 12 horas, con un espacio precediendo a los dígitos simples )
Formato desconocido : 'n' ( Un carácter de nueva línea ("\n") )
Formato desconocido : 'o'
Formato desconocido : 'q'
Formato desconocido : 'r' ( Lo mismo que "%I:%M:%S %p" )
Formato desconocido : 's' ( Marca de tiempo del momento de la Época Unix )
Formato desconocido : 't' ( Un carácter de tabulación ("\t") )
Formato desconocido : 'u' ( Representación numérica ISO-8601 del día de la semana )
Formato desconocido : 'v'
Nota: %G y %V, que están basados en el número de semana ISO 8601:1988, pueden dar resultados inesperados (aunque correctos) si el sistema numérico no se entendió perfectamente. Véase los ejemplos de %V en esta página del manual.
$date
, string $format
)
strptime() devuelve una matriz con la fecha
date analizada, o FALSE si se produjo un error.
Los nombres del mes y del día de la semana y otras cadenas dependientes del lenguaje
están subordinados a la configuración regional local establecida con setlocale() (LC_TIME).
date (string)
La cadena a analizar (p.ej. devuelta por strftime()).
format (string)
El formato usado en date (p.ej. el mismo
que el usado en strftime()). Observe que algunas de las opciones de
formato disponibles en strftime() pueden no tener ningún
efecto en strptime(); el subconjunto exacto que está
soportado variará en base al sistema operativo y a la biblioteca de C que esté
en uso.
Para más información sobre las opciones de formato, lea la página de strftime().
Devuelve una matriz o FALSE en caso de error.
| parámetros | Descripción |
|---|---|
| "tm_sec" | Segundos después del minuto (0-61) |
| "tm_min" | Minutos después de la hora (0-59) |
| "tm_hour" | Hora desde la medianoche (0-23) |
| "tm_mday" | Día del mes (1-31) |
| "tm_mon" | Meses desde Enero (0-11) |
| "tm_year" | Años desde 1900 |
| "tm_wday" | Días desde el Domingo (0-6) |
| "tm_yday" | Días desde el 1 de Enero (0-365) |
| "unparsed" | la parte de date que no fue
reconocida usando el formato format especificado |
Ejemplo #1 Ejemplo de strptime()
<?php
$formato = '%d/%m/%Y %H:%M:%S';
$strf = strftime($formato);
echo "$strf\n";
print_r(strptime($strf, $formato));
?>
El resultado del ejemplo sería algo similar a:
03/10/2004 15:54:19
Array
(
[tm_sec] => 19
[tm_min] => 54
[tm_hour] => 15
[tm_mday] => 3
[tm_mon] => 9
[tm_year] => 104
[tm_wday] => 0
[tm_yday] => 276
[unparsed] =>
)
Nota: Esta función no está implementada en plataformas Windows.
Nota:
Internamente, esta función llama a la función strptime() proporcionada por la biblioteca C del sistema. Esta función puede presentar diferencias notables de comportamiento en diferentes sistemas operativos. Se recomienda el uso de date_parse_from_format(), a la cuál no le afectan estas cosas, en PHP 5.3.0 y posterior.
Nota:
"tm_sec" incluye segundos intercalares (actualmente hasta 2 por año). Para más información acerca de los segundos intercalares, vea el » artículo de Wikipedia sobre segundos intercalares.
Nota:
Antes de PHP 5.2.0, esta función podía devolver un comportamiento indefinido. En particular, las entradas "tm_sec", "tm_min" y "tm_hour" devolverían valores indefinidos.
(PHP 4, PHP 5)
strtotime — Convierte una descripción de fecha/hora textual en Inglés a una fecha Unix
$time
[, int $now = time()
] )
Esta función espera que se proporcione una cadena que contenga un formato de fecha
en Inglés US e intentará convertir ese formato a una fecha Unix (el
número de segundos desde el 1 de Enero del 1970 00:00:00 UTC), relativa
a la marca de tiempo dada en now, o la marca de tiempo
actual si now no se proporciona.
Cada parámetro de esta función utiliza la zona horaria predeterminada a menos que se especifique una en ese parámetro. Se ha de tener cuidado de no usar diferentes zonas horarias en cada parámetro a memos que sea esa la intención. Véase la función date_default_timezone_get() para las diferentes maneras de definir la zona horaria predeterminada.
time
Una cadena de fecha/hora. Los formatos válidos son explicados en Formatos de fecha y hora.
now
La marca de tiempo que se usa como base para el cálculo de las fechas relativas.
Devuelve una marca de tiempo si se tuvo éxito, FALSE si no. Antes de PHP 5.1.0,
esta funcion devolvía -1 si fallaba.
Cada vez que se llame a la función date/time se generará un E_NOTICE
si la zona horaria no es válida, y/o un mensaje E_STRICT
o E_WARNING
si se usa la configuración del sistema o la variable global
TZ. Vea también date_default_timezone_set()
| Versión | Descripción |
|---|---|
| 5.3.0 |
Antes de PHP 5.3.0, 24:00 no era un formato válido y
strtotime() devolvía FALSE.
|
| 5.2.7 | En PHP 5 anterior a 5.2.7, las peticiones de una incidencia de un día de la semana dado en un mes donde ese día de la semana era el primer día del mes, añadía incorrectamente una semana a la marca de tiempo devuelta. Esto ha sido corregido en 5.2.7 y versiones posteriores. |
| 5.1.0 |
Ahora devuelve FALSE si falla, en vez
de -1.
|
| 5.1.0 |
Ahora muestra |
| 5.0.2 | En PHP 5 hasta 5.0.2, "now" y otros momentos relativos son computados erróneamente como la medianoche de hoy. Esto difiere de otras versiones donde es computado como el momento actual. |
| 5.0.0 | Los microsegundos comenzaron a estar permitidos, pero son ignorados. |
| 4.4.0 | En versiones de PHP anteriores a 4.4.0, "next" es computado incorrectamente como +2. Una solución típica para esto es usar "+1". |
Ejemplo #1 Un ejemplo de strtotime()
<?php
echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";
?>
Ejemplo #2 Comprobar si falla
<?php
$cadena = 'No Válida';
// antes de PHP 5.1.0 se debería de comparar con -1, en vez de con false
if (($timestamp = strtotime($cadena)) === false) {
echo "La cadena ($cadena) es falsa";
} else {
echo "$cadena == " . date('l dS \o\f F Y h:i:s A', $timestamp);
}
?>
Nota:
Si el número del año se especifica en un formato de dos dígitos, los valores entre 00-69 hacen referencia a 2000-2069 y 70-99 a 1970-1999. Vea las notas de abajo para las posibles diferencias en sistemas de 32 bit (las fechas posibles podrían terminar en 2038-01-19 03:14:07).
Nota:
El rango válido de una marca de tiempo es típicamente desde Fri, 13 Dec 1901 20:45:54 UTC a Tue, 19 Jan 2038 03:14:07 UTC. (Estas son las fechas que se corresponden con los valores máximo y mínimo de un entero con signo de 32 bit.) Adicionalmente, no todas las plataformas soportan marcas de tiempo negativas, por lo tanto el rango de la fecha puede estar limitado a fechas no anteriores a la época Unix. Esto significa que, p.ej., las fechas anteriores al 1 de Enero del 1970 no funcionarán en Windows, en algunas distribuciones de Linux, y en otros pocos sistemas operativos. PHP 5.1.0 y versiones posteriores superan esta limitación.
Para PHP versión 64-bit, el rángo válido de fechas es en la práctica infinito, ya que 64 bits pueden representar aproximadamente 293.000 millones de años en cualquier dirección.
Nota:
Las fechas en los formatos m/d/y o d-m-y no son ambiguas al observar el separador entre los distintos componentes: si el separador es una barra (/), se asume el formato americano m/d/y; mientras que si el separador es un guión (-) o un punto (.), se asume el formato europeo d-m-y.
Para evitar esta ambigüedad potencial es mejor usar fechas ISO 8601 (YYYY-MM-DD) o DateTime::createFromFormat() cuando sea posible.
Nota:
No es aconsejable utililzar esta función para operaciones matemáticas. Es mejor usar los métodos DateTime::add() y DateTime::sub() de PHP 5.3 y posterior, o el método DateTime::modify() de PHP 5.2.
(PHP 4, PHP 5)
time — Devuelve la fecha Unix actual
Devuelve el momento actual medido como el número de segundos desde la Época Unix (1 de Enero de 1970 00:00:00 GMT).
Ejemplo #1 Ejemplo de time()
<?php
$semana_sig = time() + (7 * 24 * 60 * 60);
// 7 días; 24 horas; 60 minutos; 60 segundos
echo 'Ahora: '. date('Y-m-d') ."\n";
echo 'Semana Siguiente: '. date('Y-m-d', $semana_sig) ."\n";
// o usar strtotime():
echo 'Semana Siguiente: '. date('Y-m-d', strtotime('+1 week')) ."\n";
?>
El resultado del ejemplo sería algo similar a:
Now: 2005-03-30 Next Week: 2005-04-06 Next Week: 2005-04-06
La marca de tiempo del inicio de la petición está disponible en $_SERVER['REQUEST_TIME'] desde PHP 5.1.
(PHP 5 >= 5.2.0)
timezone_abbreviations_list — Alias de DateTimeZone::listAbbreviations()
Esta función es un alias de: DateTimeZone::listAbbreviations()
(PHP 5 >= 5.2.0)
timezone_identifiers_list — Alias de DateTimeZone::listIdentifiers()
Esta función es un alias de: DateTimeZone::listIdentifiers()
Esta función es un alias de: DateTimeZone::getLocation()
(PHP 5 >= 5.1.3)
timezone_name_from_abbr — Devuelve el nombre de la zona horaria desde su abreviatura
$abbr
[, int $gmtOffset = -1
[, int $isdst = -1
]] )
abbr
La abreviatura de la zona horaria.
gmtOffset
Índice de GMT en segundos. Por defecto es -1 lo que significa que la primera zona
horaria buscada que se corresponda con abbr es devuelta.
De otro modo se busca el índice exacto y, sólo si no se encuentra, se devuelve la
priemra zona horaria con cualquier índice.
isdst
Indicador del horario de verano. Por defecto a -1, lo que significa que
si la zona horaria tiene horario de verano no se toma encosideración
en la búsqueda. Si está establecido a 1, entonces se asuma que
el parámetro gmtOffset es un índice con
el horario de verano en efecto; si es 0, entonces se asume que
gmtOffset es un índice sin horario de verano en efecto. Si
abbr no existe, la zona horaria se
busca únicamente mediante gmtOffset y
isdst.
Devuelve el nombre de la zona horaria si se tuvo éxito o FALSE en caso de error.
Ejemplo #1 Un ejemplo de timezone_name_from_abbr()
<?php
echo timezone_name_from_abbr("CET") . "\n";
echo timezone_name_from_abbr("", 3600, 0) . "\n";
?>
El resultado del ejemplo sería algo similar a:
Europe/Berlin Europe/Paris
Esta función es un alias de: DateTimeZone::getName()
Esta función es un alias de: DateTimeZone::getOffset()
Esta función es un alias de: DateTimeZone::__construct()
(PHP 5 >= 5.2.0)
timezone_transitions_get — Alias de DateTimeZone::getTransitions()
Esta función es un alias de: DateTimeZone::getTransitions()
(PHP 5 >= 5.3.0)
timezone_version_get — Obtiene la versión de la base de datos timezonedb
Devuelve la versión actual de timezonedb.
Devuelve un string.
Ejemplo #1 Obtener la versión de timezonedb
<?php
echo timezone_version_get();
?>
El resultado del ejemplo sería algo similar a:
2009.7
Esta sección describe todos los diferentes formatos que entiende el analizador de strtotime(), DateTime y date_create(). Los formatos están agrupados por secciones. En la mayoría de los casos los formatos de diferentes secciones se pueden usar en la misma cadena de fecha/hora. Se dan ejemplos por cada uno de los formatos soportados, así como una descripción del formato. En los formatos, los caracteres entre comillas simples son insensibles a mayúsculas-minúsculas, ('t' podría ser t o T), los caracteres entre comillas dobles son sensibles a mayúsculas-minúsculas ("T" es solamente T).
| Descripción | Formatos | Ejemplos |
|---|---|---|
| fracción | . [0-9]+ | ".21342", ".85" |
| hh | "0"?[1-9] | "1"[0-2] | "04", "7", "12" |
| HH | [01][0-9] | "2"[0-4] | "04", "7", "19" |
| meridiano | [AaPp] .? [Mm] .? [\0\t ] | "A.m.", "pM", "am." |
| MM | [0-5][0-9] | "00", "12", "59" |
| II | [0-5][0-9] | "00", "12", "59" |
| espacio | [ \t] | |
| zh (zona horaria - en inglés tz) | "("? [A-Za-z]{1,6} ")"? | [A-Z][a-z]+([_/][A-Z][a-z]+)+ | "CEST", "Europe/Amsterdam", "America/Indiana/Knox" |
| corrección zh | "GMT"? [+-] hh ":"? MM? | "+0400", "GMT-07:00", "-07:00" |
| Descripción | Formato | Ejemplos |
|---|---|---|
| Sólo hora, con meridiano | hh espacio? meridiano | "4 am", "5PM" |
| Horas y minutos, con meridiano | hh [.:] MM espacio? meridiano | "4:08 am", "7:19P.M." |
| Horas, minutos y segundos, con meridiano | hh [.:] MM [.:] II espacio? meridiano | "4:08:37 am", "7:19:19P.M." |
| MS SQL (Horas, minutos, segundos y fracción con meridiano), sólo PHP 5.3 y posterior | hh ":" MM ":" II [.:] [0-9]+ meridiano | "4:08:39:12313am" |
| Descripción | Formato | Ejemplos |
|---|---|---|
| Horas y minutos | 't'? HH [.:] MM | "04:08", "19.19", "T23:43" |
| Horas y minutos, sin dos puntos | 't'? HH MM | "0408", "t1919", "T2343" |
| Horas, minutos y segundos | 't'? HH [.:] MM [.:] II | "04.08.37", "t19:19:19" |
| Horas, minutos y segundos, sin dos puntos | 't'? HH MM II | "040837", "T191919" |
| Horas, minutos, segundos y zona horaria | 't'? HH [.:] MM [.:] II espacio? ( corrección zh | zh ) | "040837CEST", "T191919-0700" |
| Horas, minutos, segundos y fracción | 't'? HH [.:] MM [.:] II fracción | "04.08.37.81412", "19:19:19.532453" |
| Información de zona horaria | zh | corrección zh | "CEST", "Europe/Amsterdam", "+0430", "GMT-06:00" |
| Descripción | Formato | Ejemplos |
|---|---|---|
| sufijos de día (en inglés) | "st" | "nd" | "rd" | "th" | |
| dd | ([0-2]?[0-9] | "3"[01]) sufijos de día? | "7th", "22nd", "31" |
| DD | "0" [0-9] | [1-2][0-9] | "3" [01] | "07", "31" |
| m | 'january' | 'february' | 'march' | 'april' | 'may' | 'june' | 'july' | 'august' | 'september' | 'october' | 'november' | 'december' | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' | "I" | "II" | "III" | "IV" | "V" | "VI" | "VII" | "VIII" | "IX" | "X" | "XI" | "XII" | |
| M | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' | |
| mm | "0"? [0-9] | "1"[0-2] | "0", "04", "7", "12" |
| MM | "0" [0-9] | "1"[0-2] | "00", "04", "07", "12" |
| y | [0-9]{1,4} | "00", "78", "08", "8", "2008" |
| yy | [0-9]{2} | "00", "08", "78" |
| YY | [0-9]{4} | "2000", "2008", "1978" |
| Descripción | Formato | Ejemplos |
|---|---|---|
| Mes y día americanos | mm "/" dd | "5/12", "10/27" |
| Mes, día y año americanos | mm "/" dd "/" y | "12/22/78", "1/17/2006", "1/17/6" |
| Año de cuatro dígitos, mes y día con baras | YY "/" mm "/" dd | "2008/6/30", "1978/12/22" |
| Año de cuatro dígitos y mes (GNU) | YY "-" mm | "2008-6", "2008-06", "1978-12" |
| Año, mes y día con guiones | y "-" mm "-" dd | "2008-6-30", "78-12-22", "8-6-21" |
| Día, mes y año de cuatro dígitos, con puntos, tabulaciones o guiones | dd [.\t-] mm [.-] YY | "30-6-2008", "22.12\t1978" |
| Día, mes y año de dos dígitos, con puntos o tabulaciones | dd [.\t] mm "." yy | "30.6.08", "22\t12\t78" |
| Día, mes textual y año | dd ([ \t.-])* m ([ \t.-])* y | "30-June 2008", "22DEC78", "14 III 1879" |
| Mes textual y año de cuatro dígitos (Día se restablece a 1) | m ([ \t.-])* YY | "June 2008", "DEC1978", "March 1879" |
| Año de cuatro dígitos y mes textual (Día se restablece a 1) | YY ([ \t.-])* m | "2008 June", "1978-XII", "1879.MArCH" |
| Mes textual, día y año | m ([ .\t-])* dd [,.stndrh\t ]+ y | "July 1st, 2008", "April 17, 1790", "May.9,78" |
| Mes textual y día | m ([ .\t-])* dd [,.stndrh\t ]* | "July 1st,", "Apr 17", "May.9" |
| Día y mes textual | d ([ .\t-])* m | "1 July", "17 Apr", "9.May" |
| Abreviatura de mes, día y año | M "-" DD "-" y | "May-09-78", "Apr-17-1790" |
| Año, abreviatura de mes y día | y "-" M "-" DD | "78-Dec-22", "1814-MAY-17" |
| Año (y sólo el año) | YY | "1978", "2008" |
| Mes textual (y sólo el mes) | m | "March", "jun", "DEC" |
| Descripción | Formato | Ejemplos |
|---|---|---|
| Año, mes y día, de ocho dígitos | YY MM DD | "15810726", "19780417", "18140517" |
| Año de cuatro dígitos, mes y día con barras | YY "/" MM "/" DD | "2008/06/30", "1978/12/22" |
| Año de dos dígitos, mes y dís con barras | yy "-" MM "-" DD | "08-06-30", "78-12-22" |
| Año de cuatro dígitos con signo opcional, mes y día | [+-]? YY "-" MM "-" DD | "-0002-07-26", "+1978-04-17", "1814-05-17" |
Nota:
Para los formatos y e yy, los años por debajo de 100 son tratados de manera especial cuando se usan los símbolos y o yy. Si el año cae en el rango de 0 (inclusive) a 69 (inclusive), se añade 2000. Si el año cae en el rango de 70 (inclusive) a 99 (inclusive) se añade entonces 1900. Esto significa que "00-01-01" se interpreta como "2000-01-01".
Nota:
El formato "Día, mes y año de dos dígitos, con puntos o tabulaciones" (dd [.\t] mm "." yy) solamente funciona con valores de años de 61 (inclusive) a 99 (inclusive) - fuera de esos años el formato de hora "HH [.:] MM [.:] SS" tiene precedencia.
Nota:
El formato "Año (y sólo el año)" solamente funciona si se encotró ya una cadena de hora -- de otro modo este formato es reconocido como HH MM.
Nota:
Es posible poner en exceso y en defecto los formatos dd y DD. Día 0 significa el último día del mes anterios, mientras en exceso empieza a contar desde el mes siguiente. Esto hace que "2008-08-00" equivalga a "2008-07-31" y "2008-06-31" sea equivalente a "2008-07-01" (junio tiene sólo 30 días).
También es posible poner en defecto los formatos mm y MM con el valor 0. Un valor de mes de 0 significa diciemebre del año anterior. Como ejemplo "2008-00-22" es equivalente a "2007-12-22".
Si se combinan los dos hechos anteriores y se ponen por defecto el día y el mes, sucede lo siguiente: "2008-00-00" primero se convierte a "2007-12-00" que después se convierte a "2007-11-30". Esto también sucede con la cadena "0000-00-00", que se transforma en "-0001-11-30" (el año -1 en el calendario ISO 8601, el cuál es 2 A.C. en el calendario gregoriano "proléptico").
| Descripción | Formats | Ejemplos |
|---|---|---|
| DD | "0" [0-9] | [1-2][0-9] | "3" [01] | "02", "12", "31" |
| día del año | "00"[1-9] | "0"[1-9][0-9] | [1-2][0-9][0-9] | "3"[0-5][0-9] | "36"[0-6] | "36"[0-6] "000", "012", "366" |
| fracción | . [0-9]+ | ".21342", ".85" |
| hh | "0"?[1-9] | "1"[0-2] | "04", "7", "12" |
| HH | [01][0-9] | "2"[0-4] | "04", "7", "19" |
| meridiano | [AaPp] .? [Mm] .? [\0\t ] | "A.m.", "pM", "am." |
| ii | [0-5][0-9] | "04", "8", "59" |
| II | [0-5][0-9] | "04", "08", "59" |
| M | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' | |
| MM | [0-5][0-9] | "00", "12", "59" |
| espacio | [ \t] | |
| ss | [0-5][0-9] | "04", "8", "59" |
| SS | [0-5][0-9] | "04", "08", "59" |
| W | "0"[1-9] | [1-4][0-9] | "5"[0-3] | "05", "17", "53" |
| corrección zh | "GMT"? [+-] hh ":"? MM? | "+0400", "GMT-07:00", "-07:00" |
| YY | [0-9]{4} | "2000", "2008", "1978" |
| Descripción | Formato | Ejemplos |
|---|---|---|
| Formato Log Común | dd "/" M "/" YY : HH ":" II ":" SS espacio corrección zh | "10/Oct/2000:13:55:36 -0700" |
| EXIF | YY ":" MM ":" DD " " HH ":" II ":" SS | "2008:08:07 18:11:31" |
| Año ISO con semana ISO | YY "-"? "W" W | "2008W27", "2008-W28" |
| Año ISO con semana a día ISO | YY "-"? "W" W "-"? [0-7] | "2008W273", "2008-W28-3" |
| MySQL | YY "-" MM "-" DD " " HH ":" II ":" SS | "2008-08-07 18:11:31" |
| PostgreSQL: Año con día del año | YY "."? día del año | "2008.197", "2008197" |
| SOAP | YY "-" MM "-" DD "T" HH ":" II ":" SS fracción corrección zh? | "2008-07-01T22:35:17.02", "2008-07-01T22:35:17.03+08:00" |
| Fecha Unix | "@" "-"? [0-9]+ | "@1215282385" |
| XMLRPC | YY MM DD "T" hh ":" II ":" SS | "20080701T22:38:07", "20080701T9:38:07" |
| XMLRPC (Compacto) | YY MM DD 't' hh II SS | "20080701t223807", "20080701T093807" |
| WDDX | YY "-" mm "-" dd "T" hh ":" ii ":" ss | "2008-7-1T9:3:37" |
Nota:
La "W" en los formatos "Año ISO con semana ISO" y "Año ISO con semana y día ISO" es sensible a mayúsculas-minúsculas, sólo se puede usar la "W" mayúscula.
La "T" en los formatos SOAP, XMRPC y WDDX es sensible a mayúsculas-minúsculas, sólo se puede usar la "T" mayúscula.
El formato "Unix Timestamp" establece la zona horaria a UTC.
| Descripción | Formato |
|---|---|
| nombre del día | 'sunday' | 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat' | 'sun' |
| texto de día | 'weekday' | 'weekdays' |
| número | [+-]?[0-9]+ |
| ordinal | 'first' | 'second' | 'third' | 'fourth' | 'fifth' | 'sixth' | 'seventh' | 'eighth' | 'ninth' | 'tenth' | 'eleventh' | 'twelfth' | 'next' | 'last' | 'previous' | 'this' |
| texto relativo | 'next' | 'last' | 'previous' | 'this' |
| espacio | [ \t]+ |
| unidad | (('sec' | 'second' | 'min' | 'minute' | 'hour' | 'day' | 'fortnight' | 'forthnight' | 'month' | 'year') 's'?) | 'weeks' | texto de día |
| Formato | Descripción | Ejemplos |
|---|---|---|
| 'yesterday' | Medianoche de ayer | "yesterday 14:00" |
| 'midnight' | La hora es establecida a 00:00:00 | |
| 'today' | La hora es establecida a 00:00:00 | |
| 'now' | Ahora - esto es simplemente ignorado | |
| 'noon' | La hora es establecida a 12:00:00 | "yesterday noon" |
| 'tomorrow' | Medianoche de mañana | |
| 'back of' hora | 15 minutos después de la hora especificada | "back of 7pm", "back of 15" |
| 'front of' hora | 15 minutos antes de la hora especificada | "front of 5am", "front of 23" |
| 'first day' ' of'? | Esteblece el día al primer día del mes actual. Esta frase se usa mejor seguida de un nombre de mes. | "first day of January 2008" |
| 'last day' ' of'? | Esteblece el día al último día del mes actual. Esta frase se usa mejor seguida de un nombre de mes. | "last day of next month" |
| ordinal espacio nombre del día espacio 'of' | Calcula el x-ésimo día de la semana del mes actual. | "first sat of July 2008" |
| 'last' espacio nombre del día espacio 'of' | Calcula el último día de la semana del mes actual. | "last sat of July 2008" |
| número espacio? (unidad | 'week') | Trata elementos de hora relativos donde el valor es un número. | "+5 weeks", "12 day", "-7 weekdays" |
| ordinal espacio unidad | Trata elementos de hora relativos donde el valor es texto. | "fifth day", "second month" |
| 'ago' | Anula todos los valores de los elementos de hora relativos encontrados anteriormente. | "2 days ago", "8 days ago 14:00", "2 months 5 days ago", "2 months ago 5 days", "2 days ago ago" |
| nombre del día | Avanza al siguiente día con este nombre. | "Monday" |
| texto relativo espacio 'week' | Trata el formato especial "weekday + last/this/next week". | "Monday next week" |
Nota:
Las declaraciones relativas son siempre procesadas después de las declaraciones no relativas. Esto hace que "+1 week july 2008" y "july 2008 +1 week" sean equivalentes.
Las excepciones a esta regla son: "yesterday", "midnight", "today", "noon" y "tomorrow". Téngase en cuenta que "tomorrow 11:00" y "11:00 tomorrow" son diferentes. Considerando la fecha de hoy como "July 23rd, 2008", el primero produce "2008-07-24 11:00" mientras que el segundo produce "2008-07-24 00:00". La razón de esto es que esas cinco declaraciones influyen directamente en el momento actual.
Nota:
Analice las siguiente observaciones cuando el día de la semana actual es el mismo que el día de la semana usado en la cadena de fecha/hora. Sin embargo, el día de la semana actual prodría haber sido (re-)calculado mediante partes no relativas de la cadena de fecha/hora.
- "nombre del día" no avanza a otro día. (Ejemplo: "Wed July 23rd, 2008" significa "2008-07-23").
- "número nombre del día" no avanza a otro día. (Ejemplo: "1 wednesday july 23rd, 2008" significa "2008-07-23").
- "número week nombre del día" añadirá primero el número de semanas, pero no avanzará a otro día. En este caso "número week" y "nombre del día" son dos bloques distintos. (Ejemplo: "+1 week wednesday july 23rd, 2008" significa "2008-07-30").
- "ordinal nombre del día" sí avanza a otro día. (Ejemplo "first wednesday july 23rd, 2008" significa "2008-07-30").
- "número week ordinal nombre del día" primero añadíra el número de semanas, y después avanzará a otro día. En este caso "número week" y "ordinal nombre del día" son dos bloques distintos. (Ejemplo: "+1 week first wednesday july 23rd, 2008" significa "2008-08-06").
- "ordinal nombre del día 'of' " no avanza a otro día. (Ejemplo: "first wednesday of july 23rd, 2008" significa "2008-07-02" ya que la frase específica con 'of' restablece el día del mes a '1' y el '23rd' aquí se ignora).
También observe que el "of" en "ordinal espacio nombre del día espacio 'of' " y "'last' espacio nombre del día espacio 'of' " hace algo especial.
- Establece el día del mes a 1.
- "ordinal nombre del día 'of' " no avanza a otro día. (Ejemplo: "first tuesday of july 2008" significa "2008-07-01").
- "ordinal nombre del día " sí avanza otro día. (Ejemplo: "first tuesday july 2008" significa "2008-07-08", véase también el punto 4 en la lista de arriba).
- "'last' nombre del día 'of' " toma el último nombre del día des mes actual. (Ejemplo: "last wed of july 2008" significa "2008-07-30")
- "'last' nombre del día" toma el último nombre del día desde el día actual. (Ejemplo: "last wed july 2008" significa "2008-06-25"; "july 2008" primero establece la fecha actual a "2008-07-01" y después "last wed" avanza al miércoles anterior, que es "2008-06-25").
Nota:
Los valores relativos al mes se calculan basándose en la longitud de los meses por que los que pasan. Un ejemplo sería "+2 month 2011-11-30", el cual produciría "2012-01-30". Esto es debido a que noviembre tiene 20 días de longitud, y diciembre tiene 31 días de longitud, produciendo un total de 61 días.
Aquí se podrá encontrar una lista completa de los timezones soportados por PHP, que están pensados para ser usados p.ej. date_default_timezone_set().
Nota: La versión más reciente de la base de datos de timezone se puede instalar vía PECL's » timezonedb.
Nota: Esta lista está basada en la versión de base de datos de zonas horarias 2012.3.
| Africa/Abidjan | Africa/Accra | Africa/Addis_Ababa | Africa/Algiers | Africa/Asmara |
| Africa/Asmera | Africa/Bamako | Africa/Bangui | Africa/Banjul | Africa/Bissau |
| Africa/Blantyre | Africa/Brazzaville | Africa/Bujumbura | Africa/Cairo | Africa/Casablanca |
| Africa/Ceuta | Africa/Conakry | Africa/Dakar | Africa/Dar_es_Salaam | Africa/Djibouti |
| Africa/Douala | Africa/El_Aaiun | Africa/Freetown | Africa/Gaborone | Africa/Harare |
| Africa/Johannesburg | Africa/Juba | Africa/Kampala | Africa/Khartoum | Africa/Kigali |
| Africa/Kinshasa | Africa/Lagos | Africa/Libreville | Africa/Lome | Africa/Luanda |
| Africa/Lubumbashi | Africa/Lusaka | Africa/Malabo | Africa/Maputo | Africa/Maseru |
| Africa/Mbabane | Africa/Mogadishu | Africa/Monrovia | Africa/Nairobi | Africa/Ndjamena |
| Africa/Niamey | Africa/Nouakchott | Africa/Ouagadougou | Africa/Porto-Novo | Africa/Sao_Tome |
| Africa/Timbuktu | Africa/Tripoli | Africa/Tunis | Africa/Windhoek |
| America/Adak | America/Anchorage | America/Anguilla | America/Antigua | America/Araguaina |
| America/Argentina/Buenos_Aires | America/Argentina/Catamarca | America/Argentina/ComodRivadavia | America/Argentina/Cordoba | America/Argentina/Jujuy |
| America/Argentina/La_Rioja | America/Argentina/Mendoza | America/Argentina/Rio_Gallegos | America/Argentina/Salta | America/Argentina/San_Juan |
| America/Argentina/San_Luis | America/Argentina/Tucuman | America/Argentina/Ushuaia | America/Aruba | America/Asuncion |
| America/Atikokan | America/Atka | America/Bahia | America/Bahia_Banderas | America/Barbados |
| America/Belem | America/Belize | America/Blanc-Sablon | America/Boa_Vista | America/Bogota |
| America/Boise | America/Buenos_Aires | America/Cambridge_Bay | America/Campo_Grande | America/Cancun |
| America/Caracas | America/Catamarca | America/Cayenne | America/Cayman | America/Chicago |
| America/Chihuahua | America/Coral_Harbour | America/Cordoba | America/Costa_Rica | America/Cuiaba |
| America/Curacao | America/Danmarkshavn | America/Dawson | America/Dawson_Creek | America/Denver |
| America/Detroit | America/Dominica | America/Edmonton | America/Eirunepe | America/El_Salvador |
| America/Ensenada | America/Fort_Wayne | America/Fortaleza | America/Glace_Bay | America/Godthab |
| America/Goose_Bay | America/Grand_Turk | America/Grenada | America/Guadeloupe | America/Guatemala |
| America/Guayaquil | America/Guyana | America/Halifax | America/Havana | America/Hermosillo |
| America/Indiana/Indianapolis | America/Indiana/Knox | America/Indiana/Marengo | America/Indiana/Petersburg | America/Indiana/Tell_City |
| America/Indiana/Vevay | America/Indiana/Vincennes | America/Indiana/Winamac | America/Indianapolis | America/Inuvik |
| America/Iqaluit | America/Jamaica | America/Jujuy | America/Juneau | America/Kentucky/Louisville |
| America/Kentucky/Monticello | America/Knox_IN | America/Kralendijk | America/La_Paz | America/Lima |
| America/Los_Angeles | America/Louisville | America/Lower_Princes | America/Maceio | America/Managua |
| America/Manaus | America/Marigot | America/Martinique | America/Matamoros | America/Mazatlan |
| America/Mendoza | America/Menominee | America/Merida | America/Metlakatla | America/Mexico_City |
| America/Miquelon | America/Moncton | America/Monterrey | America/Montevideo | America/Montreal |
| America/Montserrat | America/Nassau | America/New_York | America/Nipigon | America/Nome |
| America/Noronha | America/North_Dakota/Beulah | America/North_Dakota/Center | America/North_Dakota/New_Salem | America/Ojinaga |
| America/Panama | America/Pangnirtung | America/Paramaribo | America/Phoenix | America/Port-au-Prince |
| America/Port_of_Spain | America/Porto_Acre | America/Porto_Velho | America/Puerto_Rico | America/Rainy_River |
| America/Rankin_Inlet | America/Recife | America/Regina | America/Resolute | America/Rio_Branco |
| America/Rosario | America/Santa_Isabel | America/Santarem | America/Santiago | America/Santo_Domingo |
| America/Sao_Paulo | America/Scoresbysund | America/Shiprock | America/Sitka | America/St_Barthelemy |
| America/St_Johns | America/St_Kitts | America/St_Lucia | America/St_Thomas | America/St_Vincent |
| America/Swift_Current | America/Tegucigalpa | America/Thule | America/Thunder_Bay | America/Tijuana |
| America/Toronto | America/Tortola | America/Vancouver | America/Virgin | America/Whitehorse |
| America/Winnipeg | America/Yakutat | America/Yellowknife |
| Antarctica/Casey | Antarctica/Davis | Antarctica/DumontDUrville | Antarctica/Macquarie | Antarctica/Mawson |
| Antarctica/McMurdo | Antarctica/Palmer | Antarctica/Rothera | Antarctica/South_Pole | Antarctica/Syowa |
| Antarctica/Vostok |
| Arctic/Longyearbyen |
| Asia/Aden | Asia/Almaty | Asia/Amman | Asia/Anadyr | Asia/Aqtau |
| Asia/Aqtobe | Asia/Ashgabat | Asia/Ashkhabad | Asia/Baghdad | Asia/Bahrain |
| Asia/Baku | Asia/Bangkok | Asia/Beirut | Asia/Bishkek | Asia/Brunei |
| Asia/Calcutta | Asia/Choibalsan | Asia/Chongqing | Asia/Chungking | Asia/Colombo |
| Asia/Dacca | Asia/Damascus | Asia/Dhaka | Asia/Dili | Asia/Dubai |
| Asia/Dushanbe | Asia/Gaza | Asia/Harbin | Asia/Hebron | Asia/Ho_Chi_Minh |
| Asia/Hong_Kong | Asia/Hovd | Asia/Irkutsk | Asia/Istanbul | Asia/Jakarta |
| Asia/Jayapura | Asia/Jerusalem | Asia/Kabul | Asia/Kamchatka | Asia/Karachi |
| Asia/Kashgar | Asia/Kathmandu | Asia/Katmandu | Asia/Kolkata | Asia/Krasnoyarsk |
| Asia/Kuala_Lumpur | Asia/Kuching | Asia/Kuwait | Asia/Macao | Asia/Macau |
| Asia/Magadan | Asia/Makassar | Asia/Manila | Asia/Muscat | Asia/Nicosia |
| Asia/Novokuznetsk | Asia/Novosibirsk | Asia/Omsk | Asia/Oral | Asia/Phnom_Penh |
| Asia/Pontianak | Asia/Pyongyang | Asia/Qatar | Asia/Qyzylorda | Asia/Rangoon |
| Asia/Riyadh | Asia/Saigon | Asia/Sakhalin | Asia/Samarkand | Asia/Seoul |
| Asia/Shanghai | Asia/Singapore | Asia/Taipei | Asia/Tashkent | Asia/Tbilisi |
| Asia/Tehran | Asia/Tel_Aviv | Asia/Thimbu | Asia/Thimphu | Asia/Tokyo |
| Asia/Ujung_Pandang | Asia/Ulaanbaatar | Asia/Ulan_Bator | Asia/Urumqi | Asia/Vientiane |
| Asia/Vladivostok | Asia/Yakutsk | Asia/Yekaterinburg | Asia/Yerevan |
| Atlantic/Azores | Atlantic/Bermuda | Atlantic/Canary | Atlantic/Cape_Verde | Atlantic/Faeroe |
| Atlantic/Faroe | Atlantic/Jan_Mayen | Atlantic/Madeira | Atlantic/Reykjavik | Atlantic/South_Georgia |
| Atlantic/St_Helena | Atlantic/Stanley |
| Australia/ACT | Australia/Adelaide | Australia/Brisbane | Australia/Broken_Hill | Australia/Canberra |
| Australia/Currie | Australia/Darwin | Australia/Eucla | Australia/Hobart | Australia/LHI |
| Australia/Lindeman | Australia/Lord_Howe | Australia/Melbourne | Australia/North | Australia/NSW |
| Australia/Perth | Australia/Queensland | Australia/South | Australia/Sydney | Australia/Tasmania |
| Australia/Victoria | Australia/West | Australia/Yancowinna |
| Europe/Amsterdam | Europe/Andorra | Europe/Athens | Europe/Belfast | Europe/Belgrade |
| Europe/Berlin | Europe/Bratislava | Europe/Brussels | Europe/Bucharest | Europe/Budapest |
| Europe/Chisinau | Europe/Copenhagen | Europe/Dublin | Europe/Gibraltar | Europe/Guernsey |
| Europe/Helsinki | Europe/Isle_of_Man | Europe/Istanbul | Europe/Jersey | Europe/Kaliningrad |
| Europe/Kiev | Europe/Lisbon | Europe/Ljubljana | Europe/London | Europe/Luxembourg |
| Europe/Madrid | Europe/Malta | Europe/Mariehamn | Europe/Minsk | Europe/Monaco |
| Europe/Moscow | Europe/Nicosia | Europe/Oslo | Europe/Paris | Europe/Podgorica |
| Europe/Prague | Europe/Riga | Europe/Rome | Europe/Samara | Europe/San_Marino |
| Europe/Sarajevo | Europe/Simferopol | Europe/Skopje | Europe/Sofia | Europe/Stockholm |
| Europe/Tallinn | Europe/Tirane | Europe/Tiraspol | Europe/Uzhgorod | Europe/Vaduz |
| Europe/Vatican | Europe/Vienna | Europe/Vilnius | Europe/Volgograd | Europe/Warsaw |
| Europe/Zagreb | Europe/Zaporozhye | Europe/Zurich |
| Indian/Antananarivo | Indian/Chagos | Indian/Christmas | Indian/Cocos | Indian/Comoro |
| Indian/Kerguelen | Indian/Mahe | Indian/Maldives | Indian/Mauritius | Indian/Mayotte |
| Indian/Reunion |
| Pacific/Apia | Pacific/Auckland | Pacific/Chatham | Pacific/Chuuk | Pacific/Easter |
| Pacific/Efate | Pacific/Enderbury | Pacific/Fakaofo | Pacific/Fiji | Pacific/Funafuti |
| Pacific/Galapagos | Pacific/Gambier | Pacific/Guadalcanal | Pacific/Guam | Pacific/Honolulu |
| Pacific/Johnston | Pacific/Kiritimati | Pacific/Kosrae | Pacific/Kwajalein | Pacific/Majuro |
| Pacific/Marquesas | Pacific/Midway | Pacific/Nauru | Pacific/Niue | Pacific/Norfolk |
| Pacific/Noumea | Pacific/Pago_Pago | Pacific/Palau | Pacific/Pitcairn | Pacific/Pohnpei |
| Pacific/Ponape | Pacific/Port_Moresby | Pacific/Rarotonga | Pacific/Saipan | Pacific/Samoa |
| Pacific/Tahiti | Pacific/Tarawa | Pacific/Tongatapu | Pacific/Truk | Pacific/Wake |
| Pacific/Wallis | Pacific/Yap |
| Brazil/Acre | Brazil/DeNoronha | Brazil/East | Brazil/West | Canada/Atlantic |
| Canada/Central | Canada/East-Saskatchewan | Canada/Eastern | Canada/Mountain | Canada/Newfoundland |
| Canada/Pacific | Canada/Saskatchewan | Canada/Yukon | CET | Chile/Continental |
| Chile/EasterIsland | CST6CDT | Cuba | EET | Egypt |
| Eire | EST | EST5EDT | Etc/GMT | Etc/GMT+0 |
| Etc/GMT+1 | Etc/GMT+10 | Etc/GMT+11 | Etc/GMT+12 | Etc/GMT+2 |
| Etc/GMT+3 | Etc/GMT+4 | Etc/GMT+5 | Etc/GMT+6 | Etc/GMT+7 |
| Etc/GMT+8 | Etc/GMT+9 | Etc/GMT-0 | Etc/GMT-1 | Etc/GMT-10 |
| Etc/GMT-11 | Etc/GMT-12 | Etc/GMT-13 | Etc/GMT-14 | Etc/GMT-2 |
| Etc/GMT-3 | Etc/GMT-4 | Etc/GMT-5 | Etc/GMT-6 | Etc/GMT-7 |
| Etc/GMT-8 | Etc/GMT-9 | Etc/GMT0 | Etc/Greenwich | Etc/UCT |
| Etc/Universal | Etc/UTC | Etc/Zulu | Factory | GB |
| GB-Eire | GMT | GMT+0 | GMT-0 | GMT0 |
| Greenwich | Hongkong | HST | Iceland | Iran |
| Israel | Jamaica | Japan | Kwajalein | Libya |
| MET | Mexico/BajaNorte | Mexico/BajaSur | Mexico/General | MST |
| MST7MDT | Navajo | NZ | NZ-CHAT | Poland |
| Portugal | PRC | PST8PDT | ROC | ROK |
| Singapore | Turkey | UCT | Universal | US/Alaska |
| US/Aleutian | US/Arizona | US/Central | US/East-Indiana | US/Eastern |
| US/Hawaii | US/Indiana-Starke | US/Michigan | US/Mountain | US/Pacific |
| US/Pacific-New | US/Samoa | UTC | W-SU | WET |
| Zulu |
Por favor no utilice ninguna de las zonas horarias listadas aquí (excepto UTC), sólo exiten por razones de compatibilidad con versiones anteriores.
ncurses (new curses) es una emulacion de software gratuito de curses en System V Rel 4.0 (y superior). Usa el formato terminfo, soporta rellenos, colores, resaltados múltiples, forma de caracteres y función de mapeo de teclas. Debido a la naturaleza interactiva de esta biblioteca, será de uso pequeño para escribir aplicaciones Web, pero puede ser útil al escribir scripts que tienen la intención de usar PHP desde la línea de comandos.
Las características disponibles, como los colores, dependen del terminal que se esté usando. Use funciones tales como ncurses_has_colors(), ncurses_can_change_color(), y ncurses_has_ic() para comprobar las capacidades individuales.
Nota:
Esta extensión se ha movido al repositorio de » PECL y ya no es más distribuída con PHP a partir de PHP 5.3.0.
ncurses está disponible para las siguientes plataformas:
Necesita las bibliotecas y ficheros de cabecera de ncurses. Descargue la última versión desde » ftp://ftp.gnu.org/pub/gnu/ncurses/ o desde otro servidor copia GNU.
Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/ncurses.
El soporte para caracteres anchos CRT en pantalla (ncursesw) se añadió en la versión 1.0.1 de esta versión de PECL.
Esta extensión no tiene directivas de configuración definidas en php.ini.
Esta extensión recursos de ventana, panel y relleno.
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
En caso de error, las funciones de ncurses devuelven -1. Algunas funciones devuelven 0 en caso de éxito. Véase las páginas pertinenetes en la documentación para los valores de retorno reales.
| constante | sifnificado |
|---|---|
NCURSES_COLOR_BLACK |
sin color (negro) |
NCURSES_COLOR_WHITE |
blanco |
NCURSES_COLOR_RED |
rojo - soportado cuando el terminal está en modo color |
NCURSES_COLOR_GREEN |
verde - soportado cuando el terminal está en modo color |
NCURSES_COLOR_YELLOW |
amarillo - soportado cuando el terminal está en modo color |
NCURSES_COLOR_BLUE |
azul - soportado cuando el terminal está en modo color |
NCURSES_COLOR_CYAN |
cian - soportado cuando el terminal está en modo color |
NCURSES_COLOR_MAGENTA |
magenta - soportado cuando el terminal está en modo color |
| constante | significado |
|---|---|
NCURSES_KEY_F0 - NCURSES_KEY_F64 |
teclas de función F1 - F64 |
NCURSES_KEY_DOWN |
flecha abajo |
NCURSES_KEY_UP |
flecha arriba |
NCURSES_KEY_LEFT |
flecha izquierda |
NCURSES_KEY_RIGHT |
flecha derecha |
NCURSES_KEY_HOME |
tecla inicio (arriba+flecha izquierda) |
NCURSES_KEY_BACKSPACE |
retroceso |
NCURSES_KEY_DL |
borra línea |
NCURSES_KEY_IL |
insertar línea |
NCURSES_KEY_DC |
borra carácter |
NCURSES_KEY_IC |
insertar carcter o entrar en modo insertar |
NCURSES_KEY_EIC |
salir del modo insertar carcácter |
NCURSES_KEY_CLEAR |
limpiar pantalla |
NCURSES_KEY_EOS |
limpiar hasta el final de la pantalla |
NCURSES_KEY_EOL |
limpiar hasta el final de línea |
NCURSES_KEY_SF |
avanzar una línea |
NCURSES_KEY_SR |
retroceder una línea |
NCURSES_KEY_NPAGE |
página siguiente |
NCURSES_KEY_PPAGE |
página anterior |
NCURSES_KEY_STAB |
establecer tabulación |
NCURSES_KEY_CTAB |
limpiar tabulación |
NCURSES_KEY_CATAB |
limpiar todas las tabulaciones |
NCURSES_KEY_SRESET |
reset suave (parcial) |
NCURSES_KEY_RESET |
reset o reset duro |
NCURSES_KEY_PRINT |
imprimir |
NCURSES_KEY_LL |
inferior izquierda |
NCURSES_KEY_A1 |
superior izquierda del teclado numérico |
NCURSES_KEY_A3 |
superio derecha del teclado numérico |
NCURSES_KEY_B2 |
centro del teclado numérico |
NCURSES_KEY_C1 |
inferior izquierda del teclado numérico |
NCURSES_KEY_C3 |
nferior derecha del teclado numérico |
NCURSES_KEY_BTAB |
retroceso tabulación |
NCURSES_KEY_BEG |
principio |
NCURSES_KEY_CANCEL |
cancelar |
NCURSES_KEY_CLOSE |
cerrar |
NCURSES_KEY_COMMAND |
cmd (comando) |
NCURSES_KEY_COPY |
copiar |
NCURSES_KEY_CREATE |
crear |
NCURSES_KEY_END |
fin |
NCURSES_KEY_EXIT |
salir |
NCURSES_KEY_FIND |
buscar |
NCURSES_KEY_HELP |
ayuda |
NCURSES_KEY_MARK |
marcar |
NCURSES_KEY_MESSAGE |
mensaje |
NCURSES_KEY_MOVE |
mover |
NCURSES_KEY_NEXT |
siguiente |
NCURSES_KEY_OPEN |
abrir |
NCURSES_KEY_OPTIONS |
opciones |
NCURSES_KEY_PREVIOUS |
anterior |
NCURSES_KEY_REDO |
re-hacer |
NCURSES_KEY_REFERENCE |
ref (referencia) |
NCURSES_KEY_REFRESH |
refrescar |
NCURSES_KEY_REPLACE |
reemplazar |
NCURSES_KEY_RESTART |
reiniciar |
NCURSES_KEY_RESUME |
continuar |
NCURSES_KEY_SAVE |
guardar |
NCURSES_KEY_SBEG |
principio corrido |
NCURSES_KEY_SCANCEL |
cancelar corrido |
NCURSES_KEY_SCOMMAND |
comando corrido |
NCURSES_KEY_SCOPY |
copiar corrido |
NCURSES_KEY_SCREATE |
crear corrido |
NCURSES_KEY_SDC |
borrar caracter corrido |
NCURSES_KEY_SDL |
borrar línea corrido |
NCURSES_KEY_SELECT |
seleccionar |
NCURSES_KEY_SEND |
fin corrido |
NCURSES_KEY_SEOL |
fin de línea corrido |
NCURSES_KEY_SEXIT |
salir corrido |
NCURSES_KEY_SFIND |
buscar corrido |
NCURSES_KEY_SHELP |
ayuda corrido |
NCURSES_KEY_SHOME |
inicio corrido |
NCURSES_KEY_SIC |
entrada corrido |
NCURSES_KEY_SLEFT |
flecha izquierda corrido |
NCURSES_KEY_SMESSAGE |
mensaje corrido |
NCURSES_KEY_SMOVE |
mover corrido |
NCURSES_KEY_SNEXT |
siguiente corrido |
NCURSES_KEY_SOPTIONS |
opciones corrido |
NCURSES_KEY_SPREVIOUS |
anterior corrido |
NCURSES_KEY_SPRINT |
imprimir corrido |
NCURSES_KEY_SREDO |
re-hacer corrido |
NCURSES_KEY_SREPLACE |
reemplazar corrido |
NCURSES_KEY_SRIGHT |
flecha derecha corrido |
NCURSES_KEY_SRSUME |
continuar corrido |
NCURSES_KEY_SSAVE |
guardar corrido |
NCURSES_KEY_SSUSPEND |
suspender corrido |
NCURSES_KEY_UNDO |
deshacer |
NCURSES_KEY_MOUSE |
ha ocurrido un evento del ratón |
NCURSES_KEY_MAX |
valor máximo de tecla |
| constante | significado |
|---|---|
NCURSES_BUTTON1_RELEASED - NCURSES_BUTTON4_RELEASED |
botón (1-4) soltado |
NCURSES_BUTTON1_PRESSED - NCURSES_BUTTON4_PRESSED |
botón (1-4) presionado |
NCURSES_BUTTON1_CLICKED - NCURSES_BUTTON4_CLICKED |
botón (1-4) clicado |
NCURSES_BUTTON1_DOUBLE_CLICKED -
NCURSES_BUTTON4_DOUBLE_CLICKED |
botón (1-4) doble clicado |
NCURSES_BUTTON1_TRIPLE_CLICKED -
NCURSES_BUTTON4_TRIPLE_CLICKED |
botón (1-4) triple clicado |
NCURSES_BUTTON_CTRL |
ctrl pulsada durante clic |
NCURSES_BUTTON_SHIFT |
shift pulsada durante clic |
NCURSES_BUTTON_ALT |
alt pulsada durante clic |
NCURSES_ALL_MOUSE_EVENTS |
niformar de todos los eventos de ratón |
NCURSES_REPORT_MOUSE_POSITION |
informar de la posición del ratón |
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_addch — Agregar un caracter en la posición actual y avanzar el cursor
$ch
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
ch
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_addchnstr — Agregar cadena con atributos y longitud especificada en la posición actual
$s
, int $n
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
s
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_addchstr — Agregar una cadena con atributos en la posición actual
$s
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
s
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_addnstr — Agregar una cadena con la longitud especificada en la posición actual
$s
, int $n
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
s
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_addstr — Imprimir texto en la posición actual
$text
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
text
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_assume_default_colors — Definir colores predeterminados para el color 0
$fg
, int $bg
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
fg
bg
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_attroff — Deshabilitar los atributos dados
$attributes
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
attributes
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_attron — Habilitar los atributos dados
$attributes
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
attributes
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_attrset — Establecer los atributos dados
$attributes
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
attributes
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_baudrate — Devuelve la tasa de baudios de la terminal
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_beep — Producir un beep en la terminal
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
ncurses_beep() envía una alerta auditiva (campana), y si no es posible produce un relampagueo en la pantalla.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_bkgd — Establecer la propiedad de segundo plano para la pantalla de la terminal
$attrchar
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
attrchar
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_bkgdset — Controla el segundo plano de la pantalla
$attrchar
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
attrchar
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_border — Dibujar un borde alrededor de la pantalla usando caracteres con atributos
$left
, int $right
, int $top
, int $bottom
, int $tl_corner
, int $tr_corner
, int $bl_corner
, int $br_corner
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Dibuja las líneas y esquinas especificadas alrededor de la ventana principal.
¡Utilice ncurses_wborder() para los bordes alrededor de sub-ventanas!
Cada parámetro espera 0 para dibujar una línea, o 1 para ignorarla.
izquierda
derecha
arriba
abajo
esquina_sup_izq
Esquina superior izquierda
esquina_sup_der
Esquina superior derecha
esquina_inf_izq
Esquina inferior izquierda
esquina_inf_der
Esquina inferior derecha
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_bottom_panel — Mueve un panel visible al fondo de la pila
$panel
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
panel
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_can_change_color — Comprobar si las definiciones de color del terminal se pueden cambiar
Comprueba si el terminal tiene capacidades de color y si el programador puede cambiar las definiciones de color usando ncurses_init_color(). ncurses debe ser inicializado usando ncurses_init() antes de llamar a esta función.
Esta función no tiene parámetros.
Devuelve TRUE si el programador puede cambiar las definiciones de color,
FALSE si no.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_cbreak — Desactivar el buffer de entrada
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Deshabilita el buffer de línea y el procesamiento de caracters (la interrumpción y el control de flujo de caracteres no son afectados), haciendo que los caracterse tecleados por el usuario estén disponibles inmediatamente para el programa.
Devuelve TRUE o NCURSES_ERR si ocurrión un error.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_clear — Limpiar la pantalla
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Limpia la pantalla completamente sin usar caracteres en blanco.
Nota: ncurses_clear() limpia la pantalla sin usar caracteres en blanco, que tienen la misma apariencia del segundo plano actual. Para limpiar la pantalla con caracteres en blanco, use ncurses_erase().
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_clrtobot — Limpiar la pantalla desde la posición actual al final
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Elimina todas las líneas desde el cursor hasta el fin de la pantalla y crea caracteres en blanco. Los caracteres en blanco creados por ncurses_clrtobot() tienen la apariencia del segundo plano actual.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_clrtoeol — Limpiar la pantalla desde la posición actual al final de la línea
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Elimina la línea actual desde la posición actual hasta el final. Los caracteres en blanco creados por ncurses_clrtoeol() tienen la apariencia del segundo plano actual.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_color_content — Obtiene los componentes RGB de un color
$color
, int &$r
, int &$g
, int &$b
)Obtiene los componentes rojo, verde y azul de la definición de color dada. Las capacidades de color del terminal deben ser inicializadas con ncurses_start_color() antes de llamar a esta función.
color
El número del color del que se va a obtener información. Puede ser una de las constantes de color predefinidas.
r
Una referencia a la que devolver el componente rojo del color. El valor devuelto a la referencia estará entre 0 y 1000.
g
Una referencia a la que devolver el componente verde del color. El valor devuelto a la referencia estará entre 0 y 1000.
b
Una referencia a la que devolver el componente azul del color. El valor devuelto a la referencia estará entre 0 y 1000.
Returns -1 si la función tuvo éxito, y 0 si ncurses o las capacidades de color del terminal no han sido inicializadas.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_color_set — Establecer los colores de primer plano y fondo activos
$pair
)Establecer los colores de primer plano y fondo activos. Cualquier carácter escrito después de llamar a esta función tendrá estos colores. Esta función requiere colores de terminal para ser soportados e inicializados usando ncurses_start_color() con antelación.
ncurses utiliza pares de colores para especificar los colores de primer plano y fondo. Use ncurses_init_pair() para definir una pareja de colores.
pair
La pareja de colores que va a obtener los colores de primer plano y fondo para establecer los colores activos.
Devuelve -1 en caso de éxito, y 0 en caso de fallo.
Ejemplo #1 Writing a string with a specified color to the screen
<?php
ncurses_init();
// Si el terminal soporta colores, inicializar y establecer el color activo
if (ncurses_has_colors()) {
ncurses_start_color();
ncurses_init_pair(1, NCURSES_COLOR_YELLOW, NCURSES_COLOR_BLUE);
ncurses_color_set(1);
}
// Escribir una cadena en la ubicación especificada
ncurses_mvaddstr(10, 10, "¡Hola mundo! ¡Amarillo sobre texto azul!");
// Volcar la salida a la pantalla
ncurses_refresh();
ncurses_end();
?>
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_curs_set — Establecer el estado del cursor
$visibility
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
visibility
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_def_prog_mode — Guarda los modos de terminal (programa)
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Guarda los modos de terminal actuales para programa (en curses) para su uso por ncurses_reset_prog_mode().
Devuelve FALSE en caso de éxito, TRUE de lo contrario.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_def_shell_mode — Guarda los modos de terminal (intérprete de comandos)
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Guarda los modos de terminal actuales de intérprete de comandos (no en curses) para su uso con ncurses_reset_shell_mode().
Devuelve FALSE en caso de éxito, TRUE de lo contrario.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_define_key — Definir un código de tecla
$definition
, int $keycode
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
definicion
codigo_tecla
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_del_panel — Remover un panel de la pila y eliminarlo (pero no la ventana asociada)
$panel
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
panel
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_delay_output — Retrasar la salida en la terminal usando caracteres de relleno
$milliseconds
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
milliseconds
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_delch — Eliminar un caracter en la posición actual, mover el resto de la línea hacia la izquierda
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Elimina el caracter bajo el cursor. Todos los caracteres a la derecha del cursor en la misma línea son desplazados una posición hacia la izquierda, y el último caracter en la línea es llenado con un caracter en blanco. La posición del cursor no cambia.
Devuelve FALSE en caso de tener éxito, o TRUE de lo contrario.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_deleteln — Eliminar una línea en la posición actual, mover el resto de la pantalla hacia arriba
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Elimina la línea actual bajo la posición del cursor. Todas las líneas por debajo de la línea actual son desplazadas una línea hacia arriba. La línea más baja es limpiada. La posición del cursor no cambia.
Devuelve FALSE en caso de éxito, TRUE de lo contrario.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_delwin — Eliminar una ventana ncurses
$window
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_doupdate — Escribir todas las actualizaciones preparadas sobre la terminal
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Compara la pantalla virtual con la pantalla física y actualiza la pantalla física. De esta forma es más efectivo que usando múltiples llamadas de actualización.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_echo — Activar la repetición de entrada del teclado
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Habilita el modo de repetición. Todos los caracteres escritos por el usuario son repetidos por ncurses_getch().
Devuelve FALSE de tener éxito, o TRUE si ocurrió algún error.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_echochar — Salida de un caracter sencillo, incluyendo actualización
$character
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
character
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_end — Dejar de usar ncurses, limpiar la pantalla
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_erase — Limpiar pantalla de terminal
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Llena la pantalla de terminal con caracteres en blanco.
Los caracteres creados tienen la apariencia del segundo plano actual, establecida por ncurses_bkgd().
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_erasechar — Devuelve el caracter de borrado actual
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Devuelve el caracter de borrado actual.
El caracter de borrado actual, como una cadena.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_filter — Definir LINES para iniscr() y newterm() a 1
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_flash — Relampaguear la pantalla de terminal (campana visual)
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Relampaguea la pantalla, y si no es posible, envía una aletra auditiva (campana).
Devuelve FALSE de tener éxito, TRUE de lo contrario.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_flushinp — Volcar el búfer de entrada de teclado
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Envía cualquier contenido que haya sido escrito y no haya sido leido aun por su programa.
Devuelve FALSE en caso de tener éxito, TRUE de lo contrario.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_getch — Leer un caracter desde el teclado
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_getmaxyx — Devuelve el tamaño de una ventana
$window
, int &$y
, int &$x
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Obtiene los tamaños horizontal y vertical de la
ventana dada y los coloca en las variables
entregadas.
Las variables deben ser pasadas como referencias, de modo que sean actualizadas cuando el usuario cambie el tamaño de la terminal.
window
La ventana medida
y
Esto será establecido con la altura de la ventana
x
Esto será establecido con el ancho de la ventana
No devuelve ningún valor.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_getmouse — Lee los eventos del ratón
&$mevent
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
ncurses_getmouse() lee los eventos del ratón de la cola.
mevent
Las opciones del evento serán distribuidas en este parámetro que ha de ser un array, pasado por referencia (véase el ejemplo de abajo).
En caso de éxito será distribuido un array con las siguientes claves:
"id" : Id para distinguir múltiples dispositivos
"x" : posición x relativa a la pantalla en las celdas de caracteres
"y" : posición y relativa a la pantalla en las celdas de caracteres
"z" : actualmente no soportado
"mmask" : Acción del ratón
Devuelve FALSE si un evento de ratón está realmente visible en la ventana dada,
de otro modo devuelve TRUE.
Ejemplo #1 Ejemplo de ncurses_getmouse()
<?php
switch (ncurses_getch()){
case NCURSES_KEY_MOUSE:
if (!ncurses_getmouse($mevent)){
if ($mevent["mmask"] & NCURSES_MOUSE_BUTTON1_PRESSED){
$mouse_x = $mevent["x"]; // Guardar la posición del ratón
$mouse_y = $mevent["y"];
}
}
break;
default:
/* .... */
}
?>
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_getyx — Devuelve la posición de cursor actual para una ventana
$window
, int &$y
, int &$x
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
y
x
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_halfdelay — Colocar la terminal en modo de medio retraso
$tenth
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
decimo
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_has_colors — Comprueba si el terminal tiene capacidades de color
Comprueba si el terminal tiene capacidades de color. Esta función se puede usar para escribir programas independientes del terminal. ncurses debe ser inicializado usando ncurses_init() antes de llamar a esta función.
Esta función no tiene parámetros.
Devuelve TRUE si el terminal tiene capacidades de color, FALSE si no.
Ejemplo #1 Escribir una cadena con un color especificado en la pantalla
<?php
ncurses_init();
// Si el terminal soporta colores, inicializar y establecer el color activo
if (ncurses_has_colors()) {
ncurses_start_color();
ncurses_init_pair(1, NCURSES_COLOR_YELLOW, NCURSES_COLOR_BLUE);
ncurses_color_set(1);
}
// Escribir una cadena en la ubicación especificada
ncurses_mvaddstr(10, 10, "¡Hola mundo! ¡Amarillo sobre texto azul!");
// Volcar la salida a la pantalla
ncurses_refresh();
ncurses_end();
?>
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_has_ic — Chequear por el soporte de inserción y borrado
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Chequea si existe soporte de inserción y borrado de la terminal.
Devuelve TRUE cuando la terminal tiene soporte de inserción/borrado,
FALSE de lo contrario.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_has_il — Chequea el soporte de inserción y borrado
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Chequea si existe soporte de inserción y borrado de líneas de la terminal.
Devuelve TRUE cuando la terminal tiene soporte de inserción/borrado de
líneas, FALSE de lo contrario.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_has_key — Chequear por la presencia de una tecla de función en el teclado de la terminal
$keycode
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
keycode
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_hide_panel — Remover un panel de la pila, haciéndolo invisible
$panel
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
panel
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_hline — Dibujar una línea horizontal en la posición actual usando un caracter con atributos, y de máximo n caracteres de largo
$charattr
, int $n
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
caracter_atributos
n
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_inch — Obtener el caracter y los atributos de la posición actual
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Devuelve el caracter desde de la posición actual.
Devuelve el caracter, como una cadena.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_init_color — Definir un color de termimal
$color
, int $r
, int $g
, int $b
)Define o redefine el color dado. Cuando se llama a esta función, todas los casos del color dado en la pantalla, si los hay, son cambiados inmediatamente a la nueva definición.
Las capacidades de color deben ser soportadas por el terminal e inicializadas usando ncurses_start_color() antes de llamar a esta función Además, el terminal debe tener capacidad para cambiar de color; use ncurses_can_change_color() para comprobarlo.
color
El número de identificación del color a redefinir. Puede ser una de las constnates de color predeterminadas.
r
Un valor de color, entre 0 y 1000, para el componente rojo.
g
Un valor de color, entre 0 y 1000, para el componente verde.
b
Un valor de color, entre 0 y 1000, para el componente azul.
Devuelve -1 si la función tuvo éxito, y 0 si ncurses o las capacidades de color del terminal no han sido inicializadas o el terminal no tiene capacidad de cambiar de color.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_init_pair — Definir una pareja de colores
$pair
, int $fg
, int $bg
)Define o redefine la pareja de colores dada para obtener los colores de primer plano y fondo dados. Si la pareja de colores estaba previamente inicializada, se refresca la pantalla y todas los casos de ella son cambiados para reflejar la nueva definición.
Las capacidades de color deben ser inicializadas usando ncurses_start_color() antes de llamar a esta función. Por omisión, la primera pareja de colores (pareja de colores 0) se asume que es blanco sobre negro, pero se puede cambiar usando ncurses_assume_default_colors().
pair
El número de la pareja de colores a definir.
fg
El color de primer plano de la pareja de colroes. Pude ser uno de los colores predefinidos o uno definido por ncurses_init_color() si el terminal tiene capacidades de cambio de color.
bg
El color de fondo de la pareja de colores. Pude ser uno de los colores predefinidos o uno definido por ncurses_init_color() si el terminal tiene capacidades de cambio de color.
Devuelve -1 si la función tuvo éxito, y 0 si ncurses o el soporte para colores no fue inicializado.
Observe que las capacidades de cambio de color no son necesarias para definir pares de colores de colores preexistentes, excepto solo para los cambios de definiciones (componentes rojo, verde y azul) de los colores en sí por ncurses_init_color().
Ejemplo #1 Escrivir una cadena con un color especificado en la pantalla
<?php
ncurses_init();
// Si el terminal soporta colores, inicializar y establecer el color activo
if (ncurses_has_colors()) {
ncurses_start_color();
ncurses_init_pair(1, NCURSES_COLOR_YELLOW, NCURSES_COLOR_BLUE);
ncurses_color_set(1);
}
// Escrivir una cadena en una ubicación especificada
ncurses_mvaddstr(10, 10, "¡Hola mundo! ¡Amarillo sobre texto azul!");
// Volcar la salida a la pantalla
ncurses_refresh();
ncurses_end();
?>
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_init — Inicializar ncurses
Inicializa la interfaz de ncurses. Esta función debe ser usada antes de otras llamadas funciones de ncurses.
Observe que ncurses_end() debe ser llamada antes de salir del programa, o el terminal no será restaurado a un modo no visual porpio.
Esta función no tiene parámetros.
No devuelve ningún valor.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_insch — Insertar un caracter, moviendo el resto de la línea, incluyendo el caracter en la posición actual
$character
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
character
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_insdelln — Insertar líneas antes de la línea actual, desplazando hacia abajo (los números negativos eliminan líneas y desplazan hacia arriba)
$count
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
count
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_insertln — Insertar una línea, mover el resto de la pantalla hacia abajo
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Inserta una nueva línea antes de la línea actual. La línea más baja se perderá.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_insstr — Insertar cadena en la posición actual, moviendo el resto de la línea hacia la derecha
$text
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
text
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_instr — Lee una cadena desde la pantalla de terminal
&$buffer
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Lee una cadena desde la terminal y devuelve el número de caracteres leidos desde la posición del caracter actual hasta el fin de línea.
buffer
Los caracteres. Los atributos son retirados de los caracteres.
Devuelve el número de caracteres.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_isendwin — Ncurses está en modo endwin, se puede realizar una salida normal por pantalla
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Comprueba si ncurses está en modo endwin.
Devuelve TRUE, si ncurses_end() ha sido llamada
sin ninguna llamada subsiguiente a ncurses_wrefresh(),
FALSE si no.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_keyok — Habilitar o deshabilitar un código de tecla
$keycode
, bool $enable
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
keycode
enable
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_keypad — Activa o desactiva el teclado numérico
$window
, bool $bf
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
bf
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_killchar — Devuelve el caracter de eliminación de línea actual
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Devuelve el caracter de eliminación de línea actual.
Devuelve el caracter de eliminación de línea, como una cadena.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_longname — Devuelve la descripción de la terminal
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Devuelve una descripción detallada de la terminal.
Devuelve la descripción, como una cadena truncada a 128 caracteres. En
caso de fallos, devuelve NULL.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_meta — Habilita/deshabilita la meta-información de 8-bits de tecla
$window
, bool $8bit
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
8bit
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mouse_trafo — Transforma coordenadas
&$y
, int &$x
, bool $toscreen
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
y
x
toscreen
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mouseinterval — Establecer el tiempo de espera para clics de botón del mouse
$milliseconds
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
milliseconds
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mousemask — Establece las opciones del ratón
$newmask
, int &$oldmask
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Establece los eventos del ratón para ser reportados. Por omisión no se informará de ningún evento de ratón.
Los eventos de ratón están representados por NCURSES_KEY_MOUSE en el
flujo de entrada de ncurses_wgetch(). Para leer la información del evento
y sacar el evento de la cola, llame a ncurses_getmouse().
newmask
Las opciones de máscara del ratón pueden ser establecida con las siguienetes constantes predefinidas:
NCURSES_BUTTON1_PRESSED
NCURSES_BUTTON1_RELEASED
NCURSES_BUTTON1_CLICKED
NCURSES_BUTTON1_DOUBLE_CLICKED
NCURSES_BUTTON1_TRIPLE_CLICKED
NCURSES_BUTTON2_PRESSED
NCURSES_BUTTON2_RELEASED
NCURSES_BUTTON2_CLICKED
NCURSES_BUTTON2_DOUBLE_CLICKED
NCURSES_BUTTON2_TRIPLE_CLICKED
NCURSES_BUTTON3_PRESSED
NCURSES_BUTTON3_RELEASED
NCURSES_BUTTON3_CLICKED
NCURSES_BUTTON3_DOUBLE_CLICKED
NCURSES_BUTTON3_TRIPLE_CLICKED
NCURSES_BUTTON4_PRESSED
NCURSES_BUTTON4_RELEASED
NCURSES_BUTTON4_CLICKED
NCURSES_BUTTON4_DOUBLE_CLICKED
NCURSES_BUTTON4_TRIPLE_CLICKED
NCURSES_BUTTON_SHIFT>
NCURSES_BUTTON_CTRL
NCURSES_BUTTON_ALT
NCURSES_ALL_MOUSE_EVENTS
NCURSES_REPORT_MOUSE_POSITION
Como efecto secundario, establecer una máscara de ratón a cero en
newmask descativa el puntero del
ratón. Establecer un valor distinto de cero activa el puntero del ratón.
oldmask
Esto establecerá el valor anterior de la máscara de eventos del ratón.
Devuelve una máscar para indicar cual de los eventos de ratón especificados en el
parámetro newmask pueden ser reportados. En caso de
fallo completo devuelve 0.
Ejemplo #1 Ejemplo de ncurses_mousemask()
<?php
$newmask = NCURSES_BUTTON1_CLICKED + NCURSES_BUTTON1_RELEASED;
$mask = ncurses_mousemask($newmask, $oldmask);
if ($mask & $newmask){
printf("Todas las opciones de ratón especificadas serán soportadas\n");
}
?>
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_move_panel — Mueve un panel de modo que su esquina superior izquierda se encuentre en [comienzo_x, comienzo_y]
$panel
, int $startx
, int $starty
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
panel
startx
starty
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_move — Mover la posición de salida
$y
, int $x
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
y
x
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvaddch — Mover la posición actual y agregar un caracter
$y
, int $x
, int $c
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
y
x
c
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvaddchnstr — Mover la posición y agregar una cadena con atributos con la longitud especificada
$y
, int $x
, string $s
, int $n
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
y
x
s
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvaddchstr — Mover la posición y agregar una cadena con atributos
$y
, int $x
, string $s
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
y
x
s
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvaddnstr — Mover la posición y agregar una cadena con la longitud especificada
$y
, int $x
, string $s
, int $n
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
y
x
s
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvaddstr — Mover la posición y agregar una cadena
$y
, int $x
, string $s
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
y
x
s
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvcur — Mover el cursor inmediatamente
$old_y
, int $old_x
, int $new_y
, int $new_x
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
old_y
old_x
new_y
new_x
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvdelch — Mover la posición y eliminar un caracter, desplazar el resto de la línea hacia la izquierda
$y
, int $x
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
y
x
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvgetch — Mover la posición y obtener el caracter en la nueva posición
$y
, int $x
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
y
x
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvhline — Establecer una nueva posición y dibujar una línea horizontal usando un caracter con atributos y una longitud máxima de n caracteres
$y
, int $x
, int $attrchar
, int $n
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
y
x
attrchar
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvinch — Mover la posición y obtener el caracter con atributos en la nueva posición
$y
, int $x
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
y
x
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvvline — Establecer una nueva posición y dibujar una línea vertical usando un caracter con atributos y una longitud máxima de n caracteres
$y
, int $x
, int $attrchar
, int $n
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
y
x
attrchar
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvwaddstr — Añadir una cadena en una posicón nueva de la ventana
$window
, int $y
, int $x
, string $text
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
y
x
text
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_napms — Dormir
$milliseconds
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
milliseconds
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_new_panel — Crear un nuevo panel y asociarlo con una ventana
$window
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_newpad — Crea un nuevo pad (ventana)
$rows
, int $cols
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
rows
cols
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_newwin — Crear una nueva ventana
$rows
, int $cols
, int $y
, int $x
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Crea una nueva ventana en donde dibujar elementos.
Cuando se creen ventanas adicionales, recuerde usar ncurses_getmaxyx() para verificar el espacio disponible, ya que el tamaño de terminal es individual y puede variar.
rows
Número de filas
cols
Número de columnas
y
coordenada y del origen
x
coordenada x del origen
Devuelve un ID de recurso para la nueva ventana.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_nl — Traducir línea nueva y retorno de carro / alimentación de línea
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_nocbreak — Cambiar la terminal a modo normal (cooked)
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Devuelve la terminal a modo normal (cooked). Inicialmente la terminal puede o no estar en modo cbreak, ya que el modo se hereda. De tal modo que un programa debería llamar a ncurses_cbreak() y ncurses_nocbreak() explícitamente.
Devuelve TRUE si ocurrió un error, o FALSE de lo contrario.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_noecho — Desactivar la repetición de entrada del teclado
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Previene la repetición de los caracteres escritos por el usuario.
Devuelve TRUE si ocurre un error, o FALSE de lo contrario.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_nonl — No traducir línea nueva y retorno de carro / alimentación de línea
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_noqiflush — No realizar volcados en caracteres de señales
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_noraw — Salir del modo puro en la terminal
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Retira la terminal del modo puro. El modo puro (raw) es similar al modo cbrek, en tanto que los caracteres escritos son pasados inmediatamente al programa del usuario. Las diferencias consisten en que, en modo puro, los caracteres de control de interrupción, salida, suspensión y flujo son todos pasados sin ser interpretados, en lugar de generar una señal.
Devuelve TRUE si ocurrió un error, o FALSE de lo contrario.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_pair_content — Obtiene los colores de primer plano y fondo de una pareja de colores
$pair
, int &$f
, int &$b
)Obtiene los colores de primer plano y fondo que constituyen la pareja de colores dada. La capacidad de color del terminal debe ser inicializada con ncurses_start_color() antes de llamar a esta función.
pair
EL númeero de la pareja de colores de la que obtener información.
f
Una referencia para la cual devuelve el color de primer plano de la pareja de colores. La información devuelta será un número de color aludiendo a uno de los colores predefinidos o a un color previamente definido por ncurses_init_color() si el terminal soporta el cambio de color.
b
Una referencia para la cual devuelve el color de fondo de la pareja de colores. La información devuelta será un número de color aludiendo a uno de los colores predefinidos o a un color previamente definido por ncurses_init_color() si el terminal soporta el cambio de color.
Devuelve -1 si la función tuvo éxito, y 0 si ncurses o las capacidades de color del terminal no han sido inicializadas.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_panel_above — Devuelve el panel encima del panel indicado
$panel
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
panel
Si el panel es null, devuelve el panel al fondo de la pila.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_panel_below — Devuelve el panel por debajo del panel indicado
$panel
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
panel
Si el panel no existe, devuelve el panel más arriba en la pila
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_panel_window — Devuelve la ventana asociada con el panel
$panel
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
panel
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_pnoutrefresh — Copia una región desde un pad a la pantalla virtual
$pad
, int $pminrow
, int $pmincol
, int $sminrow
, int $smincol
, int $smaxrow
, int $smaxcol
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
pad
pminrow
pmincol
sminrow
smincol
smaxrow
smaxcol
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_prefresh — Copia una región desde un pad a la pantalla virtual
$pad
, int $pminrow
, int $pmincol
, int $sminrow
, int $smincol
, int $smaxrow
, int $smaxcol
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
pad
pminrow
pmincol
sminrow
smincol
smaxrow
smaxcol
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_putp — Aplicar la información de márgenes a la cadena e imprimirla
$text
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
text
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_qiflush — Producir volcado en caracteres de señales
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_raw — Colocar la terminal en modo puro
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Coloca la terminal en modo puro. El modo puro es similar al modo cbreak, en tanto que los caracteres escritos son pasados inmediatamente al programa del usuario. Las diferencias consisten en que, en modo puro, los caracteres de control de interrupción, salida, suspensión y flujo son todos pasados sin ser interpretados, en lugar de generar una señal.
Devuelve TRUE si ocurre algún error, o FALSE de lo contrario.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_refresh — Refrescar la pantalla
$ch
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
ch
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_replace_panel — Reemplaza la ventana asociada con el panel
$panel
, resource $window
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
panel
window
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_reset_prog_mode — Restablece el modo de programa guardado por def_prog_mode
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_reset_shell_mode — Restablece el modo de intérprete de comandos guardado por def_shell_mode
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_resetty — Restablece el estado guardado de la terminal
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Recupera el estado de la terminal, el cual fue guardado previamente al llamar ncurses_savetty().
Siempre devuelve FALSE.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_savetty — Guarda el estado de la terminal
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Guarda el estado actual de la terminal. El estado de terminal guardado puede ser recuperado con la función ncurses_resetty().
Siempre devuelve FALSE.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_scr_dump — Vuelca el contenido de la pantalla en un archivo
$filename
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
filename
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_scr_init — Inicializar la pantalla desde un volcado en un archivo
$filename
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
filename
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_scr_restore — Recuperar la pantalla desde un volcado en un archivo
$filename
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
filename
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_scr_set — Heredar la pantalla de un volcado en un archivo
$filename
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
filename
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_scrl — Desplazar el contenido de la ventana hacia arriba o abajo sin cambiar la posición actual
$count
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
count
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_show_panel — Coloca un panel invisible al comienzo de la pila, haciéndola visible
$panel
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
panel
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_attr — Devuelve el atributo de la etiqueta suave de teclado
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Devuelve el atributo de la etiqueta suave de teclado actual.
El atributo, como un entero.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_attroff — Deshabilitar los atributos dados para las etiquetas suaves de teclado
$intarg
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
intarg
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_attron — Habilitar los atributos dados para las etiquetas suaves de funciones de teclado
$intarg
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
intarg
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_attrset — Definir los atributos dados para las etiquetas suaves de funciones de teclado
$intarg
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
intarg
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_clear — Limpia las etiquetas suaves de la pantalla
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
La función ncurses_slk_clear() limpia las etiquetas suaves de teclado de la pantalla.
Devuelve TRUE en caso de fallo, o FALSE de lo contrario.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_color — Establece el color para las etiquetas suaves de teclado
$intarg
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
intarg
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_init — Inicializa las funciones de tecla de etiquetación suave
$format
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Inicializa las funciones de tecla de etiquetación suave
Esta función debe ser llamada antes de llamar a ncurses_init() o a ncurses_newwin().
format
Si ncurses_init() utiliza finalmente una línea desde stdscr para emular etiquetas suaves, este parámetro determina cómo las etiquetas están dispuestas en la pantalla.
0 indica una disposición 3-2-3 de las etiquetas, 1 indica una disposición 4-4 y 2 indica el modo PC como 4-4-4, pero además se creará una línea de índice.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_noutrefresh — Copia las etiquetas suaves de teclado a la pantalla virtual
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_refresh — Copia las etiquetas suaves de teclado a la pantalla
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Copia etiquetas suaves de teclado desde la pantalla virtual a la pantalla física.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_restore — Recupera las etiquetas suaves de teclado
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Recupera las etiquetas suaves de teclado después de que se ha completado un proceso ncurses_slk_clear().
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_set — Establece las etiquetas de teclado
$labelnr
, string $label
, int $format
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
labelnr
label
format
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_touch — Obliga a que se produzca salida cuando se ejecute ncurses_slk_noutrefresh
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Obliga a que todas las etiquetas suaves sean desplegadas la próxima vez que se realice un llamado a ncurses_slk_noutrefresh().
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_standend — Dejar de usar el atributo 'standout'
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_standout — Comenzar a usar el atributo 'standout'
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_start_color — Inicializa la funcionalidad de color
Inicializa la funcionalidad de color en ncurses. Esta función debe ser llamada antes de llamar a cualquier función de manipulación de color y después de llamar a ncurses_init(). Es una buena práctica llamar a esta función justo después de ncurses_init().
Esta función no tiene parámetros.
Devuelve 0 en caso de éxito, o -1 si la tabla de colores no pudo ser asignada o ncurses no fue inicializado.
Ejemplo #1 Writing a string with a specified color to the screen
<?php
ncurses_init();
// Si el terminal soporta colores, inicializar y establecer el color activo
if (ncurses_has_colors()) {
ncurses_start_color();
ncurses_init_pair(1, NCURSES_COLOR_YELLOW, NCURSES_COLOR_BLUE);
ncurses_color_set(1);
}
// Escribir una cadena en la ubicación especificada
ncurses_mvaddstr(10, 10, "¡Hola mundo! ¡Amarillo sobre texto azul!");
// Volcar la salida a la pantalla
ncurses_refresh();
ncurses_end();
?>
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_termattrs — Devuelve un valor OR lógico de todas las banderas de atributos soportados por la terminal
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_termname — Devuelve el nombre (corto) de la terminal
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Devuelve el nombre corto de las terminales.
Devuelve el nombre corto de la terminal, truncado a 14 caracteres. En
caso de fallo, devuelve NULL.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_timeout — Establecer el tiempo de espera para secuencias especiales de teclas
$millisec
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
millisec
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_top_panel — Mueve un panel visible al tope de la pila
$panel
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
panel
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_typeahead — Especificar un descriptor de archivo diferente para el chequeo de escritura siguiente
$fd
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
fd
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_ungetch — Colocar un caracter de vuelta en la secuencia de entrada
$keycode
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
keycode
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_ungetmouse — Coloca un evento de mouse en la cola
$mevent
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Coloca un evento KEY_MOUSE en la cola de eventos devueltos y asocia con
él los datos de estado y coordenadas relativas-a-pantalla de celda de
caracter especificadas en evento_mouse.
mevent
Una matriz asociativa especificando las opciones del evento:
"id" : Id para distinguir múltiples dispositivos
"x" : posición x relativa a la pantalla en celdas de caracter
"y" : posición y relativa a la pantalla en celdas de caracter
"z" : por el momento sin soporte
"mmask" : acción del mouse
Devuelve FALSE en caso de éxito, o TRUE de lo contrario.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_update_panels — Refresca la pantalla virtual, para reflejar las relaciones entre los paneles en la pila
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_use_default_colors — Asignar los colores predeterminados de la terminal al id de color -1
Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_use_env — Controlar el uso de información del entorno sobre el tamaño de la terminal
$flag
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
flag
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_use_extended_names — Controlar el uso de nombres extendidos en descripciones de información de terminal
$flag
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
flag
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_vidattr — Desplegar la cadena en la terminal con el atributo de modo de video
$intarg
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
intarg
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_vline — Dibujar una línea vertical en la posición actual usando un caracter con atributos y una longitud máxima de n caracteres
$charattr
, int $n
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
charattr
n
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_waddch — Agrega un caracter en la posición actual de una ventana y avanza el cursor
$window
, int $ch
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
ch
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_waddstr — Imprime un texto en la posición actual de una ventana
$window
, string $str
[, int $n
] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
str
n
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wattroff — Deshabilita los atributos para una ventana
$window
, int $attrs
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
attrs
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wattron — Habilita los atributos para una ventana
$window
, int $attrs
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
attrs
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wattrset — Establecer los atributos para una ventana
$window
, int $attrs
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
attrs
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wborder — Dibuja un borde alrededor de la ventana usando caracteres con atributos
$window
, int $left
, int $right
, int $top
, int $bottom
, int $tl_corner
, int $tr_corner
, int $bl_corner
, int $br_corner
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Dibuja las líneas y esquinas indicadas alrededor de la
window dada.
Use ncurses_border() for borders around the main window.
Cada parámetro espera 0 para dibujar una línea, y 1 para saltarla.
window
La ventana en la cual operar
left
right
top
bottom
tl_corner
Esquina superior izquierda
tr_corner
Esquina superior derecha
bl_corner
Esquina inferior izquierda
br_corner
Esquina inferior derecha
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wclear — Limpia la ventana
$window
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wcolor_set — Establece parejas de colores en la ventana
$window
, int $color_pair
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
color_pair
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_werase — Eliminar los contenidos de la ventana
$window
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wgetch — Lee un caracter desde el teclado (en la ventana)
$window
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_whline — Dibuja una línea horizontal en una ventana en la posición actual usando un caracter con atributos y un largo máximo de n caracteres
$window
, int $charattr
, int $n
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
charattr
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wmouse_trafo — Transforma coordenadas de ventana/stdscr
$window
, int &$y
, int &$x
, bool $toscreen
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
x
y
toscreen
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wmove — Mueve la posición de salida de la ventana
$window
, int $y
, int $x
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
y
x
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wnoutrefresh — Copia la ventana a la pantalla virtual
$window
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wrefresh — Refrescar la ventana en la pantalla de terminal
$window
)Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wstandend — Finaliza el modo standout para una ventana
$window
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wstandout — Ingresar a modo standout en una ventana
$window
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wvline — Dibuja una línea vertical en una ventana en la posición actual usando un caracter con atributos y una longitud máxima de n caracteres
$window
, int $charattr
, int $n
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
window
charattr
n
Esta es una extensión del lenguaje PHP para la librería RedHat Newt, una ventana de terminal y librería widge para escribir aplicaciones con interfaz de usuario amigables. Una vez que esta extensión está activada en PHP ofrecerá el uso de widgets Newt, tales como ventanas, botones, casillas de verificación, botones de radio, etiquetas, editboxes, scrolls, textareas, scales etc. El uso de esta extensión es muy similar a la Newt API original del lenguaje de programación C.
This module uses the functions of the RedHat Newt library. You need libnewt version >= 0.51.0.
Esta extensión » PECL no se distribuye con PHP. Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/newt.
En PHP 4 el código fuente de estas extensiones PECL puede ser encontrado en el directorio ext/ dentro del código fuente de PHP o a través del anterior enlace a PECL. Para poder utilizar estas funciones, debe compilar PHP CGI o CLI con soporte newt mediante el uso de la opción de configuración --with-newt[=DIR] .
Nota:
Esta extensión no está disponible para la plataforma Windows.
Es posible que necesite las librerías curses y slang, con el fin de compilar esta extensión. Para especificar las ubicaciones de las librerías, use las siguientes opciones de configuración: --with-curses-dir=/path/to/libcurses --with-slang-dir=/path/to/libslang
Esta extensión no tiene directivas de configuración definidas en php.ini.
This extension uses two resource types: "newt component" and "newt grid".
Resource type "newt component" is returned by functions, which create common newt widgets (for example: newt_button())
Resource type "newt grid" is a special link identifier for components, returned by newt grid factory functions (for example: newt_create_grid())
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
| constant | meaning |
|---|---|
NEWT_EXIT_HOTKEY |
hotkey defined by newt_form_add_hot_key() was pressed |
NEWT_EXIT_COMPONENT |
some component has caused form to exit |
NEWT_EXIT_FDREADY |
file descriptor specified in newt_form_watch_fd() is ready to be read or written to |
NEWT_EXIT_TIMER |
time specified in newt_form_set_timer() has elapsed |
| constant | meaning |
|---|---|
NEWT_COLORSET_ROOT |
|
NEWT_COLORSET_BORDER |
|
NEWT_COLORSET_WINDOW |
|
NEWT_COLORSET_SHADOW |
|
NEWT_COLORSET_TITLE |
|
NEWT_COLORSET_BUTTON |
|
NEWT_COLORSET_ACTBUTTON |
|
NEWT_COLORSET_CHECKBOX |
|
NEWT_COLORSET_ACTCHECKBOX |
|
NEWT_COLORSET_ENTRY |
|
NEWT_COLORSET_LABEL |
|
NEWT_COLORSET_LISTBOX |
|
NEWT_COLORSET_ACTLISTBOX |
|
NEWT_COLORSET_TEXTBOX |
|
NEWT_COLORSET_ACTTEXTBOX |
|
NEWT_COLORSET_HELPLINE |
|
NEWT_COLORSET_ROOTTEXT |
|
NEWT_COLORSET_EMPTYSCALE |
|
NEWT_COLORSET_FULLSCALE |
|
NEWT_COLORSET_DISENTRY |
|
NEWT_COLORSET_COMPACTBUTTON |
|
NEWT_COLORSET_ACTSELLISTBOX |
|
NEWT_COLORSET_SELLISTBOX |
| constant | meaning |
|---|---|
NEWT_ARG_LAST |
|
NEWT_ARG_APPEND |
| constant | meaning |
|---|---|
NEWT_FLAGS_SET |
|
NEWT_FLAGS_RESET |
|
NEWT_FLAGS_TOGGLE |
| constant | meaning |
|---|---|
NEWT_FLAG_RETURNEXIT |
Exit form, when component is activated |
NEWT_FLAG_SCROLL |
Component is scrollable |
NEWT_FLAG_DISABLED |
Component is disabled |
NEWT_FLAG_BORDER |
|
NEWT_FLAG_WRAP |
Wrap text |
NEWT_FLAG_NOF12 |
Don't exit form on pressing F12 |
NEWT_FLAG_MULTIPLE |
|
NEWT_FLAG_SELECTED |
Component is selected |
NEWT_FLAG_CHECKBOX |
Component is checkbox |
NEWT_FLAG_PASSWORD |
Entry component is password entry |
NEWT_FLAG_SHOWCURSOR |
Show cursor |
| constant | meaning |
|---|---|
NEWT_FD_READ |
|
NEWT_FD_WRITE |
|
NEWT_FD_EXCEPT |
| constant | meaning |
|---|---|
NEWT_CHECKBOXTREE_UNSELECTABLE |
|
NEWT_CHECKBOXTREE_HIDE_BOX |
|
NEWT_CHECKBOXTREE_COLLAPSED |
|
NEWT_CHECKBOXTREE_EXPANDED |
|
NEWT_CHECKBOXTREE_UNSELECTED |
|
NEWT_CHECKBOXTREE_SELECTED |
| constant | meaning |
|---|---|
NEWT_ENTRY_SCROLL |
|
NEWT_ENTRY_RETURNEXIT |
|
NEWT_ENTRY_DISABLED |
| constant | meaning |
|---|---|
NEWT_LISTBOX_RETURNEXIT |
| constant | meaning |
|---|---|
NEWT_TEXTBOX_WRAP |
Wrap text in the textbox |
NEWT_TEXTBOX_SCROLL |
Scroll text in the textbox |
| constant | meaning |
|---|---|
NEWT_FORM_NOF12 |
Don't exit form on F12 press |
| constant | meaning |
|---|---|
NEWT_KEY_TAB |
|
NEWT_KEY_ENTER |
|
NEWT_KEY_SUSPEND |
|
NEWT_KEY_ESCAPE |
|
NEWT_KEY_RETURN |
|
NEWT_KEY_EXTRA_BASE |
|
NEWT_KEY_UP |
|
NEWT_KEY_DOWN |
|
NEWT_KEY_LEFT |
|
NEWT_KEY_RIGHT |
|
NEWT_KEY_BKSPC |
|
NEWT_KEY_DELETE |
|
NEWT_KEY_HOME |
|
NEWT_KEY_END |
|
NEWT_KEY_UNTAB |
|
NEWT_KEY_PGUP |
|
NEWT_KEY_PGDN |
|
NEWT_KEY_INSERT |
|
NEWT_KEY_F1 |
|
NEWT_KEY_F2 |
|
NEWT_KEY_F3 |
|
NEWT_KEY_F4 |
|
NEWT_KEY_F5 |
|
NEWT_KEY_F6 |
|
NEWT_KEY_F7 |
|
NEWT_KEY_F8 |
|
NEWT_KEY_F9 |
|
NEWT_KEY_F10 |
|
NEWT_KEY_F11 |
|
NEWT_KEY_F12 |
|
NEWT_KEY_RESIZE |
| constant | meaning |
|---|---|
NEWT_ANCHOR_LEFT |
|
NEWT_ANCHOR_RIGHT |
|
NEWT_ANCHOR_TOP |
|
NEWT_ANCHOR_BOTTOM |
| constant | meaning |
|---|---|
NEWT_GRID_FLAG_GROWX |
|
NEWT_GRID_FLAG_GROWY |
|
NEWT_GRID_EMPTY |
|
NEWT_GRID_COMPONENT |
|
NEWT_GRID_SUBGRID |
This example is a PHP port of RedHat 'setup' utility dialog, executed in text mode.
Ejemplo #1 Newt Usage Example
<?php
newt_init ();
newt_cls ();
newt_draw_root_text (0, 0, "Test Mode Setup Utility 1.12");
newt_push_help_line (null);
newt_draw_root_text (-30, 0, "(c) 1999-2002 RedHat, Inc");
newt_get_screen_size ($rows, $cols);
newt_open_window ($rows/2-17, $cols/2-10, 34, 17, "Choose a Tool");
$form = newt_form ();
$list = newt_listbox (3, 2, 10);
foreach (array (
"Authentication configuration",
"Firewall configuration",
"Mouse configuration",
"Network configuration",
"Printer configuration",
"System services") as $l_item)
{
newt_listbox_add_entry ($list, $l_item, $l_item);
}
$b1 = newt_button (5, 12, "Run Tool");
$b2 = newt_button (21, 12, "Quit");
newt_form_add_component ($form, $list);
newt_form_add_components ($form, array($b1, $b2));
newt_refresh ();
newt_run_form ($form);
newt_pop_window ();
newt_pop_help_line ();
newt_finished ();
newt_form_destroy ($form);
?>
(PECL newt >= 0.1)
newt_bell — Enviar sonido bip a la terminal
Esta función envía un sonido bip a la terminal.
Nota:
Dependiendo de la configuración de la terminal, el bip puede que sea o no sea audible.
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_centered_window — Abrir una ventana centrada de un tamaño específico
$width
, int $height
[, string $title
] )Abre una ventana centrada de un tamaño específico.
width
Ancho de la ventana
height
Alto de la vetana
title
Título de la ventana
Valor no definido.
(PECL newt >= 0.1)
newt_checkbox_get_value — Obtener el valor del recurso checkbox
$checkbox
)Esta función devuelve el caracter en la secuencia que indica el valor actual del checkbox.
checkbox
Devuelve el caracter indicando el valor del checkbox.
(PECL newt >= 0.1)
newt_checkbox_set_flags — Configura el recurso checkbox
$checkbox
, int $flags
, int $sense
)Esta función permite definir varias opciones en el recurso checkbox.
checkbox
flags
sense
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_checkbox_set_value — Establece el valor de la checkbox
$checkbox
, string $value
)Esta función permite establecer el valor actual del recurso checkbox.
checkbox
value
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_checkbox_tree_add_item — Añade un nuevo ítem al árbol checkbox
$checkboxtree
, string $text
, mixed $data
, int $flags
, int $index
[, int $...
] )Esta función permite añadir un nuevo ítem al árbol checkbox.
checkboxtree
text
data
flags
index
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_checkbox_tree_find_item — Finds an item in the checkbox tree
Finds an item in the checkbox tree by item's data.
checkboxtree
data
Returns checkbox tree item resource, or NULL if it wasn't found.
(PECL newt >= 0.1)
newt_checkbox_tree_get_current — Returns checkbox tree selected item
This method returns checkbox tree selected tem.
checkboxtree
Returns current (selected) checkbox tree item.
(PECL newt >= 0.1)
newt_checkbox_tree_get_entry_value —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
checkboxtree
data
(PECL newt >= 0.1)
newt_checkbox_tree_get_multi_selection —
$checkboxtree
, string $seqnum
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
checkboxtree
seqnum
(PECL newt >= 0.1)
newt_checkbox_tree_get_selection —
$checkboxtree
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
checkboxtree
(PECL newt >= 0.1)
newt_checkbox_tree_multi —
$left
, int $top
, int $height
, string $seq
[, int $flags
] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
left
top
height
seq
flags
(PECL newt >= 0.1)
newt_checkbox_tree_set_current —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
checkboxtree
data
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_checkbox_tree_set_entry_value —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
checkboxtree
data
value
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_checkbox_tree_set_entry —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
checkboxtree
data
text
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_checkbox_tree_set_width —
$checkbox_tree
, int $width
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
checkbox_tree
width
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_checkbox_tree —
$left
, int $top
, int $height
[, int $flags
] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
left
top
height
flags
(PECL newt >= 0.1)
newt_checkbox —
$left
, int $top
, string $text
, string $def_value
[, string $seq
] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
left
top
text
def_value
seq
(PECL newt >= 0.1)
newt_clear_key_buffer — Discards the contents of the terminal's input buffer without waiting for additional input
Discards the contents of the terminal's input buffer without waiting for additional input.
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_cls —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_component_add_callback —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
component
func_name
data
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_component_takes_focus —
$component
, bool $takes_focus
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
component
takes_focus
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_create_grid —
$cols
, int $rows
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
cols
rows
(PECL newt >= 0.1)
newt_cursor_off —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_cursor_on —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_delay —
$microseconds
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
microseconds
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_draw_form —
$form
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
form
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_draw_root_text — Displays the string text at the position indicated
$left
, int $top
, string $text
)Displays the string text at the position indicated.
left
Column number
Nota:
If left is negative, the position is measured from the opposite side of the screen.
top
Line number
Nota:
If top is negative, the position is measured from the opposite side of the screen.
text
Text to display.
No devuelve ningún valor.
Ejemplo #1 A newt_draw_root_text() example
This code demonstrates drawing of titles in the both corners of the screen.
<?php
newt_init();
newt_cls();
newt_draw_root_text (2, 0, "Some root text");
newt_refresh();
sleep(1);
newt_draw_root_text (-30, 0, "Root text in the other corner");
newt_refresh();
sleep(1);
newt_finished();
?>
(PECL newt >= 0.1)
newt_entry_get_value —
$entry
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
entry
(PECL newt >= 0.1)
newt_entry_set_filter —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
entry
filter
data
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_entry_set_flags —
$entry
, int $flags
, int $sense
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
entry
flags
sense
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_entry_set —
$entry
, string $value
[, bool $cursor_at_end
] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
entry
value
cursor_at_end
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_entry —
$left
, int $top
, int $width
[, string $init_value
[, int $flags
]] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
left
top
width
init_value
flags
(PECL newt >= 0.1)
newt_finished — Uninitializes newt interface
Uninitializes newt interface. This function be called, when program is ready to exit.
Returns 1 on success, 0 on failure.
(PECL newt >= 0.1)
newt_form_add_component — Adds a single component to the form
$form
, resource $component
)
Adds a single component to the form.
form
Form to which component will be added
component
Component to add to the form
No devuelve ningún valor.
Ejemplo #1 A newt_form_add_component() example
<?php
$form = newt_form();
$options = array("Authentication configuration", "Firewall configuration",
"Mouse configuration", "Network configuration", "Printer configuration",
"System services");
$list = newt_listbox(3, 2, 10);
foreach ($options as $l_item) {
newt_listbox_add_entry($list, $l_item, $l_item);
}
newt_form_add_component($form, $list);
?>
(PECL newt >= 0.1)
newt_form_add_components — Add several components to the form
$form
, array $components
)
Adds several components to the form.
form
Form to which components will be added
components
Array of components to add to the form
No devuelve ningún valor.
Ejemplo #1 A newt_form_add_components() example
<?php
$form = newt_form();
$b1 = newt_button(5, 12, "Run Tool");
$b2 = newt_button(21, 12, "Quit");
newt_form_add_components($form, array($b1, $b2));
?>
(PECL newt >= 0.1)
newt_form_add_hot_key —
$form
, int $key
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
form
key
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_form_destroy — Destroys a form
$form
)This function frees the memory resources used by the form and all of the components which have been added to the form (including those components which are on subforms). Once a form has been destroyed, none of the form's components can be used.
form
Form component, which is going to be destroyed
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_form_get_current —
$form
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
form
(PECL newt >= 0.1)
newt_form_run — Runs a form
$form
, array &$exit_struct
)This function runs the form passed to it.
form
Form component
exit_struct
Array, used for returning information after running the form component. Keys and values are described in the following table:
| Index Key | Value Type | Description |
|---|---|---|
| reason | integer | The reason, why the form has been exited. Possible values are defined here. |
| watch | resource | Resource link, specified in newt_form_watch_fd() |
| key | integer | Hotkey |
| component | resource | Component, which caused the form to exit |
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_form_set_background —
$from
, int $background
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
from
background
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_form_set_height —
$form
, int $height
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
form
height
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_form_set_size —
$form
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
form
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_form_set_timer —
$form
, int $milliseconds
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
form
milliseconds
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_form_set_width —
$form
, int $width
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
form
width
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_form_watch_fd —
$form
, resource $stream
[, int $flags
] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
form
stream
flags
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_form — Create a form
$vert_bar
[, string $help
[, int $flags
]]] )Create a new form.
vert_bar
Vertical scrollbar which should be associated with the form
help
Help text string
flags
Various flags
Returns a resource link to the created form component, or FALSE on
error.
Ejemplo #1 A newt_form() example
Displays a single button "Quit", which closes the application once it's pressed.
<?php
newt_init();
newt_cls();
$myform = newt_form();
$button = newt_button (5, 12, "Quit");
newt_form_add_component ($myform, $button);
newt_refresh ();
newt_run_form ($myform);
newt_finished ();
newt_form_destroy ($myform);
?>
(PECL newt >= 0.1)
newt_get_screen_size — Fills in the passed references with the current size of the terminal
&$cols
, int &$rows
)Fills in the passed references with the current size of the terminal.
cols
Number of columns in the terminal
rows
Number of rows in the terminal
No devuelve ningún valor.
Ejemplo #1 A newt_get_screen_size() example
This code prints out the screen size of your terminal.
<?php
newt_init();
newt_get_screen_size (&$cols, &$rows);
newt_finished();
print "Your terminal size is: {$cols}x{$rows}\n";
?>
El resultado del ejemplo sería:
Your terminal size is: 138x47
(PECL newt >= 0.1)
newt_grid_add_components_to_form —
$grid
, resource $form
, bool $recurse
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
grid
form
recurse
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_grid_basic_window —
$text
, resource $middle
, resource $buttons
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
text
middle
buttons
(PECL newt >= 0.1)
newt_grid_free —
$grid
, bool $recurse
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
grid
recurse
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_grid_get_size —
$grid
, int &$width
, int &$height
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
grid
width
height
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_grid_h_close_stacked —
$element1_type
, resource $element1
[, int $...
[, resource $...
]] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
element1_type
element1
(PECL newt >= 0.1)
newt_grid_h_stacked —
$element1_type
, resource $element1
[, int $...
[, resource $...
]] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
element1_type
element1
(PECL newt >= 0.1)
newt_grid_place —
$grid
, int $left
, int $top
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
grid
left
top
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_grid_set_field —
$grid
, int $col
, int $row
, int $type
, resource $val
, int $pad_left
, int $pad_top
, int $pad_right
, int $pad_bottom
, int $anchor
[, int $flags
] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
grid
col
row
type
val
pad_left
pad_top
pad_right
pad_bottom
anchor
flags
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_grid_simple_window —
$text
, resource $middle
, resource $buttons
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
text
middle
buttons
(PECL newt >= 0.1)
newt_grid_v_close_stacked —
$element1_type
, resource $element1
[, int $...
[, resource $...
]] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
element1_type
element1
(PECL newt >= 0.1)
newt_grid_v_stacked —
$element1_type
, resource $element1
[, int $...
[, resource $...
]] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
element1_type
element1
(PECL newt >= 0.1)
newt_grid_wrapped_window_at —
$grid
, string $title
, int $left
, int $top
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
grid
title
left
top
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_grid_wrapped_window —
$grid
, string $title
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
grid
title
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_init — Initialize newt
Initializes the newt interface. This function must be called before any other newt function.
Returns 1 on success, 0 on failure.
(PECL newt >= 0.1)
newt_label_set_text —
$label
, string $text
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
label
text
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_label —
$left
, int $top
, string $text
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
left
top
text
(PECL newt >= 0.1)
newt_listbox_append_entry —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listbox
text
data
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_listbox_clear_selection —
$listbox
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listbox
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_listbox_clear —
$listobx
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listobx
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_listbox_delete_entry —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listbox
key
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_listbox_get_current —
$listbox
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listbox
(PECL newt >= 0.1)
newt_listbox_get_selection —
$listbox
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listbox
(PECL newt >= 0.1)
newt_listbox_insert_entry —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listbox
text
data
key
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_listbox_item_count —
$listbox
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listbox
(PECL newt >= 0.1)
newt_listbox_select_item —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listbox
key
sense
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_listbox_set_current_by_key —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listbox
key
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_listbox_set_current —
$listbox
, int $num
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listbox
num
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_listbox_set_data —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listbox
num
data
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_listbox_set_entry —
$listbox
, int $num
, string $text
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listbox
num
text
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_listbox_set_width —
$listbox
, int $width
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
listbox
width
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_listbox —
$left
, int $top
, int $height
[, int $flags
] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
left
top
height
flags
(PECL newt >= 0.1)
newt_listitem_get_data —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
item
(PECL newt >= 0.1)
newt_listitem_set —
$item
, string $text
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
item
text
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_listitem —
$left
, int $top
, string $text
, bool $is_default
, resouce $prev_item
, mixed $data
[, int $flags
] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
left
top
text
is_default
prev_item
data
flags
(PECL newt >= 0.1)
newt_open_window — Open a window of the specified size and position
$left
, int $top
, int $width
, int $height
[, string $title
] )Open a window of the specified size and position.
left
Location of the upper left-hand corner of the window (column number)
top
Location of the upper left-hand corner of the window (row number)
width
Window width
height
Window height
title
Window title
Returns 1 on success, 0 on failure.
(PECL newt >= 0.1)
newt_pop_help_line — Replaces the current help line with the one from the stack
Replaces the current help line with the one from the stack.
Nota:
It's important not to call to newt_pop_help_line() more than newt_push_help_line().
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_pop_window — Removes the top window from the display
Removes the top window from the display, and redraws the display areas which the window overwrote.
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_push_help_line — Saves the current help line on a stack, and displays the new line
$text
] )Saves the current help line on a stack, and displays the new line.
text
New help text message
Nota:
If not specified, the help line is cleared.
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_radio_get_current —
$set_member
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
set_member
(PECL newt >= 0.1)
newt_redraw_help_line —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_reflow_text —
$text
, int $width
, int $flex_down
, int $flex_up
, int &$actual_width
, int &$actual_height
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
text
width
flex_down
flex_up
actual_width
actual_height
(PECL newt >= 0.1)
newt_refresh — Updates modified portions of the screen
To increase performance, newt only updates the display when it needs to, not when the program tells it to write to the terminal. Applications can force newt to immediately update modified portions of the screen by calling this function.
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_resize_screen —
$redraw
] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
redraw
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_resume — Resume using the newt interface after calling newt_suspend()
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_run_form — Runs a form
$form
)This function runs the form passed to it.
form
Form component
The component which caused the form to stop running.
Nota:
Notice that this function doesn't fit in with newt's normal naming convention. It is an older interface which will not work for all forms. It was left in newt only for legacy applications. It is a simpler interface than the new newt_form_run() though, and is still used quite often as a result. When an application is done with a form, it destroys the form and all of the components the form contains.
(PECL newt >= 0.1)
newt_scale_set —
$scale
, int $amount
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
scale
amount
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_scale —
$left
, int $top
, int $width
, int $full_value
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
left
top
width
full_value
(PECL newt >= 0.1)
newt_scrollbar_set —
$scrollbar
, int $where
, int $total
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
scrollbar
where
total
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_set_help_callback —
Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
function
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_set_suspend_callback — Set a callback function which gets invoked when user presses the suspend key
Set a callback function which gets invoked when user presses the suspend key (normally ^Z). If no suspend callback is registered, the suspend keystroke is ignored.
function
A callback function, which accepts one argument: data
data
This data is been passed to the callback function
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_suspend — Tells newt to return the terminal to its initial state
Tells newt to return the terminal to its initial state. Once this is done, the application can suspend itself (by sending itself a SIGTSTP, fork a child program, or do whatever else it likes).
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_textbox_get_num_lines —
$textbox
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
textbox
(PECL newt >= 0.1)
newt_textbox_reflowed —
$left
, int $top
, char $*text
, int $width
, int $flex_down
, int $flex_up
[, int $flags
] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
left
top
*text
width
flex_down
flex_up
flags
(PECL newt >= 0.1)
newt_textbox_set_height —
$textbox
, int $height
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
textbox
height
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_textbox_set_text —
$textbox
, string $text
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
textbox
text
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_textbox —
$left
, int $top
, int $width
, int $height
[, int $flags
] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
left
top
width
height
flags
(PECL newt >= 0.1)
newt_vertical_scrollbar —
$left
, int $top
, int $height
[, int $normal_colorset
[, int $thumb_colorset
]] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
left
top
height
normal_colorset
thumb_colorset
(PECL newt >= 0.1)
newt_wait_for_key — Doesn't return until a key has been pressed
This function doesn't return until a key has been pressed. The keystroke is then ignored. If a key is already in the terminal's buffer, this function discards a keystroke and returns immediately.
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_win_choice —
$title
, string $button1_text
, string $button2_text
, string $format
[, mixed $args
[, mixed $...
]] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
title
button1_text
button2_text
format
args
(PECL newt >= 0.1)
newt_win_entries —
$title
, string $text
, int $suggested_width
, int $flex_down
, int $flex_up
, int $data_width
, array &$items
, string $button1
[, string $...
] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
title
text
suggested_width
flex_down
flex_up
data_width
items
button1
button2
Ejemplo #1 A newt_win_entries() example
<?php
newt_init();
newt_cls();
$entries[] = array('text' => 'First name:', 'value' => &$f_name);
$entries[] = array('text' => 'Last name:', 'value' => &$l_name);
$rc = newt_win_entries("User information", "Please enter your credentials:", 50, 7, 7, 30, $entries, "Ok", "Back");
newt_finished ();
if ($rc != 2) {
echo "Your name is: $f_name $l_name\n";
}
?>
(PECL newt >= 0.1)
newt_win_message —
$title
, string $button_text
, string $format
[, mixed $args
[, mixed $...
]] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
title
button_text
format
args
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_win_messagev —
$title
, string $button_text
, string $format
, array $args
)Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
title
button_text
format
args
No devuelve ningún valor.
(PECL newt >= 0.1)
newt_win_ternary —
$title
, string $button1_text
, string $button2_text
, string $button3_text
, string $format
[, mixed $args
[, mixed $...
]] )Esta función no está documentada actualmente, solamente se encuentra disponible la lista de parámetros.
title
Its description
button1_text
Its description
button2_text
Its description
button3_text
Its description
format
Its description
args
Its description
What the function returns, first on success, then on failure. See also the &return.success; entity
Las funciones readline implementan una interfaz con la biblioteca GNU Readline. Estas son funciones que ofrecen líneas de comando editables. Un ejemplo es Bash que permite utilizar las teclas de flecha para insertar caracteres o desplazarse a través del historial de comandos. Debido a la naturaleza interactiva de esta biblioteca, será de poca utilidad para la creación de aplicaciones Web, pero puede ser útil cuando se escriben scripts utilizando la línea de comandos.
Nota: Esta extensión no está disponible en plataformas Windows.
Para usar las funciones readline, es necesario instalar libreadline. Se puede encontrar libreadline en la página principal del proyecto GNU Readline, en » http://cnswww.cns.cwru.edu/~chet/readline/rltop.html. Este proyecto es administrado por Chet Ramey, quien es también el autor de Bash.
También puede utilizar estas funciones con la libreria libedit, un reemplazo no-GPL para la biblioteca readline. La biblioteca libedit tiene licencia BSD y está disponible para su descarga desde » http://www.thrysoee.dk/editline/.
Para utilizar estas funciones, debe compilar la versión CGI o CLI de PHP con soporte para readline. Es necesario configurar PHP --with-readline[=DIR] . Si desea utilizar el reemplazo de readline libedit, es necesario configurar PHP --with-libedit[=DIR] .
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| cli.pager | "" | PHP_INI_ALL | Disponible desde PHP 5.4.0. |
| cli.prompt | "\\b \\> " | PHP_INI_ALL | Disponible desde PHP 5.4.0. |
He aquí una breve explicación de las directivas de configuración.
cli.pager
string
Herramienta externa para mostrar la salida de la línea de comandos.
cli.prompt
string
Véase Línea de Comandos.
Esta extensión no tiene ningún tipo de recurso definido.
Esta extensión no tiene ninguna constante definida.
(PHP 4, PHP 5)
readline_add_history — Adds a line to the history
$line
)This function adds a line to the command line history.
line
The line to be added in the history.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PHP 5 >= 5.1.0)
readline_callback_handler_install — Initializes the readline callback interface and terminal, prints the prompt and returns immediately
Sets up a readline callback interface then prints
prompt and immediately returns.
Calling this function twice without removing the previous
callback interface will automatically and conveniently overwrite the old
interface.
The callback feature is useful when combined with stream_select() as it allows interleaving of IO and user input, unlike readline().
prompt
The prompt message.
callback
The callback function takes one parameter; the
user input returned.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplo #1 Readline Callback Interface Example
<?php
function rl_callback($ret)
{
global $c, $prompting;
echo "You entered: $ret\n";
$c++;
if ($c > 10) {
$prompting = false;
readline_callback_handler_remove();
} else {
readline_callback_handler_install("[$c] Enter something: ", 'rl_callback');
}
}
$c = 1;
$prompting = true;
readline_callback_handler_install("[$c] Enter something: ", 'rl_callback');
while ($prompting) {
$w = NULL;
$e = NULL;
$n = stream_select($r = array(STDIN), $w, $e, null);
if ($n && in_array(STDIN, $r)) {
// read a character, will call the callback when a newline is entered
readline_callback_read_char();
}
}
echo "Prompting disabled. All done.\n";
?>
(PHP 5 >= 5.1.0)
readline_callback_handler_remove — Removes a previously installed callback handler and restores terminal settings
Removes a previously installed callback handler and restores terminal settings.
Returns TRUE if a previously installed callback handler was removed, or
FALSE if one could not be found.
See readline_callback_handler_install() for an example of how to use the readline callback interface.
(PHP 5 >= 5.1.0)
readline_callback_read_char — Reads a character and informs the readline callback interface when a line is received
Reads a character of user input. When a line is received, this function informs the readline callback interface installed using readline_callback_handler_install() that a line is ready for input.
No devuelve ningún valor.
See readline_callback_handler_install() for an example of how to use the readline callback interface.
(PHP 4, PHP 5)
readline_clear_history — Clears the history
This function clears the entire command line history.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PHP 4, PHP 5)
readline_completion_function — Registers a completion function
This function registers a completion function. This is the same kind of functionality you'd get if you hit your tab key while using Bash.
function
You must supply the name of an existing function which accepts a partial command line and returns an array of possible matches.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PHP 4, PHP 5)
readline_info — Gets/sets various internal readline variables
Gets or sets various internal readline variables.
varname
A variable name.
newvalue
If provided, this will be the new value of the setting.
If called with no parameters, this function returns an array of values for all the setting readline uses. The elements will be indexed by the following values: done, end, erase_empty_line, library_version, line_buffer, mark, pending_input, point, prompt, readline_name, and terminal_name.
If called with one or two parameters, the old value is returned.
(PHP 4, PHP 5)
readline_list_history — Lists the history
Gets the entire command line history.
Returns an array of the entire command line history. The elements are indexed by integers starting at zero.
(PHP 5 >= 5.1.0)
readline_on_new_line — Inform readline that the cursor has moved to a new line
Tells readline that the cursor has moved to a new line.
No devuelve ningún valor.
(PHP 4, PHP 5)
readline_read_history — Reads the history
$filename
] )This function reads a command history from a file.
filename
Path to the filename containing the command history.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PHP 5 >= 5.1.0)
readline_redisplay — Redibuja la vista
Redibuja readline para volver a dibujar la vista.
No devuelve ningún valor.
(PHP 4, PHP 5)
readline_write_history — Writes the history
$filename
] )This function writes the command history to a file.
filename
Path to the saved file.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PHP 4, PHP 5)
readline — Reads a line
$prompt
] )Reads a single line from the user. You must add this line to the history yourself using readline_add_history().
prompt
You may specify a string with which to prompt the user.
Returns a single string from the user. The line returned has the ending newline removed.
Ejemplo #1 readline() Example
<?php
//get 3 commands from user
for ($i=0; $i < 3; $i++) {
$line = readline("Command: ");
readline_add_history($line);
}
//dump history
print_r(readline_list_history());
//dump variables
print_r(readline_info());
?>
Las funciones bzip2 se utilizan para poder leer y escribir transparentemente ficheros comprimidos con bzip2 (.bz2).
Este módulo usa las funciones de la librería » bzip2 por Julian Seward. Este módulo requiere bzip2/libbzip2 version >= 1.0.x.
El soporte de Bzip2 en PHP no está activado por defecto. Se necesita usar la opción de configuración --with-bz2[=DIR] al compilar PHP para activar soporte de bzip2.
Esta extensión no tiene directivas de configuración definidas en php.ini.
Esta extensión define un tipo de recurso: apunta a un archivo identificando el fichero bz2 a trabajar.
Esta extensión no tiene ninguna constante definida.
Este ejemplo abre un fichero temporal y escribe una cadena de prueba en el, muestra el contenido del fichero.
Ejemplo #1 Pequeño ejemplo de bzip2
<?php
$filename = "/tmp/testfile.bz2";
$str = "Esto es una cadena de prueba.\n";
// Abriendo fichero para escribir
$bz = bzopen($filename, "w");
// escribe la cadena en el fichero
bzwrite($bz, $str);
// cierra el fichero
bzclose($bz);
// abre el fichero para escritura
$bz = bzopen($filename, "r");
// lee 10 caracteres
echo bzread($bz, 10);
// muestra salida hasta el final del fichero (o los siguientes 1024 caracteres) y lo cierra.
echo bzread($bz);
bzclose($bz);
?>
(PHP 4 >= 4.0.4, PHP 5)
bzclose — Cierra un fichero bzip2
$bz
)Cierra el dado puntero del fichero bzip2.
bz
El puntero del fichero. Debe ser un puntero válido a un fichero abierto con bzopen() satisfactoriamente.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(No hay información de versión disponible, podría estar únicamente en SVN)
bzcompress — Comprime una cadena en datos codificados en bzip2
bzcompress() comprime la cadena dada y la devuelve como datos codificados con bzip2.
source
La cadena a comprimir.
blocksize
Especifica el blocksize usado durante la compresión y debería ser un número entre 1 y 9 siendo 9 la máxima compresión, pero también utiliza más recursos.
workfactor
Controla como se comportan las fases de compresión cuando se presenta en el peor de los casos, datos que se repiten continuamente. El valor puede estar entre 0 y 250 siendo 0 un caso especial.
Independientemente de workfactor, el valor generado
de salida es el mismo.
La cadena comprimida, o el número de error en caso de error.
Ejemplo #1 Comprimiendo datos
<?php
$str = "sample data";
$bzstr = bzcompress($str, 9);
echo $bzstr;
?>
(PHP 4 >= 4.0.4, PHP 5)
bzdecompress — Descomprime datos codificados con bzip2
bzdecompress() descomprime el string pasado por parámetro que contiene los datos codificados en bzip2.
source
String a descomprimir.
small
Si es TRUE, se usará un algoritmo de descompresión alternativo que utiliza
menos memoria (disminuye el requisito máximo de memoria a entorno a 2300K)
pero por otra parte es la mitad de lento aproximadamente.
Consulte la » documentación de bzip2 para más información sobre este comportamiento.
El string descromprimido, o el número de error en caso de error.
Ejemplo #1 Descompresión de un String
<?php
$start_str = "This is not an honest face?";
$bzstr = bzcompress($start_str);
echo "String Comprimido: ";
echo $bzstr;
echo "\n<br />\n";
$str = bzdecompress($bzstr);
echo "String Descomprimido: ";
echo $str;
echo "\n<br />\n";
?>
(PHP 4 >= 4.0.4, PHP 5)
bzerrno — Devuelve el número de erro de bzip2
$bz
)Devuelve el número de error de cualquier error bzip2 devuelto por el puntero del fichero dado.
bz
El puntero del fichero. Debe ser un puntero a un fichero abierto con bzopen() satisfactoriamente.
Devuelve el número de error como entero.
(PHP 4 >= 4.0.4, PHP 5)
bzerror — Devuelve el número de error y la cadena del error de bzip2 en un array
$bz
)Devuelve el número de error y la cadena de error de cualquier error bzip2 devuelto por el puntero del fichero dado.
bz
El puntero del fichero. Debe ser un puntero a un fichero abierto con bzopen() satisfactoriamente.
Devuelve un array asociativo, con el código de error en la entrada errno y el mensaje de error en la entrada errstr.
Ejemplo #1 Ejemplo de bzerror()
<?php
$error = bzerror($bz);
echo $error["errno"];
echo $error["errstr"];
?>
(PHP 4 >= 4.0.4, PHP 5)
bzerrstr — Devuelve una cadena de error de bzip2
$bz
)Obtiene la cadena de error de cualquier error bzip2 devuelto por el puntero dado.
bz
El puntero del fichero. Debe ser un puntero a un fichero abierto con bzopen() satisfactoriamente.
Devuelve una cadena que contiene el mensaje de error.
(PHP 4 >= 4.0.4, PHP 5)
bzflush — Fuerza la escritura de todos los datos del búfer
$bz
)
Fuerza la escritura de todos los datos del búfer bzip2 para el puntero del fichero
bz.
bz
El puntero del fichero. Debe ser un puntero a un fichero abierto con bzopen() satisfactoriamente.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
(PHP 4 >= 4.0.4, PHP 5)
bzopen — Abre un fichero comprimido con bzip2
$filename
, string $mode
)bzopen() abre un fichero bzip2 (.bz2) para lectura o escritura.
filename
El nombre del fichero a abrir.
mode
Similar a la función fopen(), solamente 'r' (lectura)
y 'w' (escritura) están soportados. Todo lo demás hará que bzopen
devuelva FALSE.
Si al abrir el fichero se produce un error, bzopen() devolverá FALSE, en caso contrario
devolverá el puntero del nuevo fichero abierto.
Ejemplo #1 Ejemplo de bzopen()
<?php
$file = "/tmp/foo.bz2";
$bz = bzopen($file, "r") or die("No se pudo abrir el fichero $file para lectura");
bzclose($bz);
?>
(PHP 4 >= 4.0.4, PHP 5)
bzread — Lectura segura de ficheros bzip2
$bz
[, int $length = 1024
] )bzread() lee del puntero de fichero bzip2 pasado como parámetro.
La lectura finaliza una vez que se han leído length bytes (descomprimidos)
o cuando se alcanza EOF, lo primero que suceda.
bz
El puntero al fichero. Tiene que ser válido y debe apuntar a un fichero que se haya abierto con éxito con bzopen().
length
Si no se especifica, bzread() leerá bloques de 1024 bytes (descomprimidos) al momento. Un máximo de 8192 bytes descomprimidos serán leídos.
Devuelve la información descomprimida, o FALSE en caso de error.
Ejemplo #1 ejemplo de bzread()
<?php
$file = "/tmp/foo.bz2";
$bz = bzopen($file, "r") or die("No se ha podido abrir $file");
$decompressed_file = '';
while (!feof($bz)) {
$decompressed_file .= bzread($bz, 4096);
}
bzclose($bz);
echo "El contenido de $file es: <br />\n";
echo $decompressed_file;
?>
(PHP 4 >= 4.0.4, PHP 5)
bzwrite — Escribe en un fichero bzip2 de forma segura binariamente
$bz
, string $data
[, int $length
] )bzwrite() escribe una cadena en el fichero gzip2 dado.
bz
El puntero del fichero. Debe apuntar a un fichero abierto satisfactoriamente con bzopen().
data
Los datos a escribir.
length
Si se proporciona, la escritura terminará después de que el length
(no comprimido) en bytes hayan sido escritos o se haya llegado al final de
data, lo que llegue primero.
Devuelve el número de bytes escritos, o FALSE en caso de error.
Ejemplo #1 Ejemplo de bzwrite()
<?php
$str = "uncompressed data";
$bz = bzopen("/tmp/foo.bz2", "w");
bzwrite($bz, $str, strlen($str));
bzclose($bz);
?>
LZF es un algoritmo de compresión muy rápido, ideal para ahorrar espacio con solamente un ligero costo de velocidad. Puede optimizarse para velocidad o espacio a la hora de compilar. Esta extensión utiliza la librería » liblzf por Marc Lehmann para sus operaciones.
No se requiere de ninguna biblioteca externa para compilar esta extensión.
Esta extensión » PECL no se distribuye con PHP. Información para la instalación de esta extensión PECL puede ser encontrada en el capítulo del manual titulado Instalación de extensiones PECL. Información adicional tal como nuevos lanzamientos, descargas, archivos fuente, mantenimiento de información, y un CHANGELOG, se encontrará aquí: » http://pecl.php.net/package/lzf.
Pata utilizar estas funciones se debe compilar PHP con soporte para lzf empleando la opción de configuración --with-lzf[=DIR] . También se puede pasar --enable-lzf-better-compression para optimizar LZF para espacio en vez de para velocidad.
Los usuarios de Windows habilitarán php_lzf.dll dentro de php.ini para utilizar estas funciones. No hay una DLL disponible para esta extensión PECL actualmente. Vea también la sección Compilando en Windows .
Esta extensión no tiene directivas de configuración definidas en php.ini.
Esta extensión no tiene ningún tipo de recurso definido.
Esta extensión no tiene ninguna constante definida.
(PECL lzf >= 0.1.0)
lzf_compress — Compresión LZF
$data
)
lzf_compress() comprime el string
data dado utilizando codificación LZF.
data
El string a comprimir.
Devuelve los datos comprimidos o FALSE si ocurrió un error.
(PECL lzf >= 0.1.0)
lzf_decompress — Descompresión LZF
$data
)
lzf_compress() descomprime la cadena
data dada que contiene los datos codificados en lzf.
data
La cadena comprimida.
Devuelve los datos descomprimidos o FALSE si ocurrió un error.
(PECL lzf >= 1.0.0)
lzf_optimized_for — Determina para qué fue optimizada la extensión LZF
Determina para qué fue optimizada la extensión LZF durante la compilación.
Devuelve 1 si LZF fue optimizada para velocidad, 0 para compresión.
La extensión phar proporciona una manera de poner aplicaciones PHP enteras dentro de un únivo fichero llamado "phar" (PHP Archive) para una distribución e instalación sencilla.. Además de proporcionar este servicio, la extensión phar también provee de un método de abstracción de formato de fichero para crear y manipular ficheros tar y zip a través de la clase PharData, tal como PDO proporciona una interfaz unificada para acceder a diferentes bases de datos. A diferencia de PDO, la cual no puede realizar conversiones entre bases de datos diferentes, Phar también realiza conversiones entre los formatos de ficheros tar, zip phar con una sencilla línea de código. Véase Phar::convertToExecutable() para un ejemplo.
¿Qué es phar? Lo archivos Phar están mejor caracterizados como una forma conveniente de agrupar varios ficheros en un único fichero. Como tal, un archvo phar proporciona una forma para distribuir una aplicación PHP completa en un único fichero y ejecutarla desde ese mismo fichero sin necesidad de extraerlo en el disco. Además, los archivos phar pueden ser ejecutados por PHP fácilmente al igual que cualquier otro fichero, tanto desde la línea de comandos como desde un servidor web. Phar a web server. Phar es como una memoria USB para aplicaciones PHP.
Phar implementa esta funcionalidad a través de una Envoltura de Flujo. Normalmente, para utilizar un fichero externo dentro de un script de PHP, se debería usar include
Ejemplo #1 Utilizar un fichero externo
<?php
include '/ruta/al/fichero/externo.php';
?>
Puede considerarse que PHP traduce realemte /ruta/al/fichero/externo.php a una envoltura de flujo como file:///ruta/al/fichero/externo.php, y bajo la cubierta de hecho hace uso de funciones de flujo de envolturas de flujo de ficheros para acceder a todos los ficheros locales.
Para utilizar un fichero llamado fichero.php contenido en un archivo phar /ruta/a/miphar.phar, la sintaxis es muy similar a la sintaxis file:// de arriba.
Ejemplo #2 Utilizar un fichero dentro de un archivo phar
<?php
include 'phar:///ruta/a/miphar.phar/fichero.php';
?>
De hecho, se puede tratar un archivo phar exactamente como si fuera un disco externo, usando cualquiera de las funciones relacionadas con fopen(), opendir() y funciones relacionadas con mkdir() para leer, cambiar, o crear nuevos ficheros y directorios dentro del archivo phar. Esto permite que aplicaciones de PHP completas sean distribuidas en un único fichero y ejecutarlas directamente desde ese fichero.
El uso más común de un archivo phar es distribuir una aplicación completa en un único fichero. Por ejemplo, el Instalador de PEAR que se incluye con las versiones de PHP está distribuido como un archivo phar. Para usar un archivo phar distribuido de esta forma, se puede ejecutar en línea de comandos o mediante un servidor web.
Los archivos phar pueden ser distribuidos como archivos tar, zip, o como formato de fichero phar personalizado diseñado específicamente por la extensión phar. Cada formato de fichero tiene sus ventajas y desventajas. Los formatos de fichero tar y zip se pueden leer o extraer mediante cualquier herramienta de terceros que pueda leer el formato, pero necesia la extensión phar para ejecutarlo con PHP. El formato de fichero phar es personalizado y único para la extensión phar, y sólo puede ser creado por la extensión phar o el paquete de PEAR » PHP_Archive, pero tiene la ventaja de que las apliaciones creadas en este formato se ejecutarán incluso si la extensión phar no está habilitada.
En otras palabra, incluso con la extensión phar deshabilitada, se puede ejecutar o incluir un archivo basado en phar. El acceso a ficheros dentro de un archivo phar solamente es posible con la extesnión phar a menos que el archivo phar fuese creado por PHP_Archive.
La extensión phar también es capaz de convertir un archivo phar desde los formatos de fichero tar a zip o a phar en un único comando:
Ejemplo #3 Convertir un archivo phar, desde phar al formato de fichero tar
<?php
$phar = new Phar('miphar.phar');
$pgz = $phar->convertToExecutable(Phar::TAR, Phar::GZ); // crea miphar.phar.tar.gz
?>
Phar puede comprimir ficheros individuales o un archivo entero usando la compresión gzip o la bzip2, y puede verificar la integridad del archivo automáticamente a través del uso de las signaturas md5(), sha1(), sha256(), o sha512().
Por último, la extensión Phar se preocupa de la seguridad, y deshabilita el acceso a la escritura de archivos phar ejecutables de manera predeterminada, y requiere la deshabilitación a nivel de sistema del ajuste phar.readonly de php.ini para crear o modificar archivos phar. Los archivos tar y zip normales sin una rutina de interoperabilidad ejecutable siempre pueden ser creador o modificados utilizando la clase PharData.
Si está creando aplicaciones para su distribución, le interesará leer Cómo crear Archivos Phar. Si desea más información de las diferencias entre los tres formatos de ficheros que soporta phar, debería leer Phar, Tar y Zip.
Si usa aplicaciones phar, existen consejos útiles en Cómo utilizar Archivos Phar
La palabra phar es una contracción de PHP y Archive y está basada indirectamente en el familiar jar (Java Archive) para los desarrolladores Java.
La implementación de archivos Phar está basada en el paquete de PEAR » PHP_Archive, y los detalles de implementación son similares, aunque la extensión Phar es mucho más potente. Además, la extensión Phar permite a la mayoría de las aplicaciones de PHP ejecutarse sin modificaciones, mientras que los archivos phar basados en PHP_Archive a menudo requieren una extensa modificiación para que funcionen.
Phar requiere PHP 5.2.0 o superior. Las caracteristicas adicionales requieren la extensión SPL para aprovechar la iteración y el acceso a arrays del contenido de un fichero de Phar. El flujo phar no requiere ninguna extensión adicional para que funcione.
Opcionalmente, se puede habilitar las extensiones zlib y bzip2 para aprovechar el soporte de phar comprimidos. Además, para aprovechar la firma OpenSSL, debe estar habilidata la extensión OpenSSL.
Observe que un error en el filtro de flujos zlib.deflate corregido en la versión 5.2.6 y posteriores de PHP puede ocasionar el truncamiento de archivos phar comprimidos con gzip bzip2.
La extensión Phar está integrada a partir de la versión 5.3.0 de PHP. Phar se puede instalar a través de la extensión PECL con las versiones anteriores de PHP, y la » página Phar de PECL contiene información adicional y su hostoria.
Los usuarios de Windows deben incluir el fichero php_phar.dll en php.ini para usar esta extensión.
El comportamiento de estas funciones se ve afectado por la configuración de php.ini.
| Nombre | Por defecto | Cambiable | Historial de cambios |
|---|---|---|---|
| phar.readonly | "1" | PHP_INI_ALL | |
| phar.require_hash | "1" | PHP_INI_ALL | |
| phar.extract_list | "" | PHP_INI_ALL | Disponible desde phar 1.1.0 a 1.2.3, eliminado en 2.0.0. |
| phar.cache_list | "" | PHP_INI_SYSTEM | Disponible desde phar 2.0.0. |
He aquí una breve explicación de las directivas de configuración.
phar.readonly
boolean
Esta opción deshabilita la modificación o creación de archivos Phar usando el flujo phar o el soporte para escritura de objetos Phar. Este ajuste debería estar siempre activado en máquinas de producción, ya que el soporte para escritura conveniente de la extensión phar podría permitir la simple creación de un virus basado en PHP al asociarse con otras vulnerabilidades de seguridad comunes.
Nota:
Este ajuste sólo puede ser desactivado en php.ini por motivos de seguridad. Si phar.readonly está deshabilitado en php.ini, un usuario puede habilitar phar.readonly en un script o deshabilitarlo después. Si phar.readonly está habilitado en php.ini, un scrip puede "re-habilitar" inofensivamente la variable INI, pero no puede deshabilitarla.
phar.require_hash
boolean
Esta opción forzará a todos los archivos Phar abiertos a que contengan algún tipo de signatura (actualmente está soportadas MD5, SHA1, SHA256 y SHA512), y rehusará procesar cualquer archivo Phar que no contenga una signatura.
Nota:
Este ajuste sólo puede ser desactivado en php.ini por motivos de seguridad. Si phar.require_hash está deshabilitado en php.ini, un usuario puede habilitar phar.require_hash en un script o deshabilitarlo después. Si phar.require_hash está habilitado en php.ini, un scrip puede "re-habilitar" inofensivamente la variable INI, pero no puede deshabilitarla.
Este ajuste no afecta a la lectura de ficheros tar planos con la clase PharData.
phar.extract_list
string
Este ajuste INI ha sido eliminado desde phar 2.0.0
Permite el mapeo desde una ruta completa a un archivo phar o su alias hacia la ubicación de sus ficheros extraídos. El formato del parámetro es nombre=archivo,nombre2=archivo2. Esto permite la extracción de ficheros phar al disco, y permite a phar acutar como una especie de mapeador para extraer ficheros de discos. A menudo, esto se reailza por motivos de rendimiento, o para ayudar a la depuración de un phar.
Ejemplo #1 phar.extract_list usage example
in php.ini:
phar.extract_list = archivo=/ruta/completa/al/archivo/,archivo2=/ruta/completa/al/archivo2
<?php
include "phar://archivo/contenido.php";
include "phar://archivo2/foo.php";
?>
phar.cache_list
string
Este ajuste INI fue añadido en 2.0.0
Permite mapear archivos phar para que sean preanalizados en el arranque del servidor web, proporcionando una mejora de rendimiento que saca ficheros en ejecución de un archivo phar casi tan rápido como si esos ficheros se ejecutaran desde una instalación tradicional basada en disco.
Ejemplo #2 Ejemplo de uso de phar.cache_list
en php.ini (windows): phar.cache_list =C:\ruta\a\phar1.phar;C:\ruta\a\phar2.phar en php.ini (unix): phar.cache_list =/ruta/a/phar1.phar:/ruta/a/phar2.phar
La extensión Phar proporciona el flujo phar, el cual permite el acceso a ficheros contenidos en un phar de manera transparente. Véase también la descripción de formato de fichero Phar.
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
| Constante | Valor | Descripción |
|---|---|---|
Phar::NONE
(integer)
|
0x00000000 | sin compresión |
Phar::COMPRESSED
(integer)
|
0x0000F000 | máscara de bit que puede ser usada con banderas de fichero para determinar si está presente algún tipo de compresión |
Phar::GZ
(integer)
|
0x00001000 | compression zlib (gzip) |
Phar::BZ2
(integer)
|
0x00002000 | compression bzip2 |
| Constante | Valor | Descripción |
|---|---|---|
Phar::SAME
(integer)
|
0 | conservar el mismo formato de fichero |
Phar::PHAR
(integer)
|
1 | formato de fichero phar |
Phar::TAR
(integer)
|
2 | formato de fichero tar |
Phar::ZIP
(integer)
|
3 | formato de fichero zip |
| Constante | Valor | Descripción |
|---|---|---|
Phar::MD5
(integer)
|
0x0001 | singnatura con el algoritmo hash md5 |
Phar::SHA1
(integer)
|
0x0002 | singnatura con el algoritmo hash sha1 |
Phar::SHA256
(integer)
|
0x0003 | singnatura con el algoritmo hash sha256 (requiere la extensión Hash) |
Phar::SHA512
(integer)
|
0x0004 | singnatura con el algoritmo hash sha512 (requiere la extensión Hash) |
Phar::OPENSSL
(integer)
|
0x0010 | signatura con la pareja de claves pública/privada de OpenSSL. Esta es una signatura de clave asimétrica verdadera. |
| Constante | Valor | Descripción |
|---|---|---|
Phar::PHP
(integer)
|
1 | usada para ordenar al parámetro de sobrescritura MIME de Phar::webPhar() que la extensión debería ser analizada como un fichero de PHP |
Phar::PHPS
(integer)
|
2 | usada para ordenar al parámetro de sobrescritura MIME de Phar::webPhar() que la extensión debería ser analizada como un fichero fuente de PHP a través de highlight_file() |
Los archivos phar son similares en concepto a los archivo JAR de Java, pero están adaptados a las necesidades y a la flexibilidad de aplicoines de PHP. Un archivo Phar se usa para distribuir una aplicación o biblioteca PHP completa en un único fichero. Una aplicación de un archivo Phar se utiliza exactamente de la misma manera que otra aplicación PHP:
php aplicacion.phar
Utilizar una biblioteca de archivo Phar es idéntico a usar cualquier otra biblioteca de PHP:
<?php
include 'biblioteca.phar';
?>
La envoltura de flujos phar proporciona el núcleo de la extensión Phar, y está explicada en detalle aquí. La envoltura de flujos phar permite el acceso a los ficheros dentro de un archivo phar utilizando las funciones estándar de ficheros de PHP fopen(), opendir(), y y otras que trabajan sobre ficheros normales. La envoltura de flujos phar soporta todas las operaciones de lectura/escritura tanto en ficheros como en directorios.
<?php
include 'phar://biblioteca.phar/fichero/interno.php';
header('Content-type: image/jpeg');
// a los phar se puede acceder con la ruta completa o mediante un alias
echo file_get_contents('phar:///ruta_completa/a/biblioteca.phar/imagenes/wow.jpg');
?>
La clase Phar implementa una funcionalidad avanzada para acceder a ficheros y crear arhivos phar. La clas Phar está explicada en detalle aquí.
<?php
try {
// abrir un phar existente
$p = new Phar('biblioteca.phar', 0);
// Phar extiende la clase DirectoryIterator de SPL
foreach (new RecursiveIteratorIterator($p) as $fichero) {
// $fichero en una clase PharFileInfo, y hereda de SplFileInfo
echo $fichero->getFileName() . "\n";
echo file_get_contents($fichero->getPathName()) . "\n"; // mostrar el contenido;
}
if (isset($p['fichero/interno.php'])) {
var_dump($p['fichero/interno.php']->getMetadata());
}
// crear un nuevo phar - phar.readonly debe ser 0 en php.ini
// phar.readonly está habilitado por omisión por motivos de seguridad.
// En servidores de producción, los archivos Phar nunca se crean,
// sólo se ejecutan.
if (Phar::canWrite()) {
$p = new Phar('nuevo_phar.tar.phar', 0, 'nuevo_phar.tar.phar');
// hacerlo un archivo phar basado en tar, comprimido con gzip (.tar.gz)
$p = $p->convertToExecutable(Phar::TAR, Phar::GZ);
// crear una transacción - no se escribe nada en nuevo_phar.phar
// hasta que stopBuffering() sea llamado, aunque se necesita almacenamiento temporal
$p->startBuffering();
// añadir todos los ficheros de /ruta/del/proyecto, guardándolos en el phar con el prefijo "proyecto"
$p->buildFromIterator(new RecursiveIteratorIterator(new DirectoryIterator('/ruta/del/proyecto')), '/ruta/del/');
// añadir un nuevo fichero mediante la API de acceso a arrays
$p['fichero1.txt'] = 'Información';
$fp = fopen('fichero_enorme.dat', 'rb');
// copiar toda la información del flujo
$p['datos/fichero_enorme.dat'] = $fp;
if (Phar::canCompress(Phar::GZ)) {
$p['datos/fichero_enorme.dat']->compress(Phar::GZ);
}
$p['imagenes/wow.jpg'] = file_get_contents('imagenes/wow.jpg');
// cualquier valor se puede guardar como metainformación específica del fichero
$p['imagenes/wow.jpg']->setMetadata(array('mime-type' => 'image/jpeg'));
$p['index.php'] = file_get_contents('index.php');
$p->setMetadata(array('bootstrap' => 'index.php'));
// cuardar el archivo phar en el disco
$p->stopBuffering();
}
} catch (Exception $e) {
echo 'No se pudo abrir Phar: ', $e;
}
?>
Además, la verificación del contenido de ficheros phar se puede realizar utilizando cualquiera de los algoritmos hash simétricos soportados (MD5, SHA1, SHA256 y SHA512 si la extensión Hash está habilitada) y utilizando firmas de clave pública/privada asimétricas de OpenSSL (nuevo en Phar 2.0.0). Para aprovechar la firmas de OpenSSL, se necesita generar una pareja de claves pública/privada, y utilizar la clave privada para establecer la firma usando Phar::setSignatureAlgorithm(). Además, la clave pública se extrae usando este código:
<?php
$public = openssl_get_publickey(file_get_contents('private.pem'));
$pkey = '';
openssl_pkey_export($public, $pkey);
?>
A partir de la verisón 2.0.0, la clase Phar también proporciona tres métodos estáticos, Phar::webPhar(), Phar::mungServer() y Phar::interceptFileFuncs(), los cuales son cruiciales para empaquetar aplicaciones PHP diseñadas para un uso en sistemas de ficheros normales y aplicación basadas en web. Phar::webPhar() implementa un controlador principal que direcciona llamadas HTTP a la ubicación correcta dentro del archivo phar. Phar::mungServer() se utiliza para modificar los valores del array $_SERVER para hacer que las aplicaciones procesen estos valores. Phar::interceptFileFuncs() ordena a Phar que intercepte llamdas a fopen(), file_get_contents(), opendir(), y a todas las funciones basadas en estadísticas (file_exists(), is_readable(), etc.) y direccione todas las rutas relativas a las ubicaciones dentro del archivo phar.
Como ejemplo, empaquetar una versión de la popular aplicación phpMyAdmin para usarla cono un archivo phar, requiere solamente este sencillo script, y después se puede acceder a phpMyAdmin.phar.tar.php como un fichero normal desde el servidor web después de modificar el usuario/contraseña:
<?php
@unlink('phpMyAdmin.phar.tar.php');
copy('phpMyAdmin-2.11.3-english.tar.gz', 'phpMyAdmin.phar.tar.php');
$a = new Phar('phpMyAdmin.phar.tar.php');
$a->startBuffering();
$a["phpMyAdmin-2.11.3-english/config.inc.php"] = '<?php
/* Servers configuration */
$i = 0;
/* Server localhost (config:root) [1] */
$i++;
$cfg[\'Servers\'][$i][\'host\'] = \'localhost\';
$cfg[\'Servers\'][$i][\'extension\'] = \'mysqli\';
$cfg[\'Servers\'][$i][\'connect_type\'] = \'tcp\';
$cfg[\'Servers\'][$i][\'compress\'] = false;
$cfg[\'Servers\'][$i][\'auth_type\'] = \'config\';
$cfg[\'Servers\'][$i][\'user\'] = \'root\';
$cfg[\'Servers\'][$i][\'password\'] = \'\';
/* End of servers configuration */
if (strpos(PHP_OS, \'WIN\') !== false) {
$cfg[\'UploadDir\'] = getcwd();
} else {
$cfg[\'UploadDir\'] = \'/tmp/pharphpmyadmin\';
@mkdir(\'/tmp/pharphpmyadmin\');
@chmod(\'/tmp/pharphpmyadmin\', 0777);
}';
$a->setStub('<?php
Phar::interceptFileFuncs();
Phar::webPhar("phpMyAdmin.phar", "phpMyAdmin-2.11.3-english/index.php");
echo "phpMyAdmin está intentando ejecutarse desde un navegador web\n";
exit -1;
__HALT_COMPILER();
');
$a->stopBuffering();
?>
La envoltura de flujos phar soporta completamente fopen() para leer y escribir (no añadir), unlink(), stat(), fstat(), fseek(), rename() y operaciones de flujo de directorios opendir() y a partir de la versión 2.0.0, rmdir() y mkdir().
También se pueden manipular compresiones de ficheros individuales y metadatos por fichero en un archivo Phar usando contextos de flujo:
<?php
$contexto = stream_context_create(array('phar' =>
array('compress' => Phar::GZ)),
array('metadata' => array('user' => 'cellog')));
file_put_contents('phar://mi.phar/fichero.php', 0, $contexto);
?>
La envoltura de flujos phar no opera sobre ficheros remotos, y no puede operar sobre ficheros remotos, and cannot operate on remote files, and so is allowed even when the allow_url_fopen and allow_url_include INI options are disabled.
Aunque es posible crear archivos phar desde cero simplemente usando operaciones de flujos, es mejor utilizar la funcionalidad interna de la clase Phar. La envoltura de flujos se usa mejor para operaciones de sólo lectura.
La clase Phar admite la lectura y la manipulación de archivos Phar, así como la iteración a través de la funcionalidad de la clase RecursiveDirectoryIterator. Con el soporte para la interfaz ArrayAccess, se puede acceder a los ficheros que están dentro de un archivo Phar como si fueran parte de un array asociativo.
La clase PharData extiende la clase Phar, y permite crear y modificar archivos tar y zip no ejecutables (datos) incluso si phar.readonly=1 en php.ini. Por lo tanto, PharData::setAlias() y PharData::setStub() están desactivados ya que los conceptos de alias y rutina de interoperabilidad (stub) son válidos únicamente para archivos phar ejecutables.
Observe que al crear un archivo Phar, se debería pasar la ruta completa al contructor del objeto de la clase Phar. Las rutas relativas causarán un error en la inicialización.
Asumiendo que $p es un objeto de la clase Phar inicializado como sigue:
<?php
$p = new Phar('/ruta/a/miphar.phar', 0, 'miphar.phar');
?>
se creará un archivo Phar vacío en /ruta/a/miphar.phar, o si /ruta/a/miphar.phar ya existe, se abrirá de nuevo. El literal miphar.phar demuestra el concepto de un alias que puede ser usado para referenciar a /ruta/a/miphar.phar en URLs, como en:
<?php
// estas dos llamadas a file_get_contents() son equivalentes si
// /ruta/a/miphar.phar tiene un alias especificado como "miphar.phar"
// en su manifiesto, o si el phar fue inicializado con la
// configuración del objeto Phar del ejemplo anterior
$f = file_get_contents('phar:///ruta/a/miphar.phar/loquesea.txt');
$f = file_get_contents('phar://miphar.phar/loquesea.txt');
?>
Con el recién creado objeto $p de la clase Phar, lo siguiente es posible:
Además, el objeto de la clase Phar es la única manera de acceder a metainformación específica de Phar, a través de Phar::getMetadata(), y la única manera de establecer o recuperar una rutina de interoperabilidad (stub) del cargador de PHP de un archivo Phar a través de Phar::getStub() y Phar::setStub(). Además, la compresión del archivo completo Phar de una vez, sólo puede ser manipulada utilizando la clase Phar.
La lista completa de la funcionalidad de objetos de la clase Phar está documentada más adelante.
La clase PharFileInfo extiende a la clase SplFileInfo, y añade varios métodos para manipular detalles específicos de Phar de un fichero contenido en un Phar, tales como la manipulación de la compresión y la metainformación.
Para ser escrita completamente en un futuro próximo. Antes de leer esto, asegúrese de leer Como utilizar archivos PHAR.
Un buen lugar para empezar es leer acerca de Phar::buildFromIterator(), y los detalles de la elección del formato de fichero disponible para los archivos. Una adecuada comprensión de lo que es y hace una rutina de interoperabilidad (stub), es crucial para la creación de un archivo PHAR, así Phar::setStub() y Phar::createDefaultStub() son buenos lugares para comenzar. Si va a distribuir una aplicación basada en web es fundamental saber qué es y cómo funciona Phar::webPhar() y el método relacionado Phar::mungServer(). Cualquier aplicación que tenga acceso a sus propios ficheros también debe considerar el uso de Phar::interceptFileFuncs().
Todos los archivos Phar contienen tres o cuatro secciones:
una rutina de interoperabilidad (stub)
un manifiesto describiendo el contenido
el contenido de ficheros
[opcional] una firma para verificar la integridad del Phar (solamente el formtado de fichero phar)
Una rutina de interoperabilidad de un Phar es un simple fichero PHP. La rutina de interoperabilidad más pequeña posible es:
<?php __HALT_COMPILER();
Una rutina de interoperabilidad debe contener como mínimo el token __HALT_COMPILER(); en su conclusión. Normalmente, una rutina de interoperabilidad contendrá funcionalidad cargadora como:
<?php
Phar::mapPhar();
include 'phar://miphar.phar/index.php';
__HALT_COMPILER();
No existen restricciones para el contenido de una rutina de interoperabilidad de Phar, excepto el requerimiento
de que concluya con __HALT_COMPILER();. La etiqueta de cierre de PHP
?>
?>
En un archivo phar basado en tar o zip, la rutina de interoperabilidad es alamcenada en el fichero .phar/stub.php. La rutina de interoperabilidad predeterminada para archivos Phar basados en phar contiene aproximadamente 7k de código para extraer el contenido del phar y ejecutarlo. Véase Phar::createDefaultStub() para más información.
El alias de phar se alamcena en un archivo phar basado en zip en el fichero .phar/alias.txt como texto plano.
¿Cuáles son los aspectos positivos y negativos de los tres formatos de fichero soportados en la extensión phar? Esta tabla intenta responder esta pregunta.
| Característica | Phar | Tar | Zip |
|---|---|---|---|
| Formato de Fichero Estádar | No | Sí | Sí |
| Puede ser ejecutado con la extensión Phar [1] | Sí | No | No |
| Compresión por fichero | Sí | No | Sí |
| Compresión de archivo entero | Sí | Sí | No |
| Validación de firmas del archivo entero | Sí | Sí | Sí (PHP 5.3.1+) |
| Soporte para aplicaciones específicas de web | Sí | Sí | Sí |
| Metainformación por fichero | Sí | Sí | Sí |
| Metainformación del archivo entero | Sí | Sí | Sí |
| Modificación creación de archivos [2] | Sí | Sí | Sí |
| Soporte completa para todas las funciones de envoltura de flujos | Sí | Sí | Sí |
| Puede ser creado/modificado incluso si phar.readonly=1 [3] | No | Sí | Sí |
[1] PHP solamente puede acceder directamente al contenido de un archivo Phar sin la extensión Phar si está utilizando una rutina de interoperabilidad que extraiga el contenido del archivo phar. La rutina de interoperabilidad creada por Phar::createDefaultStub() extrae el archivo phar y ejecuta su contenido desde un directorio temporal si no se encuentra la extensión phar.
[2] Todos los accesos de escritura requieren que phar.readonly sea deshabilitado en php.ini o directamente or la línea de comandos.
[3] Solamente se pueden crear archivos tar y zip sin .phar en su nombre de fichero y sin una rutina de interoperabilidad ejecutable .phar/stub.php si phar.readonly=1.
Los archivos basados en el formato de fichero tar siguen el formato de fichero USTAR más moderno. El diseño de la cabecera de fichero tar los hace más eficientes en el acceso que el formato de fichero zip, y casi tan efiniciente que el formato de fichero phar. Los nombres de fichero están limitados a 255 bytes, incluyentdo la ruta completa dentro de archivo phar. No existe límite en el número de ficheros que un archivo phar basado en tar puede contener. Estos archivos pueden ser comprimidos completamente en los formatos gzip o bzip2 y aún ser ejecutados por la extensión Phar.
Para comprimir un archivo entero, use Phar::compress(). Para descomprimir un archvo entero, use Phar::decompress().
Los archivos basados en el formato de fichero zip soportan varias característica incorporadas del formato de fichero zip. La metainformación por fichero y del archivo entero es almacenda en el comentario del fichero zip y en el comentario del archivo zip como una cadena serializada. Los comentarios zip preexistentes serán leídos de manera satisfactoria como una cadena. La lectura/escritura de la compresión por fichero está soportada con la compresión zlib, y el acceso a lectura está soportado con la compresión bzip2. No existe límite en el número de ficheros que un archivo phar basado en zip puede contener. Los directorios vacíos son almacenados en el archivo zip como ficheros con una barra al final, como mi/directorio/
El formato de fichero phar está dispuesto literalmente como rutina_de_interoperabilidad/manifiesto/contenido/firma, y almacena la información crucial de lo que está incluido en el archivo phar en su manifiesto.
El manifiesto de phar es un formato altamente optimizado que permite especificaciones por fichero de compresión de ficheros, permisos de ficheros, e incluso metainformación definida por el usuario como el usuario o grupo del fichero. Todos los valores mayores que 1 byte son almacenados en el orden de byte little-endian, con la excepción de la versión de la API, que por motivos históricos es almacenada como 3 en el orden big-endian.
Todas las banderas sin utilizar están reservadas para un uso futuro, y no deben usarse para almacenar información personalizada.to store custom information. Use la característica de metainformación por fichero para alamacenar información personalizada sobre ficheros en particular.
El formato de fichero básico de un manifiesto Phar es como sigue:
| Tamaño en bytes | Descripción |
|---|---|
| 4 bytes | Longitud del manifiesto en bytes (límite 1 MB) |
| 4 bytes | Número de ficheros en el Phar |
| 2 bytes | Versión de la API del manifiesto de Phar (actualmente 1.0.0) |
| 4 bytes | Banderas mapeadas en bit globales de Phar |
| 4 bytes | Longitud del alisa del Phar |
| ?? | Alias del Phar (la longitud basada en lo anterior) |
| 4 bytes | Longitud de la metainformación del Phar (0 para ninguna) |
| ?? | Metainformación de Phar serializada, almacenada en el formato de serialize() |
| al menos 24 * número de entradas bytes | entradas para cada fichero |
Aquí están las banderas mapeadas en bit actualmente reconocidas por la extensión Phar para el mapeo de bit plano global de Phar:
| Valor | Descripción |
|---|---|
| 0x00010000 | Si se establece, el Phar contendrá una firma de verificaición |
| 0x00001000 | Si se establece, el Phar contendrá al menos 1 fichero que está comprimido con la compresión zlib |
| 0x00002000 | Si se establece, el Phar contendrá al menos 1 fichero que está comprimido con la compresión bzip |
Cada fichero en el manifiesto contiene la siguiente información:
| Tamaño en bytes | Descripción |
|---|---|
| 4 bytes | Longitud del nombre del fichero en bytes |
| ?? | Nombre del fichero (la longitud especificada en lo anterior) |
| 4 bytes | Tamaño del fichero sin comprimir en bytes |
| 4 bytes | Marca de tiempo Unix del fichero |
| 4 bytes | Tamaño del fichero comprimido en bytes |
| 4 bytes | Suma de verificación CRC32 del contenido del fichero si comprimir |
| 4 bytes | Banderas mapeadas en bit específicas del fichero |
| 4 bytes | Longitud de la metainformación del fichero serializada (0 para ninguna) |
| ?? | Metainformación del fichero serializada, almacenada en el formato de serialize() |
Observe que a partir de la versión 1.1.1 de la API, los directorios vacíos son almacenados como nombres de fichero con una barra al final, como mi/directorio/
Los valores de mapeo de bit específicos de fichero reconocidos son:
| Valor | Descripción |
|---|---|
| 0x000001FF | Estos bits están reservador para la definición de los permisos de fichero específicos de un fichero. Los permisos son usados por fstat() y se pueden utilizar para recrear permisos deseados en la extracción. |
| 0x00001000 | Si se establece, el fichero es comprimido con la compresión zlib |
| 0x00002000 | Si se establece, el fichero es comprimido con la compresión bzip |
Los archivos Phar que contienen una firma siempre la tienen añadida al final del archivo Phar después del cargador, el manifiesto y el contenido de ficheros. Los dos formatos de firma soportados en este momento son MD5 y SHA1.
| Longitud en bytes | Descripción |
|---|---|
| 16 ó 20 bytes | La firma real, 20 bytes para una firma SHA1, 16 bytes para una firma MD5, 32 bytes para una firma SHA256, y 64 bytes para una firma SHA512. |
| 4 bytes | Banderas de firma. 0x0001 se usa para definir una firma MD5, 0x0002 se usa para definir una firma SHA1, 0x0004 se usa para definir una firma SHA256, y 0x0008 se usaupara definir una firma SHA512. El soporte para las firmas SHA256 y SHA512 se introdujo con la versión 1.1.0 de la API. |
| 4 bytes | GBMB mágico usado para definir la presencia de una firma. |
(No hay información de versión disponible, podría estar únicamente en SVN)
La clase Phar proporciona una interfaz de alto nivel para el acceso y la creación de archivos phar.
$format = 9021976
[, int $compression = 9021976
[, string $extension
]]] )$format = 9021976
[, int $compression = 9021976
[, string $extension
]]] )$alias
[, string $index = "index.php"
[, string $f404
[, array $mimetypes
[, array $rewrites
]]]]] )(Unknown)
Phar::addEmptyDir — Añadir un directorio vacío al archvo phar
$dirname
)Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Con este método se crea un directorio vacío con la ruta dada por dirname. Este método es similar a ZipArchive::addEmptyDir().
dirname
El nombre de directorio vacío a crear en el archivo phar
No devuelve ningún valor, se lanza una excepción en caso de error.
Ejemplo #1 Un ejemplo de Phar::addEmptyDir()
<?php
try {
$a = new Phar('/ruta/a/phar.phar');
$a->addEmptyDir('/ruta/completa/a/fichero');
// demuestra cómo se almacena este fichero
$b = $a['ruta/completa/a/fichero']->isDir();
} catch (Exception $e) {
// manejar los errores aquí
}
?>
(Unknown)
Phar::addFile — Añadir un fichero desde el sistema de ficheros al archivo phar
$file
[, string $localname
] )Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Con este método, cualquier fichero o URL se puede añadir al arcivo phar. Si se especifica el segundo parámetro opcional localname, el fichero será almacenado en el archivo con el nombre dado por el parámetro, si no se usará el parámetro file como la ruta para almacentar dentro del archivo. Las URLs deben tener un nombre local o se lanzará una excepción. Este método es similar a ZipArchive::addFile().
file
La ruta completa o relativa del fichero del disco a ser añadido al archivo phar.
localname
Ruta con la que el fichero será almacenado en el archivo.
No devuelve ningún valor, se lanza una excepción en caso de error.
Ejemplo #1 Un ejemplo de Phar::addFile()
<?php
try {
$a = new Phar('/ruta/a/phar.phar');
$a->addFile('/ruta/completa/a/fichero');
// demuestra cómo se almacena este fichero
$b = $a['ruta/completa/a/fichero']->getContent();
$a->addFile('/ruta/completa/a/fichero', 'mi/fichero.txt');
$c = $a['mi/fichero.txt']->getContent();
// demostrar el uso de una URL
$a->addFile('http://www.ejemplo.com', 'ejemplo.html');
} catch (Exception $e) {
// manejar los errores aquí
}
?>
(Unknown)
Phar::addFromString — Añadir un fichero desde el sistema de ficheros al archivo phar
$localname
, string $contents
)Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Con este método, cuanquierl cadena se puede añadir al archivo phar. El fichero será almacenado en el archivo con localname como su ruta. Este método es similar a ZipArchive::addFromString().
localname
Ruta con la que el fichero será almacenado en el archivo.
contents
El contenido del fichero a almacenar
No devuelve ningún valor, se lanza una excepción en caso de error.
Ejemplo #1 Un ejemplo de Phar::addFromString()
<?php
try {
$a = new Phar('/ruta/a/phar.phar');
$a->addFromString('ruta/a/fichero.txt', 'mi sencillo fichero');
$b = $a['ruta/a/fichero.txt']->getContent();
// para añadir contenido desde un gestor de flujos para ficheros grandes, use offsetSet()
$c = fopen('/ruta/a/fichero_enorme.bin');
$a['fichero_grande.bin'] = $c;
fclose($c);
} catch (Exception $e) {
// manejar los errores aquí
}
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::apiVersion — Devolver la versión de la API
Devuelve la versión de la API del formato de fichero phar que será usado al crear phars. La extensión Phar soporta la lectura de la versión de la API 1.0.0 o superior. Se requiere la versión 1.1.0 de la API para los algoritmos hash SHA-256 y SHA-512, y la versión 1.1.1 de la API para almacenar directorios vacíos.
La cadena de la versión de la API como "1.0.0".
Ejemplo #1 Un ejemplo de Phar::apiVersion()
<?php
echo Phar::apiVersion();
?>
El resultado del ejemplo sería:
1.1.1
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::buildFromDirectory — Construir un archivo phar desde los ficheros de un directorio
$base_dir
[, string $regex
] )Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Rellena un archivo phar con el contenido de un directorio. El segundo parámtro opcional es una expresión regular (pcre) que se utiliza para excluir ficheros. Cualquier nombre de fichero que coincida con la expresión regular será incluido, todos los demás serán excluidos. Para un control más exhaustivo, use Phar::buildFromIterator().
base_dir
La ruta completa o relativa al directorio que contiene todos los ficheros a añadir al archivo.
regex
Una expresión regular de pcre opcional que se usa para filtrar la lista de ficheros. Solamente las rutas de fichero que coincidan con la expresión regular serán incluidas en el archivo.
Phar::buildFromDirectory() devuelve un array asociativo que que mapea la ruta interna del fichero a la ruta completa del mismo en el sistema de ficheros.
Este método lanza una excepción de tipo BadMethodCallException cuando no puede instanciar los iteradores intermos del directorio, o una excepción de tipo PharException si hubo errores al guardar el archivo phar.
Ejemplo #1 Un ejemplo de Phar::buildFromDirectory()
<?php
// crear con el alias "proyecto.phar"
$phar = new Phar('proyecto.phar', 0, 'proyecto.phar');
// añadir todos los ficheros del proyecto
$phar->buildFromDirectory(dirname(__FILE__) . '/proyecto');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
$phar2 = new Phar('proyecto2.phar', 0, 'proyecto2.phar');
// añadir todos los ficheros del, incluir solamente los ficheros php
$phar2->buildFromDirectory(dirname(__FILE__) . '/proyecto', '/\.php$/');
$phar2->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::buildFromIterator — Construir un archivo phar desde un iterador
Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Rellena un archivo phar desde un iterador. Están soportados dos estilos de iteradores, los iteradores que mapean el nombre de fichero dentro del phar al nombre del fichero en disco, y los iteradores como DirectoryIterator que devuelven objetos de la clase SplFileInfo. Se requiere el segundo parámetro para los iteradores que devuelven objetos de la clase SplFileInfo.
iter
Cualquier iterador que mapee de forma asociativa el fichero phar a la ubiciación o que devuelva objetos de la clase SplFileInfo
base_directory
Para los iteradores que devuelven objetos de la clase SplFileInfo, es la porción de cada ruta completa de fichero a eliminar cuando de añada al archivo phar
Phar::buildFromIterator() devuelve un array asociativo que que mapea la ruta interna del fichero a la ruta completa del mismo en el sistema de ficheros.
Ejemplo #1 Un ejemplo de Phar::buildFromIterator() con SplFileInfo
Para la mayoría de los archivos tar/zip, el archivo reflejará la distribución real de directorios, y el segundo estilo es el más útil. Por ejemplo, para crear un archivo phar que contenga los ficheros n esta distribución de muestra de directorios:
/ruta/al/proyecto/
config/
dist.xml
debug.xml
lib/
fichero1.php
fichero2.php
src/
procesa_algo.php
www/
index.php
cli/
index.php
Este código podría usarse para añadir estos ficheros al archivo phar "proyecto.phar":
<?php
// crear con el alias "proyecto.phar"
$phar = new Phar('proyecto.phar', 0, 'proyecto.phar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/ruta/al/proyecto')),
'/ruta/al/proyecto');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>
El fichero proyecto.phar se puede usar inmediatamente. Phar::buildFromIterator() no establece valores como la compresión y metainformación, que se puede hacer después de crear el archivo phar.
Como observación interesante, Phar::buildFromIterator() también se puede usar para copiar el contenido de un archivo phar existente, ya que los objetos de la clase Phar descienden de la clase DirectoryIterator:
<?php
// crear con el alias "proyecto.phar"
$phar = new Phar('proyecto.phar', 0, 'proyecto.phar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new Phar('/ruta/a/otro_phar.phar')),
'phar:///ruta/a/otro_phar.phar/ruta/al/proyecto');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>
Ejemplo #2 Un ejemplo de Phar::buildFromIterator() con otros iteradores
La segunda forma de iterador se puede usar con cualquier iterador que devuelva un mapeo clave => valor, tal como un objeto de la clase ArrayIterator:
<?php
// crear con el alias "proyecto.phar"
$phar = new Phar('proyecto.phar', 0, 'proyecto.phar');
$phar->buildFromIterator(
new ArrayIterator(
array(
'fichero/interno.php' => dirname(__FILE__) . '/algun_fichero.php',
'otro/fichero.jpg' => fopen('/rota/a/archivo_grande.jpg', 'rb'),
)));
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>
Este método lanza una excepción de tipo UnexpectedValueException cuando
el iterador devuelve valores incorrectos, tales como una clave de tipo integer en lugar de una
cadena, una excepción de tipo BadMethodCallException cuando se
pasa un iterador basado en SplFileInfo sin un parámetro base_directory,
o una excepción de tipo PharException si hubo errores
al guardar el archivo phar.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::canCompress — Devuelve si la extensión phar soporta la compresión usando zlib o bzip2
$type = 0
] )Este método debería usarse para comprobar si es posible una compresicón antes de cargar un archivo phar que contiene ficheros comprimidos.
type
Se puede usar tanto Phar::GZ o Phar::BZ2 para comprobar si la compresión es posible con un algoritmo de compresión específico (zlib o bzip2).
TRUE si la compresión/descompresión está disponible, FALSE si no.
Ejemplo #1 Un ejemplo de Phar::canCompress()
<?php
if (Phar::canCompress()) {
echo file_get_contents('phar://phar_comprimido.phar/fichero/interno.txt');
} else {
echo 'La compresión no está disponible';
}
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::canWrite — Devolver si la extensión phar soporta la escritura y creación de archivos phar
Este método estático determina si ha sido deshabilitado el acceso a escritura en el php.ini del sistema mediante la variable INI phar.readonly.
TRUE si el acceso a escritura esta habilitado, FALSE si está deshabilitado.
Ejemplo #1 Un ejemplo de Phar::canWrite()
<?php
if (Phar::canWrite()) {
file_put_contents('phar://miphar.phar/fichero.txt', 'hola, qué tal');
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::compress — Comprimir el archivo Phar entero usando la compresión Gzip o Bzip2
$compression
[, string $extension
] )Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Para archivos phar basados en tar y en phar, este método comprime el archivo entero usando la compresión gzip o bzip2. El fichero resultante puede ser procesado con el comando gunzip/bunzip, o se puede acceder a él directa y transparentemente con la extensión Phar.
Para archivos phar basados en Zip, este método falla con el lanzamiento de una excepción. La extensión zlib debe estar habilitada para poder comprimir con la compresión gzip, y la extensión bzip2 debe estar habilitada para poder comprimir con la compresión bzip2. Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto.
Además, este método renombra automáticamente el archivo, añadiéndole .gz, .bz2 o eliminado la extensión si se pasa Phar::NONE para eliminar la compresión. De forma alternativa, se puede expecificar una extensión de fichero con el segundo parámetro.
compression
La compresión debe ser Phar::GZ o Phar::BZ2 para añadir compresión, o Phar::NONE para eliminarla.
extension
Por omisión, la extensión es .phar.gz o .phar.bz2 para comprimir archivos phar, y .phar.tar.gz o .phar.tar.bz2 para comprimir archivos tar. Para la descompresión, las extensiones de fichero predeterminadas son .phar y .phar.tar.
Devuelve un objeto de la clase Phar.
Lanza una excepción de tipo BadMethodCallException si la variable INI phar.readonly está activada, la extensión zlib no está disponible, o la extensión bzip2 no está habilitada.
Ejemplo #1 Un ejemplo de Phar::compress()
<?php
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero1.txt'] = 'hola';
$p['mifichero12.txt'] = 'hola';
$p1 = $p->compress(Phar::GZ); // copia a /ruta/a/mi.phar.gz
$p2 = $p->compress(Phar::BZ2); // copia a /ruta/a/mi.phar.bz2
$p3 = $p2->compress(Phar::NONE); // excepción: /ruta/a/mi.phar ya existe
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::compressAllFilesBZIP2 — Comprimir todos los ficheros del archivo Phar actual usando la compresión Bzip2
Nota:
Este método ha sido eliminado de la extensión Phar a partir de la versión 2.0.0. Implementaciones alternativas están disponibles utilizando Phar::compress(), Phar::decompress(), Phar::compressFiles() y Phar::decompressFiles().
Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Este método comprime todos los ficheros del archivo phar usando la compresíon bzip2. La extensión bzip2 debe estar habilitada para aprovechar esta característica. Además, si cualqiuer fichero ya está comprimido con la compresión gzip, la extensión zlib debe estar habilitada para poder descomprimir los ficheros antes de re-comprimirlos con la compresión bzip2. Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo BadMethodCallException si la variable INI phar.readonly está activada, la extensión bzip2 no está disponible, o si cualquier fichero está comprimido usando la compresión gzip y la extensión zlib no está habilitada.
Ejemplo #1 Un ejemplo de Phar::compressAllFilesBZIP2()
<?php
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$p['mifichero2.txt'] = 'hola';
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressedBZIP2());
var_dump($fichero->isCompressedGZ());
}
$p->compressAllFilesBZIP2();
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressedBZIP2());
var_dump($fichero->isCompressedGZ());
}
?>
El resultado del ejemplo sería:
string(13) "mifichero.txt" bool(false) bool(false) bool(false) string(14) "mifichero2.txt" bool(false) bool(false) bool(false) string(13) "mifichero.txt" bool(true) bool(true) bool(false) string(14) "mifichero2.txt" bool(true) bool(true) bool(false)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::compressAllFilesGZ — Comprimir todos los ficheros del archivo Phar actual usando la compresión Gzip
Nota:
Este método ha sido eliminado de la extensión Phar a partir de la versión 2.0.0. Implementaciones alternativas están disponibles utilizando Phar::compress(), Phar::decompress(), Phar::compressFiles() y Phar::decompressFiles().
Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Para archivos phar basados en tar, este método comprime el archivo entero usando la compresión gzip. El fichero resultante se puede procesar con el comando gunzip, o se puede acceder a él directa y transparentemente con al extensión Phar.
Para archivos phar basados en Zip, este método comprime todos los ficheros del archivo Phar usando la compresión gzip. La extensión zlib debe estar habilitada para aprovechar esta característica. Además, si cualqiuer fichero ya está comprimido con la compresión bzip2, la extensión bzip2 debe estar habilitada para poder descomprimir los ficheros antes de re-comprimirlos con la compresión gzip. Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo BadMethodCallException si la variable INI phar.readonly está activada, la extensión zlib no está disponible, o si cualquier fichero está comprimido usando la compresión bzip2 y la extensión bzip2 no está habilitada.
Ejemplo #1 Un ejemplo de Phar::compressAllFilesGZ()
<?php
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$p['mifichero2.txt'] = 'hola';
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressedBZIP2());
var_dump($fichero->isCompressedGZ());
}
$p->compressAllFilesGZ();
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressedBZIP2());
var_dump($fichero->isCompressedGZ());
}
?>
El resultado del ejemplo sería:
string(13) "mifichero.txt" bool(false) bool(false) bool(false) string(14) "mifichero2.txt" bool(false) bool(false) bool(false) string(13) "mifichero.txt" bool(true) bool(false) bool(true) string(14) "mifichero2.txt" bool(true) bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::compressFiles — Comprime todos los ficheros del archivo Phar actual
$compression
)Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Para archivos phar basados en tar, este método lanza una excepción de tipo BadMethodCallException, ya que la compresión de ficheros individuales dentro de un archivo tar no está soportada por el formato de fichero. Use Phar::compress() para comprimir un archivo phar entero basado en tar.
Para achivos phar basados en Zip y phar, este método comprime todos los ficheros del archivo Phar usando la compresión especificada. Las extensiones zlib o bzip2 deben estar habilitadas para aprovechar esta característica. Además, si cualquier fichero ya está comprimido con la compresión bzip2/zlib, la extensión respectiva debe estar habilitada para poder descomprimir los ficheros antes de re-comprimirlos. Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto.
compression
La compresión debe ser Phar::GZ o Phar::BZ2 para añadir compresión, o Phar::NONE para eliminarla.
No devuelve ningún valor.
Lanza una excepción de tipo BadMethodCallException si la variable INI phar.readonly está activada, la extensión zlib no está disponible, o si cualquier fichero está comprimido con la compresión bzip2 y la extensión bzip2 no está habilitada.
Ejemplo #1 Un ejemplo de Phar::compressFiles()
<?php
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$p['mifichero2.txt'] = 'hola';
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressed(Phar::BZ2));
var_dump($fichero->isCompressed(Phar::GZ));
}
$p->compressFiles(Phar::GZ);
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressed(Phar::BZ2));
var_dump($fichero->isCompressed(Phar::GZ));
}
?>
El resultado del ejemplo sería:
string(13) "mifichero.txt" bool(false) bool(false) bool(false) string(14) "mifichero2.txt" bool(false) bool(false) bool(false) string(13) "mifichero.txt" int(4096) bool(false) bool(true) string(14) "mifichero2.txt" int(4096) bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::__construct — Construir un objeto de archivo Phar
$fname
[, int $flags
[, string $alias
]] )
fname
Ruta a un archivo Phar existente o para ser creado
flags
Banderas a pasar a la clase padre RecursiveDirectoryIterator.
alias
Alias con el que referirse al archivo Phar en las llamadas a funcionalidades de flujos.
Lanza una excepción de tipo BadMethodCallException si se llama dos veces, o una excepción de tipo UnexpectedValueException si no se puede abrir el archivo phar.
Ejemplo #1 Un ejemplo de Phar::__construct()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME,
'mi.phar');
} catch (UnexpectedValueException $e) {
die('No se pudo abrir mi.phar');
} catch (BadMethodCallException $e) {
echo 'Técnicamente esto no puede suceder';
}
// esto funciona ahora
echo file_get_contents('phar://mi.phar/ejemplo.txt');
// y funciona si hemos escrito
echo file_get_contents('phar:///ruta/a/mi.phar/ejemplo.txt');
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::convertToData — Convertir un archivo phar en un fichero tar o zip no ejecutable
$format = 9021976
[, int $compression = 9021976
[, string $extension
]]] )Este método se usa para convertir un archivo phar ejecutable en un fichero tar o zip. Para hacer del tar o zip un fichero no ejecutable, se eliminan los ficheros del phar de rutina de interoperabilidad y de alias del recién creado nuevo archivo.
Si no se especifica ningún cambio, este método lanza una excepción de tipo BadMethodCallException si el archivo está en el formato de fichero phar. Para archivos en el formato tar o zip, este método convierte el archivo en un archivo no ejecutable.
En caso de éxito, el metodo crea un nuevo archivo en disco y devuelve un objeto de la clase PharData. El archivo antiguo no se elimina del disco, y debería hacerse manualmente después de que el proceso haya finalizado.
format
Este parámetro debería ser Phar::TAR
o Phar::ZIP. Si se establece a NULL, se conservará el
formato de fichero existente.
compression
Este parámetro debería ser Phar::NONE para no comprimir el archivo completo, Phar::GZ para la compresión basada en zlib, y Phar::BZ2 para la compresión basada en bzip.
extension
Este parámetro se utiliza para sobrescribir la extensión de fichero predeterminada de un archivo convertido. Observe que .phar no puede ser usado en ningún lugar del nombre de fichero de un archivo tar o zip no ejecutable.
Si se convierte a un archivo basado en tar, las extensiones predeterminadas son .tar, .tar.gz, y .tar.bz2 dependiendo de la compresión especificada. Para archivos basados en zip, la extensión predetermianda es .zip.
El método devuelve un objeto PharData en caso de éxito, y lanza una excepción en caso de error.
Este método lanza una excepción de tipo BadMethodCallException cuando no se puede comprimir, se ha especificado un método de compresión desconocido, el archivo solicitado está almacenado en buffer con Phar::startBuffering() y no se ha cerrado con Phar::stopBuffering(), y una excepción de tipo PharException si se encontró algún problema durante el proceso de la creación de phar.
Ejemplo #1 Un ejemplo de Phar::convertToData()
Utilizar Phar::convertToData():
<?php
try {
$tarphar = new Phar('miphar.phar.tar');
// observe que miphar.phar.tar *no* está desvinculado.
// convertirlo a un formato de fichero tar no ejecutable,
// se crea miphar.tar
$tar = $tarphar->convertToData();
// convertirlo a un formato zip no ejecutable, se crea miphar.zip
$zip = $tarphar->convertToData(Phar::ZIP);
// crear miphar.tbz
$tgz = $tarphar->convertToData(Phar::TAR, Phar::BZ2, '.tbz');
// crear miphar.phar.tgz
$phar = $tarphar->convertToData(Phar::PHAR); // lanza una excepción
} catch (Exception $e) {
// manejar el error aquí
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::convertToExecutable — Convertir un archivo phar en otro formato de archivo phar ejecutable
$format = 9021976
[, int $compression = 9021976
[, string $extension
]]] )Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Este método se utiliza para convertir un archivo phar en otro formato de fichero. Por ejemplo, se puede utilizar para crear un archivo phar ejecutable basado en tar desde un archivo phar ejecutable basado en zip, o desde un archivo phar ejecutable en el formato de fichero phar. Además, se puede utilizar para aplicar la compresión al archivo completo a un archivo basado en phar o tar.
Si no se especifica ningún cambio, este método lanza una excepción de tipo BadMethodCallException
En caso de éxito, el metodo crea un nuevo archivo en disco y devuelve un objeto de la clase PharData. El archivo antiguo no se elimina del disco, y debería hacerse manualmente después de que el proceso haya finalizado.
format
Este parámetro debería ser Phar::PHAR, Phar::TAR,
o Phar::ZIP. Si se establece a NULL, se conservará el
formato de fichero existente.
compression
Este parámetro debería ser Phar::NONE para no comprimir el archivo completo, Phar::GZ para la compresión basada en zlib, y Phar::BZ2 para la compresión basada en bzip.
extension
Este parámetro se utiliza para sobrescribir la extensión de fichero predeterminada de un archivo convertido. Observe que todos los archivos phar basados en zip o en tar deben contener .phar en su extensión de fichero para poder ser procesados como un archivo phar.
Si se convierte a un archivo basado en phar, las extensiones predeterminadas son .phar, .phar.gz, o .phar.bz2 dependiendo de la compresión especificada. Para archivos phar basados en tar, las extensiones predeterminadas son .phar.tar, .phar.tar.gz, y .phar.tar.bz2. Para archivos phar basados en zip, la estensión predeterminada es .phar.zip.
El método devuelve un objeto Phar en caso de éxito, y lanza una excepción en caso de error.
Este método lanza una excepción de tipo BadMethodCallException cuando no se puede comprimir, se ha especificado un método de compresión desconocido, el archivo solicitado está almacenado en buffer con Phar::startBuffering() y no se ha cerrado con Phar::stopBuffering(), una excepción de tipo UnexpectedValueException si el soporte para escritura está deshabilitado, y una excepción de tipo PharException si se encontró algún problema durante el proceso de la creación de phar.
Ejemplo #1 Un ejemplo de Phar::convertToExecutable()
Utilizar Phar::convertToExecutable():
<?php
try {
$tarphar = new Phar('miphar.phar.tar');
// convertirlo al formato de fichero phar
// observe que miphar.phar.tar *no* está desvinculado
$phar = $tarphar->convertToExecutable(Phar::PHAR); // crea miphar.phar
$phar->setStub($phar->createDefaultStub('cli.php', 'web/index.php'));
// crea miphar.phar.tgz
$comprimido = $phar->convertToExecutable(Phar::TAR, Phar::GZ, '.phar.tgz');
} catch (Exception $e) {
// manejar el error aquí
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::copy — Copiar un fichero interno de un archivo phar a otro fichero nuevo dentro del phar
$oldfile
, string $newfile
)Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Copia un fichero interno de un archivo phar a otro fichero nuevo dentro del phar. Esta es una alternativa orientada a objetos para usar copy() con la envoltura de flujos phar.
oldfile
newfile
Devuelve TRUE en caso de éxito, pero es más seguro encerrar la llamada al método en un
bloque try/catch y asumir el éxito si no se lanza ninguna excepción.
Lanza una excepción de tipo UnexpectedValueException si el fichero origen no exite, el fichero destino ya existe, el acceso a escritura está deshabilitado, la apertura de cualquiera de los dos ficheros falla, la lectura del fichero fuente falla, o una excepción de tipo PharException si la escritura de los cambios del phar falla.
Ejemplo #1 Un ejemplo de Phar::copy()
Este ejemplo muestra el uso de Phar::copy() y su equivalente con envoltura de flujos. La principal diferencia entre los dos enfoques es el manejo de errores. Todos los métodos de Phar lanzan excepciones, mientras que la envoltura de flujos utiliza trigger_error().
<?php
try {
$phar = new Phar('miphar.phar');
$phar['a'] = 'hola';
$phar->copy('a', 'b');
echo $phar['b']; // imprime "hola"
} catch (Exception $e) {
// manejar errores
}
// el equivalente con envoltura de flujos del código de arriba.
// Se dispara E_WARNINGS en caso de error en vez de excepciones.
copy('phar://miphar.phar/a', 'phar//miphar.phar/c');
echo file_get_contents('phar://miphar.phar/c'); // imprimie "hola"
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::count — Devuelve el número de entradas (ficheros) en el archivo Phar
El número de archivos que contiene Phar, o 0 (el número cero) si no contiene.
Ejemplo #1 Phar::count() ejemplo
<?php
// asegurarse de que no existe
@unlink('brandnewphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
} catch (Exception $e) {
echo 'No se pudo crear Phar:', $e;
}
echo 'El nuevo Phar tiene ' . $p->count() . " entradas\n";
$p['file.txt'] = 'hi';
echo 'El nuevo Phar tiene ' . $p->count() . " entradas\n";
?>
El resultado del ejemplo sería:
El nuevo Phar tiene 0 entradas El nuevo Phar tiene 1 entradas
(Unknown)
Phar::createDefaultStub — Crear una rutina de interoperabilidad específica del formato de fichero phar
$indexfile
[, string $webindexfile
]] )Este método está destinado a la creación de rutinas de interoperabilidad (stubs) específicas del formato de fichero phar, y no está destinado a ustilizarlo con archivo phar basados en tar o zip.
Los archivos Phar contienen una rutina de interoperabilidad cargadora (en inglés stub) escrita en PHP que se ejecuta cuando el archivo es ejecutado en el propio PHP mediante inclusión:
<?php
include 'miphar.phar';
?>
php miphar.phar
Este método proporciona una manera simple y sencilla de crear una rutina de interoperabilidad que ejecutará un fichero inicial desde el archivo phar. Además, se pueden especificar diferentes ficheros para ejecutar el archivo phar desde la línea de comandos o a través de un servidor web. La rutina de interoperabilidad cargadora también llama a Phar::interceptFileFuncs() para permitir empaquetar de manera sencilla una aplicación PHP que accede al sistema de ficheros. Si la extensión phar no está presente, la rutina de interoperabilidad cargadora extraerá el archivo phar en un directorio temporal y después operará sobre los archivos. Una función d cierre borra los ficheros temporales a la salida.
Devuelve una cadena que contiene una rutina de interoperabildad personalizada (stub) que permite al archivo Phar creado funcionar con o sin la extensón Phar habilitada.
Lanza una excepción de tipo UnexpectedValueException si cualquier parámetro es mayor de 400 bytes.
Ejemplo #1 Un ejemplo de Phar::createDefaultStub()
<?php
try {
$phar = new Phar('miphar.phar');
$phar->setStub($phar->createDefaultStub('cli.php', 'web/index.php'));
} catch (Exception $e) {
// manejar errores
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::decompress — Descomprimir un archivo Phar entero
$extension
] )Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Para archivos phar basados en tar y phar, este método descomprime el archivo entero.
Para archivos phar basados en Zip, este método este método falla con el lanzamiento de una excepción. La extensión zlib debe estar habilitada para descomprimir un archivo comprimido con la compresión gzip, y la extensión bzip2 debe estar habilitada para descomprimir un archivo comprimido con la compresión bzip2. Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto.
Además, este método cambia automáticamente la extensión del archivo, .phar por omisión para archivos phar, o .phar.tar para archivos phar basados en tar. De forma alternativa, se puede expecificar una extensión de fichero con el segundo parámetro.
extension
Para la descompresión, las extensiones de fichero predeterminadas son .phar y .phar.tar. Use este parámetro para especificar otra extensión de fichero. Observe que todos los archivos phar ejecutables deben contener .phar en su nombre de fichero.
Devuelve un objeto de la clase Phar.
Lanza una excepción de tipo BadMethodCallException si la variable INI phar.readonly está activada, la extensión zlib no está disponible, o la extensión bzip2 no está habilitada.
Ejemplo #1 Un ejemplo de Phar::decompress()
<?php
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar.gz');
$p['mifichero1.txt'] = 'hola';
$p['mifichero12.txt'] = 'hola';
$p3 = $p2->decompress(); // crea /ruta/a/mi.phar
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::decompressFiles — Descomprimir todos los ficheros del archivo Phar actual
Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Para archivos phar basados en tar, este método lanza una excepción de tipo BadMethodCallException, ya que la compresión de ficheros individuales dentro de un archivo tar no está soportada por el formato de fichero. Use Phar::compress() para comprimir un archivo phar entero basado en tar.
Para achivos phar basados en Zip y phar, este método descomprime todos los ficheros del archivo Phar. Las extensiones zlib o bzip2 deben estar habilitadas para aprovechar esta característica si cualquier fichero está comprimido con la compresión bzip2/zlib. Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo BadMethodCallException si la variable INI phar.readonly está activada, la extensión zlib no está disponible, o si cualquier fichero está comprimido con la compresión bzip2 y la extensión bzip2 no está habilitada.
Ejemplo #1 Un ejemplo de Phar::decompressFiles()
<?php
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$p['mifichero2.txt'] = 'hola';
$p->compressFiles(Phar::GZ);
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressed(Phar::BZ2));
var_dump($fichero->isCompressed(Phar::GZ));
}
$p->decompressFiles();
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressed(Phar::BZ2));
var_dump($fichero->isCompressed(Phar::GZ));
}
?>
El resultado del ejemplo sería:
string(13) "mifichero.txt" int(4096) bool(false) bool(true) string(14) "mifichero2.txt" int(4096) bool(false) bool(true) string(13) "mifichero.txt" bool(false) bool(false) bool(false) string(14) "mifichero2.txt" bool(false) bool(false) bool(false)
(PHP >= 5.3.0, PECL phar >= 1.2.0)
Phar::delMetadata — Eliminar la metainformación global del phar
Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Elimina la metainformación global del phar
Devuelve TRUE en caso de éxito, pero es mejor comprobar si lanza alguna excepción,
y asumir el éxito si no se lanza ninguna.
Lanza una excepción de tipo PharException si ocurrió algún error al volcar los cambios al disco.
Ejemplo #1 Un ejemplo de Phar::delMetaData()
<?php
try {
$phar = new Phar('miphar.phar');
var_dump($phar->getMetadata());
$phar->setMetadata("hola, qué tal");
var_dump($phar->getMetadata());
$phar->delMetadata();
var_dump($phar->getMetadata());
} catch (Exception $e) {
// manejar errores
}
?>
El resultado del ejemplo sería:
NULL string(14) "hola, qué tal" NULL
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::delete — Borrar un fichero dentro de un archivo phar
$entry
)Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Borra un fichero dentro de un archivo. Esto es el equivalente funcional de llamar a unlink() en el equivalente de envoltura de flujos, tal como se muestra en el ejemplo de abajo.
entry
La ruta dentro de un archivo para borrar el fichero.
Devuelve TRUE en caso de éxito, pero es mejor comprobar si lanza alguna excepción,
y asumir el éxito si no se lanza ninguna.
Lanza una excepción de tipo PharException si se produjo algún error al volcar los cambios al disco.
Ejemplo #1 Un ejemplo de Phar::delete()
<?php
try {
$phar = new Phar('miphar.phar');
$phar->delete('desvincular/yo.php');
// esto es equivalente a:
unlink('phar://miphar.phar/desvincular/yo.php');
} catch (Exception $e) {
// manejar errores
}
?>
(Unknown)
Phar::extractTo — Extraer el contenido de un archivo phar a un directorio
$pathto
[, string|array $files
[, bool $overwrite = false
]] )Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Extrae todos los ficheros de un archivo phar al disco. Los ficheros y directorios extraídos conservan los mismos permisos que los almacenados en el archivo. Los parámetros opcionales permiten controlar qué ficheros serán extraídos, y si los ficheros existentes en disco podrán ser sobrescritos. El segundo parámetro files puede ser el nombre de un fichero o directorio a extraer, o un array de nombre de ficheros y directorios a extraer. Por omisión, este método no sobrescribirá los ficheros existentes, aunque el tercer parámetro se puede establecer a true para habilitar la sobrescritura de ficheros. Este método es similar a ZipArchive::extractTo().
pathto
Ruta dentro de un archivo al fichero a borrar.
files
El nombre de un fichero o directorio a extraer, o un array de ficheros/directorios a extraer.
overwrite
Esteblecer a TRUE para habilitar la sobrescritura de ficheros existentes
Devuelve TRUE en caso de éxito, pero es mejor comprobar si lanza alguna excepción,
y asumir el éxito si no se lanza ninguna.
Lanza una excepción de tipo PharException si ocurrió algún error al volcar los cambios al disco.
Ejemplo #1 Un ejemplo de Phar::extractTo()
<?php
try {
$phar = new Phar('miphar.phar');
$phar->extractTo('/ruta/completa'); // extraer todos los ficheros
$phar->extractTo('/otra/ruta', 'fichero.txt'); // extraer solamente fichero.txt
$phar->extractTo('/esta/ruta',
array('fichero1.txt', 'fichero2.txt')); // extraer solamente 2 ficheros
$phar->extractTo('/tercera/ruta', null, true); // extraer todos los ficheros y sobrescribirlos
} catch (Exception $e) {
// manejar errores
}
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::getMetadata — Devolver la metainformación de un archivo phar
Recupera la información de un archivo. La metainformación puede ser cualquier variable de PHP que pueda ser serializada.
No tiene parámetros.
Cualquier variable de PHP que pueda ser serializada y almacenada como metainformación del archivo Phar,
o NULL si no hay metainformación almacenada.
Ejemplo #1 Un ejemplo de Phar::getMetadata()
<?php
// asegurarse de que no existe
@unlink('nuevo_phar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/nuevo_phar.phar', 0, 'nuevo_phar.phar');
$p['fichero.php'] = '<?php echo "hola";';
$p->setMetadata(array('bootstrap' => 'fichero.php'));
var_dump($p->getMetadata());
} catch (Exception $e) {
echo 'No se pudo crear y/o modificar el phar:', $e;
}
?>
El resultado del ejemplo sería:
array(1) {
["bootstrap"]=>
string(11) "fichero.php"
}
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::getModified — Devolver si el phar fue modificado
Este método se puede usar para determinar si un phar tiene un fichero interno eliminado, o el contenido de un fichero ha cambiado de alguna forma.
No tiene parámetros.
TRUE si el phar ha sido modificado desde su apertura, FALSE si no.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::getSignature — Devolver la firma MD5/SHA1/SHA256/SHA512/OpenSSL de un archivo Phar
Devuelve la firma de verificación de un archivo phar en una cadena hexadecimal.
Un array con las firmas del archivo abierto en la clave hash, y MD5, SHA-1, SHA-256, SHA-512, o OpenSSL en la clave hash_type. Esta firma es un hash calculado sobre el contenido entero del phar, y puede ser usada para verificar la integridad del archivo. Se requiere absolutamente una firma válida de todos los archivos phar ejecutables si la variable INI phar.require_hash está establecida a true.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::getStub — Devolver el cargador de PHP o la rutina de interoperabilidad de un archivo Phar
Los archivos Phar contienen una rutina de interoperabilidad cargadora (en inglés stub) escrita en PHP que se ejecuta cuando el archivo es ejecutado en el propio PHP mediante inclusión:
<?php
include 'myphar.phar';
?>
php myphar.phar
Devuelve una cadena que contiene la rutina de interoperabilidad cargadora (stub) del archivo Phar actual.
Lanza una excepción de tipo RuntimeException si no es posible leer la rutina de interoperabilidad del archivo Phar.
Ejemplo #1 Un ejemplo de Phar::getStub()
<?php
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
echo $p->getStub();
echo "==NEXT==\n";
$p->setStub("<?php
function __autoload($clase)
{
include 'phar://' . str_replace('_', '/', $clase);
}
Phar::mapPhar('miphar.phar');
include 'phar://miphar.phar/arrancar.php';
__HALT_COMPILER(); ?>");
echo $p->getStub();
?>
El resultado del ejemplo sería:
<?php __HALT_COMPILER(); ?>
==NEXT==
<?php
function __autoload($clase)
{
include 'phar://' . str_replace('_', '/', $clase);
}
Phar::mapPhar('miphar.phar');
include 'phar://miphar.phar/arrancar.php';
__HALT_COMPILER(); ?>
(PHP >= 5.3.0, PECL phar >= 1.2.0)
Phar::getSupportedCompression — Devolver un array de los algoritmos de compresión soportados
No tiene parámetros.
Devuelve un array que contiene Phar::GZ o Phar::BZ2, dependiendo de la disponibilidad de la extensión zlib o de la extensión bz2.
(PHP >= 5.3.0, PECL phar >= 1.1.0)
Phar::getSupportedSignatures — Devolver un array con los tipos de firmas soportados
Devuelve un array con los tipos de firmas soportados
No tiene parámetros.
Devuelve un array que contiene cualquiera de las firmas MD5, SHA-1, SHA-256, SHA-512, o OpenSSL.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::getVersion — Devolver información de la versión del archivo Phar
Devuelve la versión de la API de un archvo Phar abierto.
La versión de la API del arcivo abierto. No se debe confundir con la versión de la API que la extensión phar cargada usará para crear nuevos phars. Cada archivo Phar tiene la versión de la API codificada dentro de su manifiesto. Véase la documentación del formato de fichero Phar para más información.
(PHP >= 5.3.0, PECL phar >= 1.2.0)
Phar::hasMetadata — Devolver si el phar tiene metainformación global
Devuelve si el phar tiene metainformación global establecida.
No tiene parámetros.
Devuelve TRUE si la metainformación ha sido establecida, y FALSE si no.
Ejemplo #1 Un ejemplo de Phar::hasMetadata()
<?php
try {
$phar = new Phar('miphar.phar');
var_dump($phar->hasMetadata());
$phar->setMetadata(array('cosa' => 'hola'));
var_dump($phar->hasMetadata());
$phar->delMetadata();
var_dump($phar->hasMetadata());
} catch (Exception $e) {
// manejar errores
}
?>
El resultado del ejemplo sería:
bool(false) bool(true) bool(false)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::interceptFileFuncs — Ordenar a phar interceptar fopen, file_get_contents, opendir, y todas las funciones relacionadas con estadísticas
Ordena a phar interceptar fopen(), readfile(), file_get_contents(), opendir(), y todas las funciones relacionadas con estadísticas. Si cualquiera de estas tres funciones es llamada desde dentro de un archivo phar con una ruta relativa, la llamada es modificada para acceder al fichero dentro del archivo phar. Se asume que las rutas absolutas son intentos para cargar ficheros externos desde el sistema de ficheros.
Esta función hace posible ejecutar aplicaciones de PHP diseñadas para ejecutarse desde un disco duro como una aplicación phar.
No tiene parámetros.
Ejemplo #1 Un ejemplo de Phar::interceptFileFuncs()
<?php
Phar::interceptFileFuncs();
include 'phar://' . __FILE__ . '/fichero.php';
?>
Se asume que este phar está en /ruta/a/miphar.phar y que contiene fichero.php y fichero2.txt, si fichero.php contiene este código:
Ejemplo #2 Un ejemplo de Phar::interceptFileFuncs()
<?php
echo file_get_contents('fichero2.txt');
?>
Normalmente, PHP buscará fichero2.txt en el directorio actual, que traducirá como el directorio del fichero.php, o el direcotorio actual de un usuario de la línea de comandos. En el código del ejemplo anterior, Phar::interceptFileFuncs() ordena a PHP que considere el directorio actual como phar:///ruta/a/miphar.phar/ y por lo tanto abra phar:///ruta/a/miphar.phar/fichero2.txt.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::isBuffering — Determinar si las operaciones de escritura de Phar está siendo almacenadas en buffer, o están siendo volcadas directamente al disco
Este método se puede usar para determinar si un Phar guardará los cambios al disco inmediatamente, o si se necesita una llamada Phar::stopBuffering() para habilitar el guardado de los cambios.
La escritura en buffer de Phar es por archivo, el almacenamiento activo en buffer del archivo Phar foo.phar no afecta a los cambios hechos al archivo Phar bar.phar.
Devuelve TRUE si las operaciones de escritura están siendo almacenadas en buffer, FALSE si no.
Ejemplo #1 Un ejemplo de Phar::isBuffering()
<?php
$p = new Phar(dirname(__FILE__) . '/nuevo_phar.phar', 0, 'nuevo_phar.phar');
$p2 = new Phar('phar_existente.phar');
$p['fichero1.txt'] = 'hola';
var_dump($p->isBuffering());
var_dump($p2->isBuffering());
?>
=2=
<?php
$p->startBuffering();
var_dump($p->isBuffering());
var_dump($p2->isBuffering());
$p->stopBuffering();
?>
=3=
<?php
var_dump($p->isBuffering());
var_dump($p2->isBuffering());
?>
El resultado del ejemplo sería:
bool(false) bool(false) =2= bool(true) bool(false) =3= bool(false) bool(false)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::isCompressed — Devuelve Phar::GZ oPHAR::BZ2 si el archivo phar entero está comprimido (.tar.gz/tar.bz, etc.)
Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Devuelve Phar::GZ o PHAR::BZ2 si el archivo phar entero está comprimido
(.tar.gz/tar.bz, etc.). Los archivos phar basados en Zip no pueden ser comprimidos como un
fichero, y por lo tanto, este método devolverá siempre FALSE si se requiere un archivo phar basado en zip.
No tiene parámetros.
Phar::GZ, Phar::BZ2 o FALSE
Ejemplo #1 Un ejemplo de Phar::isCompressed()
<?php
try {
$phar1 = new Phar('miphar.zip.phar');
var_dump($phar1->isCompressed());
$phar2 = new Phar('sin_comprimir.tar.phar');
var_dump($phar2->isCompressed());
$phar2->compressAllFilesGZ();
var_dump($phar2->isCompressed() == Phar::GZ);
} catch (Exception $e) {
}
?>
El resultado del ejemplo sería:
bool(false) bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::isFileFormat — Devolver true si el archivo phar está basado en el formato de fichero tar/phar/zip dependiendo del parámetro
$format
)
format
Phar::PHAR, Phar::TAR, o Phar::ZIP para comprobar el formato del archivo.
Devuelve TRUE si el archivo phar coincide con el formato de fichero solicitado por el parámetro
Se lanza una excepción de tipo PharException si el parámetro es un especificador de formato de fichero desconocido.
(PHP >= 5.3.0, PECL phar >= 1.2.0)
Phar::isValidPharFilename — Devolver si el nombre de fichero dado es un nombre de fichero phar válido
$filename
[, bool $executable = true
] )Devuelve si el nombre de fichero dado es un nombre de fichero phar válido que será reconocido como un archivo phar por la extensión phar. Este método se puede usar para comprobar un nombre sin tener que instanciar un archivo phar y capturar la inevitable excepción que será lanzada si se especifica un nombre no válido.
filename
El nombre o la ruta completa al archivo phar aún no creado
executable
Este parámetro determina si el nombre de fichero debería ser tratado como un archivo phar ejecutable o un archivo de datos no ejecutable
Devuelve TRUE si el nombre de fichero es válido, FALSE si no.
(Unknown)
Phar::isWritable — Devolver si el archivo phar se puede modificar
Este método devuelve TRUE si phar.readonly es 0,
y el archivo phar real del disco no es de sólo lectura.
No tiene parámetros.
Devuelve TRUE si el archivo phar puede ser modificado
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::loadPhar — Cargar cualquier archivo phar con un alias
$filename
[, string $alias
] )Este método se puede usar para leer el contenido de una archivo Phar externo. Esto es más útil para asignar un alias a un phar, por lo que las referencias subsiguientes al phar puedan usar el alias más corto, o para cargar archivos Phar que contengan solamente datos y no estén concebidos para la ejecución/inclusión en scripts de PHP.
filename
La ruta completa o relativa al archivo phar a abrir
alias
El alias que puede usarse para referirse al archivo phar. Observe que muchos archivos phar especifican un alias explícito dentro del archivo phar, y que una excepción de tipo PharException será lanzada si en este caso se especifica un nuevo alias.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo PharException si se pasa un alias y en archivo phat ya tiene uno explícito
Ejemplo #1 Un ejemplo de Phar::loadPhar()
Phar::loadPhar puede usarse en cualquier lugar para cargar un archivo Phar externo, mientras que Phar::mapPhar debería usarse en una rutina de interoperabilidad cargadora para un Phar.
<?php
try {
Phar::loadPhar('/ruta/a/phar.phar', 'mi.phar');
echo file_get_contents('phar://mi.phar/fichero.txt');
} catch (PharException $e) {
echo $e;
}
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::mapPhar — Leer el fichero (un phar) que está en ejecución y registrar su manifiesto
$alias
[, int $dataoffset = 0
]] )Este método estático solamente se puede usar dentro de una rutina de interoperabilidad cargadora de un archivo Phar para inicializar el phar cuando sea directamente ejecutado, o cuando se incluya en otro scrip.
alias
El alias que puede usarse en las URL phar:// para referirse a este archivo, en vez de su ruta completa.
dataoffset
Variable sin uso, está aquí por compatibilidad con los PHP_Archive de PEAR.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Se lanza una excepción de tipo PharException si no se llama directamente dentro de la ejecución de PHP, si no se encuentra el token __HALT_COMPILER(); en el fichero fuente actual, o si el fichero no se puede abrir para lectura.
Ejemplo #1 Un ejemplo de Phar::mapPhar()
mapPhar debería usarse dentro de una rutina de interoperabilidad cargadora de phar. Utilice loadPhar para cargar un phar externo en memoria.
Aquí está una rutina de interoperabilidad de Phar de muestra que usa mapPhar.
<?php
function __autoload($clase)
{
include 'phar://mi.phar/' . str_replace('_', '/', $clase) . '.php';
}
try {
Phar::mapPhar('mi.phar');
include 'phar://mi.phar/inicio.php';
} catch (PharException $e) {
echo $e->getMessage();
die('No se puede inicializar el Phar');
}
__HALT_COMPILER();
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::mount — Montar un fichero o ruta externos en una ubicación virtual dentro de un archivo phar
$pharpath
, string $externalpath
)Al igual que con el concepto del sistema de ficheros de Unix de montar dispositivos externos en rutas dentro del árbol de directorios, Phar::mount() siempre se refiere a ficheros y directorios externos como si estuvieran dentro de un archivo phar. Esto perimte una potente abstracción tal como referirse a ficheros de configuración externos como si estuvieran dentro del archivo.
pharpath
La ruta interna a usar dentro del archivo phar como la ubicación de la ruta montada. Debe ser una ruta relativa dentro del archivo phar, y no debe existir.
externalpath
Una ruta o un URL a un fichero o directorio externo a montar dentro del archivo phar.
No devuelve nada. Lanza una excepción de tipo PharException en caso de fallo.
Lanza una excepción de tipo PharException si ocurrió algún problema al montar la ruta.
Ejemplo #1 Un ejemplo de Phar::mount()
El siguiente ejemplo muestra el acceso a un fichero de configuración externo como si fuera una ruta dentro de un archivo phar.
Lo primero, el código dentro de un archivo phar:
<?php
$configuración = simplexml_load_string(file_get_contents(
Phar::running(false) . '/config.xml'));
?>
Lo siguiente, el código externo utilizado para montar el fichero de configuración:
<?php
// primero se establece la asociación entre el config.xml abstracto
// y el real del disco
Phar::mount('phar://config.xml', '/home/example/config.xml');
// ahora ejecutar la aplicación
include '/ruta/a/archivo.phar';
?>
Otro método es poner el codigo de montaje dentro de la rutina de interoperabilidad del archivo phar. Aquí está un ejemplo de establecer un fichero de configuración predeterminado si no se especifica una configuración de usuario:
<?php
// primero se establece la asociación entre el config.xml abstracto
// y el real del disco
if (defined('EXTERNAL_CONFIG')) {
Phar::mount('config.xml', EXTERNAL_CONFIG);
if (file_exists(__DIR__ . '/extra_config.xml')) {
Phar::mount('extra.xml', __DIR__ . '/extra_config.xml');
}
} else {
Phar::mount('config.xml', 'phar://' . __FILE__ . '/default_config.xml');
Phar::mount('extra.xml', 'phar://' . __FILE__ . '/default_extra.xml');
}
// ahora ejecutar la aplicación
include 'phar://' . __FILE__ . '/index.php';
__HALT_COMPILER();
?>
...y el código externo para cargar este archivo phar:
<?php
define('EXTERNAL_CONFIG', '/inicio/ejemplo/config.xml');
// ahora ejecutar la aplicación
include '/ruta/a/archivo.phar';
?>
(Unknown)
Phar::mungServer — Definir una lista de hasta 4 variables $_SERVER que debería ser modificadas para la ejecución
$munglist
)Phar::mungServer() solamente debería ser llamado dentro de la rutina de interoperabilidad de un archivo phar.
Define una lista de hasta 4 variables $_SERVER que deberían ser modificadas para la ejecución. Las variables que pueden ser modificadas para eliminar rastros de una ejecución de un phar son REQUEST_URI, PHP_SELF, SCRIPT_NAME y SCRIPT_FILENAME.
Por sí solo, este método no hace nada. Solamente al combinarlo con Phar::webPhar() hace que tenga efecto, y sólo cuando el fichero solicitado es un fichero de PHP a ser procesado. Observe que las variables PATH_INFO y PATH_TRANSLATED son siempre modificadas.
Los valores originales de las variables que son modificadas son almacenados en el array SERVER con el prefijo PHAR_, así por ejemplo SCRIPT_NAME sería guardado como PHAR_SCRIPT_NAME.
munglist
Un array que contiene como índices de cadenas REQUEST_URI, PHP_SELF, SCRIPT_NAME y SCRIPT_FILENAME. Otros valores lanzan una excepción, y Phar::mungServer() es sensible a mayúsculas-minúsculas.
No devuelve nada.
Lanza una excepción de tipo UnexpectedValueException si se encontró algún problema con la información pasada.
Ejemplo #1 Un ejemplo de Phar::mungServer()
<?php
// rutina de interoperabilidad de ejemplo
Phar::mungServer(array('REQUEST_URI'));
Phar::webPhar();
__HALT_COMPILER();
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::offsetExists — Determina si un fichero existe en un phar
$offset
)Ésta es una implementación de la interfaz ArrayAccess que permite la manipulación directa del contenido de un archivo Phar utilizando los corchetes de acceso al array.
offsetExists() es llamado siempre que isset() sea llamada.
offset
El nombre del fichero (ruta relativa) a buscar en un Phar.
Devuelve TRUE si el fichero existe dentro del phar, o FALSE si no.
Ejemplo #1 Un ejemplo de Phar::offsetExists()
<?php
$p = new Phar(dirname(__FILE__) . '/mi.phar', 0, 'mi.phar');
$p['primer_fichero.txt'] = 'primer fichero';
$p['segundo_fichero.txt'] = 'segundo_fichero';
// las siguientes líneas llama a offsetExists() indirectamente
var_dump(isset($p['primer_fichero.txt']));
var_dump(isset($p['no_existe.txt']));
?>
El resultado del ejemplo sería:
bool(true) bool(false)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::offsetGet — Obtener un objeto de la clase PharFileInfo para un fichero específico
$offset
)Ésta es una implementación de la interfaz ArrayAccess que permite la manipulación directa del contenido de un archivo Phar utilizando los corchetes de acceso al array. Phar::offsetGet() se usa para recuperar ficheros de un archivo Phar.
offset
El nombre del fichero (ruta relativa) a buscar en un Phar.
Devuelve un objeto de la clase PharFileInfo que puede usarse para iterar sobre el contenido de un fichero o para recuperar información sobre el fichero actual.
Este método lanza una extepción de tipo BadMethodCallException si el fichero no existe en el archivo Phar.
Ejemplo #1 Ejemplo de Phar::offsetGet()
Ya que todas las clases implementan la iterfaz ArrayAccess, Phar::offsetGet() es automáticamente llamada a utilizar el operador [].
<?php
$p = new Phar(dirname(__FILE__) . '/miphar.phar', 0, 'miphar.phar');
$p['existe.txt'] = "el fichero existe\n";
try {
// automáticamente llama a offsetGet()
echo $p['existe.txt'];
echo $p['no_existe.txt'];
} catch (BadMethodCallException $e) {
echo $e;
}
?>
El resultado del ejemplo sería:
el fichero existe Entry no_existe.txt does not exist
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::offsetSet — Establecer el contenido de un fichero interno a aquel de un fichero externo
$offset
, string $value
)Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Ésta es una implementación de la interfaz ArrayAccess que permite la manipulación directa del contenido de un archivo Phar utilizando los corchetes de acceso al array. offsetSet se utiliza para modificar un fichero existente, o añadir un nuevo fichero al archivo Phar.
offset
El nombre del fichero (ruta relativa) a modificar en un Phar.
value
El contenido del fichero.
No devuelve ningún valor.
Si phar.readonly es 1, lanza una excepción de tipo BadMethodCallException, ya que modificar un Phar sólo está permitido cuando phar.readonly está establecido a 0. Lanza un excepción de tipo PharException si existe cualquier problema volcando los cambios hechos al archivo Phar al disco.
Ejemplo #1 Un ejemplo de Phar::offsetSet()
No se debería acceder directamente a offsetSet, en su lugar se utiliza el operador [] para acceder al array.
<?php
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
try {
// llama a offsetSet
$p['fichero.txt'] = 'Hola qué tal';
} catch (Exception $e) {
echo 'No se pudo modificar fichero.txt:', $e;
}
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::offsetUnset — Eliminar un fichero de un phar
$offset
)Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Ésta es una implementación de la interfaz ArrayAccess que permite la manipulación directa del contenido de un archivo Phar utilizando los corchetes de acceso al array. offsetUnset se utiliza para borrar un fichero existente, y es llamado por el constructor de lenguaje unset().
offset
El nombre del fichero (ruta relativa) a eliminar en un Phar.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Si phar.readonly es 1, lanza una excepción de tipo BadMethodCallException, ya que modificar un Phar sólo está permitido cuando phar.readonly está establecido a 0. Lanza un excepción de tipo PharException si existe cualquier problema volcando los cambios hechos al archivo Phar al disco.
Ejemplo #1 Un ejemplo de Phar::offsetUnset()
<?php
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
try {
// borra fichero.txt de mi.phar llamando a offsetUnset
unset($p['fichero.txt']);
} catch (Exception $e) {
echo 'No se pudo borrar fichero.txt: ', $e;
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::running — Devolover la ruta completa del disco o el URL completo de phar del archivo Phar que está en ejecución
$retphar = true
] )Devuelve la ruta completa del archivo phar en ejecución. Este método tiene la intención de utilizarse como la constante mágica __FILE__, y solamente tiene efecto dentro de un archivo phar en ejecución.
Dentro de una rutina de interoperabilidad de un archivo, Phar::running() devuelve
"". Use simplemente __FILE__
para acceder al phar que está ejecutándose acualmente dentro de una rutina de interoperabilidad.
retphar
Si es FALSE, se devuelve la ruta completa del disco
del archivo phar. Si es TRUE, se devuelve el URL phar completo.
Devuelve el nombre de fichero si es válido, si no una cadena vacía.
Ejemplo #1 Un ejemplo de Phar::running()
Para el siguiente ejemplo se asume que el archivo phar está ubicado en /ruta/a/phar/mi.phar.
<?php
$a = Phar::running(); // $a es "phar:///ruta/a/mi.phar"
$b = Phar::running(false); // $b es "/ruta/a/mi.phar"
?>
(PHP >= 5.3.0, PECL phar >= 1.2.1)
Phar::setAlias — Establecer el alias para un archivo Phar
$alias
)Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Establece el alias par un archivo Phar, y lo escribe como el alias permanente para este archivo phar. Un alias puede usarse internamente a un archivo phar para asegurarse de que el uso de la envoltura de flujo phar para acceder a ficheros internos, siempre funcione sin tener en cuenta la ubicación del archivo phar en el sistema de ficheros. Otra alternativa es confiar en la intercepción de Phar de include o utilizar Phar::interceptFileFuncs() y usar rutas relativas.
alias
Una cadena abreviada para referirse a este archivo en el acceso con la envoltura de flujo phar.
Lanza una excepción de tipo UnexpectedValueException cuando el acceso a escritura está deshabilitado, y una excepción de tipo PharException si el alias ya está en uso o se encontró algún problema al volcar los cambios al disco.
Ejemplo #1 Un ejemplo de Phar::setAlias()
<?php
try {
$phar = new Phar('miphar.phar');
$phar->setAlias('mip.phar');
} catch (Exception $e) {
// manejar errores
}
?>
(Unknown)
Phar::setDefaultStub — Establecer el cargador o la rutina de interoperabilidad de un archivo Phar al cargador predeterminado
$index
[, string $webindex
]] )Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Este método es un método cómodo que combina la funcionalidad de Phar::createDefaultStub() y Phar::setStub().
index
La ruta relativa dentro del archivo phar a ejectuar si se accede desde la línea de comandos
webindex
La ruta relativa dentro del archivo phar a ejectuar si se accede desde un servidor web
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Se lanza una excepción de tipo UnexpectedValueException si phar.readonly está habilitado en php.ini. Se lanza una excepción de tipo PharException si se encuentra cualquier problema al volcar los cambios al disco.
Ejemplo #1 Un ejemplo de Phar::setDefaultStub()
<?php
try {
$phar = new Phar('miphar.phar');
$phar->setDefaultStub('cli.php', 'web/index.php');
// esto es lo mismo que:
// $phar->setStub($phar->createDefaultStub('cli.php', 'web/index.php'));
} catch (Exception $e) {
// manejar errores
}
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::setMetadata — Establecer la metainformación de un archivo phar
Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Phar::setMetadata() debería usarse para almacenar información personalizada que describa algo sobre el archivo phar como una entidad completa. PharFileInfo::setMetadata() debería usarse para metainformación específica de cada fichero. La metainformación puede ralentizar la velocidad de carga de un archivo phar si la información es grande.
Algunos posibles usos para la metainformación incluyen especificar qué fichero dentro del archivo debería usarse para cargar el archivo, o la ubicación de un fichero de manifiesto como el fichero package.xml de » PEAR. Sin embargo, se puede almacenar cualquier información útil que describa el archivo phar.
metadata
Cualquier variable de PHP que contenga la información a almacenar que describa el archivo phar
No devuelve ningún valor.
Ejemplo #1 Un ejemplo de Phar::setMetadata()
<?php
// asegurarse de que no existe
@unlink('nuevo_phar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/nuevo_phar.phar', 0, 'nuevo_phar.phar');
$p['fichero.php'] = '<?php echo "hola"';
$p->setMetadata(array('bootstrap' => 'fichero.php'));
var_dump($p->getMetadata());
} catch (Exception $e) {
echo 'No se pudo crear y/o modificar el phar:', $e;
}
?>
El resultado del ejemplo sería:
array(1) {
["bootstrap"]=>
string(11) "fichero.php"
}
(PHP >= 5.3.0, PECL phar >= 1.1.0)
Phar::setSignatureAlgorithm — Establecer el algoritmo de firma para un phar y aplicarlo
Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Establece el algoritmo de firma para un phar y lo aplica. El algoritmo de firma debe ser una de las constantes Phar::MD5, Phar::SHA1, Phar::SHA256, Phar::SHA512, o Phar::OPENSSL.
Observe que todos los archivos phar ejecutables tienen una firma creada automáticamente, SHA1 por omisión. Los archivos de datos basados en tar o en zip (archivos creados con la clase PharData class) deben tener su signatura creada y establecerla explícitamente mediante Phar::setSignatureAlgorithm().
sigtype
Una de las constantes Phar::MD5, Phar::SHA1, Phar::SHA256, Phar::SHA512, o Phar::OPENSSL
privatekey
El contenido de una clave privada OpenSSL, como la extraída de un certificado o de un fichero de clave OpenSSL:
<?php
$private = openssl_get_privatekey(file_get_contents('private.pem'));
$pkey = '';
openssl_pkey_export($private, $pkey);
$p->setSignatureAlgorithm(Phar::OPENSSL, $pkey);
?>
No devuelve ningún valor.
Lanza una excepción de tipo UnexpectedValueException para muchos errores, y una excepción de tipo PharException si ocurrió algún problema al volcar los cambios al disco.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::setStub — Establecer el cargador de PHP o la rutina de interoperabilidad de un archivo Phar
$stub
)Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Este método se utiliza para añadir una rutina de interoperabilidad cargadora a un nuevo archivo Phar, o reemlazar la rutina de interoperabilidad de un archivo Phar existente.
La rutina de interoperabilidad cargadora de un archivo Phar se utiliza siempre que un archivo esté incluido directamente como en este ejemplo:
<?php
include 'miphar.phar';
?>
Al cargador no se accede cuando se incluye un archivo a través de la envoltura de flujos phar como aquí:
<?php
include 'phar://miphar.phar/un_fichero.php';
?>
stub
Una cadena o un gestor de flujo abierto para usarlo como la rutina de interoperabilidad ejecutable de este archivo phar.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Se lanza una excepción de tipo UnexpectedValueException si phar.readonly está habilitado en php.ini. Se lanza una excepción de tipo PharException si se encuentra cualquier problema al volcar los cambios al disco.
Ejemplo #1 Un ejemplo de Phar::setStub()
<?php
try {
$p = new Phar(dirname(__FILE__) . '/nuevo_phar.phar', 0, 'nuevo_phar.phar');
$p['a.php'] = '<?php var_dump("Hola");';
$p->setStub('<?php var_dump("Primero"); Phar::mapPhar("nuevo_phar.phar"); __HALT_COMPILER(); ?>');
include 'phar://nuevo_phar.phar/a.php';
var_dump($p->getStub());
$p['b.php'] = '<?php var_dump("Mundo");';
$p->setStub('<?php var_dump("Segundo"); Phar::mapPhar("nuevo_phar.phar"); __HALT_COMPILER(); ?>');
include 'phar://nuevo_phar.phar/b.php';
var_dump($p->getStub());
} catch (Exception $e) {
echo 'Las operaciones de escritura sobre nuevo_phar.phar fallaron: ', $e;
}
?>
El resultado del ejemplo sería:
string(4) "Hola"
string(84) "<?php var_dump("Primero"); Phar::mapPhar("nuevo_phar.phar"); __HALT_COMPILER(); ?>"
string(5) "Mundo"
string(84) "<?php var_dump("Segundo"); Phar::mapPhar("nuevo_phar.phar"); __HALT_COMPILER(); ?>"
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::startBuffering — Iniciar las operaciones de escritura en buffer de Phar, no modifica el objeto Phar del disco
Aunque es técnicamente innecesario, el método Phar::startBuffering() puede proporcionar un aumento significativo de rendimiento al crear o modificar un archivo Phar con un gran número de ficheros. Normalmente, cada vez que un fichero dentro de un archivo Phar es creado o modificado de alguna manera, el archivo Phar entero se re-creará con los cambios. De esta forma, el archivo estará actualizado con la actividad realizada sobre él.
Sin embargo, esto puede ser innecesario al crear simplemente un nuevo archivo Phar, que tendría más sentido escribir el archivo entero de una vez. De forma similar, a menudo es necesario realizar una serie de cambios y asegurarse de que todos son posibles antes de hacer cualquier cambio en disco, similar al concepto de transacciones en bases de datos relacionales. La pareja de métodos Phar::startBuffering()/Phar::stopBuffering() está prevista para este propósito.
La escritura en buffer de Phar es por archivo, el almacenamiento activo en buffer del archivo Phar foo.phar no afecta a los cambios hechos al archivo Phar bar.phar.
No devuelve ningún valor.
Ejemplo #1 Un ejemplo de Phar::startBuffering()
<?php
// asegurarse de que no existe
@unlink('nuevo_phar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/nuevo_phar.phar', 0, 'nuevo_phar.phar');
} catch (Exception $e) {
echo 'No se pudo crear el phar:', $e;
}
echo 'El nuevo phar tiene ' . $p->count() . " entradas\n";
$p->startBuffering();
$p['fichero.txt'] = 'hola';
$p['fichero2.txt'] = 'qué tal';
$p['fichero2.txt']->setCompressedGZ();
$p['fichero3.txt'] = 'cara de niño';
$p['fichero3.txt']->setMetadata(42);
$p->setStub("<?php
function __autoload($clase)
{
include 'phar://miphar.phar/' . str_replace('_', '/', $clase) . '.php';
}
Phar::mapPhar('miphar.phar');
include 'phar://miphar.phar/inicio.php';
__HALT_COMPILER();");
$p->stopBuffering();
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::stopBuffering — Detener las peticiones de escritura en buffer del archivo Phar, y guardar los cambios en disco
Phar::stopBuffering() se usa junto con el método Phar::startBuffering(). Phar::startBuffering() puede proporcionar un aumento significativo de rendimiento al crear o modificar un archivo Phar con un gran número de ficheros. Normalmente, cada vez que un fichero dentro de un archivo Phar es creado o modificado de alguna manera, el archivo Phar entero se re-creará con los cambios. De esta forma, el archivo estará actualizado con la actividad realizada sobre él.
Sin embargo, esto puede ser innecesario al crear simplemente un nuevo archivo Phar, que tendría más sentido escribir el archivo entero de una vez. De forma similar, a menudo es necesario realizar una serie de cambios y asegurarse de que todos son posibles antes de hacer cualquier cambio en disco, similar al concepto de transacciones en bases de datos relacionales. La pareja de métodos Phar::startBuffering()/Phar::stopBuffering() está prevista para este propósito.
La escritura en buffer de Phar es por archivo, el almacenamiento activo en buffer del archivo Phar foo.phar no afecta a los cambios hechos al archivo Phar bar.phar.
No devuelve ningún valor.
Se lanza una excepción de tipo PharException si se encontró algún problema volcando los cambios al disco.
Ejemplo #1 Un ejemplo de Phar::stopBuffering()
<?php
$p = new Phar(dirname(__FILE__) . '/nuevo_phar.phar', 0, 'nuevo_phar.phar');
$p['fichero1.txt'] = 'hola';
$p->startBuffering();
var_dump($p->getStub());
$p->setStub("<?php
function __autoload(\$clase)
{
include 'phar://nuevo_phar.phar/' . str_replace('_', '/', \$clase) . '.php';
}
Phar::mapPhar('nuevo_phar.phar');
include 'phar://nuevo_phar.phar/incio.php';
__HALT_COMPILER();");
$p->stopBuffering();
var_dump($p->getStub());
?>
El resultado del ejemplo sería:
string(24) "<?php __HALT_COMPILER();"
string(195) "<?php
function __autoload($clase)
{
include 'phar://' . str_replace('_', '/', $clase);
}
Phar::mapPhar('nuevo_phar.phar');
include 'phar://nuevo_phar.phar/incio.php';
__HALT_COMPILER();"
(PECL phar < 2.0.0)
Phar::uncompressAllFiles — Descomprimir todos los ficheros del archivo Phar actual
Nota:
Este método ha sido eliminado de la extensión Phar a partir de la versión 2.0.0. Implementaciones alternativas están disponibles utilizando Phar::compress(), Phar::decompress(), Phar::compressFiles() y Phar::decompressFiles().
Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Este método descomprime todos los ficheros del archivo Phar. Si cualquier ficheros ya está comprimido con la compresión gzip, la extensión zlib debe estar habilitada para poder descomprimirlo, y cualquier fichero comprimido con la compresión bzip2 queriere de la extensión bzip2 para descomprimirlo. Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo BadMethodCallException si la variable INI phar.readonly está activada, la extensión bzip2 no está habilitada y cualquier fichero está comprimido con la compresión bzip2, o si cualquer fichero está comprimido con la compresión gzip y la extensión zlib no está habilitada.
Ejemplo #1 Un ejemplo de Phar::uncompressAllFiles()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$p['mifichero2.txt'] = 'hola';
$p->compressAllFilesGZ();
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressedBZIP2());
var_dump($fichero->isCompressedGZ());
}
$p->uncompressAllFiles();
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressedBZIP2());
var_dump($fichero->isCompressedGZ());
}
} catch (Exception $e) {
echo 'Las operaciones de escritura sobre mi.phar fallaron: ', $e;
}
?>
El resultado del ejemplo sería:
string(13) "mifichero.txt" bool(true) bool(false) bool(true) string(14) "mifichero2.txt" bool(true) bool(false) bool(true) string(13) "mifichero.txt" bool(false) bool(false) bool(false) string(14) "mifichero2.txt" bool(false) bool(false) bool(false)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::unlinkArchive — Elimiar completamente un archivo phar del disco y de la memoria
$archive
)Elimina un archivo phar del disco y de la memoria.
archive
La ruta en el disco al archivo phar.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Se lanza una excepción de tipo PharException si existe cualquier fichero abierto que apunte al archivo phar, o cualquier objeto existente de las clases Phar, PharData, o PharFileInfo que haga referencia al archivo phar.
Ejemplo #1 Un ejemplo de Phar::unlinkArchive()
<?php
// uso simple
Phar::unlinkArchive('/ruta/a/mi.phar');
// ejemplo más común:
$p = new Phar('mi.phar');
$fp = fopen('phar://mi.phar/fichero.txt', 'r');
// esto crea 'mi.phar.gz'
$gp = $p->compress(Phar::GZ);
// eliminar todas las referencias al archivo
unset($p);
fclose($fp);
// ahora, eliminar todas los indicions del archivo
Phar::unlinkArchive('mi.phar');
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::webPhar — mapPhar para archivos phar basados en web. Controlador principal para aplicaciones web
$alias
[, string $index = "index.php"
[, string $f404
[, array $mimetypes
[, array $rewrites
]]]]] )Phar::mapPhar() para archivos phar basados en web. Este método procesa $_SERVER['REQUEST_URI'] y direcciona una petición de un navegador web a un fichero interno dentro de un archivo phar. En esencia, simula un servidor web, direccionando las peticiones al fichero correcto, enviando las cabeceras correctas y procesando ficheros PHP según sea necesario. Este poderoso método es parte de lo que hace sencillo convertir una apliación PHP existene en un archivo phar. Combinado con Phar::mungServer() y Phar::interceptFileFuncs(), cualquier aplicación web se puede utilizar sin modificaciones desde un archivo phar.
Phar::webPhar() debería llamarse solamente desde la rutina de interoperabilidad (stub) de un archivo phar (aquí hay más información de lo que es una rutina de interorperabilidad).
alias
El alias que puede usarse en las URL phar:// para referirse a este archivo, en vez de su ruta completa.
index
La ubicación dentro del phar del índice de directorios.
f404
La ubicación del script a ejecutar cuando no se encuentra el fichero. Este script debería mostrar las cabeceras HTTP 404 apropiadas.
mimetypes
Un array que mapea extensiones de fichero adicionales a tipos de MIME. Si el mapeo predeterminado es suficiente, se ha de pasar un array vacío. Por omisión, estas extensiones son mapeadas a estos tipos de MIME:
<?php
$mimes = array(
'phps' => Phar::PHPS, // pasa a highlight_file()
'c' => 'text/plain',
'cc' => 'text/plain',
'cpp' => 'text/plain',
'c++' => 'text/plain',
'dtd' => 'text/plain',
'h' => 'text/plain',
'log' => 'text/plain',
'rng' => 'text/plain',
'txt' => 'text/plain',
'xsd' => 'text/plain',
'php' => Phar::PHP, // procesado como PHP
'inc' => Phar::PHP, // procesado como PHP
'avi' => 'video/avi',
'bmp' => 'image/bmp',
'css' => 'text/css',
'gif' => 'image/gif',
'htm' => 'text/html',
'html' => 'text/html',
'htmls' => 'text/html',
'ico' => 'image/x-ico',
'jpe' => 'image/jpeg',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'js' => 'application/x-javascript',
'midi' => 'audio/midi',
'mid' => 'audio/midi',
'mod' => 'audio/mod',
'mov' => 'movie/quicktime',
'mp3' => 'audio/mp3',
'mpg' => 'video/mpeg',
'mpeg' => 'video/mpeg',
'pdf' => 'application/pdf',
'png' => 'image/png',
'swf' => 'application/shockwave-flash',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'wav' => 'audio/wav',
'xbm' => 'image/xbm',
'xml' => 'text/xml',
);
?>
rewrites
Un array que mapea URI al fichero interno, simulando la directiva mod_rewrite de apache. Por ejemplo:
<?php
array(
'mi_info' => 'mi_info.php'
);
?>
No devuelve ningún valor.
Lanza una excepción de tipo PharException cuando no se puede abrir el fichero
interno para salida, o si se llama desde un lugar que no sea
una rutina de interoperabilidad. Si se pasa un array no válido a
mimetypes o a rewrites, se
lanza una excepción de tipo UnexpectedValueException.
Ejemplo #1 Un ejemplo de Phar::webPhar()
Con el ejemplo siguiente, el phar creado mostrará Hola Mundo si uno explora /miphar.phar/index.php o /miphar.phar, y mostrará la fuente de index.phps si uno explora /miphar.phar/index.phps.
<?php
// creating the phar archive:
try {
$phar = new Phar('miphar.phar');
$phar['index.php'] = '<?php echo "Hola Mundo"; ?>';
$phar['index.phps'] = '<?php echo "Hola Mundo"; ?>';
$phar->setStub('<?php
Phar::webPhar();
__HALT_COMPILER(); ?>');
} catch (Exception $e) {
// manejar errores
}
?>
(No hay información de versión disponible, podría estar únicamente en SVN)
La clase PharData proporciona una interfaz de alto nivel para el acceso y la creación de archivos tar y zip no ejecutables. Debido a que estos archivos no contienen una rutina de interoperabilidad y no pueden ser ejecutados por la extensión phar, es posible crear y manipular ficheros zip y tar normales con la clase PharData incluso si la opción del php.ini phar.readonly está establecida a 1.
$format = 9021976
[, int $compression = 9021976
[, string $extension
]]] )$format = 9021976
[, int $compression = 9021976
[, string $extension
]]] )$alias
[, string $index = "index.php"
[, string $f404
[, array $mimetypes
[, array $rewrites
]]]]] )(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::addEmptyDir — Añadir un directorio vacío al archivo tar/zip
$dirname
)Con este método se crea un directorio vacío con la ruta dada por dirname. Este método es similar a ZipArchive::addEmptyDir().
dirname
El nombre de directorio vacío a crear en el archivo tar o zip
No devuelve ningún valor, se lanza una excepción en caso de error.
Ejemplo #1 Un ejemplo de PharData::addEmptyDir()
<?php
try {
$a = new PharData('/ruta/a/phar.phar');
$a->addEmptyDir('/ruta/completa/a/fichero');
// demuestra cómo se almacena este fichero
$b = $a['ruta/completa/a/fichero']->isDir();
} catch (Exception $e) {
// manejar los errores aquí
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::addFile — Añadir un fichero desde el sistema de ficheros al archivo tar/zip
Con este método, cualquier fichero o URL se puede añadir al arcivo tar/zip. Si se especifica el segundo parámetro opcional localname, el fichero será almacenado en el archivo con el nombre dado por el parámetro, si no se usará el parámetro file como la ruta para almacentar dentro del archivo. Las URLs deben tener un nombre local o se lanzará una excepción. Este método es similar a ZipArchive::addFile().
file
La ruta completa o relativa del fichero del disco a ser añadido al archivo phar.
localname
Ruta con la que el fichero será almacenado en el archivo.
No devuelve ningún valor, se lanza una excepción en caso de error.
Ejemplo #1 Un ejemplo de PharData::addFile()
<?php
try {
$a = new PharData('/ruta/a/phar.phar');
$a->addFile('/ruta/completa/a/fichero');
// demuestra cómo se almacena este fichero
$b = $a['ruta/completa/a/fichero']->getContent();
$a->addFile('/ruta/completa/a/fichero', 'mi/fichero.txt');
$c = $a['mi/fichero.txt']->getContent();
// demostrar el uso de una URL
$a->addFile('http://www.ejemplo.com', 'ejemplo.html');
} catch (Exception $e) {
// manejar los errores aquí
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::addFromString — Añadir un fichero desde el sistema de ficheros al archivo tar/zip
$localname
, string $contents
)Con este método, cuanquierl cadena se puede añadir al archivo tar/zip. El fichero será almacenado en el archivo con localname como su ruta. Este método es similar a ZipArchive::addFromString().
localname
Ruta con la que el fichero será almacenado en el archivo.
contents
El contenido del fichero a almacenar
No devuelve ningún valor, se lanza una excepción en caso de error.
Ejemplo #1 Un ejemplo de PharData::addFromString()
<?php
try {
$a = new PharData('/ruta/a/phar.phar');
$a->addFromString('ruta/a/fichero.txt', 'mi sencillo fichero');
$b = $a['ruta/a/fichero.txt']->getContent();
// para añadir contenido desde un gestor de flujos para ficheros grandes, use offsetSet()
$c = fopen('/ruta/a/fichero_enorme.bin');
$a['fichero_grande.bin'] = $c;
fclose($c);
} catch (Exception $e) {
// manejar los errores aquí
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::buildFromDirectory — Construir un archivo tar/zip desde los ficheros de un directorio
Rellena un archivo phar con el contenido de un directorio. El segundo parámtro opcional es una expresión regular (pcre) que se utiliza para excluir ficheros. Cualquier nombre de fichero que coincida con la expresión regular será incluido, todos los demás serán excluidos. Para un control más exhaustivo, use PharData::buildFromIterator().
base_dir
La ruta completa o relativa al directorio que contiene todos los ficheros a añadir al archivo.
regex
Una expresión regular de pcre opcional que se usa para filtrar la lista de ficheros. Solamente las rutas de fichero que coincidan con la expresión regular serán incluidas en el archivo.
Phar::buildFromDirectory() devuelve un array asociativo que que mapea la ruta interna del fichero a la ruta completa del mismo en el sistema de ficheros.
Este método lanza una excepción de tipo BadMethodCallException cuando no puede instanciar los iteradores intermos del directorio, o una excepción de tipo PharException si hubo errores al guardar el archivo phar.
Ejemplo #1 Un ejemplo de PharData::buildFromDirectory()
<?php
$phar = new PharData('proyecto.tar');
// añadir todos los ficheros del proyecto
$phar->buildFromDirectory(dirname(__FILE__) . '/proyecto');
$phar2 = new PharData('proyecto2.zip');
// añadir todos los ficheros del, incluir solamente los ficheros php
$phar->buildFromDirectory(dirname(__FILE__) . '/proyecto', '/\.php$/');
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::buildFromIterator — Construir un archivo tar o zip desde un iterador
Rellena un archivo tar o zip desde un iterador. Están soportados dos estilos de iteradores, los iteradores que mapean el nombre de fichero dentro del tar/zip al nombre del fichero en disco, y los iteradores como DirectoryIterator que devuelven objetos de la clase SplFileInfo. Se requiere el segundo parámetro para los iteradores que devuelven objetos de la clase SplFileInfo.
Ejemplo #1 Un ejemplo de PharData::buildFromIterator() con SplFileInfo
Para la mayoría de los archivos tar/zip, el archivo reflejará la distribución real de directorios, y el segundo estilo es el más útil. Por ejemplo, para crear un archivo tar/zip que contenga los ficheros n esta distribución de muestra de directorios:
/ruta/al/proyecto/
config/
dist.xml
debug.xml
lib/
fichero1.php
fichero2.php
src/
procesa_algo.php
www/
index.php
cli/
index.php
Este código podría usarse para añadir estos ficheros al archivo tar "proyecto.tar":
<?php
$phar = new PharData('proyecto.tar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/ruta/al/proyecto')),
'/ruta/al/proyecto');
?>
El fichero project.tar se puede usar inmediatamente. PharData::buildFromIterator() no establece valores como la compresión y metainformación, que se puede hacer después de crear el archivo tar/zip.
Como observación interesante, PharData::buildFromIterator() también se puede usar para copiar el contenido de un archivo phar, tar o zip existentese, ya que los objetos de la clase PharData descienden de la clase DirectoryIterator:
<?php
$phar = new PharData('proyecto.tar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new Phar('/ruta/a/otro_phar.phar')),
'phar:///ruta/a/otro_phar.phar/ruta/al/proyecto');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>
Ejemplo #2 Un ejemplo de PharData::buildFromIterator() con otros iteradores
La segunda forma de iterador se puede usar con cualquier iterador que devuelva un mapeo clave => valor, tal como un objeto de la clase ArrayIterator:
<?php
$phar = new PharData('proyecto.tar');
$phar->buildFromIterator(
new ArrayIterator(
array(
'fichero/interno.php' => dirname(__FILE__) . '/algun_fichero.php',
'otro/fichero.jpg' => fopen('/rota/a/archivo_grande.jpg', 'rb'),
)));
?>
iter
Cualquier iterador que mapee de forma asociativa el fichero tar/zip a la ubiciación o que devuelva objetos de la clase SplFileInfo
base_directory
Para los iteradores que devuelven objetos de la clase SplFileInfo, es la porción de cada ruta completa de fichero a eliminar cuando de añada al archivo tar/zip
PharData::buildFromIterator() devuelve un array asociativo que que mapea la ruta interna del fichero a la ruta completa del mismo en el sistema de ficheros.
Este método lanza una excepción de tipo UnexpectedValueException cuando
el iterador devuelve valores incorrectos, tales como una clave de tipo integer en lugar de una
cadena, una excepción de tipo BadMethodCallException cuando se
pasa un iterador basado en SplFileInfo sin un parámetro base_directory,
o una excepción de tipo PharException si hubo errores
al guardar el archivo phar.
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::compress — Comprimir el archivo tar/zip entero usando la compresión Gzip o Bzip2
$compression
[, string $extension
] )Para archivos tar, este método comprime el archivo entero usando la compresión gzip o bzip2. El fichero resultante puede ser procesado con el comando gunzip/bunzip, o se puede acceder a él directa y transparentemente con la extensión Phar.
Para archivos phar basados en Zip, este método falla con el lanzamiento de una excepción. La extensión zlib debe estar habilitada para poder comprimir con la compresión gzip, y la extensión bzip2 debe estar habilitada para poder comprimir con la compresión bzip2.
Además, este método renombra automáticamente el archivo, añadiéndole .gz, .bz2 o eliminado la extensión si se pasa Phar::NONE para eliminar la compresión. De forma alternativa, se puede expecificar una extensión de fichero con el segundo parámetro.
compression
La compresión debe ser Phar::GZ o Phar::BZ2 para añadir compresión, o Phar::NONE para eliminarla.
extension
Por omisión, la extensión es .tar.gz o .tar.bz2 para comprimir un tar, y .tar para descomprimirlo.
Devuelve un objeto de la clase PharData.
Lanza una excepción de tipo BadMethodCallException si la extensión zlib no está disponible, o la extensión bzip2 no está habilitada.
Ejemplo #1 Un ejemplo de PharData::compress()
<?php
$p = new PharData('/ruta/a/mi.tar');
$p['myfile.txt'] = 'hi';
$p['myfile2.txt'] = 'hi';
$p1 = $p->compress(Phar::GZ); // copia a /ruta/a/mi.phar.gz
$p2 = $p->compress(Phar::BZ2); // copia a /ruta/a/mi.phar.bz2
$p3 = $p2->compress(Phar::NONE); // excepción: /ruta/a/mi.phar ya existe
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::compressFiles — Comprime todos los ficheros del archivo tar/zip actual
$compression
)Para archivos phar basados en tar, este método lanza una excepción de tipo BadMethodCallException, ya que la compresión de ficheros individuales dentro de un archivo tar no está soportada por el formato de fichero. Use Phar::compress() para comprimir un archivo phar entero basado en tar.
Para achivos basados en Zip, este método comprime todos los ficheros del archivo usando la compresión especificada. Las extensiones zlib o bzip2 deben estar habilitadas para aprovechar esta característica. Además, si cualquier fichero ya está comprimido con la compresión bzip2/zlib, la extensión respectiva debe estar habilitada para poder descomprimir los ficheros antes de re-comprimirlos.
compression
La compresión debe ser Phar::GZ o Phar::BZ2 para añadir compresión, o Phar::NONE para eliminarla.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo BadMethodCallException si la variable INI phar.readonly está activada, la extensión zlib no está disponible, o si cualquier fichero está comprimido con la compresión bzip2 y la extensión bzip2 no está habilitada.
Ejemplo #1 Un ejemplo de PharData::compressFiles()
<?php
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$p['mifichero2.txt'] = 'hola';
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressed(Phar::BZ2));
var_dump($fichero->isCompressed(Phar::GZ));
}
$p->compressFiles(Phar::GZ);
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressed(Phar::BZ2));
var_dump($fichero->isCompressed(Phar::GZ));
}
?>
El resultado del ejemplo sería:
string(13) "mifichero.txt" bool(false) bool(false) bool(false) string(14) "mifichero2.txt" bool(false) bool(false) bool(false) string(13) "mifichero.txt" int(4096) bool(false) bool(true) string(14) "mifichero2.txt" int(4096) bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::__construct — Construir un objeto de archivo tar o zip no ejecutable
$fname
[, int $flags
[, string $alias
[, int $format = Phar::TAR
]]] )
fname
Ruta a un archivo tar/zip existente o para ser creado
flags
Banderas a pasar a la clase padre RecursiveDirectoryIterator.
alias
Alias con el que referirse al archivo Phar en las llamadas a funcionalidades de flujos.
format
Una de las constantes de formato de fichero disponiblies dentro de la clase Phar.
Lanza una excepción de tipo BadMethodCallException si se llama dos veces, o una excepción de tipo UnexpectedValueException si no se puede abrir el archivo phar.
Ejemplo #1 Un ejemplo de PharData::__construct()
<?php
try {
$p = new PharData('/ruta/a/mi.tar', CURRENT_AS_FILEINFO | KEY_AS_FILENAME);
} catch (UnexpectedValueException $e) {
die('No se pudo abrir mi.tar');
} catch (BadMethodCallException $e) {
echo 'Técnicamente esto no puede suceder';
}
echo file_get_contents('phar:///ruta/a/mi.tar/ejemplo.txt');
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::convertToData — Convertir un archivo phar en un fichero tar o zip no ejecutable
Este método se usa para convertir un archivo tar o zip no ejecutable a otro formato no ejecutable.
Si no se especifica ningún cambio, este método lanza una excepción de tipo BadMethodCallException Este método debería usarse para convertir un archivo tar a formato zip o viceversa. Aunque es posible cambiar la compresión de un archivo tar simplemente usando este método, es mejor utilizad el método PharData::compress() para una consistencia lógica.
En caso de éxito, el metodo crea un nuevo archivo en disco y devuelve un objeto de la clase PharData. El archivo antiguo no se elimina del disco, y debería hacerse manualmente después de que el proceso haya finalizado.
format
Este parámetro debería ser Phar::TAR
o Phar::ZIP. Si se establece a NULL, se conservará el
formato de fichero existente.
compression
Este parámetro debería ser Phar::NONE para no comprimir el archivo completo, Phar::GZ para la compresión basada en zlib, y Phar::BZ2 para la compresión basada en bzip.
extension
Este parámetro se utiliza para sobrescribir la extensión de fichero predeterminada de un archivo convertido. Observe que .phar no puede ser usado en ningún lugar del nombre de fichero de un archivo tar o zip no ejecutable.
Si se convierte a un archivo basado en tar, las extensiones predeterminadas son .tar, .tar.gz, y .tar.bz2 dependiendo de la compresión especificada. Para archivos basados en zip, la extensión predetermianda es .zip.
El método devuelve un objeto PharData en caso de éxito, y lanza una excepción en caso de error.
Este método lanza una excepción de tipo BadMethodCallException cuando no se puede comprimir, se ha especificado un método de compresión desconocido, el archivo solicitado está almacenado en buffer con Phar::startBuffering() y no se ha cerrado con Phar::stopBuffering(), y una excepción de tipo PharException si se encontró algún problema durante el proceso de la creación de phar.
Ejemplo #1 Un ejemplo de PharData::convertToData()
Utilizar PharData::convertToData():
<?php
try {
$tarphar = new PharData('miphar.tar');
// observe que miphar.phar.tar *no* está desvinculado.
// convertirlo a un formato de fichero tar no ejecutable,
// se crea miphar.zip
$zip = $tarphar->convertToData(Phar::ZIP);
// crear miphar.tbz
$tgz = $tarphar->convertToData(Phar::TAR, Phar::BZ2, '.tbz');
// crear miphar.phar.tgz
$phar = $tarphar->convertToData(Phar::PHAR); // lanza una excepción
} catch (Exception $e) {
// manejar el error aquí
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::convertToExecutable — Convertir un archivo tar/zip no ejecutable en un archivo phar ejecutable
Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Este método se utiliza para convertir un arhivo tar o zip no ejecutable en un archivo phar ejecutable. Se puede usar cualquiera de los tres formatos de fichero (phar, tar o zip), y también se puede realizar la compresión del archivo completo.
Si no se especifica ningún cambio, este método lanza una excepción de tipo BadMethodCallException
En caso de éxito, el metodo crea un nuevo archivo en disco y devuelve un objeto de la clase PharData. El archivo antiguo no se elimina del disco, y debería hacerse manualmente después de que el proceso haya finalizado. If successful, the method creates a new archive on disk and returns a Phar object. The old archive is not removed from disk, and should be done manually after the process has finished.
format
Este parámetro debería ser Phar::PHAR, Phar::TAR,
o Phar::ZIP. Si se establece a NULL, se conservará el
formato de fichero existente.
compression
Este parámetro debería ser Phar::NONE para no comprimir el archivo completo, Phar::GZ para la compresión basada en zlib, y Phar::BZ2 para la compresión basada en bzip.
extension
Este parámetro se utiliza para sobrescribir la extensión de fichero predeterminada de un archivo convertido. Observe que todos los archivos phar basados en zip o en tar deben contener .phar en su extensión de fichero para poder ser procesados como un archivo phar.
Si se convierte a un archivo basado en phar, las extensiones predeterminadas son .phar, .phar.gz, o .phar.bz2 dependiendo de la compresión especificada. Para archivos phar basados en tar, las extensiones predeterminadas son .phar.tar, .phar.tar.gz, y .phar.tar.bz2. Para archivos phar basados en zip, la estensión predeterminada es .phar.zip.
El método devuelve un objeto Phar en caso de éxito, y lanza una excepción en caso de error.
Este método lanza una excepción de tipo BadMethodCallException cuando no se puede comprimir, se ha especificado un método de compresión desconocido, el archivo solicitado está almacenado en buffer con Phar::startBuffering() y no se ha cerrado con Phar::stopBuffering(), una excepción de tipo UnexpectedValueException si el soporte para escritura está deshabilitado, y una excepción de tipo PharException si se encontró algún problema durante el proceso de la creación de phar.
Ejemplo #1 Un ejemplo de PharData::convertToExecutable()
Utilizar PharData::convertToExecutable():
<?php
try {
$tarphar = new PharData('miphar.tar');
// convertirlo al formato de fichero phar
// observe que miphar.tar *no* está desvinculado
$phar = $tarphar->convertToExecutable(Phar::PHAR); // crea miphar.phar
$phar->setStub($phar->createDefaultStub('cli.php', 'web/index.php'));
// crea miphar.phar.tgz
$comprimido = $tarphar->convertToExecutable(Phar::TAR, Phar::GZ, '.phar.tgz');
} catch (Exception $e) {
// manejar el error aquí
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::copy — Copiar un fichero interno de un archivo phar a otro fichero nuevo dentro del phar
$oldfile
, string $newfile
)Copia un fichero interno de un archivo tar/zip a otro fichero nuevo dentro del mismo archivo. Esta es una alternativa orientada a objetos para usar copy() con la envoltura de flujos phar.
oldfile
newfile
Devuelve TRUE en caso de éxito, pero es más seguro encerrar la llamada al método en un
bloque try/catch y asumir el éxito si no se lanza ninguna excepción.
Lanza una excepción de tipo UnexpectedValueException si el fichero origen no exite, el fichero destino ya existe, el acceso a escritura está deshabilitado, la apertura de cualquiera de los dos ficheros falla, la lectura del fichero fuente falla, o una excepción de tipo PharException si la escritura de los cambios del phar falla.
Ejemplo #1 Un ejemplo de Phar::copy()
Este ejemplo muestra el uso de PharData::copy() y su equivalente con envoltura de flujos. La principal diferencia entre los dos enfoques es el manejo de errores. Todos los métodos de PharData lanzan excepciones, mientras que la envoltura de flujos utiliza trigger_error().
<?php
try {
$phar = new PharData('miphar.tar');
$phar['a'] = 'hola';
$phar->copy('a', 'b');
echo $phar['b']; // imprime "phar://miphar.tar/b"
} catch (Exception $e) {
// manejar errores
}
// el equivalente con envoltura de flujos del código de arriba.
// Se dispara E_WARNINGS en caso de error en vez de excepciones.
copy('phar://miphar.tar/a', 'phar//miphar.tar/c');
echo file_get_contents('phar://miphar.tar/c'); // imprime "hola"
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::decompress — Descomprimir un archivo Phar entero
$extension
] )Para archivos phar basados en tar, este método descomprime el archivo entero.
Para archivos phar basados en Zip, este método este método falla con el lanzamiento de una excepción. La extensión zlib debe estar habilitada para descomprimir un archivo comprimido con la compresión gzip, y la extensión bzip2 debe estar habilitada para descomprimir un archivo comprimido con la compresión bzip2.
Además, este método renombra automáticamente la extensión de fichero del archivo, .tar por omisión. De forma alternativa, se puede expecificar una extensión de fichero con el segundo parámetro.
extension
Para la descompresión, las extensión de fichero predeterminada es .phar.tar. Use este parámetro para especificar otra extensión de fichero. Observe que todos los archivos no ejecutables no pueden contener .phar en su nombre de fichero.
Devuelve un objeto de la clase PharData.
Lanza una excepción de tipo BadMethodCallException si la extensión zlib no está disponible, o la extensión bzip2 no está habilitada.
Ejemplo #1 Un ejemplo de PharData::decompress()
<?php
$p = new PharData('/ruta/a/mi.phar', 0, 'mi.phar.gz');
$p['mifichero1.txt'] = 'hola';
$p['mifichero12.txt'] = 'hola';
$p3 = $p2->decompress(); // crea /ruta/a/mi.phar
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::decompressFiles — Descomprimir todos los ficheros del archivo zip actual
Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Para archivos basados en tar, este método lanza una excepción de tipo BadMethodCallException, ya que la compresión de ficheros individuales dentro de un archivo tar no está soportada por el formato de fichero. Use Phar::compress() para comprimir un archivo phar entero basado en tar.
Para achivos phar basados en Zip y phar, este método descomprime todos los ficheros del archivo. Las extensiones zlib o bzip2 deben estar habilitadas para aprvechar esta característica si cualquier fichero está comprimido con la compresión bzip2/zlib.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo BadMethodCallException si la extensión zlib no está disponible, o si cualquier fichero está comprimido con la compresión bzip2 y la extensión bzip2 no está habilitada. Throws BadMethodCallException if the zlib extension is not available, or if any files are compressed using bzip2 compression and the bzip2 extension is not enabled.
Ejemplo #1 Un ejemplo de PharData::decompressFiles()
<?php
$p = new PharData('/ruta/a/mi.zip');
$p['mifichero.txt'] = 'hola';
$p['mifichero2.txt'] = 'hola';
$p->compressFiles(Phar::GZ);
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressed(Phar::BZ2));
var_dump($fichero->isCompressed(Phar::GZ));
}
$p->decompressFiles();
foreach ($p as $fichero) {
var_dump($fichero->getFileName());
var_dump($fichero->isCompressed());
var_dump($fichero->isCompressed(Phar::BZ2));
var_dump($fichero->isCompressed(Phar::GZ));
}
?>
El resultado del ejemplo sería:
string(13) "mifichero.txt" int(4096) bool(false) bool(true) string(14) "mifichero2.txt" int(4096) bool(false) bool(true) string(13) "mifichero.txt" bool(false) bool(false) bool(false) string(14) "mifichero2.txt" bool(false) bool(false) bool(false)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::delMetadata — Eliminar la metainformación global de un archivo zip
Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Elimina la metainformación global de un archivo zip
Devuelve TRUE en caso de éxito, pero es mejor comprobar si lanza alguna excepción,
y asumir el éxito si no se lanza ninguna.
Lanza una excepción de tipo PharException si ocurrió algún error al volcar los cambios al disco.
Ejemplo #1 Un ejemplo de PharData::delMetaData()
<?php
try {
$phar = new PharData('miphar.zip');
var_dump($phar->getMetadata());
$phar->setMetadata("hola, qué tal");
var_dump($phar->getMetadata());
$phar->delMetadata();
var_dump($phar->getMetadata());
} catch (Exception $e) {
// manejar errores
}
?>
El resultado del ejemplo sería:
NULL string(14) "hola, qué tal" NULL
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::delete — Borrar un fichero dentro de un archivo tar/zip
$entry
)Borra un fichero dentro de un archivo. Esto es el equivalente funcional de llamar a unlink() en el equivalente de envoltura de flujos, tal como se muestra en el ejemplo de abajo.
entry
La ruta dentro de un archivo para borrar el fichero.
Devuelve TRUE en caso de éxito, pero es mejor comprobar si lanza alguna excepción,
y asumir el éxito si no se lanza ninguna.
Lanza una excepción de tipo PharException si se produjo algún error al volcar los cambios al disco.
Ejemplo #1 Un ejemplo de PharData::delete()
<?php
try {
$phar = new PharData('miphar.zip');
$phar->delete('desvincular/yo.php');
// esto es equivalente a:
unlink('phar://miphar.phar/desvincular/yo.php');
} catch (Exception $e) {
// manejar errores
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::extractTo — Extraer el contenido de un archivo tar/zip a un directorio
$pathto
[, string|array $files
[, bool $overwrite = false
]] )Extrae todos los ficheros de un archivo tar/zip al disco. Los ficheros y directorios extraídos conservan los mismos permisos que los almacenados en el archivo. Los parámetros opcionales permiten controlar qué ficheros serán extraídos, y si los ficheros existentes en disco podrán ser sobrescritos. El segundo parámetro files puede ser el nombre de un fichero o directorio a extraer, o un array de nombre de ficheros y directorios a extraer. Por omisión, este método no sobrescribirá los ficheros existentes, aunque el tercer parámetro se puede establecer a true para habilitar la sobrescritura de ficheros. Este método es similar a ZipArchive::extractTo().
pathto
Ruta dentro de un archivo al fichero a borrar.
files
El nombre de un fichero o directorio a extraer, o un array de ficheros/directorios a extraer.
overwrite
Esteblecer a TRUE para habilitar la sobrescritura de ficheros existentes
Devuelve TRUE en caso de éxito, pero es mejor comprobar si lanza alguna excepción,
y asumir el éxito si no se lanza ninguna.
Lanza una excepción de tipo PharException si ocurrió algún error al volcar los cambios al disco.
Ejemplo #1 Un ejemplo de PharData::extractTo()
<?php
try {
$phar = new PharData('miphar.tar');
$phar->extractTo('/ruta/completa'); // extraer todos los ficheros
$phar->extractTo('/otra/ruta', 'fichero.txt'); // extraer solamente fichero.txt
$phar->extractTo('/esta/ruta',
array('fichero1.txt', 'fichero2.txt')); // extraer solamente 2 ficheros
$phar->extractTo('/tercera/ruta', null, true); // extraer todos los ficheros y sobrescribirlos
} catch (Exception $e) {
// manejar errores
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::isWritable — Devolver si el archivo tar/zip se puede modificar
Este método devuelve TRUE si el archivo tar/zip archive del disco no es de sólo lectura.
A diferencia de Phar::isWritable(), los archivos tar/zip de sólo datos
se pueden modificar incluso si phar.readonly está establecido a 1.
No tiene parámetros.
Devuelve TRUE si el archivo tar/zip puede ser modificado
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::offsetSet — Establecer el contenido de un fichero dentro de un tar/zip a aquel de un fichero o cadena externos
$offset
, string $value
)Ésta es una implementación de la interfaz ArrayAccess que permite la manipulación directa del contenido de un archivo tar/zip utilizando los corchetes de acceso al array. offsetSet se utiliza para modificar un fichero existente, o añadir un nuevo fichero al archivo tar/zip.
offset
El nombre del fichero (ruta relativa) a modificar en un archivo tar o zip.
value
El contenido del fichero.
No devuelve ningún valor.
Lanza un excepción de tipo PharException si existe cualquier problema volcando los cambios hechos al archivo tar/zip al disco.
Ejemplo #1 Un ejemplo de PharData::offsetSet()
No se debería acceder directamente a offsetSet, en su lugar se utiliza el operador [] para acceder al array.
<?php
$p = new PharData('/ruta/a/mi.phar', 0, 'mi.phar');
try {
// llama a offsetSet
$p['fichero.txt'] = 'Hola qué tal';
} catch (Exception $e) {
echo 'No se pudo modificar fichero.txt:', $e;
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::offsetUnset — Eliminar un ficerho de un archivo tar/zip
$offset
)Ésta es una implementación de la interfaz ArrayAccess que permite la manipulación directa del contenido de un archivo tar/zip utilizando los corchetes de acceso al array. offsetUnset se utiliza para borrar un fichero existente, y es llamado por el constructor de lenguaje unset().
offset
El nombre del fichero (ruta relativa) a eliminar en un archivo tar o zip.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza un excepción de tipo PharException si existe cualquier problema volcando los cambios hechos al archivo tar/zip al disco.
Ejemplo #1 Un ejemplo de PharData::offsetUnset()
<?php
$p = new PharData('/ruta/a/mi.phar', 0, 'mi.phar');
try {
// borra fichero.txt de mi.phar llamando a offsetUnset
unset($p['fichero.txt']);
} catch (Exception $e) {
echo 'No se pudo borrar fichero.txt: ', $e;
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::setAlias — función sin sentido (Phar::setAlias no es válido para PharData)
$alias
)Los archivos tar/zip no ejecutables no pueden tener un alias, por lo que este método simplemente lanza una excepción.
alias
Una cadena abreviada para referirse a este archivo en el acceso con la envoltura de flujo phar. Este parámetro es ignorado.
Lanza una excepción de tipo PharException en todas las llamdas al método
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::setDefaultStub — función sin sentido (Phar::setStub no es válido para PharData)
$index
[, string $webindex
]] )Los archivos tar/zip no ejecutables no pueden tener una rutina de interoperabilidad, por lo que este método simplemente lanza una excepción.
index
La ruta relativa dentro del archivo phar a ejectuar si se accede desde la línea de comandos
webindex
La ruta relativa dentro del archivo phar a ejectuar si se accede desde un servidor web
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo PharException en todas las llamadas al método
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::setMetadata — Establecer la metainformación de un archivo phar
Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Phar::setMetadata() debería usarse para almacenar información personalizada que describa algo sobre el archivo phar como una entidad completa. PharFileInfo::setMetadata() debería usarse para metainformación específica de cada fichero. La metainformación puede ralentizar la velocidad de carga de un archivo phar si la información es grande.
Algunos posibles usos para la metainformación incluyen especificar qué fichero dentro del archivo debería usarse para cargar el archivo, o la ubicación de un fichero de manifiesto como el fichero package.xml de » PEAR. Sin embargo, se puede almacenar cualquier información útil que describa el archivo phar.
metadata
Cualquier variable de PHP que contenga la información a almacenar que describa el archivo phar
No devuelve ningún valor.
Ejemplo #1 Un ejemplo de Phar::setMetadata()
<?php
// asegurarse de que no existe
@unlink('nuevo_phar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/nuevo_phar.phar', 0, 'nuevo_phar.phar');
$p['fichero.php'] = '<?php echo "hola"';
$p->setMetadata(array('bootstrap' => 'fichero.php'));
var_dump($p->getMetadata());
} catch (Exception $e) {
echo 'No se pudo crear y/o modificar el phar:', $e;
}
?>
El resultado del ejemplo sería:
array(1) {
["bootstrap"]=>
string(11) "fichero.php"
}
(PHP >= 5.3.0, PECL phar >= 1.1.0)
Phar::setSignatureAlgorithm — Establecer el algoritmo de firma para un phar y aplicarlo
$sigtype
)Nota:
Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.
Establece el algoritmo de firma para un phar y lo aplica. El algoritmo de firma debe ser una de las constantes Phar::MD5, Phar::SHA1, Phar::SHA256, Phar::SHA512, o Phar::OPENSSL. (PGP aún no está soportado y se recurre a SHA-1).
sigtype
Una de las constantes Phar::MD5, Phar::SHA1, Phar::SHA256, Phar::SHA512, or Phar::PGP
No devuelve ningún valor.
Lanza una excepción de tipo UnexpectedValueException para muchos errores, una excepción de tipo BadMethodCallException si se llamó para un archivo basao en zip o en tar, y una excepción de tipo PharException si ocurrió algún problema al volcar los cambios al disco.
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::setStub — función sin sentido (Phar::setStub no es válido para PharData)
$stub
)Los archivos tar/zip no ejecutables no pueden tener una rutina de interoperabilidad, por lo que este método simplemente lanza una excepción.
stub
Una cadena o un gestor de flujo abierto para usarlo como la rutina de interoperabilidad ejecutable de este archivo phar. Este parámetro es ignorado.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo PharException en todas las llamadas al método
(No hay información de versión disponible, podría estar únicamente en SVN)
La clase PharFileInfo proporciona una interfaz de alto nivel para el contenido y los atributos de un único fichero dentro de un archivo phar.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::chmod — Esteblecer los bits de permiso específicos del fichero
$permissions
)PharFileInfo::chmod() permite el ajuste del bit de permiso ejecutable de un fichero, así como el bit de sólo lectura. El bit de escritura se ignora, y se establece en tiempo de ejecución basándose en la variable INI phar.readonly. Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto si el fichero está dentro de un archivo Phar. Los ficheros dentro de archivos PharData no tienen esta restricción.
No devuelve ningún valor.
Ejemplo #1 Un ejemplo de PharFileInfo::chmod()
<?php
// asegurarse de que no existe
@unlink('nuevo_phar.phar');
try {
$p = new Phar('nuevo_phar.phar', 0, 'nuevo_phar.phar');
$p['fichero.sh'] = '#!/usr/local/lib/php
<?php echo "hi"; ?>';
// establecer el bit ejecutable
$p['fichero.sh']->chmod(0555);
var_dump($p['fichero.sh']->isExecutable());
} catch (Exception $e) {
echo 'No se pudo crear/modificar el phar: ', $e;
}
?>
El resultado del ejemplo sería:
bool(true)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharFileInfo::compress — Comprimir la entrada del Phar actual con la compresión zlib o bzip2
$compression
)Este método comprime el fichero dentro de un archivo Phar usando la compresión bzip2 o zlib. Las extensiones bzip2 o zlib deben estar habilitadas para aprovechar esta característica. Además, si el fichero ya está comprimido, la extensión respectiva debe estar habilitada para poder descomprimir el fichero. Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto si el fichero está dentro de un archivo Phar. Los ficheros dentro de archivos PharData no tienen esta restricción.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo BadMethodCallException si la variable INI phar.readonly está activada, la extensión bzip2/zlib no está disponible.
Ejemplo #1 Un ejemplo de PharFileInfo::compress()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$fichero = $p['mifichero.txt'];
var_dump($fichero->isCompressed(Phar::BZ2));
$p['mifichero.txt']->compress(Phar::BZ2);
var_dump($fichero->isCompressed(Phar::BZ2));
} catch (Exception $e) {
echo 'Falló la operación de crear/modificar mi.phar: ', $e;
}
?>
El resultado del ejemplo sería:
bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::__construct — Construir un objeto de entrada Phar
$entry
)Este método no debería llamarse directamente. En su lugar, un objeto de la clase PharFileInfo se inicializa al llamar a Phar::offsetGet() a traves del acceso a un array.
entry
La URL completa para recuperar un fichero. Si se desea recuperar la informacion del fichoer mi/fichero.php desde el phar boo.phar, la entrada debería ser phar://boo.phar/mi/fichero.php.
Lanza una excepción de tipo BadMethodCallException si __construct() es llamado dos veces. Lanza una excepción de tipo UnexpectedValueException si la URL del phar solicitado está malformada, el phar solicitado no se puede abrir, o el fichero no se puede encontrar dentro del phar.
Ejemplo #1 Un ejemplo de PharFileInfo::__construct()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['fichero_prueba.txt'] = "hola\nqué tal\namigo";
$fichero = $p['fichero_prueba.txt'];
foreach ($fichero as $línea => $texto) {
echo "línea número $línea: $texto";
}
// esto también funciona
$fichero = new PharFileInfo('phar:///ruta/a/mi.phar/fichero_prueba.txt');
foreach ($fichero as $línea => $texto) {
echo "línea número $línea: $texto";
}
} catch (Exception $e) {
echo 'Las operaciones Phar fallaron: ', $e;
}
?>
El resultado del ejemplo sería:
línea número 1: hola línea número 2: qué tal línea número 3: amigo línea número 1: hola línea número 2: qué tal línea número 3: amigo
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharFileInfo::decompress — Descomprimir la entrada Phar actual dentro del phar
Este método descompribe el fichero dentro de un archivo Phar. Dependiendo de cómo esté comprimido el fichero, las extensiones bzip2 o zlib deben estar habilitadas para aprovechar esta característica. Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto si el fichero está dentro de un archivo Phar. Los ficheros dentro de archivos PharData no tienen esta restricción.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo BadMethodCallException si la variable INI phar.readonly está activada, la extensión bzip2/zlib no está disponible.
Ejemplo #1 Un ejemplo de PharFileInfo::decompress()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$fichero = $p['mifichero.txt'];
$fichero->compress(Phar::GZ);
var_dump($fichero->isCompressed());
$p['mifichero.txt']->decompress();
var_dump($fichero->isCompressed());
} catch (Exception $e) {
echo 'La operación de crear/modificar mi.phar falló: ', $e;
}
?>
El resultado del ejemplo sería:
int(4096) bool(false)
(PHP >= 5.3.0, PECL phar >= 1.2.0)
PharFileInfo::delMetadata — Eliminar la metainformación de una entrada
Eliminar la metainformación de una entrada, si existe.
No parameters.
Devuelve TRUE en caso de éxito, FALSE si la entrada no tiene metainformación.
Al igual que con toda la funcionalidad que modifica el contenido de
un Phar, la variable INI phar.readonly
debe estar desactivada para poder realizar esto si el fichero está dentro de un archivo
Phar. Los ficheros dentro de archivos PharData no tienen
esta restricción.
Lanza una excepción de tipo PharException si ocurrió algún error al volcar los cambios al disco, y una excepción de tipo BadMethodCallException si el acceso a escritura está deshabilitado.
Ejemplo #1 Un ejemplo de PharFileInfo::delMetaData()
<?php
try {
$a = new Phar('miphar.phar');
$a['hola'] = 'hola';
var_dump($a['hola']->delMetadata());
$a['hola']->setMetadata('qué tal');
var_dump($a['hola']->delMetadata());
var_dump($a['hola']->delMetadata());
} catch (Exception $e) {
// manejar errores
}
?>
El resultado del ejemplo sería:
bool(false) bool(true) bool(false)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::getCRC32 — Devolver el códido CRC32 o lanzar una exepción si la CRC no ha sido verificado
Este método devuelve la suma de verificación crc32() del fichero dentro de un archivo Phar.
La suma de verificaicón crc32() de un fichero dentro de un archivo Phar.
Lanza una excepción de tipo BadMethodCallException si el fichero no tiene aún su CRC32 verificado. Esto sería imposible con un uso normal, ya que la CRC es verificada al abrir el fichero para lectura o escritura.
Ejemplo #1 Un ejemplo de PharFileInfo::getCRC32()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$fichero = $p['mifichero.txt'];
echo $fichero->getCRC32();
} catch (Exception $e) {
echo 'Las operaciones de escritura sobre mi.phar.phar fallaron: ', $e;
}
?>
El resultado del ejemplo sería:
1872820616
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::getCompressedSize — Devolver el tamaño real de un fichero (con compresión) dentro de un archivo Phar
Devuelve el tamaño del fichero dentro del archivo Phar. Los ficheros no comprimidos devolverán el mismo valor que si se utilizara filesize() en vez de filesize()
El tamaño en bytes del fichero dentro del archivo Phar en disco.
Ejemplo #1 Un ejemplo de PharFileInfo::getCompressedSize()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$fichero = $p['mifichero.txt'];
echo $fichero->getCompressedSize();
} catch (Exception $e) {
echo 'Las operaciones de escritura sobre mi.phar fallaron: ', $e;
}
?>
El resultado del ejemplo sería:
2
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::getMetadata — Devolver la metainformación específica de un fichero almacenada con un fichero
Devuelve la metainformación que fue almacenada en el manifiesto del archivo Phar para este fichero.
Cualquier variable de PHP que pueda ser serializada y almacenada como metainformación del fichero,
o NULL si no hay metainformación almacenada.
Ejemplo #1 Un ejemplo de PharFileInfo::getMetadata()
<?php
// asegurarse de que no existe
@unlink('nuevo_phar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/nuevo_phar.phar', 0, 'nuevo_phar.phar');
$p['fichero.txt'] = 'hello';
$p['fichero.txt']->setMetadata(array('usuario' => 'bill', 'tipo-mime' => 'text/plain'));
var_dump($p['fichero.txt']->getMetadata());
} catch (Exception $e) {
echo 'No se pudo crear y/o modificar nuevo_phar.phar:', $e;
}
?>
El resultado del ejemplo sería:
array(2) {
["usuario"]=>
string(4) "bill"
["tipo-mime"]=>
string(10) "text/plain"
}
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::getPharFlags — Devolver las banderas de una entrada de fichero
Este método devuelve las banderas establecidas en el manifiesto de un Phar. Siempre devolverá 0 en la implementacion actual.
Las banderas del Phar (siempre 0 en la implementacion actual)
Ejemplo #1 Un ejemplo de PharFileInfo::getPharFlags()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$fichero = $p['mifichero.txt'];
var_dump($fichero->getPharFlags());
} catch (Exception $e) {
echo 'No se pudo crear/modificar my.phar: ', $e;
}
?>
El resultado del ejemplo sería:
int(0)
(PHP >= 5.3.0, PECL phar >= 1.2.0)
PharFileInfo::hasMetadata — Devolver la metainformación de una entrada
Devuelve la metainformación de una fichero dentro de un archivo phar.
No tiene parámetros.
Devuelve FALSE si no está establecida la metainformación o es NULL, TRUE si la metainformación no es NULL
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::isCRCChecked — Devolver si la entrada de fichero tiene su CRC verificada
Este método devuelve si un fichero dentro de un archivo Phar tiene su CRC verificada.
TRUE si el fichero tiene su CRC verificada, FALSE si no.
Ejemplo #1 Un ejemplo de PharFileInfo::isCRCChecked()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$fichero = $p['mifichero.txt'];
var_dump($fichero->isCRCChecked());
} catch (Exception $e) {
echo 'Las operaciones de creación/modificación sobre mi.phar fallaron: ', $e;
}
?>
El resultado del ejemplo sería:
bool(true)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::isCompressed — Devolver si la entrada está comprimida
$compression_type = 9021976
] )Este método devuelve si un fichero está comprimido dentro de un archivo Phar con la compresión Gzip o Bzip2.
compression_type
Una de las constantes Phar::GZ o Phar::BZ2,
por defecto es cualquier compresión.
TRUE si el fichero está comprimido dentro del archivo Phar, FALSE si no.
Ejemplo #1 Un ejemplo de PharFileInfo::isCompressed()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$p['mifichero2.txt'] = 'hola';
$p['mifichero2.txt']->setCompressedGZ();
$fichero = $p['mifichero.txt'];
$fichero2 = $p['mifichero2.txt'];
var_dump($fichero ->isCompressed());
var_dump($fichero 2->isCompressed());
} catch (Exception $e) {
echo 'La creación/modificación del phar mi.phar falló: ', $e;
}
?>
El resultado del ejemplo sería:
bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::isCompressedBZIP2 — Devolver si la entrada está comprimida con bzip2
Nota:
Este método ha sido eliminado de la extensión Phar a partir de la versión 2.0.0. Implementaciones alternativas están disponibles utilizando PharFileInfo::isCompressed(), PharFileInfo::decompress(), y PharFileInfo::compress().
Este método devuelve si un fichero está comprimido dentro de un archivo Phar con la compresión Bzip2.
TRUE si el fichero está comprimido con Bzip2 dentro del archivo Phar, FALSE si no.
Ejemplo #1 Un ejemplo de PharFileInfo::isCompressedBZIP2()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$p['mifichero2.txt'] = 'hola';
$p['mifichero3.txt'] = 'hola';
$p['mifichero2.txt']->setCompressedGZ();
$p['mifichero3.txt']->setCompressedBZIP2();
$fichero = $p['mifichero.txt'];
$fichero2 = $p['mifichero2.txt'];
$fichero3 = $p['mifichero3.txt'];
var_dump($fichero->isCompressedBZIP2());
var_dump($fichero2->isCompressedBZIP2());
var_dump($fichero3->isCompressedBZIP2());
} catch (Exception $e) {
echo 'La creación/modificación del phar mi.phar falló: ', $e;
}
?>
El resultado del ejemplo sería:
bool(false) bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::isCompressedGZ — Devolver si la entrada está comprimida con gz
Nota:
Este método ha sido eliminado de la extensión Phar a partir de la versión 2.0.0. Implementaciones alternativas están disponibles utilizando PharFileInfo::isCompressed(), PharFileInfo::decompress(), y PharFileInfo::compress().
Este método devuelve si un fichero está comprimido dentro de un archivo Phar con la compresión Gzip.
TRUE si el fichero está comprimido con Gzip dentro del archivo Phar, FALSE si no.
Ejemplo #1 Un ejemplo de PharFileInfo::isCompressedGZ()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$p['mifichero2.txt'] = 'hola';
$p['mifichero3.txt'] = 'hola';
$p['mifichero2.txt']->setCompressedGZ();
$p['mifichero3.txt']->setCompressedBZIP2();
$fichero = $p['mifichero.txt'];
$fichero2 = $p['mifichero2.txt'];
$fichero3 = $p['mifichero3.txt'];
var_dump($fichero->isCompressedGZ());
var_dump($fichero2->isCompressedGZ());
var_dump($fichero3->isCompressedGZ());
} catch (Exception $e) {
echo 'La creación/modificación del phar mi.phar falló: ', $e;
}
?>
El resultado del ejemplo sería:
bool(false) bool(true) bool(false)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::setCompressedBZIP2 — Comprimir la entrada actual de un Phar dentro del phar usando la compresión Bzip2
Nota:
Este método ha sido eliminado de la extensión Phar a partir de la versión 2.0.0. Implementaciones alternativas están disponibles utilizando PharFileInfo::isCompressed(), PharFileInfo::decompress(), y PharFileInfo::compress().
Este método comprime el fichero dentro del archivo Phar usando la compresión bzip2. La extensión bzip2 debe estar habilitada para aprovechar esta característica. Además, si el fichero ya está comprimido con la compresión gzip, la extensión zlib debe estar habilitada para poder descomprimir el fichero. Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo BadMethodCallException si la variable INI phar.readonly está activada, la extensión bzip2 no está disponible.
Ejemplo #1 Un ejemplo de PharFileInfo::setCompressedBZIP2()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hi';
$fichero = $p['mifichero.txt'];
var_dump($fichero->isCompressedBZIP2());
$p['mifichero.txt']->setCompressedBZIP2();
var_dump($fichero->isCompressedBZIP2());
} catch (Exception $e) {
echo 'La operación de creación/modificación sobre mi.phar falló: ', $e;
}
?>
El resultado del ejemplo sería:
bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::setCompressedGZ — Comprimir la entrada actual de un Phar dentro del phar usando la compresión gz
Nota:
Este método ha sido eliminado de la extensión Phar a partir de la versión 2.0.0. Implementaciones alternativas están disponibles utilizando PharFileInfo::isCompressed(), PharFileInfo::decompress(), y PharFileInfo::compress().
Este método comprime el fichero dentro del archivo Phar usando la compresión gzip. La extensión zlib debe estar habilitada para aprovechar esta característica. Además, si el fichero ya está comprimido con la compresión bzip2 , la extensión bzip2 debe estar habilitada para poder descomprimir el fichero. Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo BadMethodCallException si la variable INI phar.readonly está activada, la extensión zlib no está disponible.
Ejemplo #1 Un ejemplo de PharFileInfo::setCompressedGZ()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hi';
$fichero = $p['mifichero.txt'];
var_dump($fichero->isCompressedGZ());
$p['mifichero.txt']->setCompressedGZ();
var_dump($fichero->isCompressedGZ());
} catch (Exception $e) {
echo 'La operación de creación/modificación sobre mi.phar falló: ', $e;
}
?>
El resultado del ejemplo sería:
bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::setMetadata — Establecer la metainformación específica de un fichero almacenda con un fichero
PharFileInfo::setMetadata() solamente debería usarse para almacenar información personalizada en un fichero que con pueda ser representado con la información almacenada existente con un fichero. La metainformación puede ralentizar significativamente la velocidad de carga de un archivo phar si la información es grande, o si existen muchos ficheros que contienen metainformación. Es importante observar que esos permisos de fichero están soportados nativamente dentro de un phar; es posible establecerlo con el método PharFileInfo::chmod(). Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto si el fichero está dentro de un archivo Phar. Los ficheros dentro de archivos PharData no tienen esta restricción.
Algunos posibles usos para la metainformación incluten pasar un usuario/grupo que debería establecerse al extraer el fichero desde el phar al disco. Otros usos podrían incluir explicitamente especificar un tipo MIME a devolver. Sin embargo, cualquier información útil que describa un fichero, excepto la que no debería estar contenida dentro del mismo, puede ser almacenada.
metadata
Cualquier variable de PHP que contenga información a almacenar junto a un fichero
No devuelve ningún valor.
Ejemplo #1 Un ejemplo de PharFileInfo::setMetadata()
<?php
// asegurarse de que no existe
@unlink('nuevo_phar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/nuevo_phar.phar', 0, 'nuevo_phar.phar');
$p['fichero.txt'] = 'hola';
$p['fichero.txt']->setMetadata(array('usuario' => 'bill', 'tipo-mime' => 'text/plain'));
var_dump($p['fichero.txt']->getMetadata());
} catch (Exception $e) {
echo 'No se pudo crear y/o modificar el phar:', $e;
}
?>
El resultado del ejemplo sería:
array(2) {
["usuario"]=>
string(4) "bill"
["tipo-mime"]=>
string(10) "text/plain"
}
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::setUncompressed — Descomprimir la entrada actual del Phar dentro del phar, si está comprimida
Nota:
Este método ha sido eliminado de la extensión Phar a partir de la versión 2.0.0. Implementaciones alternativas están disponibles utilizando PharFileInfo::isCompressed(), PharFileInfo::decompress(), y PharFileInfo::compress().
Este método descompribe el fichero dentro de un archivo Phar. Dependiendo de cómo esté comprimido el fichero, las extensiones bzip2 o zlib deben estar habilitadas para aprovechar esta característica. Al igual que con toda la funcionalidad que modifica el contenido de un Phar, la variable INI phar.readonly debe estar desactivada para poder realizar esto.
Devuelve TRUE en caso de éxito o FALSE en caso de error.
Lanza una excepción de tipo BadMethodCallException si la variable INI phar.readonly está activada, la extensión bzip2/zlib no está disponible.
Ejemplo #1 Un ejemplo de PharFileInfo::setUncompressed()
<?php
try {
$p = new Phar('/ruta/a/mi.phar', 0, 'mi.phar');
$p['mifichero.txt'] = 'hola';
$fichero = $p['mifichero.txt'];
$fichero->setCompressedGZ();
var_dump($fichero->isCompressed());
$p['mifichero.txt']->setUncompressed();
var_dump($fichero->isCompressed());
} catch (Exception $e) {
echo 'La operación de crear/modificar mi.phar falló: ', $e;
}
?>
El resultado del ejemplo sería:
bool(true) bool(false)