PHP - PHP

PHP
PHP-logo.svg
Paradigma Multi-paradigma : imperativo , funcional , orientado a objetos , procedimental , reflexivo
Diseñada por Rasmus Lerdorf
Desarrollador El equipo de desarrollo de PHP, Zend Technologies
Apareció por primera vez 8 de junio de 1995 ; Hace 26 años (8 de junio de 1995 )
Lanzamiento estable
8.0.11  Edita esto en Wikidata / 23 de septiembre de 2021 ; Hace 24 dias ( 23 de septiembre de 2021 )
Versión de vista previa
8.1.0 Beta 1/22  Edita esto en Wikidata de julio de 2021 ; Hace 2 meses ( 22 de julio de 2021 )
Disciplina de mecanografía Dinámico , débil

desde la versión 7.0:

Gradual
Lenguaje de implementación C (principalmente; algunos componentes C ++ )
SO Tipo Unix , Windows , macOS , IBM i , OpenVMS
Licencia Licencia PHP (la mayor parte del motor Zend bajo licencia de motor Zend )
Extensiones de nombre de archivo .php, .phar, .phtml, .pht,.phps
Sitio web www .php .net Edita esto en Wikidata
Implementaciones importantes
Motor Zend , HHVM , PeachPie , Quercus , Parrot
Influenciado por
Perl , HTML , C , C ++ , Java , Tcl , JavaScript , Hack
Influenciado
Hack , JSP , ASP

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 1994. La implementación de referencia PHP ahora es producida por The PHP Group. PHP originalmente significaba página de inicio personal , pero ahora representa el inicialismo recursivo 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 Common Gateway Interface (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 gestión de contenido web y marcos web que pueden emplearse para orquestar o facilitar la generación de esa respuesta. Además, PHP se puede utilizar para muchas tareas de programación fuera del contexto web, como aplicaciones gráficas independientes y control robótico de drones . 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 adaptado 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 formal escrita o estándar hasta 2014, con la implementación original actuando como el estándar de facto que otras implementaciones pretendían seguir. Desde 2014, se ha trabajado para crear una especificación PHP formal.

W3Techs informa que, en abril de 2021, "PHP es utilizado por el 79,2% de todos los sitios web cuyo lenguaje de programación del lado del servidor conocemos".

Historia

Historia temprana

Rasmus Lerdorf , quien escribió el componente Common Gateway Interface (CGI) original, junto con Andi Gutmans y Zeev Suraski , quienes reescribieron el analizador que formó PHP 3.

El desarrollo de PHP comenzó en 1994 cuando Rasmus Lerdorf escribió varios programas Common Gateway Interface (CGI) 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 "Intérprete de formularios / página de inicio personal" o PHP / FI.

PHP / FI se puede utilizar para crear aplicaciones web dinámicas y sencillas . Para acelerar la notificación de errores y mejorar el código, Lerdorf anunció inicialmente el lanzamiento de PHP / FI como "Herramientas de página de inicio personal (PHP Tools) 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 PHP temprana :

<!--include /text/header.html-->

<!--getenv HTTP_USER_AGENT-->
<!--if substr $exec_result Mozilla-->
  Hey, you are using Netscape!<p>
<!--endif-->

<!--sql database select * from table where user='$username'-->
<!--ifless $numentries 1-->
  Sorry, that record does not exist<p>
<!--endif exit-->
  Welcome <!--$user-->!<p>
  You have <!--$index:0--> credits left in your account.<p>

<!--include /text/footer.html-->

PHP temprano no tenía la intención de ser un nuevo lenguaje de programación y creció orgánicamente, con Lerdorf observando en retrospectiva: "No sé cómo detenerlo, nunca hubo la intención de escribir un lenguaje de programación [...] absolutamente ninguna idea de cómo escribir un lenguaje de programación, simplemente seguí agregando el siguiente paso lógico en el camino ". Comenzó a formarse 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 diseñó originalmente, sino que se desarrolló orgánicamente, ha llevado a una nomenclatura inconsistente de funciones y un orden 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 los nombres se eligieron para mejorar la distribución de los valores hash .

PHP 3 y 4

Este es un ejemplo de código PHP personalizado para el sistema de gestión de contenido 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 luego comenzaron una nueva reescritura del núcleo de PHP, produciendo 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. En agosto de 2008, esta sucursal había alcanzado la versión 4.4.9. PHP 4 ya no está en desarrollo y no 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 incluyó nuevas características como soporte mejorado para programación orientada a objetos , la extensión PHP Data Objects (PDO) (que define una interfaz liviana y consistente para acceder a bases de datos) y numerosas mejoras de desempeño. En 2008, PHP 5 se convirtió en la única versión estable en desarrollo. El enlace estático tardío había faltado 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 código nuevo 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 construyéndolos a partir del código fuente PHP o usando binarios prediseñados. Para las versiones 5.3 y 5.4 de PHP, las únicas distribuciones binarias de Microsoft Windows disponibles eran compilaciones IA-32 de 32 bits , que requerían el modo de compatibilidad de Windows de 32 bits mientras se usaban Internet Information Services (IIS) en una plataforma 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 soporte nativo Unicode a través de PHP, incorporando la biblioteca International Components for Unicode (ICU) y representando cadenas de texto como UTF-16 internamente. Dado que esto causaría cambios importantes tanto en los aspectos internos del lenguaje como en el código de usuario, se planeó lanzar esto como la versión 6.0 del lenguaje, junto con otras características importantes en desarrollo.

Sin embargo, la escasez de desarrolladores que entendieron los cambios necesarios y los problemas de rendimiento que surgen de la conversión hacia 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 características que no son Unicode y se han actualizado desde 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 PHP 5.4 que contiene la mayoría de las características 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 implicó cierto debate entre los desarrolladores internos. Si bien el experimento PHP 6 Unicode nunca se había lanzado, varios artículos y títulos de libros hicieron referencia al nombre 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 de 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 refactorizando el motor Zend al tiempo que conservaba una compatibilidad casi completa del lenguaje. Para el 14 de julio de 2014, los puntos de referencia basados ​​en WordPress , que sirvieron como el conjunto de puntos de referencia principal para el proyecto phpng, mostraron un aumento de casi un 100% en el rendimiento. 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 Just-In -Time (JIT). Debido a los cambios significativos, el motor Zend reelaborado se llamó Zend Engine 3 , sucediendo al Zend Engine 2 utilizado en PHP 5.

Debido a los principales cambios internos en phpng, debe recibir un nuevo número de versión principal de PHP, en lugar de una versión menor 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:

  • Muchos mecanismos de error de PHP heredados fatales o recuperables fueron reemplazados por excepciones modernas orientadas a objetos .
  • La sintaxis para desreferenciar variable fue revisado a fin de ser internamente más consistente y completa, lo que permite el uso de los operadores ->, [], (), {}, y ::, con expresiones del lado izquierdo significativas arbitrarias.
  • La compatibilidad con los métodos de constructor de estilo PHP 4 heredados quedó obsoleta.
  • El comportamiento de la foreachdeclaración se cambió para que sea más predecible.
  • Los constructores para las pocas clases integradas en PHP que devolvieron nulos en caso de falla se cambiaron para lanzar una excepción en su lugar, por coherencia.
  • Varias interfaces de programación de aplicaciones de servidor (SAPI) y extensiones que no se mantuvieron o en desuso se eliminaron del núcleo de PHP, sobre todo la mysqlextensión heredada .
  • El comportamiento del list()operador se modificó para eliminar la compatibilidad con cadenas.
  • Se eliminó el soporte para los delimitadores de estilo ASP heredados <%y %>y <script language="php"> ... </script>.
  • Se corrigió un descuido que permitía que una declaración de cambio tuviera múltiples defaultcláusulas.
  • Se eliminó el soporte para el soporte de números hexadecimales en algunas conversiones implícitas de cadenas a tipos de números.
  • Se cambiaron los operadores de desplazamiento a la izquierda y a la derecha para que se comporten de forma más coherente en todas las plataformas.
  • Se cambiaron las conversiones entre números de punto flotante y enteros (por ejemplo, se cambió el infinito para convertirlo en cero) y se implementaron de manera más consistente en todas las plataformas.

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

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 versiones anteriores. Las nuevas características y cambios notables incluyen:

Recopilación justo a tiempo

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

El compilador JIT de PHP 8 puede proporcionar mejoras sustanciales de rendimiento para algunos casos de uso. El desarrollador de PHP Nikita Popov ha declarado 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. Se espera que las mejoras de rendimiento debido a la adición del compilador JIT sean más sustanciales para operaciones de tipo matemático que para casos de uso comunes de desarrollo web. Además, el compilador JIT ofrece un potencial futuro para mover algunos códigos 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 matchexpresión. La expresión de coincidencia es conceptualmente similar a una switchdeclaración y es más compacta para algunos casos de uso. Como matches una expresión, su resultado se puede capturar en una variable o devolver desde una función.

Tipo de cambios y adiciones

PHP 8 introdujo tipos de unión, un nuevo statictipo de retorno y un nuevo mixedtipo.

Los "atributos", a menudo denominados "anotaciones" en otros lenguajes de programación, se agregaron en PHP 8, lo que permite agregar metadatos a las clases.

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

Cambios y adiciones de sintaxis

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 de fusión nula ?? , pero se usa al llamar a métodos. El siguiente fragmento de código no arrojará un error si getBirthday()devuelve un valor nulo:

$human_readable_date = $user->getBirthday()?->diffForHumans();

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

Otros cambios menores incluyen soporte para el uso de ::classen objetos, que sirve como una alternativa para el uso de get_class(); capturas no capturadas en bloques de try-catch; 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 soporte para comas finales en otros contextos, como en matrices.

Cambios y adiciones estándar de la biblioteca

  • Se agregaron mapas débiles en PHP 8. A WeakMapcontiene referencias a objetos, pero estas referencias no impiden que dichos objetos sean recolectados como basura . Esto puede proporcionar mejoras de rendimiento en escenarios donde los datos se almacenan en caché ; esto es de particular relevancia para los ORM .
  • Varios ajustes a las interfaces, como agregar soporte para crear DateTimeobjetos a partir de interfaces y la adición de una Stringableinterfaz que se puede usar para sugerencias de tipo.
  • Varias funciones nuevas que incluyen str_contains (), str_starts_with () y str_ends_with (); fdiv (); get_debug_type (); y get_resource_id ()
  • Implementación de objeto de token_get_all ()

Cambios adicionales

  • Las anotaciones de tipo también se agregaron al código fuente C de PHP para permitir que las funciones y métodos internos tengan "información de tipo completa en reflexión".
  • Herencia con métodos privados
  • Métodos abstractos en mejoras de rasgos

Historial de versiones

Versión Fecha de lanzamiento Soportado hasta Notas
Versión antigua, ya no se mantiene: 1.0 8 de junio de 1995 Oficialmente llamado "Herramientas de la página de inicio personal (Herramientas PHP)". Este es el primer uso del nombre "PHP".
Versión antigua, ya no se mantiene: 2.0 1 de noviembre de 1997 Oficialmente llamado "PHP / FI 2.0". Esta es la primera versión que en realidad podría caracterizarse como PHP, siendo un lenguaje independiente con muchas características que han perdurado 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 varios desarrolladores. Zeev Suraski y Andi Gutmans reescriben la base de esta versión.
Versión antigua, ya no se mantiene: 4.0 22 de mayo de 2000 23 de junio de 2001 Se agregó un sistema más avanzado de análisis / ejecución de etiquetas de dos etapas llamado motor Zend.
Versión antigua, ya no se mantiene: 4.1 10 de diciembre de 2001 12 de marzo de 2002 Introducido "superglobals" ( $_GET, $_POST, $_SESSION, etc.)
Versión antigua, ya no se mantiene: 4.2 22 de abril de 2002 6 de septiembre de 2002 Desactivado register_globalspor defecto. Los datos recibidos a través de la red ya no se insertan directamente en el espacio de nombres global , 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 Se corrigió un error de corrupción de memoria, que requería romper la compatibilidad binaria con extensiones compiladas en PHP versión 4.3.x.
Versión antigua, ya no se mantiene: 5,0 13 de julio de 2004 5 de septiembre de 2005 Zend Engine II con un nuevo modelo de objetos.
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 del compilador en PHP Engine rediseñado. Se agregaron objetos de datos PHP (PDO) como una interfaz coherente para acceder a las bases de datos.
Versión antigua, ya no se mantiene: 5.2 2 de noviembre de 2006 6 de enero de 2011 Habilitada la extensión del filtro de forma predeterminada. Soporte JSON nativo .
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 , etiqueta de salto ( goto limitado ), funciones anónimas , cierres , archivos PHP (phar), recolección de basura para referencias circulares, soporte mejorado de Windows , sqlite3, mysqlnd como reemplazo de libmysql como biblioteca subyacente para las extensiones que funcionan con MySQL , fileinfo como reemplazo de mime_magic para una mejor compatibilidad con MIME , la extensión de internacionalización y la desaprobación de la extensión ereg.
Versión antigua, ya no se mantiene: 5.4 1 de marzo de 2012 3 de septiembre de 2015 Soporte de rasgos , soporte de sintaxis de matriz corta. Los elementos eliminados: register_globals, safe_mode, allow_call_time_pass_reference, , y . Servidor web integrado. Varias mejoras a las características existentes, rendimiento y requisitos de memoria reducidos. session_register()session_unregister()session_is_registered()
Versión antigua, ya no se mantiene: 5.5 20 de junio de 2013 10 de julio de 2016 Soporte para generadores , finallybloques para manejo de excepciones, OpCache (basado en Zend Optimizer +) incluido en distribución oficial.
Versión antigua, ya no se mantiene: 5,6 28 de agosto de 2014 31 de diciembre de 2018 Expresiones escalares constantes, funciones variadas , desempaquetado de argumentos, nuevo operador de exponenciación, extensiones de la usedeclaración para funciones y constantes, nuevo phpdbgdepurador como módulo SAPI y otras mejoras menores.
6.x No publicado N / A Versión abandonada de PHP que planeaba incluir soporte nativo Unicode.
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 compatibilidad con enteros de 64 bits en Windows), sintaxis de variable uniforme, proceso de compilación basado en AST , agregado , consistencia de cambio bit a bit entre plataformas, operador ( fusión nula ), sintaxis de escape de punto de código Unicode , declaraciones de tipo de retorno, declaraciones de tipo escalar (entero, flotante, de cadena y booleano), operador de comparación de tres vías de "nave espacial" , delegación de generador , clases anónimas , API CSPRNG más simple y disponible de manera más consistente , reemplazo de muchos "errores" internos de PHP restantes con las excepciones más modernas y sintaxis abreviada para importar varios elementos desde un espacio de nombres. Closure::call()??<=>
Versión antigua, ya no se mantiene: 7.1 1 de diciembre de 2016 1 de diciembre de 2019 tipo de retorno 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 objeto y declaración de tipo de retorno, extensión Libsodium, anulación de método abstracto, ampliación de tipo de parámetro
Versión anterior, pero aún se mantiene: 7.3 6 de diciembre de 2018 6 de diciembre de 2021 Sintaxis flexible de Heredoc y Nowdoc, soporte para asignación de referencias y deconstrucción de matrices con list (), soporte PCRE2, función hrtime ()
Versión anterior, pero aún se mantiene: 7.4 28 de noviembre de 2019 28 de noviembre de 2022 Propiedades escritas 2.0, precarga, operador de asignación de coalescencia nula, mejorar openssl_random_pseudo_bytes, referencias débiles, FFI - interfaz de función externa , extensión hash siempre disponible, registro hash de contraseña, división de cadenas multibyte, reflexión para referencias, desagregar ext / wddx, nueva serialización de objetos personalizados mecanismo
Versión estable actual: 8.0 26 de noviembre de 2020 26 de noviembre de 2023 Compilación Just-In-Time (JIT) , matrices que comienzan con un índice negativo, semántica de lenguaje más estricta / sana (validación para métodos de rasgos abstractos), comparaciones de cadenas a números más cuerdas, cadenas numéricas más cuerdas, TypeError en operadores aritméticos / bit a bit no válidos, reclasificación de varios errores de motor, errores de tipo consistente para funciones internas, error fatal para firmas de métodos incompatibles), conversión flotante a cadena independiente de la configuración regional, ajustes de sintaxis de variables, atributos, argumentos con nombre, expresión de coincidencia, promoción de propiedades del constructor, tipos de unión, tipo mixto, estático tipo de retorno, operador nullsafe, capturas sin captura, expresión de lanzamiento, la extensión JSON siempre está disponible.
Lanzamiento futuro: 8.1 25 de noviembre de 2021 ?? Noviembre 2024 Notación literal de entero octal explícito, enumeraciones
Leyenda:
Versión antigua
Versión anterior, aún mantenida
Ultima versión
Última versión de vista previa
Lanzamiento 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. Con este sistema, debería producirse al menos una versión cada mes. Una vez al año, debería producirse una versión menor que puede incluir nuevas funciones. Cada versión menor debe ser compatible con al menos dos años con seguridad y correcciones de errores, seguido de al menos un año de solo correcciones de seguridad, para un total de un proceso de lanzamiento de tres años para cada versión menor. No se introducirán nuevas funciones, a menos que sean pequeñas y autónomas, en una versión menor durante el proceso de publicación de tres años.

