Capítulo 1. Introducción al PHP

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

PHP es un lenguaje sencillo pero potente diseñado para crear contenido HTML. Este capítulo cubre los antecedentes esenciales del lenguaje PHP. Describe la naturaleza y la historia de PHP, en qué plataformas funciona y cómo configurarlo. Este capítulo termina mostrándote PHP en acción, con un rápido recorrido por varios programas PHP que ilustran tareas comunes, como el procesamiento de datos de formularios, la interacción con una base de datos y la creación de gráficos.

¿Qué hace PHP?

PHP puede utilizarse de dos formas principales:

Programación del lado del servidor
PHP se diseñó originalmente para crear contenido web dinámico , y sigue siendo el más adecuado para esa tarea. Para generar HTML, necesitas el analizador PHP y un servidor web a través del cual enviar los archivos de documentos codificados. PHP también se ha hecho popular para generar contenidos dinámicos mediante conexiones a bases de datos, documentos XML, gráficos, archivos PDF y mucho más.
Programación desde la línea de comandos
PHP puede ejecutar scripts desde la línea de comandos, de forma muy similar a Perl, awk o el shell de Unix. Podrías utilizar los scripts de la línea de comandos para tareas de administración del sistema, como copias de seguridad y análisis de registros; incluso algunos scripts de tipo trabajo CRON pueden hacerse de esta forma (como tareas PHP no visuales).

En este libro, sin embargo, nos concentraremos en el primer punto: utilizar PHP para desarrollar contenidos web dinámicos.

PHP funciona en los principales sistemas operativos, desde las variantes de Unix (incluidos Linux, FreeBSD, Ubuntu, Debian y Solaris) hasta Windows y macOS. Se puede utilizar con todos los servidores web líderes, incluidos los servidores Apache, Nginx y OpenBSD, por nombrar algunos; incluso los entornos en la nube como Azure y Amazon están en auge.

El lenguaje en sí es extremadamente flexible. Por ejemplo, no estás limitado a generar sólo archivos HTML u otros archivos de texto: se puede generar cualquier formato de documento. PHP tiene soporte incorporado para generar archivos PDF e imágenes GIF, JPEG y PNG.

Una de las características más significativas de PHP es su amplia compatibilidad con bases de datos. PHP admite todas las bases de datos principales (incluidas MySQL, PostgreSQL, Oracle, Sybase, MS-SQL, DB2 y bases de datos compatibles con ODBC), e incluso muchas bases de datos poco conocidas. También son compatibles las bases de datos NoSQL más recientes, como CouchDB y MongoDB. Con PHP, crear páginas web con contenido dinámico a partir de una base de datos es extraordinariamente sencillo.

Por último, PHP proporciona una biblioteca de código PHP para realizar tareas comunes, como la abstracción de bases de datos, la gestión de errores, etc., con el Repositorio de Extensiones y Aplicaciones PHP (PEAR). PEAR es un marco y un sistema de distribución para componentes reutilizables de PHP.

Breve historia de PHP

Rasmus Lerdorf concibió PHP por primera vez en 1994, pero el PHP que la gente utiliza hoy en día es bastante diferente de la versión inicial. Para entender cómo PHP llegó a donde está ahora, es útil conocer la evolución histórica del lenguaje. Aquí está esa historia, con amplios comentarios y correos electrónicos del propio Rasmus.

La evolución de PHP

Aquí está el anuncio de PHP 1.0 que se publicó en el grupo de noticias de Usenet(comp.infosystems.www.authoring.cgi) en junio de 1995:

From: rasmus@io.org (Rasmus Lerdorf)
Subject: Announce: Personal Home Page Tools (PHP Tools)
Date: 1995/06/08
Message-ID: <3r7pgp$aa1@ionews.io.org>#1/1
organization: none
newsgroups: comp.infosystems.www.authoring.cgi

Announcing the Personal Home Page Tools (PHP Tools) version 1.0.

