PHP

Ajustar Compartir Imprimir Citar

PHP es un lenguaje de secuencias de comandos de propósito general orientado al desarrollo web. Fue creado originalmente por el programador danés-canadiense Rasmus Lerdorf en 1993 y lanzado en 1995. La implementación de referencia PHP ahora es producida por The PHP Group. PHP era originalmente una abreviatura de Página de inicio personal, pero ahora significa la sigla recursiva PHP: preprocesador de hipertexto.

El código PHP generalmente se procesa en un servidor web mediante un intérprete de PHP implementado como un módulo, un demonio o como un ejecutable de interfaz de puerta de enlace común (CGI). En un servidor web, el resultado del código PHP interpretado y ejecutado, que puede ser cualquier tipo de datos, como HTML generado o datos de imágenes binarias, formaría la totalidad o parte de una respuesta HTTP. Existen varios sistemas de plantillas web, sistemas de administración de contenido web y marcos web que se pueden emplear para orquestar o facilitar la generación de esa respuesta. Además, PHP se puede usar para muchas tareas de programación fuera del contexto web, como aplicaciones gráficas independientes y control de drones robóticos. El código PHP también se puede ejecutar directamente desde la línea de comandos.

El intérprete de PHP estándar, impulsado por Zend Engine, es un software gratuito publicado bajo la licencia de PHP. PHP ha sido ampliamente portado y se puede implementar en la mayoría de los servidores web en una variedad de sistemas operativos y plataformas.

El lenguaje PHP evolucionó sin una especificación o estándar formal escrito hasta 2014, con la implementación original actuando como el estándar de facto que otras implementaciones intentaron seguir. Desde 2014, se ha continuado trabajando para crear una especificación PHP formal.

W3Techs informa que, a partir de octubre de 2022, "PHP es utilizado por el 74,4 % de todos los sitios web cuyo lenguaje de programación del lado del servidor conocemos." PHP versión 7.4 es la versión más utilizada. El soporte para la versión 7.3 se eliminó el 6 de diciembre de 2021.

Historia

Rasmus Lerdorf, creador de PHP; y Andi Gutmans y Zeev Suraski, creadores del motor Zend

Historia temprana

El desarrollo de PHP comenzó en 1993 cuando Rasmus Lerdorf escribió varios programas CGI (Common Gateway Interface) en C, que utilizó para mantener su página de inicio personal. Los amplió para trabajar con formularios web y para comunicarse con bases de datos, y llamó a esta implementación "Página de inicio personal/Intérprete de formularios" o PHP/FI.

PHP/FI podría utilizarse para crear aplicaciones web dinámicas y sencillas. Para acelerar el informe de errores y mejorar el código, Lerdorf anunció inicialmente el lanzamiento de PHP/FI como "Herramientas de página de inicio personal (Herramientas PHP) versión 1.0" en el grupo de discusión de Usenet comp.infosystems.www.authoring.cgi el 8 de junio de 1995. Esta versión ya tenía la funcionalidad básica que PHP tiene hoy. Esto incluía variables similares a Perl, manejo de formularios y la capacidad de incrustar HTML. La sintaxis se parecía a la de Perl, pero era más simple, más limitada y menos consistente.

Un ejemplo de la sintaxis inicial de PHP:

¡Seguido!incluir /texto/header.html--¡Seguido!getenv HTTP_USER_AGENT--¡Seguido!si substr $exec_result Mozilla-- Hey,  son utilizando Netscape!.p¡Seguido!endif--¡Seguido!sql base de datos seleccionar * desde cuadro Donde usuario=Nombre de usuario '--¡Seguido!si no Nutriciones 1-- Lo siento., que récord ¿Sí? no existir.p¡Seguido!endif Salida-- Bienvenido ¡Seguido!$user- ¡No!.p  han tenido ¡Seguido!$index:0-- Créditos izquierda dentro tu cuenta..p¡Seguido!incluir /texto/pie.html--

El PHP inicial no pretendía ser un nuevo lenguaje de programación y creció de manera orgánica, con Lerdorf comentando en retrospectiva: "No sé cómo detenerlo, nunca hubo ninguna intención de escribir un lenguaje de programación lenguaje [...] No tengo absolutamente ninguna idea de cómo escribir un lenguaje de programación, simplemente seguí agregando el siguiente paso lógico en el camino." Se comenzó a formar un equipo de desarrollo y, después de meses de trabajo y pruebas beta, lanzó oficialmente PHP/FI 2 en noviembre de 1997.

El hecho de que PHP no se haya diseñado originalmente, sino que se haya desarrollado orgánicamente, ha llevado a una nomenclatura inconsistente de las funciones y un ordenamiento inconsistente de sus parámetros. En algunos casos, los nombres de las funciones se eligieron para que coincidieran con las bibliotecas de nivel inferior que PHP estaba "envolviendo", mientras que en algunas versiones muy tempranas de PHP, la longitud de los nombres de las funciones se usaba internamente como una función hash, por lo que se eligieron nombres para mejorar la distribución de los valores hash.

PHP 3 y 4

Este es un ejemplo de código PHP para el sistema de gestión de contenidos de WordPress.

Zeev Suraski y Andi Gutmans reescribieron el analizador en 1997 y formaron la base de PHP 3, cambiando el nombre del lenguaje por el acrónimo recursivo PHP: Hypertext Preprocessor. Posteriormente, comenzaron las pruebas públicas de PHP 3 y el lanzamiento oficial se produjo en junio de 1998. Suraski y Gutmans comenzaron una nueva reescritura del núcleo de PHP y produjeron Zend Engine en 1999. También fundaron Zend Technologies en Ramat Gan, Israel.

El 22 de mayo de 2000, se lanzó PHP 4, impulsado por Zend Engine 1.0. Para agosto de 2008, esta rama había alcanzado la versión 4.4.9. PHP 4 ya no está en desarrollo y tampoco se planea lanzar ninguna actualización de seguridad.

PHP 5

El 1 de julio de 2004, se lanzó PHP 5, impulsado por el nuevo Zend Engine II. PHP 5 incluía nuevas funciones, como compatibilidad mejorada con la programación orientada a objetos, la extensión PHP Data Objects (PDO) (que define una interfaz liviana y consistente para acceder a las bases de datos) y numerosas mejoras de rendimiento. En 2008, PHP 5 se convirtió en la única versión estable en desarrollo. El enlace estático tardío no se encontraba en versiones anteriores de PHP y se agregó en la versión 5.3.

Muchos proyectos de código abierto de alto perfil dejaron de admitir PHP 4 en el nuevo código a partir del 5 de febrero de 2008 debido a la iniciativa GoPHP5, proporcionada por un consorcio de desarrolladores de PHP que promueven la transición de PHP 4 a PHP 5.

Con el tiempo, los intérpretes de PHP estuvieron disponibles en la mayoría de los sistemas operativos existentes de 32 y 64 bits, ya sea compilándolos a partir del código fuente de PHP o utilizando binarios prediseñados. Para las versiones de PHP 5.3 y 5.4, las únicas distribuciones binarias de Microsoft Windows disponibles eran las compilaciones IA-32 de 32 bits, que requerían el modo de compatibilidad de Windows de 32 bits al usar Internet Information Services (IIS) en una plataforma de Windows de 64 bits. La versión 5.5 de PHP hizo que las compilaciones x86-64 de 64 bits estuvieran disponibles para Microsoft Windows.

El soporte de seguridad oficial para PHP 5.6 finalizó el 31 de diciembre de 2018.

PHP 6 y Unicode