Mascota

El elePHPant, mascota de PHP

La mascota del proyecto PHP es elePHPant , un elefante azul con el logo de PHP en un costado, diseñado por Vincent Pontier en 1998. "Las letras (PHP) tenían la forma de un elefante si se veían en 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 que se ejecuta en un servidor de desarrollo localhost

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

<!DOCTYPE html>
<html>
    <head>
        <title>PHP "Hello, World!" program</title>
    </head>
    <body>
        <?php
            echo '<p>Hello, World!</p>';
        ?>
    </body>
</html>

Sin embargo, como no existe ningún requisito para que el código PHP esté incrustado en HTML, la versión más simple de Hello, World! puede escribirse así, con la etiqueta de cierre omitida como se prefiere en archivos que contienen código PHP puro ?>

<?php
    echo 'Hello, World!';
?>

El intérprete de PHP solo ejecuta código PHP dentro de sus delimitadores . Todo lo que esté fuera de sus delimitadores no es procesado por PHP, 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 <?phpabrir y cerrar secciones PHP. La forma abreviada también existe. Este delimitador corto hace que los archivos de script sean menos portátiles, ya que el soporte para ellos se puede deshabilitar en la configuración de PHP local y, por lo tanto, no se recomienda. Por el contrario, no hay ninguna recomendación contra la etiqueta eco corta . Antes de PHP 5.4.0, esta sintaxis corta solo funciona con la configuración habilitada, mientras que para PHP 5.4.0 y 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. Así que el más breve "¡Hola, mundo!" programa escrito en PHP es: ?><?<?=echoshort_open_tag

