Primeras páginas en PHP

Estructura de una página PHP

Una página PHP es un archivo de texto que contiene uno o varios fragmentos de código PHP y que también puede contener fragmentos de código HTML.

Fragmentos PHP

Los fragmentos de código PHP están delimitados por las etiquetas <?php (etiqueta inicial) y ?> (etiqueta final) y contienen las instrucciones de PHP. Más adelante se comentan otros posibles delimitadores de fragmentos de código PHP.

<?php
print "<p>Hola</p>\n";
?>
<p>Hola</p>

Si el programa termina con un fragmento PHP, ese último fragmento PHP no necesita cerrarse. Los siguientes programas son correctos:

<?php
print "<p>Hola</p>\n";
<p>Hola</p>
<?php
  print "<p>Hola</p>\n";
?>
<?php
print "<p>Adios</p>\n";
<p>Hola</p>
<p>Adios</p>

Los fragmentos de PHP no pueden anidarse, es decir, no puede haber un fragmento dentro de otro:

Incorrecto
<?php
print "<p>Hola</p>\n";

<?php
print "<p>Adios</p>\n";
?>

Parse error: syntax error, unexpected '<' in ejemplo.php on line 4


Si en una misma página hay varios fragmentos PHP, se tratan como un único programa. Los siguientes programas son equivalentes:

<?php
$saludo = "Hola";         // Se define una variable
print "<p>$saludo</p>";   // Se escribe el valor de la variable
?>
<p>Hola</p>
<?php
$saludo = "Hola";             // Se define una variable
?>
<?php
print "<pre>$saludo<pre>";   // Se escribe el valor de la variable
?>
<p>Hola</p>

Fragmentos PHP y fragmentos HTML

En una página PHP todo lo que no son fragmentos PHP son fragmentos HTML. Los fragmentos de código HTML no están delimitados por ninguna etiqueta.

<?php
print "<p>Hola</p>\n";
?>
<p>¿Cómo estás?</p>
<p>Hola</p>
<p>¿Cómo estás?</p>

Cuando un navegador solicita una página PHP a un servidor, el servidor lee el archivo secuencialmente y va generando el resultado:

Cuando el servidor termina de leer el archivo, el servidor envía al navegador el resultado.

Es importante señalar que:

Los ejemplos siguientes muestran diferentes programas PHP que generan el mismo resultado:


En un fragmento PHP no pueden escribirse etiquetas HTML sueltas; el código HTML debe generarse siempre con instrucciones de PHP. El programa siguiente no puede ni siquiera ejecutarse y produce un error de sintaxis:

Incorrecto
<?php
<p>Hola</p>
?>

Parse error: syntax error, unexpected '<' in ejemplo.php on line 2


De la misma manera, no se deben escribir instrucciones de PHP fuera de fragmentos PHP. No se producen errores, pero el resultado no es el esperado. Como el texto fuera de fragmentos PHP se envía tal cual al navegador, el navegador recibirá las instrucciones de PHP, que el navegador no sabe ejecutar y se mostrarán en la pantalla.

Incorrecto
<?php
print "<p>Hola</p>\n";
?>
<p>¿Cómo estás?</p>

print "<p>Adios</p>\n";
<p>Hola</p>
<p>¿Cómo estás?</p>

print "<p>Adios</p>\n";

Se pueden fragmentar incluso las estructuras de PHP que ocupan varias líneas (aunque no es habitual hacerlo). Los siguientes programas son equivalentes:

<p>¿Dos y dos son cuatro?</p>
<?php
if (2 + 2 == 4) {
    print "<p>Sí</p>\n";
} else {
    print "<p>No</p>\n";
}
<p>¿Dos y dos son cuatro?</p>
<p>Sí</p>
<p>¿Dos y dos son cuatro?</p>
<?php if (2 + 2 == 4) { ?>
    <p>Sí</p>
<?php } else { ?>
    <p>No</p>
<?php } ?>
<p>¿Dos y dos son cuatro?</p>
<p>Sí</p>

El delimitador <? ... ?>

¡Atención!Nota: El delimitador <? ... ?> no se debe utilizar. Se comenta en esta lección porque todavía se puede encontrar en código escrito hace muchos años.

El delimitador <? se podía utilizar antiguamente como delimitador de bloques PHP, pero desde hace años se desaconseja completamente su uso porque provoca conflictos, entre otros, con la instrucción de procesamiento xml (<?xml) de los documentos XML. En su lugar, se debe utilizar el delimitador <?php .. ?>.