PHP recibió críticas mixtas debido a la falta de compatibilidad nativa con Unicode en el nivel del idioma principal. En 2005, se inició un proyecto encabezado por Andrei Zmievski para brindar compatibilidad nativa con Unicode en todo PHP, mediante la incorporación de la biblioteca International Components for Unicode (ICU) y la representación de cadenas de texto como UTF-16 internamente. Dado que esto provocaría cambios importantes tanto en el interior del lenguaje como en el código de usuario, se planeó lanzarlo como la versión 6.0 del lenguaje, junto con otras características importantes que estaban en desarrollo.

Sin embargo, la escasez de desarrolladores que comprendieran los cambios necesarios y los problemas de rendimiento derivados de la conversión a UTF-16 y desde UTF-16, que rara vez se usa en un contexto web, provocaron retrasos en el proyecto. Como resultado, se creó una versión de PHP 5.3 en 2009, con muchas funciones que no son Unicode adaptadas de PHP 6, en particular, los espacios de nombres. En marzo de 2010, el proyecto en su forma actual se abandonó oficialmente y se preparó una versión de PHP 5.4 que contenía la mayoría de las funciones restantes que no son Unicode de PHP 6, como rasgos y reenlace de cierre. Las esperanzas iniciales eran que se formaría un nuevo plan para la integración de Unicode, pero en 2014 no se había adoptado ninguno.

PHP 7

Durante 2014 y 2015, se desarrolló una nueva versión principal de PHP, PHP 7. La numeración de esta versión generó cierto debate entre los desarrolladores internos. Si bien el experimento PHP 6 Unicode nunca se había publicado, varios artículos y títulos de libros hacían referencia al nombre de PHP 6, lo que podría haber causado confusión si una nueva versión reutilizara el nombre. Después de una votación, se eligió el nombre PHP 7.

La base de PHP 7 es una rama de PHP que originalmente se denominó PHP próxima generación (phpng). Fue escrito por Dmitry Stogov, Xinchen Hui y Nikita Popov, y tenía como objetivo optimizar el rendimiento de PHP mediante la refactorización de Zend Engine y al mismo tiempo mantener una compatibilidad de idiomas casi completa. El 14 de julio de 2014, los puntos de referencia basados en WordPress, que sirvieron como principal conjunto de puntos de referencia para el proyecto phpng, mostraron un aumento de rendimiento de casi el 100 %. Los cambios de phpng facilitan la mejora del rendimiento en versiones futuras, ya que las estructuras de datos más compactas y otros cambios se consideran más adecuados para una migración exitosa a un compilador justo a tiempo (JIT). Debido a los cambios significativos, el motor Zend modificado se denominó Zend Engine 3, reemplazando al Zend Engine 2 utilizado en PHP 5.

Debido a los importantes cambios internos en phpng, debe recibir un nuevo número de versión principal de PHP, en lugar de una versión secundaria de PHP 5, de acuerdo con el proceso de lanzamiento de PHP. Las versiones principales de PHP pueden romper la compatibilidad con versiones anteriores del código y, por lo tanto, PHP 7 presentó una oportunidad para otras mejoras más allá de phpng que requieren rupturas de compatibilidad con versiones anteriores. En particular, implicó los siguientes cambios:

PHP 7 también incluía nuevas funciones de idioma. En particular, introdujo declaraciones de tipo de devolución para funciones que complementan las declaraciones de tipo de parámetro existentes y soporte para los tipos escalares (entero, flotante, cadena y booleano) en las declaraciones de tipo de parámetro y devolución.

PHP 8

PHP 8 se lanzó el 26 de noviembre de 2020. PHP 8 es una versión principal y tiene cambios importantes con respecto a las versiones anteriores. Las nuevas características y los cambios notables incluyen:

Compilación justo a tiempo

La compilación justo a tiempo es compatible con PHP 8.

El compilador JIT de PHP 8 puede proporcionar mejoras de rendimiento sustanciales para algunos casos de uso, mientras que el desarrollador de PHP Nikita Popov afirmó que las mejoras de rendimiento para la mayoría de los sitios web serán menos sustanciales que la actualización de PHP 5 a PHP 7. Mejoras sustanciales se esperan más para operaciones de tipo matemático que para casos de uso comunes de desarrollo web. Además, el compilador JIT brinda un potencial futuro para mover parte del código de C a PHP, debido a las mejoras de rendimiento para algunos casos de uso.

Adición de la expresión de coincidencia

PHP 8 introdujo la expresión match. La expresión de coincidencia es conceptualmente similar a una declaración switch y es más compacto para algunos casos de uso. Debido a que match es una expresión, su resultado puede capturarse en una variable o devuelta por una función.

Escriba cambios y adiciones

PHP 8 introdujo tipos de unión, un nuevo estático tipo de retorno, y un nuevo tipo mixto.

"Atributos", a menudo denominados "anotaciones" en otros lenguajes de programación, se agregaron en PHP 8, que permiten agregar metadatos a las clases.

throw se cambió de ser una declaración a siendo una expresión. Esto permite lanzar excepciones en lugares que antes no eran posibles.

Cambios de sintaxis y adiciones

PHP 8 incluye cambios para permitir sintaxis alternativas, más concisas o más consistentes en varios escenarios. Por ejemplo, el operador nullsafe es similar al operador coalescente nulo ?? , pero se usa al llamar a métodos. El siguiente fragmento de código no generará un error si getbirthday() devuelve nulo:

$human_readable_date = $user-# Cumpleaños()?DiffForHumans();

La promoción de propiedades de constructores se ha agregado como "azúcar sintáctico" permitiendo que las propiedades de clase se establezcan automáticamente cuando los parámetros se pasan a un constructor de clase. Esto reduce la cantidad de código repetitivo que se debe escribir.

Otros cambios menores incluyen soporte para el uso de ::class< /code> sobre objetos, que sirve como alternativa para el uso de get_class(); capturas que no capturan en bloques de intento y captura; ajustes de sintaxis variable para resolver inconsistencias; soporte para argumentos con nombre; y soporte para comas finales en listas de parámetros, lo que agrega coherencia con el soporte para comas finales en otros contextos, como en matrices.

Cambios y adiciones a la biblioteca estándar

Cambios adicionales

PHP 8.1

PHP 8.1 se lanzó el 8 de diciembre de 2021 e incluyó una serie de nuevas funciones y mejoras con respecto a las versiones anteriores. Aquí hay una mirada más detallada a algunas de las características y mejoras clave en PHP 8.1:

La expresión match es una característica nueva en PHP 8.1 que le permite realizar coincidencias de valores de una manera más concisa y flexible. Es similar a una instrucción switch, pero con algunas características adicionales y mejoras de sintaxis.

Aquí hay un ejemplo de cómo puede usar la expresión match en PHP:

$value = 3;$result = partido ()$value) {} 0 = ' El valor es cero ', 1, 2, 3 = ' El valor es uno, dos o tres ', por defecto = ' El valor es otra cosa. ',};eco $result; // Salidas: "El valor es uno, dos o tres"

En este ejemplo, la expresión match compara el valor de $value con los diferentes casos especificados entre llaves. Si $value coincide con uno de los casos, se devuelve el valor correspondiente. Si ninguno de los casos coincide, se utiliza el caso default.

Uno de los principales beneficios de la expresión match es que le permite especificar múltiples valores para un solo caso, como se muestra en el ejemplo anterior. Esto puede ayudar a que su código sea más conciso y fácil de leer.

La expresión match también le permite especificar una cláusula when para cada caso, que se puede usar para especificar condiciones adicionales que deben cumplirse para que el caso coincida. Por ejemplo:

$value = 3;$result = partido ()$value) {} 0 = ' El valor es cero ', 1, 2, 3 cuando $value  1 = ' El valor es dos o tres ', por defecto = ' El valor es otra cosa. ',};eco $result; // Salidas: "El valor es dos o tres"

En general, la expresión match es una adición útil a PHP que puede facilitar la escritura de código que realiza coincidencias de valores y procesamiento condicional.

Manejo de errores de Assert()

La función assert() y la palabra clave throws son nuevas características de manejo de errores en PHP 8.1 que pueden ayudarlo a escribir código más confiable y sólido.

La función assert() se usa para verificar ciertas condiciones en tiempo de ejecución. Si no se cumple la condición, la función genera una excepción AssertionError. Por ejemplo:

afirmación()$x  0, "$x debe ser mayor que cero" ');

En este ejemplo, la función assert() comprueba si $x es mayor que cero. Si no es así, se genera una excepción AssertionError con el mensaje "$x debe ser mayor que cero". La palabra clave throws, por otro lado, se usa para especificar qué excepciones puede lanzar una función o método. Esto puede ser útil para documentar su código y facilitar que otros desarrolladores entiendan cómo se comportan sus funciones y métodos. Por ejemplo:

función dividir()int $a, int $b): int{} si ()$b == 0) {} tiro nuevo DivisionByZeroError()No se puede dividir por cero '); } retorno $a / $b;}

En este ejemplo, la función divide() usa la palabra clave throws para especificar que puede lanzar una excepción DivisionByZeroError si el segundo argumento es cero

En general, la función assert() y la palabra clave throws son herramientas útiles para manejar errores y excepciones en PHP, y pueden ayudarlo a escribir un código más confiable y sólido.

Soporte para enumeraciones

El soporte para enumeraciones fue una de las características más destacadas de PHP 8.1. Las enumeraciones permiten a los desarrolladores aplicar estados mediante programación en su base de código. A continuación se muestra un ejemplo de una enumeración:

Identificado?phpnamespace AppEnums;enum FacturaStatus: cuerda {} Caso proyecto = 'draft' '; Caso pendientes = Depende '; Caso pagado = 'pagado '; Caso expirado = 'expired ';}

Otras características de PHP 8.1

PHP 8.2

PHP 8.2 incluye varias funciones y mejoras nuevas. Estos son algunos de los principales:

  1. Tipos de unión: Los tipos de unión le permiten especificar que un parámetro de función o método puede aceptar varios tipos, separados por el símbolo "vivir". Esto puede ayudar a mejorar la seguridad del tipo y reducir la necesidad de malabarismo tipo.
  2. Operador de Nullsafe: El operador nullsafe (?-prop) le permite encadenar llamadas de método sin tener que comprobar los valores null en cada paso. Esto puede ayudar a reducir la necesidad de cheques nulos y hacer su código más conciso.
  3. Presión de partido: La expresión del partido le permite realizar un patrón que coincida con los valores, similar a una declaración de conmutación en otros idiomas. Esto puede ser una forma más concisa y expresiva para manejar múltiples condiciones.
  4. Tipo mejorado Variación: PHP 8.2 introduce una mejor variabilidad de tipo para tipos genéricos, lo que le permite especificar si un tipo genérico es covariante, contravariante o invariante. Esto puede ayudar a mejorar la seguridad del tipo y la flexibilidad al trabajar con tipos genéricos.
  5. Mejoras de rendimiento: PHP 8.2 incluye varias mejoras de rendimiento, incluyendo una compilación más rápida de JIT, una recolección de basura más rápida y un mejor manejo de grandes arrays. Estas mejoras pueden ayudar a que las aplicaciones PHP sean más rápidas y eficientes.
  6. Deprecaciones: Algunas características han sido deprecatadas en PHP 8.2, incluyendo la función afirma() cuando se utiliza con un argumento de cadena, y la compilación lista() con un único elemento de array. Es importante ser consciente de estas deprecaciones si está actualizando desde una versión anterior de PHP.

Estos son algunos ejemplos de funciones que han quedado obsoletas en PHP 8.2:

  1. afirmación() función con argumento de cadena: La función afirma() se puede utilizar para realizar cheques de tiempo de ejecución, pero se ha deprecado cuando se utiliza con un argumento de cadena. En su lugar, debe utilizar la función afirma() con un argumento booleano o una expresión.
  2. list() construct with a single array element: La construcción list() le permite desempacar los elementos de un array en variables separadas. Se ha deprecado cuando se utiliza con un único elemento array, ya que este uso fue considerado confuso y prono de error.
  3. create_function(): La función create_function() ha sido deprecatada, ya que ha sido superada por funciones anónimas, que son más flexibles y fáciles de usar.
  4. mb_ereg_replace_callback(): La función mb_ereg_replace_callback() ha sido deprecatada, ya que ha sido superada por la función preg_replace_callback(), que proporciona funcionalidad similar y es más ampliamente utilizada.

Nuevo "Aleatorio" extensión

El "aleatorio" extensión proporciona una nueva API orientada a objetos para generar valores aleatorios en PHP. Incluye varias clases ("Engine"s) que implementan diferentes algoritmos para generar números aleatorios y almacenar su estado dentro de los objetos. Esto permite múltiples secuencias sembrables independientes, que pueden ser útiles en ciertos contextos, como pruebas o simulación.

La clase RandomRandomizer proporciona una interfaz de alto nivel para usar la aleatoriedad del motor para generar un número entero aleatorio, mezclar una matriz o cadena, seleccionar claves de matriz aleatorias y más. Esta puede ser una forma conveniente de realizar estas tareas comunes sin tener que usar directamente las clases de motor de nivel inferior.

Vale la pena señalar que la función "Random" La extensión no está habilitada de forma predeterminada en PHP, y deberá instalarla y habilitarla en su entorno PHP para poder usar sus funciones. Puede encontrar más información sobre la extensión en la documentación oficial de PHP.

Historial de versiones