<?='Hello, World!';

La primera forma de delimitadores <?phpy , 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 como prefijo un símbolo de dólar y no es necesario especificar un tipo de antemano. PHP 5 introdujo declaraciones de tipo que permiten a las funciones forzar a sus parámetros a ser 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 integer o string.

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

<?php
    $name = 'John';  // variable of string type being declared and Initialized
    $age = 18;       // variable of integer type being declared and Initialized
    $height = 5.3;   // variable of double type being declared and Initialized
    echo $name . ' is ' . $height . 'm tall\n'; // concatenating variables and strings
    echo "$name is $age years old."; // interpolating variables to string
?>

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 heredoc proporcionan 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 : /* */bloque de marcas y comentarios en línea; //o #se utilizan para comentarios de una línea. La echodeclaración es una de las varias facilidades que ofrece PHP para generar texto.

En términos de palabras clave y sintaxis del lenguaje, PHP es similar a la sintaxis de estilo C. ifcondiciones, fory whilebucles, y devuelve la función son similares en la sintaxis de lenguajes como C, C ++, C #, Java y Perl.

Tipos de datos

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

Los números de coma flotante también se almacenan en un rango específico de la plataforma. Se pueden especificar mediante notación de punto 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; NULLes el único valor permitido para este tipo de datos.