Mediante la directiva short_open_tag (etiqueta de apertura abreviada) se puede permitir el uso del delimitador <? además del delimitador <?php. Si la directiva short_open_tag tiene el valor On (lo que está desaconsejado), el siguiente programa no daría errores:

<?
print "<p>Hola</p>\n";
?>
<p>Hola</p>

Pero si la directiva short_open_tag tiene el valor Off (valor recomendado), el mismo programa produciría un resultado incorrecto y que puede resultar chocante, ya que en el navegador se puede ver el programa original:

<?
print "<p>Hola</p>\n";
?>
<?
print "<p>Hola</p>\n";
?>

Este resultado se debe a que como el programa no contiene el delimitador <?php, su contenido no se reconoce como fragmento PHP. Como no se reconoce como fragmento PHP, el servidor lo envía tal cual al navegador, que no puede mostrarlo correctamente puesto que no es html correcto. Abriendo la vista de código fuente en el navegador, se podría ver mejor el programa completo.

El delimitador <?= ... ?>

El delimitador <?= es una abreviatura de la expresión <?php echo que se utiliza en muchos frameworks de PHP en los documentos que sirven de plantilla de generación de interfaces, sobre todo cuando estas plantillas las van a editar usuarios que pueden no tener conocimientos de programación (diseñadores gráficos, etc.).

<?php
$saludo = "Hola";
$despedida = "Adios";
?>
<p><?= $saludo ?></p>
<p><?= $despedida ?></p>
<p>Hola</p>
<p>Adios</p>

Antes de PHP 5.4, publicado en marzo de 2012, para poder usar este delimitador se necesitaba activar la directiva short_open_tag. El problema era que, como se comenta en el apartado anterior, desde hace años se aconseja no activar esa directiva para impedir el uso del delimitador <?. A partir de PHP 5.4 se resolvió este problema desvinculado el delimitador <?= de la directiva short_open_tag. por tanto, desde PHP 5.4, el delimitador <?= se puede utilizar sin limitaciones.

Instrucciones PHP

Los fragmentos PHP contienen instrucciones de PHP. Las instrucciones individuales deben terminarse por un punto y coma (;).

<?php
print "<p>Hola</p>\n";
print "<p>Adios</p>\n";
?>
<p>Hola</p>
<p>Adios</p>

La última instrucción antes del cierre de un fragmento puede no llevar punto y coma, aunque se aconseja terminar todas las instrucciones con punto y coma, para evitar errores si posteriormente se añaden instrucciones al final del fragmento o si se mueve esa última instrucción a un punto anterior del programa.

Desaconsejado
<?php
print "<p>Hola</p>\n";
print "<p>Adios</p>\n" 
?>
<p>Hola</p>
<p>Adios</p>

Una línea puede contener varias instrucciones, aunque por legibilidad se recomienda escribir una sola instrucción por línea de programa.

Desaconsejado
<?php
print "<p>Hola</p>\n"; print "<p>Adios</p>\n";
?>
<p>Hola</p>
<p>Adios</p>

Los grupos de instrucciones se escriben entre llaves. Tras las llaves no es necesario escribir puntos y comas y se recomienda no hacerlo, pues en algunos casos puede ser incluso un error de sintaxis, aunque la última instrucción dentro de las llaves requiere el punto y coma.

Correcto
<?php
$a = 5;
if ($a == 5) {
    print "<p>$a es cinco</p>\n";
    print "<p>¡Hasta otra!</p>\n";
}
?>
<p>Hola</p>
<p>Adios</p>
Desaconsejado
<?php
$a = 5;
if ($a == 5) {
    print "<p>$a es cinco</p>\n";
    print "<p>¡Hasta otra!</p>\n";
};
?>
<p>Hola</p>
<p>Adios</p>
Incorrecto
<?php
$a = 5;
if ($a == 5) {
    print "<p>$a es cinco</p>\n";
    print "<p>¡Hasta otra!</p>\n";
}; else {
    print "<p>$a no es cinco</p>\n";
    print "<p>¡Hasta otra!</p>\n";
}
?>

Parse error: syntax error, unexpected 'else' (T_ELSE), expecting end of file in ejemplo.php on line 6

Comentarios en páginas PHP

En un fragmento PHP se pueden comentar líneas de código utilizando:

Estos comentarios no se añaden al código HTML generado por la página, por lo que no pueden verse en el navegador.