Versión Fecha de lanzamiento Apoyo hasta Notas
Versión antigua, ya no se mantiene: 1.0 8 de junio de 1995 Oficialmente llamado "Herramientas de Página Principal Personal (FPHP Herramientas)". Este es el primer uso del nombre "PHP".
Versión antigua, ya no se mantiene: 2.0 1o de noviembre de 1997 Oficialmente llamado "PHP/FI 2.0". Esta es la primera versión que podría ser caracterizada como PHP, siendo un lenguaje independiente con muchas características que han soportado hasta el día de hoy.
Versión antigua, ya no se mantiene: 3.0 6 de junio de 1998 20 de octubre de 2000 El desarrollo pasa de una persona a múltiples desarrolladores. Zeev Suraski y Andi Gutmans reescribir la base para esta versión.
Versión antigua, ya no se mantiene: 4.0 22 de mayo de 2000 23 de junio de 2001 Añadido más avanzado parse de dos etapas/ejecutar sistema de fijación de etiquetas llamado el motor Zend.
Versión antigua, ya no se mantiene: 4.1 10 de diciembre de 2001 12 de marzo de 2002 Presentado "superglobals"$_GET, $_POST, $_SESSION, etc.)
Versión antigua, ya no se mantiene: 4.2 22 de abril de 2002 6 de septiembre de 2002 Discapacitados register_globals por defecto. Los datos recibidos sobre la red ya no se insertan directamente en el espacio global de nombres, cerrando posibles agujeros de seguridad en las aplicaciones.
Versión antigua, ya no se mantiene: 4.3 27 de diciembre de 2002 31 de marzo de 2005 Introdujo la interfaz de línea de comandos (CLI), para complementar el CGI.
Versión antigua, ya no se mantiene: 4.4 11 de julio de 2005 7 de agosto de 2008 Arregló un error de corrupción de memoria, que requería romper compatibilidad binaria con extensiones compiladas contra la versión 4.3.x de PHP.
Versión antigua, ya no se mantiene: 5.0 13 de julio de 2004 5 de septiembre de 2005 Motor Zend II con un nuevo modelo de objeto.
Versión antigua, ya no se mantiene: 5.1 24 de noviembre de 2005 24 de agosto de 2006 Mejoras de rendimiento con la introducción de variables de compilador en el motor PHP reingeniero. Añadido PHP Data Objects (PDO) como una interfaz consistente para acceder a bases de datos.
Versión antigua, ya no se mantiene: 5.2 2 de noviembre de 2006 6 de enero de 2011 Habilitó la extensión del filtro por defecto. Apoyo nativo de JSON.
Versión antigua, ya no se mantiene: 5.3 30 de junio de 2009 14 de agosto de 2014 Soporte de espacio de nombres; enlaces estáticos tardíos, etiquetas de salto (Goto limitado), funciones anónimas, cierres, archivos PHP (far), colección de basura para referencias circulares, mejora del soporte de Windows, sqlite3, mysqlnd como sustituto de libmysql como biblioteca subyacente para las extensiones que trabajan con MySQL, fileinfo como un reemplazo para mime_magic para un mejor soporte MIME, la extensión de internacionalización, y extensión
Versión antigua, ya no se mantiene: 5.4 1o de marzo de 2012 3 de septiembre de 2015 Soporte de trait, soporte de sintaxis de gama corta. Artículos eliminados: register_globals, safe_mode, allow_call_time_pass_reference, session_register(), session_unregister() y session_is_registered(). Servidor web incorporado. Varias mejoras en las características existentes, el rendimiento y las necesidades de memoria reducidas.
Versión antigua, ya no se mantiene: 5,5 20 de junio de 2013 10 de julio de 2016 Apoyo para generadores, finally bloques para el manejo de excepciones, OpCache (basado en Zend Optimizer+) agrupados en distribución oficial.
Versión antigua, ya no se mantiene: 5.6 28 de agosto de 2014 31 de diciembre de 2018 Expresiones scalar constantes, funciones variadas, desempaquetamiento de argumentos, nuevo operador de exponenciación, extensiones del use declaración para funciones y constantes, nuevo phpdbg depurador como módulo SAPI, y otras mejoras más pequeñas.
6.x No se libera Versión abandonada de PHP que planeaba incluir soporte Unicode nativo.
Versión antigua, ya no se mantiene: 7.0 3 de diciembre de 2015 10 de enero de 2019 Zend Engine 3 (mejoras de rendimiento y soporte de entero de 64 bits en Windows), sintaxis variable uniforme, proceso de compilación basado en AST, añadido Closure::call(), la consistencia del cambio de bits a través de plataformas, ?? (null coalesce) operador, Unicode code point escape syntax, declaraciones de tipo de retorno, tipo de escalar (integer, flotador, cadena y booleano) declaraciones, <=> Operador de comparación de tres vías "spaceship", delegación de generadores, clases anónimas, API CSPRNG más simple y consistentemente disponible, reemplazo de muchos "errores" internos restantes con las excepciones más modernas, y sintaxis de mano corta para importar múltiples elementos de un espacio de nombres.
Versión antigua, ya no se mantiene: 7.1 1 diciembre 2016 1 diciembre 2019 Tipo de retorno de vacío, modificadores de visibilidad constante de clase
Versión antigua, ya no se mantiene: 7.2 30 de noviembre de 2017 30 de noviembre de 2020 Parámetro de objetos y declaración de tipo de retorno, extensión de Libsodium, método abstracto overriding, tipo de parámetro ampliación
Versión antigua, ya no se mantiene: 7.3 6 de diciembre de 2018 6 de diciembre de 2021 Sintaxis flexible Heredoc y Nowdoc, soporte para asignación de referencia y deconstrucción de array con list(), soporte PCRE2, función hrtime()
Versión antigua, ya no se mantiene: 7.4 28 de noviembre de 2019 28 de noviembre de 2022 Propiedades tipodas 2.0, precarga, operador de asignación de coalestación null, mejora openssl_random_pseudo_bytes, Referencias de Weak, FFI – interfaz de función extranjera, siempre disponible extensión de hash, registro de contraseñas, división de cadenas multibyte, reflexión para referencias, ext/wddx desplegable, nuevo mecanismo de serialización de objetos personalizados
Versión más antigua, sin embargo, mantenida: 8.0 26 de noviembre de 2020 26 de noviembre de 2023 Just-In-Time (JIT) compilación, arrays que comienzan con un índice negativo, semántica de lenguaje más estricto/saner (validación para métodos de rasgo abstracto), comparaciones de cadenas saner a números, cadenas numéricas saner, TipoError en operadores aritméticos/bitwise inválidos, reclasificación de varios errores de motor, errores de tipo consistente para funciones internas, error fatal para la conversión de método incompatible
Versión más antigua, sin embargo, mantenida: 8.1 25 de noviembre de 2021 25 de noviembre de 2024 Explicit octal integer literal notation, enumerations, readonly properties, first-class callable syntax, new in initializers, pure intersection types, never return type, final class constraints, fibras
Versión estable actual: 8.28 de diciembre de 2022 8 de diciembre de 2025 Clases, nulas, falsas y verdaderas como tipos autónomos, conversión de caso independiente local
Future release: 8.3 23 de noviembre de 2023 23 de noviembre de 2026
Leyenda:
Versión antigua
Versión más antigua, todavía mantenida
Última versión
Última versión de vista previa
Liberación del futuro

A partir del 28 de junio de 2011, el equipo de desarrollo de PHP implementó un cronograma para el lanzamiento de nuevas versiones de PHP. Bajo este sistema, debe ocurrir al menos un lanzamiento cada mes. Una vez al año, debe producirse un lanzamiento menor que puede incluir nuevas características. Cada versión secundaria debe recibir soporte técnico durante al menos dos años con correcciones de errores y seguridad, seguido de al menos un año de solo correcciones de seguridad, para un total de un proceso de publicación de tres años para cada versión secundaria. No se introducirán nuevas características, a menos que sean pequeñas y autónomas, en una versión menor durante el proceso de lanzamiento de tres años.

Mascota

ElePHPant, mascota PHP

La mascota del proyecto PHP es elePHPant, un elefante azul con el logo de PHP en su costado, diseñado por Vincent Pontier en 1998. "Las letras (PHP) formaban el forma de elefante si se ve desde un ángulo lateral." El elePHPant a veces tiene un color diferente cuando está en forma de peluche.

Se han realizado muchas variaciones de esta mascota a lo largo de los años. Solo los elePHPants basados en el diseño original de Vincent Pontier son considerados oficiales por la comunidad. Estos son coleccionables y algunos de ellos son extremadamente raros.

Sintaxis

Una aplicación "Hello World" en PHP 7.4 se ejecuta en su servidor de desarrollo incorporado

El siguiente "¡Hola, mundo!" El programa está escrito en código PHP incrustado en un documento HTML:

¡Atención! DOCTYPE html.html .cabeza .TítuloPHP "¡Hola, Mundo!"c)Título c)cabeza .cuerpo Identificado?php eco {cHello, World! '; ? c)cuerpoc)html

Sin embargo, como no existe ningún requisito para que el código PHP se incruste en HTML, la versión más simple de ¡Hola, mundo! puede escribirse así, con la etiqueta de cierre ?> omitido como preferido en archivos que contienen código PHP puro.

Identificado?php eco ¡Hola, Mundo! ';

El intérprete PHP solo ejecuta código PHP dentro de sus delimitadores. PHP no procesa nada fuera de sus delimitadores, aunque el texto que no es PHP todavía está sujeto a las estructuras de control descritas en el código PHP. Los delimitadores más comunes son <?php para abrir y ?> para cerrar secciones de PHP. La forma abreviada <? también existe Este delimitador corto hace que los archivos de secuencias de comandos sean menos portátiles, ya que se puede deshabilitar su compatibilidad en la configuración local de PHP y, por lo tanto, no se recomienda. Por el contrario, no hay ninguna recomendación contra la etiqueta corta de eco <?= . Antes de PHP 5.4.0, esta breve sintaxis para echo solo funciona con la opción de configuración short_open_tag habilitada, mientras que para PHP 5.4.0 y versiones posteriores siempre está disponible. El propósito de todos estos delimitadores es separar el código PHP del contenido que no es PHP, como el código JavaScript o el marcado HTML. Entonces, el "¡Hola, mundo!" programa escrito en PHP es:

¿Lograste?=¡Hola, Mundo! ';

La primera forma de delimitadores, <?php y ?>< span class="x">, en XHTML y otros documentos XML, crea instrucciones de procesamiento XML correctamente formadas. Esto significa que la mezcla resultante de código PHP y otras marcas en el archivo del lado del servidor es XML bien formado.

Las variables tienen el prefijo de un símbolo de dólar y no es necesario especificar un tipo por adelantado. PHP 5 introdujo declaraciones de tipo que permiten que las funciones fuercen sus parámetros para que sean objetos de una clase específica, matrices, interfaces o funciones de devolución de llamada. Sin embargo, antes de PHP 7, las declaraciones de tipos no se podían usar con tipos escalares como enteros o cadenas.

A continuación se muestra un ejemplo de cómo se declaran e inicializan las variables de PHP.

Identificado?php Nombre = John '; // variable de tipo de cadena siendo declarada e inicializada $age = 18; // variable de tipo entero siendo declarado y inicializado Vale. = 5.3; // variable de doble tipo siendo declarada y inicializada eco Nombre . 'es ' . Vale. . Soy alton"; // variables y cadenas concatenantes eco "Nombre es $age años".; // variables interpoladoras a cadena?

A diferencia de los nombres de funciones y clases, los nombres de variables distinguen entre mayúsculas y minúsculas. Tanto las cadenas entre comillas dobles ("") como las heredoc brindan la capacidad de interpolar el valor de una variable en la cadena. PHP trata las líneas nuevas como espacios en blanco a la manera de un lenguaje de forma libre, y las declaraciones terminan con un punto y coma. PHP tiene tres tipos de sintaxis de comentarios: /* */ marca el bloque y los comentarios en línea; // o # se utilizan para comentarios de una línea. La declaración echo es una de las varias funciones que PHP proporciona para generar texto.

En términos de palabras clave y sintaxis del lenguaje, PHP es similar a la sintaxis del estilo C. si condiciones, for y while los bucles y los retornos de función son similares en sintaxis a lenguajes como C, C++, C#, Java y Perl.

Tipos de datos

PHP está mal escrito. Almacena números enteros en un rango que depende de la plataforma, ya sea como un número entero con signo de 32, 64 o 128 bits equivalente al tipo largo del lenguaje C. Los enteros sin signo se convierten en valores con signo en ciertas situaciones, lo que es un comportamiento diferente al de muchos otros lenguajes de programación. Las variables enteras se pueden asignar mediante notaciones decimales (positivas y negativas), octales, hexadecimales y binarias.

Los números de punto flotante también se almacenan en un rango específico de la plataforma. Se pueden especificar usando notación de coma flotante o dos formas de notación científica. PHP tiene un tipo booleano nativo que es similar a los tipos booleanos nativos en Java y C++. Usando las reglas de conversión de tipos booleanos, los valores distintos de cero se interpretan como verdaderos y cero como falsos, como en Perl y C++.

El tipo de datos nulo representa una variable que no tiene valor; NULL es el único valor permitido para este tipo de datos.

Variables del "recurso" tipo representan referencias a recursos de fuentes externas. Estos suelen ser creados por funciones de una extensión particular y solo pueden ser procesados por funciones de la misma extensión; los ejemplos incluyen recursos de archivos, imágenes y bases de datos.

Los arreglos pueden contener elementos de cualquier tipo que PHP pueda manejar, incluidos recursos, objetos e incluso otros arreglos. El orden se conserva en las listas de valores y en los valores hash con claves y valores, y los dos se pueden entremezclar. PHP también admite cadenas, que se pueden usar con comillas simples, comillas dobles, sintaxis nowdoc o heredoc.

La Biblioteca PHP estándar (SPL) intenta resolver problemas estándar e implementa interfaces y clases de acceso a datos eficientes.

Funciones

PHP define una gran variedad de funciones en el lenguaje central y muchas también están disponibles en varias extensiones; estas funciones están bien documentadas en la documentación de PHP en línea. Sin embargo, la biblioteca integrada tiene una amplia variedad de convenciones de nomenclatura e incoherencias asociadas, como se describe en el historial anterior.

El desarrollador puede definir funciones personalizadas:

función # Edad()int Mortícia): cuerda{} // calcular la edad restando el año de nacimiento del año actual. Años Viejo = Fecha()'Y ') - Mortícia; // devolver la edad en una cadena descriptiva. retorno Años Viejo . ()Años Viejo == 1 ? Año ' : años ');}eco 'Yo soy actualmente ' . # Edad()1995) . viejo. ';

A partir de 2023, el resultado del programa de ejemplo anterior es "Actualmente tengo 28 años."

En lugar de punteros de función, las funciones en PHP pueden ser referenciadas por una cadena que contiene su nombre. De esta manera, las funciones normales de PHP se pueden usar, por ejemplo, como devoluciones de llamadas o dentro de tablas de funciones. Las funciones definidas por el usuario se pueden crear en cualquier momento sin ser prototipadas. Las funciones se pueden definir dentro de bloques de código, lo que permite una decisión en tiempo de ejecución sobre si se debe definir o no una función. Existe una función function_exists que determina si ya se ha definido una función con un nombre dado. Las llamadas a funciones deben usar paréntesis, con la excepción de las funciones constructoras de clase de argumento cero llamadas con el operador de PHP new, en cuyo caso los paréntesis son opcionales.

Desde PHP 4.0.1 create_function(), un envoltorio delgado alrededor de eval() permitía crear funciones PHP normales durante la ejecución del programa; quedó en desuso en PHP 7.2 y se eliminó en PHP 8.0 a favor de la sintaxis para funciones anónimas o "cierres" que puede capturar variables del ámbito circundante, que se agregó en PHP 5.3. La sintaxis de flecha abreviada se agregó en PHP 7.4:

función # Adder()$x) {} retorno f()$y) = $x + $y;}Escalera = # Adder()8);eco Escalera()2); // impresiones "10"

En el ejemplo anterior, la función getAdder() crea un cierre utilizando el argumento pasado $x (la palabra clave use importa una variable del contexto léxico), que toma un argumento adicional $y, y devuelve el cierre creado a la persona que llama. Tal función es un objeto de primera clase, lo que significa que puede almacenarse en una variable, pasarse como parámetro a otras funciones, etc.

Excepcionalmente para un lenguaje de tipo dinámico, PHP admite declaraciones de tipo en parámetros de función, que se aplican en tiempo de ejecución. Esto ha sido compatible con clases e interfaces desde PHP 5.0, para arreglos desde PHP 5.1, para "callables" desde PHP 5.4, y tipos escalares (entero, flotante, cadena y booleano) desde PHP 7.0. PHP 7.0 también tiene declaraciones de tipo para los tipos de devolución de funciones, que se expresan colocando el nombre del tipo después de la lista de parámetros, precedido por dos puntos. Por ejemplo, la función getAdder del ejemplo anterior podría anotarse con tipos como este en PHP 7:

función # Adder()int $x): Clausura{} retorno f()int $y): int = $x + $y;}Escalera = # Adder()8);eco Escalera()2); // impresiones "10"eco Escalera()nulo); // lanza una excepción porque un tipo incorrecto fue aprobadoEscalera = # Adder([]); // también lanzaría una excepción

De forma predeterminada, las declaraciones de tipos escalares siguen principios de escritura débiles. Entonces, por ejemplo, si el tipo de un parámetro es int, PHP permitiría no solo pasar números enteros, sino también cadenas numéricas convertibles, flotantes o booleanos a esa función, y los convertiría. Sin embargo, PHP 7 tiene un "tipo estricto" modo que, cuando se usa, no permite tales conversiones para llamadas a funciones y devoluciones dentro de un archivo.

Objetos PHP

La funcionalidad básica de programación orientada a objetos se agregó en PHP 3 y se mejoró en PHP 4. Esto permitió que PHP ganara más abstracción, lo que facilitó las tareas creativas para los programadores que usan el lenguaje. El manejo de objetos se reescribió por completo para PHP 5, lo que expandió el conjunto de funciones y mejoró el rendimiento. En versiones anteriores de PHP, los objetos se manejaban como tipos de valor. El inconveniente de este método era que el código tenía que hacer un uso intensivo de la "referencia" variables si quería modificar un objeto, se le pasaba en lugar de crear una copia del mismo. En el nuevo enfoque, se hace referencia a los objetos por identificador y no por valor.

PHP 5 introdujo métodos y variables miembro privadas y protegidas, junto con clases abstractas, clases finales, métodos abstractos y métodos finales. También introdujo una forma estándar de declarar constructores y destructores, similar a la de otros lenguajes orientados a objetos como C++, y un modelo estándar de manejo de excepciones. Además, PHP 5 agregó interfaces y permitió la implementación de múltiples interfaces. Hay interfaces especiales que permiten que los objetos interactúen con el sistema de tiempo de ejecución. Los objetos que implementan ArrayAccess se pueden usar con sintaxis de matriz y los objetos que implementan Iterator o IteratorAggregate se pueden usar con la construcción de lenguaje foreach. No hay una función de tabla virtual en el motor, por lo que las variables estáticas se vinculan con un nombre en lugar de una referencia en el momento de la compilación.

Si el desarrollador crea una copia de un objeto utilizando la palabra reservada clone, el motor de Zend comprobará si se ha definido un método __clone(). De lo contrario, llamará a un __clone() predeterminado que copiará las propiedades del objeto. Si se define un método __clone(), será responsable de establecer las propiedades necesarias en el objeto creado. Para mayor comodidad, el motor proporcionará una función que importa las propiedades del objeto de origen, por lo que el programador puede comenzar con una réplica por valor del objeto de origen y solo anular las propiedades que deben cambiarse.

La visibilidad de las propiedades y métodos de PHP se define mediante las palabras clave public, private y protected. El valor predeterminado es public, si solo se usa var; var es un sinónimo de public. Se puede acceder a los elementos declarados public desde cualquier lugar. protected limita el acceso a las clases heredadas (ya la clase que define el elemento). private limita la visibilidad solo a la clase que define el elemento. Los objetos del mismo tipo tienen acceso a los miembros privados y protegidos de los demás aunque no sean la misma instancia.

Ejemplo

El siguiente es un ejemplo básico de programación orientada a objetos en PHP 8:

Identificado?phpabstracto clase Usuario{} protegida cuerda Nombre; público función __construir()cuerda Nombre) {} // hacer primera carta mayúscula y la minúscula del resto Esto-Nombre = Ucfirst()strtolower()Nombre)); } público función salud(): cuerda {} retorno "Hola, mi nombre es " . Esto-Nombre; } abstracto público función trabajo(): cuerda;}clase Estudiante extensiones Usuario{} público función __construir()cuerda Nombre, privado cuerda $course) {} padre::__construir()Nombre); } público función trabajo(): cuerda {} retorno "Aprendo" . Esto-Por supuesto.; }}clase Maestro extensiones Usuario{} público función __construir()cuerda Nombre, privado array $teachingCourses) {} padre::__construir()Nombre); } público función trabajo(): cuerda {} retorno "Enseño" . implode()", ", Esto-enseñanzas); }}Estudiantes = [ nuevo Estudiante()"Alice", "Computer Science"), nuevo Estudiante()"Bob", "Computer Science"), nuevo Estudiante()"Charlie", "Business Studies"),];$teachers = [ nuevo Maestro()"Dan", ["Computer Science", "Seguridad de Información"]), nuevo Maestro()"Erin", ["Computer Science", "Programación de gráficos 3D"]), nuevo Maestro()"Frankie", ["Mercadeo Online", "Business Studies", "E-commerce"]),];en adelante [Estudiantes, $teachers] como $usuarios) {} eco $usuarios[0]::clase . "s:n"; array_walk()$usuarios, función ()Usuario $user) {} eco "{}$user-salud()}, {}$user-trabajo()}n"; });}