Las variables del tipo "recurso" representan referencias a recursos de fuentes externas. Por lo general, estos son creados por funciones de una extensión en particular y solo pueden ser procesados ​​por funciones de la misma extensión; los ejemplos incluyen archivos, imágenes y recursos de bases de datos.

Las matrices pueden contener elementos de cualquier tipo que PHP pueda manejar, incluidos recursos, objetos e incluso otras matrices. El orden se conserva en listas de valores y en 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 clases e interfaces de acceso a datos eficientes.

Funciones

PHP define una gran variedad de funciones en el lenguaje principal 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 incorporada tiene una amplia variedad de convenciones de nomenclatura e inconsistencias asociadas, como se describe en el historial anterior.

Las funciones personalizadas pueden ser definidas por el desarrollador:

function myAge(int $birthYear): string
{
    // calculate the age by subtracting the birth year from the current year.
    $yearsOld = date('Y') - $birthYear;

    // return the age in a descriptive string.
    return $yearsOld . ' year' . ($yearsOld != 1 ? 's':'');
}

echo 'I am currently ' . myAge(1995) . ' old.';

En 2021, el resultado del programa de muestra anterior es 'Actualmente tengo 26 años'.

En lugar de punteros de función , las funciones en PHP pueden ser referenciadas por una cadena que contenga su nombre. De esta manera, las funciones PHP normales se pueden utilizar, por ejemplo, como devoluciones de llamada o dentro de tablas de funciones . Las funciones definidas por el usuario se pueden crear en cualquier momento sin necesidad de prototipos . 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 function_existsfunción que determina si una función con un nombre dado ya se ha definido. 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 PHP new, en cuyo caso los paréntesis son opcionales.

