PHP
Last updated
Was this helpful?
Last updated
Was this helpful?
El enfoque tradicional sería usar una máquina con windows o linux y:
Servidor web. Típicamente Apache 2.
Servidor de bases de datos. Típicamente Mysqsl.
Entorno de administración de bases de datos. Típicamente PhpMyAdmin.
Yo opto por usar docker
. Esto me da más seguridad respecto al entorno usado por los alumnos.
Vamos a partir del entorno de desarrollo preparado con docker:
Debemos clonar dicho repositorio en nuestro espacio de trabajo:
Obtenemos un entorno docker para desarrollar en php:
Uno o más servicios web.
Un servicio de base de datos Mysql
Un servicio PhpMyAdmin para administrar las bases de datos.
Para gestionarlo necesitamos la consola y necesitamos ir a la carpeta que lo contine.
Iniciar servicio:
Parar servicio:
Ver máquinas corriendo:
En este entorno se van a usar tres sitios web de prueba. Para poder usarlos debemos engañar al DNS.
Debes editar tu fichero /etc/hosts
para acceder a los dos sitios web creados por el mismo.
Prueba a hacer ping a estos sitios.
Este entorno creo los siguientes contendedores en su rama master:
proxy: Es un proxy nginx para poder mantener simultaneamente múltiples contenedores con diferentes sitios web.
db: Contenedor mysql para uso de bases de datos.
phpmyadmin: Contenedor para administración web del anterior.
web1: sitios web1.com apache y php (Dockerfile web1)
web2: sitio web2.com con apache y php (php:7.4-apache)
Pruebe en su navegador las siguientes url's:
El último sitio nos permite accede a phpmyadmin
Este entorno incorpora un script para inicializar una base de datos en ./data/init-db
Conectese a e importe el script citado.
Pruebe a acceder ahora de nuevo a
Analiza lo ocurrido y crea otro sitio web en el mismo entorno llamado web3 (web3.com).
Vamos a añadir algunos complementos:
PHP IntelliSense
PHP Intelephense
PHPml (PHP in Html)
Atajo JSON: ctrl+shift+P
+ shotcut
El repositorio entornods está en su rama master. Ahí tenemos los servicios que hemos explicado.
Pero ahora no necesitamos web1 ni web2. Necesitamos un servicio para hacer ver ejemplos y hacer ejercicios.
El uso de ramas en git me permite hacer esto fácilmente
Vamos a cambiar a la rama ejercicios de nuestro "entornods"
Nuestro docker-compose ya está preparado para servir el contendio de "data/ejercicios". Examina el fichero docker-composer.yml para comprobarlo.
Lo siguiente es crear ese directorio data/ejercicios.
Ese repositorio es propiedad del profesor. Me sirve para descargarme cosas pero no para guardar mis soluciones.
Por eso no me interesa hacer un "clon" sino un "fork".
Hacer un clon consiste en descargar el código del profesor (no me intereasa).
Hacer un fork consiste en copiar el repositorio del profesor en el espacio de GitHub del alumno.
Ese repositorio resultante es el que debe ser clonado.
Una vez clonado, nuestro repositorio local está vinculado al que guardamos en GitHub
Podemos comprobarlo ejecutando:
El resultado indica algo así:
Como vermos más adelante, me puede interesar vincular un repositorio local a dos remotos:
El mío (alumno) con mis ejercicios.
El del profesor, por si añade ejemplos o enunciados de problemas.
Para hacerlo:
Nos falta preparar el fichero /etc/hosts
. Debemos añadir:
Ya casí está. Vamos a "entornods", paramos los servicios y los vovemos a levantar:
Damos por hecho que el alumno tiene una base de programación y de orientación a objetos.
Vamos a hacer un recorrido rápido sobre las bases de PHP.
Para completar información respecto a lo que aquí se cuenta el mejor sitio
PHP (acrónimo recursivo de "PHP: Hypertext Preprocessor") es un lenguaje de código abierto muy popular especialmente adecuado para el desarrollo web y que puede ser incrustado en HTML.
PHP está construído a partir de Perl
Perl está basado en C.
Las variables son al estilo Perl
La sintáxis es muy similar a C (y por tanto a Java)
Los ficheros php deben tener extensión ".php"
El php puede estar embebido en código html
Los fragmentos de php deben ir etiquetasdos entre <?php ?>
O pueden ser ficheros código php puro.
Sólo debe aparecer al inicio la marca de apertura: <?php
Las sentencias acaban en ";".
Los comentarios:
Entero: número entero con signo
Flotante: número decimal con signo
Booleano: vale true o false
Cadena de caracteres: cadena de caracteres delimitada por comillas simples o dobles.
Existen otros más complejos que iremos viendo:
Arrays
Objetos
Recursos
....
Podemos consultar el tipo de una variable con gettype()
.
Y hacer casting para cambiar el tipo:
Casting o forzados permitidos
(int), (integer) - forzado a integer
(bool), (boolean) - forzado a boolean
(float), (double), (real) - forzado a float
(string) - forzado a string
(array) - forzado a array
(object) - forzado a object
(unset) - forzado a NULL (PHP 5)
Las variables deben comenzar por dolar: $miVariable
No necesitan ser declaradas, basta inicializarlas.
No tienen un tipo fijo.
Deben segir notación de estilo $camelCase
;
Podemos consultar si una variable está definida y su tipo de dato:
El ámbito de las variables es:
Global si está fuera de una función o una clase
Local dentro de funciones
Podemos definir variables estáticas dentro de las funciones. Su valor no cambia entre invocaciones.
El ámbito es compartido con ficheros incuídos.
Las constantes se crear usarndo define
o const
El estándar dice que deben ser en mayúsculas:
Rseñar:
Concatenación .
.
Asignación y concatenacion .=
, similar a +=
.
Podemos empezar a codificar con lo que sabemos.
Podemos importar el contenido de otros ficheros de código con include, include_once, require, require_once
Require para la ejecución si no encuentra el fichero.
La variante "_once" comprueba que no se ha requerido/incluído el mismo fichero antes. Importante al importar clases.
En Php un array es un tipo de dato compuesto. Es una colección de datos.
En un array hay una asociación entre cada valor y su clave de acceso.
Las claves pueden ser:
Números: arrays ordenados.
Cadenas de texto: arrays asociativos (mapas).
Podemos usar los corchetes o la función array
.
Ojo, podríamos combinar tipos de datos:
Y acceder así:
Podemos añadir elementos. El array crece a demanda:
Y podemos eliminar elementos:
Lo ideal es usar un bucle foreach
. Hay dos variantes:
En un array asociativo las claves para referenciar cada valor son strings.
Para declarar un array o añadir elementos:
Igualmente podemos usar foreach en cualquiera de sus variantes.
Y podemos acceder a un valor usando corchetes: $alumno['nombre'] = "Juan";
Un elemento de un array puede ser otro array.
Esto nos permite definir arrays de dos o más dimensiones.
Los formularios son la forma más común de enviar información del cliente al servidor.
Vamos a ver en qué consiste.
¿Qué puedo encontrar en un formulario?
La etiqueta form que define el método (method get o post)
El destinatario (action)
Y los datos a rellenar o inputs
El método GET envía los datos en la cabecera.
Los datos se ven en la barra del navegador.
Pueden usarse en enlaces.
El método POST envía los datos en el cuerpo. Es más seguro.
Normalmente el formulario lo crea un fichero y recibe sus datos otro fichero indicado en el action.
El action puede:
Usar rutas absolutas (RECOMENDABLE)
Usar rutas relativas
Hacer referencia al fichero actual
Los input que debéis usar son los del ejemplo: text, password, hidden y submit.
No debéis usar tipos como numeric o date. Estos tipos mejoran la esperiencia de usuario pero no permiten probar algunas cosas en el servidor. No nos interesa usarlos en este módulo
Las variables superglobales son creadas por el sistema.
Las variables que podemos encontrar son:
$_SERVER. Inf. del script actual y del servidor.
$_GET. Datos formulario con método GET.
$_POST. Idem con método POST.
$_FILES. Ficheros enviados en un formulario.
$_COOKIE. Cookies (para más adelante)
$_REQUEST. Combina las tres anteriores.
$_SESSION. Datos de sesión (para más adelante)
</small>
Los datos se reciben así:
Puede ser conveniente comprobar si existe la variable:
Para entender las posibilidades debes analizar el ejemplo 11.
Si queremos elegir uno entre varios podemos usar
Radio:
Select:
MIRA BIEN: para preseleccionar una opción debemos usar checker o selected.
Si queremos seleccionar varios entre varios debemos usar checkbox (o select multiple).
En ambos casos nos interesa recibir un array con la colección de varios elegida.
En PHP, debemos nombrar a nuestros inputs (o select) con corchetes:
Otra cosa interesante es que un script puede enviarse los datos a sí mismo. Basta con poner en el action del formulario el propio script, o más fácil todavía, dejando el action en blanco:
Crea un formulario para enviar los datos de registro de un libro: título, autor, editorial, páginas.
Crea un formulario para enviar campo nombre. Si el nombre existe se da un saludo. Si no existe se vuelve atrás indicando que el campo es obligatorio.
Envío del script al mismo script. Crea un formulario para enviar campo nombre. El nombre debe existir y debe tener un tamaño mínimo de 3 caracteres. Si es válido se da un saludo. Si no lo es se vuelve a mostar el formulario indicando que el campo es obligatorio y mostrando en el "input" el valor anterior no válido.
Envío del script al mismo script. Crea un formulario que funcione como calculadora. Debe contener dos input como operandos y un select para elegir operador.
Si se reciben los datos muestra el resultado.
Si no son válidos o no existen debe devolver a la página anterior.
Crea un formulario que envíe un array de 3 nombres. Para hacerlo debes usar el mismo nombre en todos los input (name="nombres[]").
Crea una lista usando etiquetas ul y li. La lista inicialmente estará vacía pero un formulario con un input servirá para añadir los elementos. Usa input de tipo hiddens para que no "olvidar" los elementos ya añadidos a la lista.
Php es un lenguaje de scripting. El punto de entrada es la primera línea de un script siempre.
Pero soporta programación estructurada, por tanto funciones, y programación orientada a objetos, por tanto clases.
No vamos a poner mucha energía en las funciones (sí en POO), pero veamos un ejemplo:
Php soporta POO desde la versión 5
En las versiones 7.* las posibilidades son muy completas.
Vamos a ver las cuestiones básicas.
Conceptos base: clases, objetos, atributos y métodos.
Visibilidad: public, protected, private
Métodos mágicos: constructor, destructor, toString, ...
Herencia, interfaces, métodos y atributos estáticos y finales
Muchas cosas y algunas de ellas no las emplearemos nunca.
Vamos a ir explicando conceptos ya conocidos segun nos haan falta.
Nombre de la clase CamelCase.
Una clase - un fichero, y ambos con el mismo nombre.
Atributos y funciones con nombres camelCase
Reciben este nombre los que se ejecutan de foma "mágica". Sin petición explícita.
Siempre empiezan por doble guión bajo. Los más destacables:
__construct()
: constructor. Se ejecuta al crear un objeto.
__destruct()
: destructor. Se ejecuta al eliminar un objeto.
__toString()
: se ejecuta cuando imprimimos un objeto. Lo convierte a string.
Para acceder a métodos y atributos usamos "->".
Para acceder a constantes de clase y métodos estáticos usamos "::"
Para referirnos al propio objeto usamos $this
Y ahora la usamos:
El script de entrada:
La clase
Pero podemos ser un poco formales en nuestro código:
Los cálculos que debamos hacer los hacemos dentro de un método de la clase. Un fichero php puro.
El html lo generaremos en un fichero mixto html/php.
Esto no es obligatorio. No es requisito del lenguaje. Pero nos ayudará a crear código limpio.
Podríamos trasformar nuestra clase así:
Ojo. Necesiamos un carpeta views
Y nuestras vistas quedarían así:
Vamos a refinar un poco más nuestra aplicación
Dejemos de jugar al azar. ¿Cómo decidimos qué método?
Podemos hacerlo de muchas maneras. Vamos a optar por argumentos GET.
Debemos recoger esos argumentos en el run de App:
Y debemos añadir enlaces en ambas páginas.
¿Lo ponemos en cada vista?
Mejor creamos un header.php
Y lo incluímos en ambas vistas
Además podemos añadir un poco de CSS
Crea una aplicación web con una clase App y varios métodos. En todos los casos se trata de obtener una serie numérica. El método debe calcular la serie y guardarla en un array, después hay que incluir una vista que muestre la serie. Puede ser que necesites crear métodos auxiliares (private) para el cálculo del array, por ejemplo: esPrimo(). Los métodos necesarios son:
Index (index). Presentación de la App y enlaces.
Fibonacci (fibonacci). Muestra la serie de Fibonacci. Debe mostrar todos los términos menores a un millón.
Potencias de 2 (potencias2). Debe mostrar los valores de las potencias de 2 hasta 2 elevado a 24 (nº de colores True Color, por ejemplo).
Factorial (factoriales). Debe mostar los factoriales desde 1 hasta n de tal manera que el último término sea el más próximo cercano al millón.
Nº. primos (primos). Debe encontrar los números primos entre 1 y 10.000.
Una cookie es un fichero de texto que se guarda en el equipo del cliente.
Este fichero está ligado al sitio web que lo crea y al navegador usado.
En él se almacena el contenido de un array de variables.
Se crea mediante la función setcookie(). La función necesita:
Clave: nombre de la variable.
Valor: contenido de la misma. Debe ser texto (o convertible).
Tiempo unix de vida (en segundos). Por defecto, 0, se elimina al cerrar el navegador.
Se accede a su contenido mendiante la variable superglobal $_COOKIE
Para eliminar una cookie usa setcookie con tiempo menor al actual:
Ejemplo de creación de cookies. Incluso arrays y objetos:
Arrays y objetos deben tratarse con:
serialize/unserialize: nativo php. Los objetos se recrean en su clase.
json_encode/json_decode: estándar. Los objetos se recrean como stdClass.
Habitualmente una petición acaba con la construcción de una vista html.
home: página de inicio de una apliación
login: página con formulario de entrada, ...
Pero otras veces queremos que el servidor haga una tarea y después el navegador vaya a una dirección determinada. Por ejemplo:
auth: toma los datos de login. Si son "buenos" reenvía a "home" y si son malos reenvía a "login" de nuevo.
Para hacer esto hay que usar el status 302 de HTTP.
Con php debemos hacer esto con la función header. Veamos ejemplos
Siempre que te pidan reenvío usa header() y no include()
Vamos a crear una App con estos métodos:
login: muestra un formulario de login (usuario y contraseña).
auth: guarda el usuario y su contraseña en una cookie. Después reenvía la petición a home.
home: Muestra un saludo y un enlace para cerrar sesión.
logout: elimina las cookies (setcookie(...., time() - 1)) y reenvía a login.
Depura tu código. En login, comprueba que no hay ya un usuario. Si lo hay reenvía a home.
Ya hemos visto que los enlaces pueden incluir parámetros "GET".
Cuando manejamos listas podemos definir enlaces con mucha información. Veamos un ejemplo para luego usarlo en un ejercicio:
Se trata de crear una lista de deseos Usaremos la clase App con los siguietens métodos:
login método que muestra formulario de entrada.
auth método que toma el nombre de usuario tras el login. Tras hacer esto reenvía a home.
home método que muestra la lista de deseos. Además muestra un formulario de nuevos deseos. El formulario envía al método new
new toma el nuevo deseo y lo incluye en la lista.
delete borra un deseo de la lista. Debe recibir el indice del deseo.
empty vacía la lista de deseos.
close Cierra sesión: borra la cookie.
Colorear una página con ayuda de una cookie. Usaremos la clase App con los siguietens métodos:
home muestra un mensaje de bienvenida. Comprueba si hay una cookie llamada "color". Si existe la usa para darle color al fondo de la ágina.
colores muestra una lista de colores. Cada color tiene un enlace del estilo ?method=cambio&color=red . Al hacer clic cambiará el color del home.
cambio . Recibe el color de la página anterior, crea la cookie y reenvia ('header...') al método home.
NOTA: dos vistas (home y colores) y un reenvío (cambio).
También llamadas cookies del lado del servidor.
Guardan la información en el servidor (RAM, fichero, BBDD, ...).
Se apoyan en una cookie que se envía al navegador y que sirve de clave para recuperar la información almacenada.
Antes de agregar o acceder a las variables de sesión, debemos "avisar" con la función session_start().
Al iniciar la sesión se crea un id aleatorio para la sesión. Este id se puede transmitir en la url o guardar en una cookie de forma transparente al programador. La opción de la url es poco recomendaable por segurirdad.
La información se guarda en la variable superglobal $_SESSION. Es un array al que podemos añadir elementos según necesitamos y que podemos leer como es habitual.
Añadir elementos a sesión:
Se pueden elimnar elementos selectivamente o borar toda la sesión:
Sobre las opciones de sesión. Sus parámetros se establecen en el php.ini: enlace.
Haz el ejercicio 19 pero usando sesiones en vez de cookies
Haz el ejercicio 20 pero usando sesiones en vez de cookies
Una excepción es un objeto. Describe un error o comportamiento indeseado.
Existe en php como en otros muchos lenguajes, p.ej. Java.
Sirven para parar el funcionamiento normal ante situaciones indeseadas.
Muchas funciones y clases del lenguaje lanzan excepciones.
En nuestro código también podemos lanzar excepciones.
Su sintáxis es:
Ejemplo:
Permite añadir código que se ejecute siempre, haya o no excepción.
Ejemplo
Al crear un objeto exception podemos pasar 3 atributos:
message es un texto. Parámetro principal
code un código numérico de error
previous se usa si lanzamos una excepción dentro de un catch
La excepción recibida dispone de los métodos:
getMessage(), getter del message.
getPrevious(), getter del previous
getCode(), getter del code
getFile(), devuelve el fichero que lanza la excepción
getLine(), devuelve la línea que lanza la excepción
getTrace(), devuelve array con la traza de la pila de llamadas.
getTraceAsString(), idem convertido a texto.
Podemos crear nuestro propio tipo de excepciones:
Incluso más de una:
Podríamos incluso añadir un catch por defecto:
Abrir un fichero: fopen(ruta, modo)
La función devuelve 0 si no se puede abrir:
El fichero puede ser incluso una url:
Donde modo:
Ojo:
Si el archivo no es escribible, abrirlo con r+ fallará, incluso cuando sólo se intenta leer.
w y w+ eliminarán el contenido de cualquier archivo. Para sólo añadir y no borrar, se usa a y a+.
Si quieres crear nuevos archivos y evitar sobreescribir sin querer un archivo existente, utiliza x o x+.
Cuando se trabaja con archivos binarios, como imágenes, hay que añadir 'b' después del modo. Como rb o r+b
Ejemplo de escritura
Ejemplo de añadir texto:
Ejemplo de lectura completa:
<<<<<<< HEAD
Crea una aplicación para almacenar una lista de deseos
Lista de métodos:
home, método por defecto. Muestra la lista de deseos y un formulario para añadir nuevos.
new, toma la informacion del nuevo deseo y lo añade al fichero. Después reenvía a home.
clear, borra toda la lista de deseos y velve al home.
delete, borra selectivamente elementos de la lista de deseos. Mira el siguiente ejemplo para ver como cargar las líneas del fichero en un array. NOTA: debes, cargar el array, borrar el elemento y volver a escribir el fichero completo.
=======
Realiza el ejercicio de la lista de deseos usando un fichero deseos.txt. Usa seriel
Método index, lee el contendio de la lista de deseos.
Método new, crea un
ea147b71ce3839cc9819e8b4cb1db6c0151c0319
Podríamos hacerlo desde 0 pero vamos a usar el .
Y vamos a nuestro navegador:
es la documentación oficial
Los básicos son:
Los lógicos y matemáticos son casi ideńticos a C o Java.
Hay alguna curiosidad en los
Las son muy similares a Java
La estructura permite recorrer arrays (y otros objetos iterables).