These tools are a set of small tight cgi binaries written in C.
They perform a number of functions including:

. Logging accesses to your pages in your own private log files
. Real-time viewing of log information
. Providing a nice interface to this log information
. Displaying last access information right on your pages
. Full daily and total access counters
. Banning access to users based on their domain
. Password protecting pages based on users' domains
. Tracking accesses ** based on users' e-mail addresses **
. Tracking referring URL's - HTTP_REFERER support
. Performing server-side includes without needing server support for it
. Ability to not log accesses from certain domains (ie. your own)
. Easily create and display forms
. Ability to use form information in following documents

Here is what you don't need to use these tools:

. You do not need root access - install in your ~/public_html dir
. You do not need server-side includes enabled in your server
. You do not need access to Perl or Tcl or any other script interpreter
. You do not need access to the httpd log files

The only requirement for these tools to work is that you have
the ability to execute your own cgi programs. Ask your system
administrator if you are not sure what this means.

The tools also allow you to implement a guestbook or any other
form that needs to write information and display it to users
later in about 2 minutes.

The tools are in the public domain distributed under the GNU
Public License. Yes, that means they are free!

For a complete demonstration of these tools, point your browser
at: http://www.io.org/~rasmus

--
Rasmus Lerdorf
rasmus@io.org
http://www.io.org/~rasmus

Ten en cuenta que la URL y la dirección de correo electrónico que aparecen en este mensaje hace tiempo que desaparecieron. El lenguaje de este anuncio refleja las preocupaciones que la gente tenía en aquel momento, como proteger las páginas con contraseña, crear formularios fácilmente y acceder a los datos de los formularios en páginas posteriores. El anuncio también ilustra el posicionamiento inicial de PHP como marco para una serie de herramientas útiles.

El anuncio sólo habla de las herramientas que venían con PHP, pero entre bastidores el objetivo era crear un marco para facilitar la ampliación de PHP y añadir más herramientas. La lógica de negocio de estos complementos estaba escrita en C; un simple analizador sintáctico seleccionaba etiquetas del HTML y llamaba a las distintas funciones en C. En realidad, crear un lenguaje de programación nunca formó parte del plan.

¿Qué ha pasado?

Rasmus empezó a trabajar en un proyecto bastante grande para la Universidad de Toronto que necesitaba una herramienta para reunir datos de varios lugares y presentar una bonita interfaz de administración basada en la web. Por supuesto, utilizó PHP para la tarea, pero por razones de rendimiento, las diversas pequeñas herramientas de PHP 1.0 tenían que reunirse mejor e integrarse en el servidor web.

Al principio, se hicieron algunos hacks en el servidor web de la NCSA, para parchearlo y que fuera compatible con la funcionalidad básica de PHP. El problema de este enfoque era que, como usuario, tenías que sustituir el software de tu servidor web por esta versión especial y pirateada. Afortunadamente, Apache también estaba empezando a ganar impulso por aquel entonces, y la API de Apache facilitaba la adición de funcionalidades como PHP al servidor.