Hasta PHP 5.3, el soporte para funciones anónimas y cierres no existía en PHP. Si bien create_function()existe desde PHP 4.0.1, es simplemente una envoltura delgada eval()que permite crear funciones PHP normales durante la ejecución del programa. PHP 5.3 agregó sintaxis para definir una función anónima o " cierre " que puede capturar variables del ámbito circundante. La sintaxis de flechas abreviadas se agregó en PHP 7.4:

function getAdder($x) {
    return fn($y) => $x + $y;
}

$adder = getAdder(8);
echo $adder(2); // prints "10"

En el ejemplo anterior, la getAdder()función crea un cierre usando un argumento pasado $x(la palabra clave useimporta una variable del contexto léxico), que toma un argumento adicional $yy devuelve el cierre creado al llamador. Dicha función es un objeto de primera clase, lo que significa que se puede almacenar en una variable, pasar como parámetro a otras funciones, etc.

Inusualmente para un lenguaje escrito dinámicamente, 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 matrices desde PHP 5.1, para "callables" desde PHP 5.4 y tipos escalares (integer, float, string y boolean) desde PHP 7.0. PHP 7.0 también tiene declaraciones de tipos para los tipos de retorno de funciones, expresadas colocando el nombre del tipo después de la lista de parámetros, precedido por dos puntos. Por ejemplo, la getAdderfunción del ejemplo anterior podría anotarse con tipos como en PHP 7:

function getAdder(int $x): Closure
{
    return fn(int $y): int => $x + $y;
}

$adder = getAdder(8);
echo $adder(2); // prints "10"
echo $adder(null); // throws an exception because an incorrect type was passed
$adder = getAdder([]); // would also throw an exception

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 modo de "escritura estricta" que, cuando se usa, no permite tales conversiones para llamadas a funciones y retornos 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ó a PHP obtener una mayor abstracción, facilitando las tareas creativas a los programadores que usan el lenguaje. El manejo de objetos se reescribió por completo para PHP 5, expandiendo el conjunto de características y mejorando 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 las variables de "referencia" de PHP si quería modificar un objeto que se le había pasado 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 variables y métodos de miembros privados y protegidos , 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 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 foreach construcción del lenguaje . No hay una función de tabla virtual en el motor, por lo que las variables estáticas están vinculadas con un nombre en lugar de una referencia en el momento de la compilación.

Si el desarrollador crea una copia de un objeto usando la palabra reservada clone, el motor Zend verificará si __clone()se ha definido un método. De lo contrario, llamará a un valor predeterminado __clone()que copiará las propiedades del objeto. Si __clone()se define un método, será responsable de establecer las propiedades necesarias en el objeto creado. Por conveniencia, el motor proporcionará una función que importe 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 propiedades y métodos de PHP se define utilizando los palabras clave public , privatey protected. El valor predeterminado es público, si solo se usa var ; vares sinónimo de public. publicSe puede acceder a los elementos declarados en todas partes. protectedlimita el acceso a las clases heredadas (y a la clase que define el elemento). privatelimita 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:

<?php

abstract class User
{
    protected string $name;

    public function __construct(string $name)
    {
        // make first letter uppercase and the rest lowercase
        $this->name = ucfirst(strtolower($name));
    }

    public function greet(): string
    {
        return "Hello, my name is " . $this->name;
    }

    abstract public function job(): string;
}

class Student extends User
{
    public function __construct(string $name, private string $course)
    {
        parent::__construct($name);
    }

    public function job(): string
    {
        return "I learn " . $this->course;
    }
}

class Teacher extends User
{
    public function __construct(string $name, private array $teachingCourses)
    {
        parent::__construct($name);
    }

    public function job(): string
    {
        return "I teach " . implode(", ", $this->teachingCourses);
    }
}

$students = [
    new Student("Alice", "Computer Science"),
    new Student("BOB", "Computer Science"),
    new Student("Charlie", "Business Studies"),
];

$teachers = [
    new Teacher("Dan", ["Computer Science", "Information Security"]),
    new Teacher("Erin", ["Computer Science", "3D Graphics Programming"]),
    new Teacher("Frankie", ["Online Marketing", "Business Studies", "E-commerce"]),
];

foreach ([$students, $teachers] as $users) {
    echo $users[0]::class . "s:\n";

    array_walk($users, function (User $user) {
        echo "{$user->greet()}, {$user->job()}\n";
    });
}

// Output of program:
// Students:
// Hello, my name is Alice, I learn Computer Science
// Hello, my name is Bob, I learn Computer Science
// Hello, my name is Charlie, I learn Business Studies
// Teachers:
// Hello, my name is Dan, I teach Computer Science, Information Security
// Hello, my name is Erin, I teach Computer Science, 3D Graphics Programming
// Hello, my name is Frankie, I teach Online Marketing, Business Studies, E-commerce

Implementaciones

