Un alumno de un curso de PHP Orientado a Objetos me hizo esta pregunta:
Necesito hacer que un botón o link de mi HTML ejecute un método de un objeto php.
Intenté lo siguiente pero sin éxito:<a href=»<?php $objeto->Método() ?>»> Reservar </a>
Cuál es el modelo de ejecución de PHP
Lo primero que hay que entender para responder esta pregunta es el ciclo de vida de una petición a una aplicación (o página) PHP.
Recordemos que PHP es un lenguaje pensado (al menos originalmente) para generar código HTML en forma dinámica sin recurrir a complicados mecanismos tipo CGI.
HTML es la salida por defecto de PHP cuando se ejecuta como módulo de algún servidor web (Apache por ejemplo)… HTML porque eso es lo que los navegadores (FireFox, Chrome, etc…) interpretan para mostrar los resultados a los visitantes (El uso más común de una aplicación web).
Una vez el HTML está generado es enviado al cliente, el cual, al recibirlo lo procesa para dibujar la página correspondiente.
Más gráficamente:

(Diapositiva extraída del curso de Introducción a PHP)
Cuál es el problema
Al escribir <a href="<?php $objeto->Método() ?>"> Reservar </a>
en un único archivo PHP se está generando un html del tipo:
<a href="XXX"> Reservar </a>
Donde lo que está en rojo es la salida del método $objeto->Metodo().
function Metodo() { echo "reservar.php"; }
<a href="reservar.php"> Reservar </a>
Podés chequearlo accediendo al código fuente de la página que recibís cuando ingresás a la URL que estás probando (Apretando CTRL+U en tu navegador).
El problema es que, al momento de hacer click en el link el método ya se ejecutó… ¡precisamente para generar el link!
Cómo se soluciona el problema
Una solución pasa por tener dos archivos php diferentes:
- Uno para mostrar el botón
- Otro para ejecutar el método
<a href="reservar.php?id=1"> Reservar </a>
Y el php (reservar.php) sería algo como:
<?php $objeto = new Clase(); $objeto->Metodo( $_GET['id'] );
De esta forma el método se ejecutará como respuesta al click sobre el enlace.
Esta confusión es muy común cuando uno empieza a programar para la web… hay que acostumbrarse a pensar en diferentes ambientes/momentos de ejecución (Es un poco como cuando el Doc Brown le decía a Marty que no estaba pensando «en la cuarta dimensión» :)).
Es cuestión de acostumbrarse nomás… ni qué hablar si agregamos la parte que se ejecuta del lado de la base de datos!
- ¿Cualquier aplicación PHP se puede dockerizar? - 21/08/2023
- Por qué NO deberías usar XAMPP - 14/08/2023
- «Mi sitio funcionaba bien hasta que el hosting actualizó PHP» - 09/08/2023
Para evitar ataques de CORS (que una web cualquiera pueda tener oculto el link a «reservar.php?id=1» y ejecutarte una acción sin tu permiso) es siempre mejor pasar la data «id=1» via POST. Eso requiere tener un par de líneas mas en JS, pero es fundamentalmente mas seguro
Hola Mauro:
Veo una gran calidad en todos tus posts de PHP, así como una gran dedicación de tu parte al respecto. En este post sugiero cambies la liga de CGI a esta de Wikipedia:
https://es.wikipedia.org/wiki/Interfaz_de_entrada_com%C3%BAn
Ya que CGI en cuanto a asuntos de producción de video (que es a donde lleva actualmente) es otra cosa totalmente diferente,.
Hola Octavio:
Gracias por la sugerencia! No me había dado cuenta 🙂