Durante el año siguiente, más o menos, se hicieron muchas cosas y el enfoque cambió bastante. Aquí está el anuncio de PHP 2.0 (PHP/FI) que se envió en abril de 1996:

 From: rasmus@madhaus.utcs.utoronto.ca (Rasmus Lerdorf)
 Subject: ANNOUNCE: PHP/FI Server-side HTML-Embedded Scripting Language
 Date: 1996/04/16
 Newsgroups: comp.infosystems.www.authoring.cgi

 PHP/FI is a server-side HTML embedded scripting language. It has built-in
 access logging and access restriction features and also support for
 embedded SQL queries to mSQL and/or Postgres95 backend databases.

 It is most likely the fastest and simplest tool available for creating
 database-enabled web sites.

 It will work with any UNIX-based web server on every UNIX flavour out
 there. The package is completely free of charge for all uses including
 commercial.

 Feature List:

 . Access Logging
 Log every hit to your pages in either a dbm or an mSQL database.
 Having hit information in a database format makes later analysis easier.
 . Access Restriction
 Password protect your pages, or restrict access based on the refering URL
 plus many other options.
 . mSQL Support
 Embed mSQL queries right in your HTML source files
 . Postgres95 Support
 Embed Postgres95 queries right in your HTML source files
 . DBM Support
 DB, DBM, NDBM and GDBM are all supported
 . RFC-1867 File Upload Support
 Create file upload forms
 . Variables, Arrays, Associative Arrays
 . User-Defined Functions with static variables + recursion
 . Conditionals and While loops
 Writing conditional dynamic web pages could not be easier than with
 the PHP/FI conditionals and looping support
 . Extended Regular Expressions
 Powerful string manipulation support through full regexp support
 . Raw HTTP Header Control
 Lets you send customized HTTP headers to the browser for advanced
 features such as cookies.
 . Dynamic GIF Image Creation
 Thomas Boutell's GD library is supported through an easy-to-use set of
 tags.

 It can be downloaded from the File Archive at: <URL:http://www.vex.net/php>

 --
 Rasmus Lerdorf
 rasmus@vex.net

Fue la primera vez que se utilizó el términolenguaje de scripting . El simplista código de sustitución de etiquetas de PHP 1.0 fue sustituido por un analizador que podía manejar un lenguaje de etiquetas incrustadas más sofisticado. Según los estándares actuales, el lenguaje de etiquetas no era especialmente sofisticado, pero comparado con PHP 1.0 sí que lo era.

La razón principal de este cambio fue que pocas personas que utilizaban PHP 1.0 estaban realmente interesadas en utilizar el framework basado en C para crear complementos. La mayoría de los usuarios estaban mucho más interesados en poder incrustar lógica directamente en sus páginas web para crear HTML condicional, etiquetas personalizadas y otras funciones similares. Los usuarios de PHP 1.0 solicitaban constantemente la posibilidad de añadir el pie de página de seguimiento de visitas o enviar diferentes bloques HTML condicionalmente. Esto llevó a la creación de la etiqueta if . Una vez que tienes if, necesitas también else, y a partir de ahí es una pendiente resbaladiza hasta el punto en que, quieras o no, acabas escribiendo todo un lenguaje de scripting.

A mediados de 1997, la versión 2.0 de PHP había crecido bastante y había atraído a muchos usuarios, pero seguía habiendo algunos problemas de estabilidad con el motor de análisis subyacente. Además, el proyecto seguía siendo en su mayor parte un esfuerzo unipersonal, con algunas contribuciones aquí y allá. En ese momento, Zeev Suraski y Andi Gutmans, de Tel Aviv (Israel), se ofrecieron voluntarios para reescribir el motor de análisis subyacente, y acordamos hacer de su reescritura la base de la versión 3.0 de PHP. Otras personas también se ofrecieron voluntarias para trabajar en otras partes de PHP, y el proyecto pasó de ser un esfuerzo unipersonal con unos pocos colaboradores a un verdadero proyecto de código abierto con muchos desarrolladores de todo el mundo.

