InicioInfoClases de PHP (3 Lecciones simples)

Clases de PHP (3 Lecciones simples)

Info10/27/2010
Cómo funciona el intérprete de PHP

(Este es el capítulo más teórico del curso, imprescindible para entender qué hace PHP).


PHP es la sigla de "PHP: Hypertext Preprocessor", o sea, "Pre-procesador de Hipertexto marca PHP". Que sea un "pre" procesador, es lo que diferencia el proceso que sufren las páginas programadas en PHP, de aquellas páginas web estándar escritas sólo en lenguaje HTML.

Vamos a examinar cuál es la diferencia entre el proceso de un archivo o página web "normal" (HTML) y el "pre" proceso de un archivo o página escritos en lenguaje PHP.


-Proceso de archivos HTML:


A) -¿Cuál es el camino que sigue una página web estándar (HTML) desde que escribimos su dirección en nuestro navegador, hasta que la vemos?

1) Primero, el pedido de ver esa página "viaja" (imaginémoslo como si fuera una especie de e-mail que enviamos) desde nuestro navegador hasta la máquina que hospeda el archivo solicitado.

El pedido de ver esa página no viaja solo, sino que va acompañado por un número que nos identifica inequívocamente (nuestra dirección IP).

-Pensemos esto como un "delivery" de pizza: le decimos "de qué gusto" queremos, y "a qué dirección" nos la deben enviar.



2) Cuando el pedido llega a la máquina indicada, un programa que está corriendo en esa máquina llamado "servidor web" recibe el pedido, y va a buscar el archivo solicitado en el disco rígido.

-Es el empleado de la pizzería que atiende al teléfono y pasa el pedido a la cocina de la pizzería, indicando qué pizza hay que preparar.



3) Ese servidor web despacha, entrega o "sirve" (por eso lo de "servidor" el archivo al navegador que está esperando una respuesta en esa dirección IP que nos identificaba.

-Sale la moto con la pizza caliente hacia nuestra casa.



4) Y finalmente nuestro navegador se encarga de "interpretar" lo que llega en ese archivo de sólo texto, armando cada elemento (textos, tablas, colores) de esa página recibida en nuestra pantalla.

-Vemos y nos comemos la pizza!

Nuestro navegador tiene la capacidad de "entender" y descifrar archivos con extensión ".html" o ".htm".

Servidor HTML


-Hasta aquí, eso sucede cada vez que solicitamos ver un archivo HTML.



-Pre-proceso de archivos PHP:


B) -¿Cuál es el camino que sigue una página web cuya extensión es ".php" desde que escribimos su dirección en nuestro navegador, hasta que la vemos?

Cuando la extensión del archivo solicitado es ".php", se introduce un elemento diferente en este circuito:

1) Hacemos el pedido de ver una página "cualquiera.php" desde nuestro navegador;

2) el servidor web recibe nuestro pedido, y de inmediato "se da cuenta" de que el archivo solicitado tiene extensión ".php", y por lo tanto le deriva el pedido a otro software que está encendido en esa máquina hosting; ese programa se llama software "intérprete de PHP" (es una especie de "ser mágico" cuya presencia es difícil intuir, y que debemos comprender que "está ahí" para poder programar correctamente en PHP!). sonrisa

3) Este programa intérprete de PHP busca en el disco rígido del hosting el archivo que fue solicitado, y comienza a leer su código, buscando determinadas "marcas", etiquetas o tags, que indican que desde ese momento "le están dando órdenes" a ese software intérprete de PHP; cuando encuentra estas "órdenes", ejecuta esas órdenes, y reemplaza todas las órdenes que estaban entre la apertura y el cierre del tag PHP por el resultado de esas órdenes.


Por ejemplo, podríamos imaginar que en una de esas órdenes le hemos dejado dicho al intérprete de PHP que averigüe la fecha actual y la escriba en ese lugar exacto donde le dejamos la orden. La orden que le dejamos será borrada del código fuente, y en su lugar quedará escrita la fecha, que es lo que le pedimos que escriba.


No se dice así de simple y en castellano, pero es parecido!...
Así que no hagan la prueba de ejecutar esto, es solo para dar una idea:

<?php
Ey software de PHP, escribí la fecha actual aquí!
?>



4) El software de PHP ejecuta ese pedido que le hicimos, y finalmente, envía sólo código HTML al navegador, que lo interpreta como si éste código HTML que incluye la fecha hubiera estado escrito allí desde siempre:

1 de Enero de 2025



Servidor HTML + PHP


En el código fuente que le llega al navegador, no vemos ningún rastro de la orden que habíamos escrito para el software de PHP, este software se ocupó de "borrarla" para que nadie la vea, y en el lugar donde habíamos escrito la orden, colocó "el resultado de ejecutar esa orden", es decir, la fecha que le habíamos pedido que escriba.

Entonces: le dejamos órdenes (que casi siempre tienen que ver con que el software de PHP obtenga cierta información, como la fecha) y esas órdenes suelen decirle que "haga algo" con esa información, típicamente, QUE ESCRIBA esa información en el código fuente de la página que está por ser enviada al navegador del usuario.


Includes


Muchas páginas de un sitio o aplicación web tienen elementos en común, que se repiten una y otra vez a lo largo de decenas de páginas.

Por ejemplo, un encabezado, la botonera del menú de navegación, o un pie de página, o una zona con banners de propaganda.

Es muy poco práctico que el código de esos bloques se repita idénticamente en cada uno de los numerosos archivos del sitio, ya que cuando sea preciso hacer actualizaciones o cambios a alguno de estos elementos (agregar un botón nuevo en el menú, o un cambio de teléfono en el pie de página), será necesario reemplazar ese bloque a lo largo de tooodos los archivos que componen el sitio, y subir por FTP decenas o cientos de archivos.

Para evitar este problema, PHP posee las construcciones (no son funciones) llamadas include, require, include_once y require_once.

La idea al utilizarlas es que colocaremos dentro de un archivo aparte el código HTML (y/o PHP) que conforma cada "bloque" que tengan "en común" muchas páginas.

Por ejemplo, colocaremos en un archivo llamado "menu.php" el menú, el pie de página en otro archivo llamado "pie.php", y así sucesivamente con todos los elementos comunes a varias páginas, y luego, en cada página del sitio, haremos que sea incluido el archivo en cuestión en el lugar que especifiquemos.

De esta manera, cuando sea necesario realizar un cambio, lo haremos en el archivo del menú o el del pie de página, actualizándose en cuanto subamos por FTP ese único archivo modificado, y no tendremos que cambiar absolutamente nada en las otras decenas o cientos de páginas que conforman el sitio, las cuales reflejarán los cambios de inmediato, ya que en ellas solo dice "mostrar aquí lo que haya en menu.php" (de una forma más técnica, pero la idea es esa).


Veamos un ejemplo, el archivo "pagina.php":

Esquema con CSS


El código de este archivo "pagina.php" -que figura ser una de las tantas páginas estándar del sitio- sería así:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>
Esquema con CSS
</title>
<style type="text/css">
<!--
body{
text-align:center;
font-family: sans-serif;
margin:30px 0;
background-color: #999;
}
p {
font-size:.9em;
line-height:1.3em;
margin:20px auto;
}

#contenedor {
width:700px;
margin:0 auto;
}

#encabezado {
background-color: #fc0;
width:100%;
line-height:50px;
}
#contenidoPrincipal {
background-color: #fff;
width:75%;
line-height:250px;
float:right;
}
#botonera{
background-color: #9ac;
width:25%;
line-height:250px;
float:left;
color:#fff;
}
#pie{
background-color: #fc0;
width:100%;
line-height:50px;
clear:both;
}
a{
font-weight:bold;
color:#000;
cursor: pointer;
}
-->
</style>
</head>
<body>
<div id="contenedor">