<p><strong>
<?php
// La instrucción print escribe texto en la página web
print "Hola"; // El comentario se puede escribir al final de la línea
?>
</strong></p>
<p><strong>Hola</strong></p>
<p><strong>
<?php
# La instrucción print escribe texto en la página web
print "Hola"; # El comentario se puede escribir al final de la línea
?>
</strong></p>
<p><strong>Hola</strong></p>
<?php
print "<p><strong>";
/* Dentro de un fragmento PHP no se pueden escribir
   etiquetas html sueltas, tienen que estar siempre
   incluidas en instrucciones print
*/
?>
Hola
<?php
print "</strong></p>";
?>
<p><strong>Hola</strong></p>

Si se quieren escribir comentarios en los fragmentos HTML, hay que utilizar la etiqueta de comentarios de HTML <!-- .... -->.

Estos comentarios, como todo el código HTML situado en los fragmentos HTML, se incluyen sin modificaciones en el resultado, por lo que pueden verse en el navegador.

<p>
<?php
print "Hola";
?>
</p>
<!-- El texto anterior ha sido generado por PHP -->
<p>Hola</p>
<!-- El texto anterior ha sido generado por PHP -->

Si se quieren escribir comentarios en las hojas de estilo CSS, hay que utilizar la etiqueta de comentarios de C /* .... */.

Estos comentarios, como todo el código CSS situado en las hojas de estilo, se incluyen sin modificaciones en el resultado, por lo que pueden verse en el navegador.

html {
    background-color: #FF0000; /* #FF000000 es rojo */
}
html {
    background-color: #FF0000; /* #FF000000 es rojo */
}

Código HTML de páginas HTML válidas

Si queremos crear páginas HTML válidas debemos generar código HTML válido, es decir, generar todas las etiquetas HTML necesarias respetando las reglas sintácticas. En este curso se generarán páginas HTML y se utilizará el juego de caracteres UTF-8.

El ejemplo siguiente muestra el código html de una página web HTML válida con las líneas numeradas.

<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="utf-8">
  <title>Página HTML válida</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="estilo.css" title="Color">
</head>

<body>
  <p>Esta página es una página HTML válida.</p>
</body>
</html>


Generar el código HTML de páginas HTML válidas

La página PHP debe incluir o generar todo el código HTML necesario.

El ejemplo siguiente genera una página válida mediante un único fragmento PHP y una única instrucción print:

Nota: Dentro de la cadena todas las comillas están precedidas del carácter contrabarra (\), como se explica en la lección sobre cadenas.

<?php
print "<!DOCTYPE html>
<html lang=\"es\">
<head>
  <meta charset=\"utf-8\">
  <title>Página HTML válida</title>
  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
</head>

<body>
  <p>Esta página es una página HTML válida.</p>
</body>
</html>";
?>

El ejemplo siguiente genera una página válida mediante un único fragmento PHP y una instrucción print por línea HTML:

Nota: Los print acaban imprimiendo el carácter salto de línea \n para que en el código fuente HTML cada línea este en una línea distinta.

<?php
print "<!DOCTYPE html>\n";
print "<html lang=\"es\">\n";
print "<head>\n";
print "  <meta charset=\"utf-8\">\n";
print "  <title>Página HTML válida</title>\n";
print "  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n";
print "</head>\n";
print "\n";
print "<body>\n";
print "  <p>Esta página es una página HTML válida.</p>\n";
print "</body>\n";
print "</html>\n";
?>

En principio, el mismo código html podría generarse combinando fragmentos PHP y fragmentos HTML, como en el siguiente ejemplo con dos fragmentos PHP y tres fragmentos HTML:

Nota: El carácter especial \n incluido en los print es para generar un salto de línea en el código HTML, como se explica en la lección sobre cadenas.

<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="utf-8">
<?php
print "  <title>Página HTML válida</title>\n";
?>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>

<body>
<?php
print "  <p>Esta página es una página HTML válida.</p>\n";
?>
</body>
</html>

Enlaces a hojas de estilo

Una página PHP puede enlazar a una hoja de estilo CSS exactamente igual que una página HTML, es decir, enlazando a la hoja de estilo mediante la etiqueta <link>.

Los siguientes ejemplos muestran el enlace a la hoja de estilo incluido en un fragmento HTML o generado por un fragmento PHP:

<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="utf-8">
  <title>Página HTML válida</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="estilo.css" title="Color">
</head>

<body>
<?php
print "  <p>Esta página es una página HTML válida.</p>\n";
?>
</body>
</html>
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="utf-8">
  <title>Página HTML válida</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
<?php
print "  <link rel=\"stylesheet\" href=\"estilo.css\" title=\"Color\">\n";
?>
</head>

 <body>
<?php
print "  <p>Esta página es una página HTML válida.</p>\n";
?>
</body>
</html>