Aquí está el anuncio de PHP 3.0 de junio de 1998:

 June 6, 1998 -- The PHP Development Team announced the release of PHP 3.0,
 the latest release of the server-side scripting solution already in use on
 over 70,000 World Wide Web sites.

 This all-new version of the popular scripting language includes support
 for all major operating systems (Windows 95/NT, most versions of Unix,
 and Macintosh) and web servers (including Apache, Netscape servers,
 WebSite Pro, and Microsoft Internet Information Server).

 PHP 3.0 also supports a wide range of databases, including Oracle,
 Sybase, Solid, MySQ, mSQL, and PostgreSQL, as well as ODBC data sources.

 New features include persistent database connections, support for the
 SNMP and IMAP protocols, and a revamped C API for extending the language
 with new features.

 "PHP is a very programmer-friendly scripting language suitable for
 people with little or no programming experience as well as the
 seasoned web developer who needs to get things done quickly. The
 best thing about PHP is that you get results quickly," said
 Rasmus Lerdorf, one of the developers of the language.

 "Version 3 provides a much more powerful, reliable, and efficient
 implementation of the language, while maintaining the ease of use and
 rapid development that were the key to PHP's success in the past,"
 added Andi Gutmans, one of the implementors of the new language core.

 "At Circle Net we have found PHP to be the most robust platform for
 rapid web-based application development available today," said Troy
 Cobb, Chief Technology Officer at Circle Net, Inc. "Our use of PHP
 has cut our development time in half, and more than doubled our client
 satisfaction. PHP has enabled us to provide database-driven dynamic
 solutions which perform at phenomenal speeds."

 PHP 3.0 is available for free download in source form and binaries for
 several platforms at http://www.php.net/.

 The PHP Development Team is an international group of programmers who
 lead the open development of PHP and related projects.

 For more information, the PHP Development Team can be contacted at
 core@php.net.

Tras el lanzamiento de PHP 3.0, su uso empezó a despegar realmente. La versión 4.0 fue impulsada por una serie de desarrolladores interesados en realizar algunos cambios fundamentales en la arquitectura de PHP. Estos cambios incluían la abstracción de la capa entre el lenguaje y el servidor web, la adición de un mecanismo de seguridad de hilos y la incorporación de un sistema más avanzado de análisis sintáctico/ejecución de etiquetas en dos fases. Este nuevo analizador, escrito principalmente por Zeev y Andi, recibió el nombre de motor Zend. Tras mucho trabajo de muchos desarrolladores, PHP 4.0 se publicó el 22 de mayo de 2000.

En el momento en que este libro entra en imprenta, la versión 7.3 de PHP lleva ya algún tiempo publicada. Ya ha habido algunas versiones "punto" menores, y la estabilidad de esta versión actual es bastante alta. Como verás en este libro, se han realizado algunos avances importantes en esta versión de PHP, principalmente en el procesamiento de código en el lado del servidor. También se han incorporado muchos otros cambios menores, adiciones de funciones y mejoras de características .

El uso generalizado de PHP

La Figura 1-1 muestra el uso de PHP recopilado por W3Techs en marzo de 2019. El dato más interesante aquí es que el 79% de todos los sitios web encuestados lo utilizan, y sin embargo la versión 5.0 sigue siendo la más utilizada. Si te fijas en la metodología utilizada en las encuestas de W3Techs, verás que seleccionan los 10 millones de sitios más importantes (según el tráfico; popularidad del sitio web) del mundo. Como es evidente, ¡el PHP tiene una adopción muy amplia!

PHP usage as of March 2019
Figura 1-1. Uso de PHP en marzo de 2019

Instalar PHP

Como ya se ha mencionado, PHP está disponible para muchos sistemas operativos y plataformas. Por lo tanto, te recomendamos que consultes la documentación de PHP para encontrar el entorno que más se ajuste al que vayas a utilizar y sigas las instrucciones de configuración adecuadas.

De vez en cuando, también puedes querer cambiar la forma en que está configurado PHP. Para ello, tendrás que cambiar el archivo de configuración de PHP y reiniciar tu servidor web (Apache). Cada vez que realices un cambio en el entorno de PHP, tendrás que reiniciar el servidor web (Apache) para que esos cambios surtan efecto.

Los ajustes de configuración de PHP suelen mantenerse en un archivo llamado php.ini. Los ajustes de este archivo controlan el comportamiento de las funciones de PHP, como el manejo de sesiones y el procesamiento de formularios. En capítulos posteriores se hace referencia a algunas de las opciones de php.ini, pero en general el código de este libro no requiere una configuración personalizada. Consulta la documentación de PHP para obtener más información sobre la configuración de php.ini.

Un paseo por PHP