Este programa genera lo siguiente:

Estudiantes:
Hola, me llamo Alice, aprendo Ciencias de la Computación
Hola, me llamo Bob, aprendo Ciencias de la Computación
Hola, me llamo Charlie.
Maestros:
Hola, me llamo Dan, enseño Ciencias de la Computación, Seguridad de la Información
Hola, me llamo Erin, enseño Ciencias de la Computación, Programación de Gráficos 3D
Hola, mi nombre es Frankie, Enseño Marketing Online, Estudios de Negocios, E-commerce

Implementaciones

La única implementación PHP completa es la original, conocida simplemente como PHP. Es el más utilizado y funciona con Zend Engine. Para eliminar la ambigüedad de otras implementaciones, a veces se le llama extraoficialmente "Zend PHP". Zend Engine compila el código fuente de PHP sobre la marcha en un formato interno que puede ejecutar, por lo que funciona como un intérprete. También es la "implementación de referencia" de PHP, ya que PHP no tiene una especificación formal, por lo que la semántica de Zend PHP define la semántica de PHP. Debido a la semántica compleja y matizada de PHP, definida por la forma en que funciona Zend, es difícil que las implementaciones de la competencia ofrezcan una compatibilidad completa.

El modelo de ejecución de una sola solicitud por secuencia de comandos de PHP y el hecho de que Zend Engine es un intérprete conduce a la ineficiencia; como resultado, se han desarrollado varios productos para ayudar a mejorar el rendimiento de PHP. Para acelerar el tiempo de ejecución y no tener que compilar el código fuente PHP cada vez que se accede a la página web, los scripts PHP también se pueden implementar en el formato interno del motor PHP mediante el uso de un caché de código de operación, que funciona mediante el almacenamiento en caché. la forma compilada de un script PHP (códigos de operación) en la memoria compartida para evitar la sobrecarga de analizar y compilar el código cada vez que se ejecuta el script. Un caché de código de operación, Zend Opcache, está integrado en PHP desde la versión 5.5. Otro ejemplo de un caché de código de operación ampliamente utilizado es el caché PHP alternativo (APC), que está disponible como una extensión PECL.