La única implementación completa de PHP 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 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 el funcionamiento de Zend, es difícil que las implementaciones de la competencia ofrezcan una compatibilidad completa.

El modelo de ejecución de una sola solicitud por script 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 utilizando una caché de código de operación , que funciona almacenando en caché la forma compilada de un script PHP (opcodes) 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 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 las siguientes:

  • HHVM (HipHop Virtual Machine): desarrollado en Facebook y disponible como código abierto, convierte el código PHP en un código de bytes de alto nivel (comúnmente conocido como lenguaje intermedio ), que luego se traduce al código de máquina x86-64 de forma dinámica en tiempo de ejecución por un compilador Just - In -Time (JIT), lo que da como resultado mejoras de rendimiento de hasta 6 veces. Sin embargo, desde la versión 7.2, Zend ha superado a HHVM, y HHVM 3.24 es la última versión que admite oficialmente PHP.
  • Parrot  : una máquina virtual diseñada para ejecutar lenguajes dinámicos de manera eficiente; Pipp transforma el código fuente PHP en la representación intermedia de Parrot , que luego se traduce al código de bytes de Parrot y se ejecuta por la máquina virtual.
  • PeachPie : un compilador de segunda generación para. Código de bytes de Lenguaje Intermedio Común (CIL) .NET, construido sobre la plataforma Roslyn ; sucesor de Phalanger, compartiendo varios componentes arquitectónicos
  • Phalanger  : compila PHP en código de bytes del Lenguaje Intermedio Común (CIL); predecesor de PeachPie
  • Quercus  : compila PHP en código de bytes de Java
  • HipHop  : desarrollado en Facebook y disponible como código abierto, transforma los scripts PHP en código C ++ y luego compila el código resultante, reduciendo la carga del servidor hasta en un 50%. A principios de 2013, Facebook lo desaprobó en favor de HHVM debido a múltiples razones, incluidas las dificultades de implementación y la falta de soporte para todo el lenguaje PHP, incluidas las construcciones create_function()y eval().

Licencia

PHP es un software gratuito publicado bajo la licencia PHP , que estipula que:

Los productos derivados de este software no pueden llamarse "PHP", ni "PHP" puede aparecer en su nombre, sin el permiso previo por 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 las compilaciones binarias de PHP resultantes. PHP es fundamentalmente un sistema compatible con Internet con módulos integrados para acceder a servidores de Protocolo de transferencia de archivos (FTP) y a 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 versiones 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 , administració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 IRC , la 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 básicas 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 de extensiones del lenguaje PHP.

Algunos otros proyectos, como Zephir , ofrecen la posibilidad de crear extensiones PHP en un lenguaje de alto nivel y compilarlas en extensiones PHP nativas. Este enfoque, en lugar de escribir extensiones PHP directamente en C, simplifica el desarrollo de extensiones y reduce el tiempo requerido para programar y probar.

En diciembre de 2018, PHP Group estaba formado por 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 PHP certificados.

Instalacion y configuracion

Salida de ejemplo 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 , Netscape (ahora desaparecido) e iPlanet . Algunos otros servidores web, como OmniHTTPd, admiten la Interfaz de programación de aplicaciones de servidor de Internet (ISAPI), que es una interfaz de módulo de servidor web de Microsoft . Si PHP no tiene soporte de módulo para un servidor web, siempre se puede usar como un procesador Common Gateway Interface (CGI) o 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 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 muy cargados.

Cuando se utiliza PHP para secuencias de comandos de línea de comandos, se necesita un ejecutable de interfaz de línea de comandos (CLI) 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 utilizando PHP. Existen bastantes diferencias entre la CLI SAPI y otras SAPI, aunque comparten muchos de los mismos comportamientos.

PHP tiene una interfaz de módulo directo 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 comprende. 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 Common Gateway Interface (CGI) y la interfaz de línea de comandos (CLI).

PHP también se puede utilizar para escribir aplicaciones de interfaz gráfica de usuario (GUI) de escritorio , mediante 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 a partir del código fuente.

Cuando PHP se instala y utiliza en entornos de nube , se proporcionan kits de desarrollo de software (SDK) para utilizar funciones específicas de la nube. Por ejemplo:

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

Usar

Una descripción general amplia del paquete de software LAMP, que se muestra aquí junto con Squid

PHP es un lenguaje de scripting de propósito general que es 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 dinámico de páginas web o imágenes dinámicas utilizadas en sitios web o en otros lugares. También se puede utilizar para scripts 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 creen, personalicen y amplíen para su propio uso.

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