Las páginas PHP son generalmente páginas HTML con comandos PHP incrustados en ellas. Esto contrasta con muchas otras soluciones de páginas web dinámicas, que son scripts que generan HTML. El servidor web procesa los comandos PHP y envía su salida (y cualquier HTML del archivo) al navegador. El Ejemplo 1-1 muestra una página PHP completa.

Ejemplo 1-1. hola_mundo.php
<html>
 <head>
 <title>Look Out World</title>
 </head>

 <body>
 <?php echo "Hello, world!"; ?>
 </body>
</html>

Guarda el contenido del Ejemplo 1-1 en un archivo, hola_mundo.php, y dirígete a él con tu navegador. Los resultados aparecen en la Figura 1-2.

Output of hello_world.php
Figura 1-2. Salida de hello_world.php

El comando PHP echo produce una salida (la cadena "¡Hola, mundo!" en este caso) insertada en el archivo HTML. En este ejemplo, el código PHP se coloca entre las etiquetas <?php y ?>. Hay otras formas de etiquetar tu código PHP: consulta el Capítulo 2 para una descripción completa.

Página de configuración

La función PHP phpinfo() crea una página HTML llena de información sobre cómo se instaló PHP y cómo está configurado actualmente. Puedes utilizarla para ver si tienes instaladas determinadas extensiones, o si se ha personalizado el archivo php.ini. El Ejemplo 1-2 es una página completa que muestra la página phpinfo().

Ejemplo 1-2. Uso de phpinfo()
<?php phpinfo();?>

La Figura 1-3 muestra la primera parte de la salida del Ejemplo 1-2.

Partial output of phpinfo()
Figura 1-3. Salida parcial de phpinfo()

Formularios

El Ejemplo 1-3 crea y procesa un formulario. Cuando el usuario envía el formulario, la información introducida en el campo nombre se devuelve a esta página a través de la acción de formulario $_SERVER['PHP_SELF']. El código PHP comprueba si hay un campo de nombre y muestra un saludo si lo encuentra.

Ejemplo 1-3. Procesar un formulario (form.php)
<html>
 <head>
 <title>Personalized Greeting Form</title>
 </head>

 <body>
 <?php if(!empty($_POST['name'])) {
 echo "Greetings, {$_POST['name']}, and welcome.";
 } ?>

 <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
 Enter your name: <input type="text" name="name" />
 <input type="submit" />
 </form>
 </body>
</html>

El formulario y el mensaje se muestran en la Figura 1-4.

Form and greeting page
Figura 1-4. Formulario y página de saludo

Los programas PHP acceden a los valores de los formularios principalmente a través de las variables de matriz $_POST y $_GET . En el Capítulo 8 se tratan con más detalle los formularios y su procesamiento.

Bases de datos

PHP admite todos los sistemas de bases de datos populares, como MySQL, PostgreSQL, Oracle, Sybase, SQLite y bases de datos compatibles con ODBC. La Figura 1-5 muestra parte de una consulta a la base de datos MySQL ejecutada a través de un script PHP, que muestra los resultados de una búsqueda de libros en un sitio de reseñas de libros. Muestra el título del libro, el año de publicación y el ISBN.

A MySQL book list query run through a PHP script
Figura 1-5. Una consulta de lista de libros MySQL ejecutada a través de un script PHP

El código del Ejemplo 1-4 se conecta a la base de datos, emite una consulta para recuperar todos los libros disponibles (con la cláusula WHERE ), y produce una tabla como salida para todos los resultados devueltos mediante un bucle while.

Nota

El código SQL de esta base de datos de ejemplo está en el archivo library.sql proporcionado. Puedes soltar este código en MySQL después de crear la base de datos de la biblioteca y disponer de la base de datos de ejemplo para probar el siguiente código de ejemplo, así como los ejemplos relacionados del Capítulo 9.

Ejemplo 1-4. Consulta de la base de datos de libros (booklist.php)
<?php

$db = new mysqli("localhost", "petermac", "password", "library");