Si bien Zend PHP sigue siendo la implementación más popular, se han desarrollado varias otras implementaciones. Algunos de estos son compiladores o admiten la compilación JIT y, por lo tanto, ofrecen beneficios de rendimiento sobre Zend PHP a expensas de la falta de compatibilidad completa con PHP. Las implementaciones alternativas incluyen lo siguiente:

Licencias

PHP es software gratuito publicado bajo la Licencia PHP, que estipula que:

Los productos derivados de este software no pueden llamarse "PHP", ni pueden aparecer "PHP" en su nombre, sin previo permiso escrito de group@php.net. Puede indicar que su software funciona en conjunto con PHP diciendo "Foo para PHP" en lugar de llamarlo "PHP Foo" o "phpfoo".

Esta restricción en el uso de "PHP" hace que la Licencia PHP sea incompatible con la Licencia Pública General (GPL), mientras que la Licencia Zend es incompatible debido a una cláusula publicitaria similar a la de la licencia BSD original.

Desarrollo y comunidad

PHP incluye varias bibliotecas gratuitas y de código abierto en su distribución de código fuente, o las usa en compilaciones binarias de PHP resultantes. PHP es fundamentalmente un sistema compatible con Internet con módulos incorporados para acceder a servidores de Protocolo de transferencia de archivos (FTP) y muchos servidores de bases de datos, incluidos PostgreSQL, MySQL, Microsoft SQL Server y SQLite (que es una base de datos integrada), servidores LDAP y otros.. Numerosas funciones familiares para los programadores de C, como las de la familia stdio, están disponibles en las compilaciones estándar de PHP.

PHP permite a los desarrolladores escribir extensiones en C para agregar funcionalidad al lenguaje PHP. Las extensiones de PHP pueden compilarse estáticamente en PHP o cargarse dinámicamente en tiempo de ejecución. Se han escrito numerosas extensiones para agregar soporte para la API de Windows, gestión de procesos en sistemas operativos similares a Unix, cadenas multibyte (Unicode), cURL y varios formatos de compresión populares. Otras características de PHP disponibles a través de extensiones incluyen la integración con Internet Relay Chat (IRC), generación dinámica de imágenes y contenido de Adobe Flash, PHP Data Objects (PDO) como una capa de abstracción utilizada para acceder a bases de datos, e incluso síntesis de voz. Algunas de las funciones principales del lenguaje, como las que se ocupan de cadenas y matrices, también se implementan como extensiones. El proyecto PHP Extension Community Library (PECL) es un repositorio para extensiones del lenguaje PHP.

Algunos otros proyectos, como Zephir, brindan la capacidad de crear extensiones PHP en un lenguaje de alto nivel y compilarlas en extensiones PHP nativas. Este enfoque, en lugar de escribir extensiones de PHP directamente en C, simplifica el desarrollo de extensiones y reduce el tiempo necesario para la programación y las pruebas.

En diciembre de 2018, PHP Group constaba de diez personas: Thies C. Arntzen, Stig Bakken, Shane Caraveo, Andi Gutmans, Rasmus Lerdorf, Sam Ruby, Sascha Schumann, Zeev Suraski, Jim Winstead y Andrei Zmievski.

Zend Technologies proporciona una certificación PHP basada en el examen PHP 7 (y anteriormente basado en PHP 5.5) para que los programadores se conviertan en desarrolladores certificados de PHP.

Fundación PHP

El 26 de noviembre de 2021, el blog de JetBrains anunció la creación de PHP Foundation, que patrocinará el diseño y desarrollo de PHP.

Instalación y configuración

Ejemplo de salida de la función phpinfo() en PHP 7.1

Hay dos formas principales de agregar soporte para PHP a un servidor web: como un módulo de servidor web nativo o como un ejecutable CGI. PHP tiene una interfaz de módulo directo llamada interfaz de programación de aplicaciones de servidor (SAPI), que es compatible con muchos servidores web, incluidos Apache HTTP Server, Microsoft IIS e iPlanet Web Server. Algunos otros servidores web, como OmniHTTPd, admiten la interfaz de programación de aplicaciones de servidor de Internet (ISAPI), que es la interfaz del módulo de servidor web de Microsoft. Si PHP no tiene soporte de módulo para un servidor web, siempre se puede usar como una interfaz de puerta de enlace común (CGI) o un procesador FastCGI; en ese caso, el servidor web está configurado para usar el ejecutable CGI de PHP para procesar todas las solicitudes de archivos PHP.

PHP-FPM (FastCGI Process Manager) es una implementación alternativa de FastCGI para PHP, incluida con la distribución oficial de PHP desde la versión 5.3.3. En comparación con la implementación anterior de FastCGI, contiene algunas características adicionales, en su mayoría útiles para servidores web con mucha carga.

Al usar PHP para secuencias de comandos de línea de comandos, se necesita un ejecutable de interfaz de línea de comandos (CLI) de PHP. PHP admite una interfaz de programación de aplicaciones de servidor CLI (SAPI) desde PHP 4.3.0. El enfoque principal de este SAPI es desarrollar aplicaciones de shell usando PHP. Existen bastantes diferencias entre CLI SAPI y otros SAPI, aunque comparten muchos de los mismos comportamientos.

PHP tiene una interfaz de módulo directa llamada SAPI para diferentes servidores web; en el caso de PHP 5 y Apache 2.0 en Windows, se proporciona en forma de un archivo DLL llamado php5apache2.dll, que es un módulo que, entre otras funciones, proporciona una interfaz entre PHP y el servidor web, implementado en una forma que el servidor entienda. Este formulario es lo que se conoce como SAPI.

Existen diferentes tipos de SAPI para varias extensiones de servidor web. Por ejemplo, además de los enumerados anteriormente, otros SAPI para el lenguaje PHP incluyen la interfaz de puerta de enlace común y la interfaz de línea de comandos.

PHP también se puede usar para escribir aplicaciones de interfaz gráfica de usuario (GUI) de escritorio, usando la extensión PHP-GTK. PHP-GTK no está incluido en la distribución oficial de PHP y, como extensión, solo se puede usar con las versiones de PHP 5.1.0 y posteriores. La forma más común de instalar PHP-GTK es compilarlo desde el código fuente.

Cuando se instala PHP y se usa en entornos de nube, se proporcionan kits de desarrollo de software (SDK) para usar características específicas de la nube. Por ejemplo:

Se admiten numerosas opciones de configuración, que afectan tanto a las funciones básicas de PHP como a las extensiones. El archivo de configuración php.ini se busca en diferentes ubicaciones, dependiendo de la forma en que se use PHP. El archivo de configuración se divide en varias secciones, mientras que algunas de las opciones de configuración también se pueden configurar dentro de la configuración del servidor web.

Usar

Un amplio resumen del paquete de software LAMP, mostrado aquí junto con Squid

PHP es un lenguaje de secuencias de comandos de propósito general especialmente adecuado para el desarrollo web del lado del servidor, en cuyo caso PHP generalmente se ejecuta en un servidor web. El tiempo de ejecución de PHP ejecuta cualquier código PHP en un archivo solicitado, generalmente para crear contenido de página web dinámico o imágenes dinámicas utilizadas en sitios web o en otros lugares. También se puede utilizar para secuencias de comandos de línea de comandos y aplicaciones de interfaz gráfica de usuario (GUI) del lado del cliente. PHP se puede implementar en la mayoría de los servidores web, muchos sistemas operativos y plataformas, y se puede usar con muchos sistemas de administración de bases de datos relacionales (RDBMS). La mayoría de los proveedores de alojamiento web admiten PHP para que lo utilicen sus clientes. Está disponible de forma gratuita, y PHP Group proporciona el código fuente completo para que los usuarios lo construyan, personalicen y amplíen para su propio uso.