<?php include ("encabezado.php"; ?>

<div id="contenidoPrincipal">
Contenido Principal
</div>

<?php include ("botonera.php"; ?>

<?php include ("pie.php"; ?>
</div>
</body>
</html>

Y por otro lado, tendríamos un archivo por cada "pedazo" de página:

-El archivo "encabezado.php":
<div id="encabezado">
Encabezado
</div>

-El archivo "botonera.php":
<div id="botonera">
Botonera
</div>

-El archivo "pie.php":
<div id="pie">
Pie
</div>

Queda claro entonces que la ventaja es la facilidad de mantenimiento de un sitio de muchas páginas.



Include de archivo con funciones

Además del principal uso "visible" de colocar "partes del sitio" -bloques enteros, usualmente- en archivos externos que son incluidos en las páginas, las funciones include/require también se utilizan para cosas "invisibles"; por ejemplo, para crear un archivo externo que contenga todas las funciones de un sitio necesarias a lo largo de varias páginas.

Por ejemplo, éste sería el archivo "funciones.php":
<?php

function doble($numero){
return $numero * 2;
}

function cuadrado($numero){
return $numero * $numero;
}
?>


Y en las páginas que deben usar luego estas funciones, simplemente agregaremos la siguiente línea:

<?php include ("funciones.php"; ?>


Notemos que la extensión de las páginas que llaman (o ejecutan) includes debe ser ".php", para que ejecuten la orden include.

En cambio, los archivos externos que son incluidos no necesitan la extensión ".php", ya que primero son incluidos en la página (que sí tiene extensión ".php" y luego son interpretados.

Pero si dentro de estos archivos externos hay código PHP, es imprescindible abrir el tag de PHP:

<?php

ya que de lo contrario el contenido se considerará HTML.

Y al terminar el código, debemos cerrar PHP con:

?>


Diferencias entre include, require, include_once y require_once

Las diferencias entre include y require son mínimas, simplemente se diferencian por el tipo de error que generan si fracasan en su intento de incluir un archivo (por ejemplo, si ese archivo no existe).

Un include genera en ese caso un "Warning", esto es, envía una advertencia por pantalla pero no interrumpe la ejecución del resto del archivo.

En cambio require al fallar genera un "Fatal error", con lo cual se interrumpe definitivamente en ese punto la ejecución del archivo que estaba haciendo el intento de inclusión.

Por lo tanto, en casos donde sea imprescindible contar con los datos guardados en el archivo externo a incluir, es mejor usar require (un caso típico son los archivos externos que contienen usuario y password de una base de datos, ya que si no accedemos a esos datos "clave" no tiene sentido continuar la ejecución de las órdenes que vengan a posteriori, por eso en ese caso será mejor usar "require".


¿Y cuál es la diferencia entre require/include y require_once o include_once? (Nota: "once" en inglés quiere decir "una sola vez".

Que con "xxxx_once" si el código ha sido ya incluido, no se volverá a incluir. Esto puede ser útil en los casos en los que un mismo archivo pudiera ser potencialmente incluido más de una vez durante la ejecución de un código, y se quiera estar seguro de que se incluye una sola vez, para evitar problemas con redefiniciones de funciones, valores de funciones, variables, etc.


Include según una variable

Veremos ahora una técnica muy utilizada para el "armado" de sitios dinámicos que consta de una única página como "molde", la cual no contiene nada de HTML, sino solamente un código PHP que decide qué página (.html o .php) debe incluirse, según el link desde el cual está llegando a esa página el usuario (en verdad, según la variable que pasa el usuario junto con el link).

Tomemos como ejemplo el único contenido del archivo "home.php":

<?php

$pagina = $_GET["pagina"];

include("../".$pagina.".php"

?>

Efectivamente, ésa es la única línea que contiene ese archivo.


A este archivo se llega pulsando links como éstos:

<a href="home.php?pagina=pag1">Ir a página 1</a>
<a href="home.php?pagina=pag2">Ir a página 2</a>


Hilando un poco más fino, podríamos considerar la posibilidad de que el usuario escriba "home.php" en la barra de dirección del navegador, sin pasar ninguna variable, con lo cual no se incluiría nada. Para evitar este error, podemos encerrar al include en un if o, mejor aún, un switch:

Ejemplo de validación con if:

<?php

if (isset($_GET["pagina"])){

$pagina = $_GET["pagina"];

include("../".$pagina.".php";

} else {

echo 'Ha introducido una URL no válida.';
//o mejor aún, hacer un include de una página de error en el else...
}
?>

De esta forma evitamos que si deja en blanco la variable $pagina dé un error, pero el problema que se presenta en este caso es que el usuario podría setear la variable $pagina con un valor cualquiera que no sea el nombre de ninguna de nuestras páginas a incluir, con lo cual... otro error en puerta.


El switch sí lo evita por completo:

<?php

if (isset($_GET["pagina"])){

$pagina = $_GET["pagina"];

switch ($pagina){
case "pag1":
include ("pag1.php";
break;

case "pag2":
include ("pag2.php";
break;

case "pag3":
include ("pag3.php"; // etcétera...
break;

default:
include ("error.php";
break;
} // fin del switch

} // fin del if

?>

Manejo de Fechas y Horas


El concepto de Timestamp.


En PHP tenemos a nuestra disposición diversas funciones para el manejo de fechas y horas; su elección dependerá de nuestra necesidad concreta en cada caso.

Pero antes de entrar en ellas, veremos un concepto fundamental para comprender cómo trabajan varias de estas funciones: el de "timestamp" o "registro de hora", utilizado en los sistemas operativos Unix y Linux desde hace mucho tiempo.

El valor timestamp de un instante dado es la cantidad de segundos transcurridos desde el primero de enero de 1970 hasta ese momento. Un ejemplo: 10 de enero de 1980 a las 10 y 30 de la mañana en formato timestamp se escribiría: 316359000 ya que esa es la cantidad de segundos desde las cero horas del 01/01/1970 hasta las 10:30 hs. del 10/01/1980.

Este número es muy práctico ya que es un número entero, y permite realizar operaciones con fechas sumando y restando, cosa que con fechas formateadas con barras o guiones no es sencillo.

En este capítulo veremos cómo averiguar estos números y cómo utilizarlos para operaciones con fechas y horas.

Obtener fecha y hora actual con la función time().

La función más básica para obtener el número de timestamp de la fecha y hora actuales es la función time(). Esta función no necesita ningún parámetro, y nos devuelve la cantidad de segundos pasados desde el 01/01/1970 hasta el momento en que es ejecutada.

Probémosla:

<?php
$ahora = time();
print ($ahora);
?>

Si creamos una página con este código, y actualizamos la página varias veces en el navegador, veremos cómo cada vez que la ejecutamos va incrementando el número (ya que la cantidad de segundos transcurridos desde el 01/01/1970 cada vez es mayor).

Si queremos hacer operaciones, como por ejemplo, calcular un plazo de 2 horas desde el momento actual, podemos sumarle la cantidad de segundos necesaria (lo mismo vale para restas, multiplicaciones o divisiones):

<?php
$ahora = time();
$vence = $ahora + 7200;
/* 60 segundos cada minuto, por 120 minutos, da 7200 segundos*/
print ("El plazo vence en: ".$vence." segundos";
?>


Cómo "traducir" de timestamp a un formato más "humano": la función getdate().

Si una vez obtenido el valor timestamp mediante la función time() necesitamos mostrarlo de una forma más entendible, precisaremos emplear la función getdate(). Esta función necesita como parámetro un número timestamp, y genera un vector de diez celdas o posiciones, guardando un dato en cada una, lo que luego nos permite ir imprimiendo por separado la hora, los minutos, segundos, el día, mes, año, etc., en varias formas. Los índices del vector que genera son los siguientes:
Se almacena : En el índice:
Hora "hours"
Minutos "minutes"
Segundos "seconds"
Día del mes, en número "mday" (month day)
Mes, en número "mon"
Año, en número "year"
Día de la semana, en número (comienza en 0 para el domingo, y llega hasta el 6 -sábado-) "wday" (week day)
Día del año, en número "yday" (year day)
Día de la semana, la palabra completa, en inglés "weekday"
Mes, la palabra completa, en inglés "month"

Veamos un ejemplo de su uso:

<?php
$ahora = time();
$detalle = getdate($ahora);// Convirtió a $detalle en un vector

print("Hora: ".$detalle["hours"]."<br />";
print("Minutos: ".$detalle["minutes"]."<br />";
print("Segundos: ".$detalle["seconds"]."<br />";
print("Día: ".$detalle["mday"]."<br />";
print("Mes: ".$detalle["mon"]."<br />";
print("Año: ".$detalle["year"]."<br />";
print("Día de la semana: ".$detalle["wday"]."<br />";
print("Día del año: ".$detalle["yday"]."<br />";
print("Nombre del día de la semana: ".$detalle["weekday"]."<br />";
print("Nombre del mes: ".$detalle["month"]."<br />";
?>


Otra forma de mostrar fechas y horas: la función date().

Una función de uso similar pero un tanto más breve es la función date(). También parte de un número de timestamp o, en su ausencia, supone que queremos partir del instante actual. La diferencia es que no genera un vector, sino una cadena de texto formateada que nos permite especificar fácilmente muchas maneras de mostrar una fecha u hora con simplemente una sola letra. Veamos su tabla de letras clave:
Para mostrar: Letra:
Hora, de 01 a 12 h
Hora, de 00 a 23 H
Hora, sin ceros, de 1 a 12 g
Hora, sin ceros, de 0 a 23 G
Minutos, de 00 a 59 i
Segundos, de 00 a 59 s
Día del mes, con ceros, de 01 a 31 d
Día del mes, sin ceros, de 1 a 31 j
Mes, con ceros, de 01 a 12 m
Mes, sin ceros, de 1 a 12 n
Nombre del Mes completo, en inglés F
Abreviatura del Mes, 3 letras, en inglés M
Año, cuatro cifras Y
Año, dos cifras y
Día de la semana, en número (comienza en 0 para el domingo, y llega hasta el 6 -sábado-) w
Día del año, en número z
Día de la semana, la palabra completa, en inglés l (es una "ele" minúscula)
Abreviatura del Día de la semana, 3 letras, en inglés D
Mes, la palabra completa, en inglés F
Abreviatura del Mes, 3 letras, en inglés M
Número de días del mes, de 28 a 31 t
Segundos desde el 1ro. de enero de 1970 (timestamp) U
Diferencia horaria en segundos (de -43200 a 43200) Z
"am" o "pm" a
"AM" o "PM" A
Si el año es bisiesto ("1" o no ("0" L
Sufijo ordinal para los días, en inglés, 2 caracteres S

Lo más interesante de esta función es que dentro de ella se pueden especificar separadores o palabras, con la única excepción de las letras del listado precedente, ya que si no, serían reemplazadas por su valor de fecha u hora. Todo el conjunto de caracteres dentro de los paréntesis de la función date() va entre comillas.

<?php
print (date("d-m-Y"); // Observar el separador "-"
?>

El siguiente ejemplo daría un error (ya que las "d" imprimirán el día cada vez que aparecen):

<?php
print ("Hoy es ".date("d de m del Y");
?>

La solución sería concatenar:

<?php
print ("Hoy es ".date("d"." de ".date("m"." del ".date("Y");
?>

Además de usarse para el momento actual, como en estos ejemplos, también se le puede especificar un valor timestamp, con la particularidad de que se lo suma a partir de la hora cero del meridiano de Greenwich o su equivalente desde el meridiano en que esté el servidor (por ejemplo, Buenos Aires va tres horas por detrás del meridiano de Greenwich, con lo cual si le pasamos un "1" como segundo argumento, nos imprimiría 21:00:01 -un segundo desde la cero hora GM, adaptado a nuestro huso horario, lo que da las 21 hs.-).

<?php
$hora = date("H:i:s",3600);
?>


Partir de una fecha y hora real y convertirla a timestamp con mktime().

La función mktime ("make time" toma como argumento una fecha y hora y devuelve el número en formato timestamp correspondiente. El orden de los argumentos es: hora, minutos, segundos, mes, día y año, y hay un último argumento opcional que especifica si es horario de verano (en países en que se adelanta la hora) en cuyo caso se escribe un "1" en ese argumento, un "0" si es horario de invierno, y un "-1" si se desconoce ese dato.

Veamos un ejemplo, en el que omitimos el argumento opcional (es lo más común); notemos que al contrario de date(), los argumentos no llevan comillas. Un detalle al cual prestar especial atención para quienes estamos acostumbrados a decir primero el día, luego el mes y finalmente el año, es que en esta función el mes va antes del día, al modo norteamericano:
<?php
$navidad = mktime(23,59,59,12,24,2006); // No lleva comillas
print("Esta navidad es: ".$navidad);
?>

Un uso complementario de esta función es el de corregir errores como resultado de operaciones de suma o resta entre fechas, ya que, por ejemplo, si le pasamos como argumento 32 de enero, nos devuelve un número timestamp que, si lo convertimos con getdate, da 1 de febrero.


Validar si una fecha es correcta con checkdate().

Muchas veces necesitaremos validar una fecha que, por ejemplo, haya ingresado un usuario en un campo de formulario. Para ello nos sirve la función checkdate, que recibe como argumentos el mes, el día y el año (cuidar ese orden, recordar la función anterior).

Da como válidas fechas entre el año 0 y 32767 inclusive, meses del 1 al 12, y días entre el 1 y el 28 a 31 según el mes, considerando según el año la posibilidad de que sea bisiesto o no. Su resultado puede ser "true" o "false" únicamente (se dice que es una función booleana -por Boole, un famoso matemático-: o da verdadero, o da falso, no puede tener otro resultado).

Veamos ejemplos de su uso:

<?php
$primera = checkdate(12,24,2006);

if ($primera){ // preguntamos tácitamente si dio verdadero
print("Fecha buena";

} else {
print("Fecha equivocada";

}
?>
Datos archivados del Taringa! original
20puntos
640visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
2visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

C
Cagmaster🇦🇷
Usuario
Puntos0
Posts4
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.