Originalmente diseñado para crear dinámicas páginas web , PHP ahora se centra principalmente en secuencias de comandos del lado del servidor , y es similar a otros lenguajes de script del lado del servidor que proporcionan contenido dinámico desde un servidor web a un cliente , como Microsoft 's ASP.NET , Sun Microsystems ' Java Server 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 frameworks 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 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 corresponde al 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 de escribir extensiones personalizadas en C o C ++ . Además de extender el lenguaje en forma de bibliotecas adicionales , las extensiones están proporcionando una forma de mejorar la velocidad de ejecución donde es crítico 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 puede usarse fácilmente como un lenguaje de scripting interno para otro proyecto, proporcionando también una interfaz estrecha con las estructuras de datos internas específicas del proyecto .

PHP recibió críticas mixtas debido a la falta de soporte para múltiples subprocesos en el nivel del lenguaje central, aunque el uso de subprocesos es posible gracias a la extensión PECL "pthreads" .

Se han creado 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 gestión de contenido web, incluidos MediaWiki , WordPress , Joomla , Drupal , Moodle , eZ Publish , eZ Platform y SilverStripe .

Los sitios web que utilizan PHP incluyen Facebook , Digg , Dailymotion y Tumblr .

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

En marzo de 2021, PHP se utilizaba como lenguaje de programación del lado del servidor en el 79,1% de los sitios web, en comparación con el 83,5% anterior, donde se podía determinar el idioma, y ​​PHP 7 es la versión más utilizada del lenguaje con el 50,3% de todos. los sitios web en la web están usando 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. Las fallas técnicas de seguridad del lenguaje en sí o de sus bibliotecas centrales no son frecuentes (22 en 2009, aproximadamente el 1% del total, aunque PHP se aplica a aproximadamente el 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, lo que induce 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.

Hay parches de protección avanzadas tales como Suhosin y endurecimiento -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 tales configuraciones de tiempo de ejecución que hacían que algunas aplicaciones PHP fueran propensas a problemas de seguridad. Entre estas, las directivas de configuración magic_quotes_gpcy register_globalsfueron las más conocidas; este último hizo que cualquier parámetro de URL se convirtiera en variables de PHP, abriendo un camino para serias vulnerabilidades de seguridad al permitir que un atacante estableciera el valor de cualquier variable global no inicializada e interfiriera con la ejecución de un script PHP. El soporte para la configuración de " comillas mágicas " y "registrar globales" ha quedado obsoleto 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 enginedirectiva de configuración) para el directorio donde se almacenan los archivos cargados; habilitarlo puede resultar en la ejecución de código malicioso incrustado dentro de 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 enable_dldirectiva de configuración) en un entorno de alojamiento web compartido puede generar problemas de seguridad.

Las conversiones de tipos implícitas que dan como resultado que diferentes valores sean tratados 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 una notación científica que tiene el valor (0 × 10 1234 ), que es cero. Errores como este resultaron en vulnerabilidades de autenticación en Simple Machines Forum , Typo3 y phpBB cuando se compararon los hash de contraseña MD5 . La forma recomendada es usar hash_equals () (para cronometrar la seguridad de los ataques ), o el operador de identidad ( ), como resultado . strcmp==='0e1234' === '0'false

En un análisis de 2013 de más de 170.000 desfiguraciones sitio web , publicado por Zone-H , la técnica utilizada con mayor frecuencia (53%) fue la explotación de la vulnerabilidad de inclusión de archivo , en su mayoría relacionados con el uso inseguro de las construcciones de lenguaje PHP include, requirey allow_url_fopen.

En 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) y el 35% de todos los sitios web PHP usan la versión 5.6 o anteriores.

La versión 5 todavía se utiliza 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 usar random_int () en lugar de rand () o mt_rand (). Hay dos ataques que se pueden realizar sobre fuentes de entropía PHP: "Seed Attack" y "State recovery attack". Con las tecnologías actuales de GPU, un atacante puede realizar hasta 2 ^ 30 cálculos MD5 por segundo con una GPU de $ 250, mientras que con $ 500 adicionales puede alcanzar hasta 2 ^ 32 cálculos. En combinación con el " ataque de cumpleaños ", esto puede provocar graves vulnerabilidades de seguridad.

Ver también

Referencias

Otras lecturas

Escuche este artículo ( 35 minutos )
Icono de Wikipedia hablado
Este archivo de audio se creó a partir de una revisión de este artículo con fecha del 23 de noviembre de 2011 y no refleja ediciones posteriores. ( 23/11/2011 )

enlaces externos