// make sure the above credentials are correct for your environment
if ($db->connect_error) {
 die("Connect Error ({$db->connect_errno}) {$db->connect_error}");
}

$sql = "SELECT * FROM books WHERE available = 1 ORDER BY title";
$result = $db->query($sql);

?>
<html>
<body>

<table cellSpacing="2" cellPadding="6" align="center" border="1">
 <tr>
 <td colspan="4">
 <h3 align="center">These Books are currently available</h3>
 </td>
 </tr>

 <tr>
 <td align="center">Title</td>
 <td align="center">Year Published</td>
 <td align="center">ISBN</td>
 </tr>
 <?php while ($row = $result->fetch_assoc()) { ?>
 <tr>
 <td><?php echo stripslashes($row['title']); ?></td>
 <td align="center"><?php echo $row['pub_year']; ?></td>
 <td><?php echo $row['ISBN']; ?></td>
 </tr>
 <?php } ?>
</table>

</body>
</html>

El contenido dinámico proporcionado por las bases de datos impulsa los sitios de noticias, blogs y comercio electrónico en el corazón de la web. En el Capítulo 9 encontrarás más detalles sobre el acceso a bases de datos desde PHP.

Gráficos

Con PHP, puedes crear y manipular imágenes fácilmente utilizando la extensión GD. El Ejemplo 1-5 proporciona un campo de entrada de texto que permite al usuario especificar el texto de un botón. Toma un archivo de imagen de botón vacío, y centra en él el texto pasado como parámetro GET 'message' . El resultado se devuelve al navegador como una imagen PNG.

Ejemplo 1-5. Botones dinámicos (graphic_example.php)
<?php
if (isset($_GET['message'])) {
 // load font and image, calculate width of text
 $font = dirname(__FILE__) . '/fonts/blazed.ttf';
 $size = 12;
 $image = imagecreatefrompng("button.png");
 $tsize = imagettfbbox($size, 0, $font, $_GET['message']);

 // center
 $dx = abs($tsize[2] - $tsize[0]);
 $dy = abs($tsize[5] - $tsize[3]);
 $x = (imagesx($image) - $dx) / 2;
 $y = (imagesy($image) - $dy) / 2 + $dy;

 // draw text
 $black = imagecolorallocate($im,0,0,0);
 imagettftext($image, $size, 0, $x, $y, $black, $font, $_GET['message']);

 // return image
 header("Content-type: image/png");
 imagepng($image);

 exit;
} ?>
<html>
 <head>
 <title>Button Form</title>
 </head>

 <body>
 <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET">
 Enter message to appear on button:
 <input type="text" name="message" /><br />
 <input type="submit" value="Create Button" />
 </form>
 </body>
</html>

El formulario generado por el Ejemplo 1-5 se muestra en la Figura 1-6. El botón creado se muestra en la Figura 1-7.

Button creation form
Figura 1-6. Formulario de creación de botones
Button created
Figura 1-7. Botón creado

Puedes utilizar GD para cambiar dinámicamente el tamaño de las imágenes, generar gráficos y mucho más. PHP también tiene varias extensiones para generar documentos en el popular formato PDF de Adobe. El Capítulo 10 trata en profundidad la generación dinámica de imágenes, mientras que el Capítulo 11 proporciona instrucciones sobre cómo crear archivos PDF de Adobe.

¿Qué sigue?

Ahora que ya sabes lo que se puede hacer con PHP, estás preparado para aprender a programar en este lenguaje. Comenzamos con su estructura básica, prestando especial atención a las funciones definidas por el usuario, la manipulación de cadenas y la programación orientada a objetos. Luego pasamos a áreas de aplicación específicas, como la web, las bases de datos, los gráficos, XML y la seguridad. Terminamos con referencias rápidas a las funciones incorporadas y a las extensiones. Domina estos capítulos, ¡y habrás dominado PHP!

Get Programación PHP, 4ª Edición now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.