Página web dinámica: ejemplo de scripting lado del servidor (PHP y MySQL)

Diseñado originalmente para crear páginas web dinámicas, PHP ahora se enfoca principalmente en secuencias de comandos del lado del servidor y es similar a otros lenguajes de secuencias de comandos del lado del servidor que brindan contenido dinámico desde un servidor web a un cliente, como Microsoft' s ASP.NET, Sun Microsystems' JavaServer Pages y mod_perl. PHP también ha atraído el desarrollo de muchos marcos de software que proporcionan bloques de construcción y una estructura de diseño para promover el desarrollo rápido de aplicaciones (RAD). Algunos de estos incluyen PRADO, CakePHP, Symfony, CodeIgniter, Laravel, Yii Framework, Phalcon y Laminas, que ofrecen características similares a otros marcos web.

La arquitectura LAMP se ha vuelto popular en la industria web como una forma de implementar aplicaciones web. PHP se usa comúnmente como la P en este paquete junto con Linux, Apache y MySQL, aunque la P también puede referirse a Python, Perl o alguna combinación de los tres. Paquetes similares, WAMP y MAMP, también están disponibles para Windows y macOS, y la primera letra representa el sistema operativo respectivo. Aunque tanto PHP como Apache se proporcionan como parte de la instalación básica de macOS, los usuarios de estos paquetes buscan un mecanismo de instalación más simple que se pueda mantener actualizado más fácilmente.

Para escenarios de uso específicos y más avanzados, PHP ofrece una forma bien definida y documentada para escribir extensiones personalizadas en C o C++. Además de ampliar el propio lenguaje en forma de bibliotecas adicionales, las extensiones proporcionan una forma de mejorar la velocidad de ejecución donde es crítica y hay espacio para mejoras mediante el uso de un verdadero lenguaje compilado. PHP también ofrece formas bien definidas para integrarse en otros proyectos de software. De esa manera, PHP se puede usar fácilmente como un lenguaje de secuencias de comandos interno para otro proyecto, y también proporciona una interfaz estrecha con las estructuras de datos internas específicas del proyecto.

PHP recibió críticas mixtas debido a la falta de compatibilidad con subprocesos múltiples en el nivel del idioma principal, aunque el uso de subprocesos es posible gracias a la función "pthreads" Extensión PECL.

Se han producido una interfaz de línea de comandos, php-cli y dos motores de secuencias de comandos ActiveX Windows Script Host para PHP.

Estadísticas de popularidad y uso

PHP se utiliza para sistemas de administración de contenido web, incluidos MediaWiki, WordPress, Joomla, Drupal, Moodle, eZ Publish, eZ Platform y SilverStripe.

En enero de 2013, PHP se usaba en más de 240 millones de sitios web (39 % de los incluidos en la muestra) y se instalaba en 2,1 millones de servidores web.

Hasta marzo de 2021, PHP se usaba como lenguaje de programación del lado del servidor en el 79,1 % de los sitios web, frente al 83,5 % anterior, donde se podía determinar el lenguaje, y PHP 7 es la versión más utilizada del lenguaje con 50,3 % de todos los sitios web en la web que usan esa versión.

Seguridad

En 2019, el 11 % de todas las vulnerabilidades enumeradas por la Base de datos nacional de vulnerabilidades estaban vinculadas a PHP; Históricamente, alrededor del 30 % de todas las vulnerabilidades enumeradas desde 1996 en esta base de datos están vinculadas a PHP. Los fallos de seguridad técnica del propio lenguaje o de sus bibliotecas principales no son frecuentes (22 en 2009, alrededor del 1% del total, aunque PHP se aplica a alrededor del 20% de los programas enumerados). Reconociendo que los programadores cometen errores, algunos lenguajes incluyen verificación de corrupción para detectar automáticamente la falta de validación de entrada que provoca muchos problemas. Esta característica se está desarrollando para PHP, pero su inclusión en una versión ha sido rechazada varias veces en el pasado.

Existen parches de protección avanzada como Suhosin y Hardening-Patch, especialmente diseñados para entornos de alojamiento web.

Históricamente, las versiones antiguas de PHP tenían algunos parámetros de configuración y valores predeterminados para dichas configuraciones de tiempo de ejecución que hacían que algunas aplicaciones de PHP fueran propensas a problemas de seguridad. Entre estas, las directivas de configuración magic_quotes_gpc y register_globals fueron las más conocidas; este último hizo que los parámetros de URL se convirtieran en variables de PHP, abriendo un camino para vulnerabilidades de seguridad graves al permitir que un atacante estableciera el valor de cualquier variable global no inicializada e interfiriera con la ejecución de un script PHP. Compatibilidad con "comillas mágicas" y "registrar globales" La configuración está obsoleta desde PHP 5.3.0 y se eliminó de PHP 5.4.0.

Otro ejemplo de la posible vulnerabilidad de la configuración del tiempo de ejecución proviene de no deshabilitar la ejecución de PHP (por ejemplo, mediante el uso de la directiva de configuración engine) para el directorio donde se almacenan los archivos cargados; habilitarlo puede resultar en la ejecución de un código malicioso incrustado en los archivos cargados. La mejor práctica es ubicar el directorio de imágenes fuera de la raíz del documento disponible para el servidor web y servirlo a través de un script intermediario, o deshabilitar la ejecución de PHP para el directorio que almacena los archivos cargados.

Además, habilitar la carga dinámica de extensiones PHP (a través de la directiva de configuración enable_dl) en un entorno de alojamiento web compartido puede generar problemas de seguridad.

Las conversiones de tipo implícitas que dan como resultado que diferentes valores se traten como iguales, a veces en contra de la intención del programador, pueden generar problemas de seguridad. Por ejemplo, el resultado de la comparación '0e1234' == '0' es true, porque las cadenas que se pueden analizar como números se convierten en números; en este caso, el primer valor comparado se trata como notación científica que tiene el valor (0×101234), que es cero. Errores como este resultaron en vulnerabilidades de autenticación en Simple Machines Forum, Typo3 y phpBB cuando se compararon los hashes de contraseña MD5. La forma recomendada es usar hash_equals() (para la seguridad de ataques de tiempo), strcmp o el operador de identidad (===), como '0e1234' === '0' da como resultado false.

En un análisis de 2013 de más de 170.000 desfiguraciones de sitios web, publicado por Zone-H, la técnica utilizada con mayor frecuencia (53 %) fue la explotación de la vulnerabilidad de inclusión de archivos, principalmente relacionada con el uso inseguro de las construcciones del lenguaje PHP include< /code>, require y allow_url_fopen.

A partir de abril de 2021, W3Techs informa que el 64 % de los sitios web que usan PHP, usan versiones 7.2 o anteriores (que ya no son compatibles con el equipo de desarrollo de PHP) con un 35 % de todos los sitios web de PHP que utilizan la versión 5.6 o anterior.

La versión 5 todavía se usa en el 24,5 % de todos los sitios web (septiembre de 2021). Se recomienda encarecidamente migrar a la versión 7 u 8 de PHP y utilizar random_int() en lugar de rand() o mt_rand(), como Las últimas funciones no son criptográficamente seguras. Hay dos ataques que se pueden realizar sobre las fuentes de entropía de PHP: "ataque semilla" y "ataque de recuperación de estado". Con las tecnologías GPU actuales, un atacante puede realizar hasta 230 cálculos MD5 por segundo con una GPU de $250, mientras que con $500 adicionales puede alcanzar hasta 232 cálculos. En combinación con un "ataque de cumpleaños" esto puede dar lugar a graves vulnerabilidades de seguridad.