Programación web con PHP
Módulo 2.2: Conceptos básicos de programación y PHP (I)
Documentación oficial de PHP
La web oficial del proyecto PHP es www.php.net. En ella podemos encontrar desde información sobre las últimas versiones de PHP, descarga de ejecutables para su instalación, hasta documentación muy detallada y explicativa de todas las funciones del lenguaje.
Es posible que al principio no comprendamos bien la información de esta página al buscar información sobre una función, pero con la práctica se convertirá en nuestra referencia más importante.
Podemos comenzar a leer la versión en español de la documentación en el siguiente enlace: http://php.net/manual/es
La parte que más nos va a interesar al comienzo de nuestro aprendizaje es la referencia principal del lenguaje PHP, que se lee desde el siguiente enlace: http://php.net/manual/es/langref.php
Código PHP y código HTML
La forma usual como están configurados los servidores web es la siguiente:
- Los ficheros .htm o .html son enviados al navegador tal cual
- Los ficheros .php (y a veces los .inc) son preprocesados por el ejecutable PHP antes de enviarlos al navegador
- Todo el código HTML que se encuentre en el fichero .php se envía al navegador tal cual
- El código encerrado entre las etiquetas es ejecutado por el preprocesador PHP, y su contenido sustituido por el resultado de dicha ejecución.
En general, nos podemos encontrar ficheros .php cuyo uso encaje con alguno de los siguientes perfiles:
- El fichero contiene gran parte de código HTML, y de vez en cuando abre y cierra etiquetas con código PHP esporádico. Los ejemplos iniciales que un usuario programa, o alguno de los ficheros de temas de WordPress o Drupal son de este tipo.
- El fichero contiene una etiqueta
<?php
al principio del mismo, y no contiene código HTML directamente (aunque puede que se envíe al navegador mediante las funcionesecho
oprint
). - El fichero puede ser llamado directamente desde el navegador
- El fichero está pensado para se llamado desde otros ficheros PHP
Comentarios de código
Cuando escribimos código, podemos necesitar escribir comentarios que nos permitan explicar o aclarar el funcionamiento de lo que estemos programando.
Esto lo podemos hacer o bien anteponiendo dos barras inclinadas // delante de una linea de comentario, o bien incluyendo los caracteres de apertura /* y de cierre */, con lo que todo el contenido dentro de estas marcas, aunque sea de algunos caracteres o muchas lineas, será considerado comentario, y no se procesará por el intérprete de PHP.
Tratamiento de errores
Cuando cometamos un error al programar en PHP, en principio no podemos saberlo hasta haber intentado ejecutar el código, ya que como comentamos PHP es un lenguaje interpretado, no es un lenguaje compilado.
Normalmente el mensaje de error se muestra directamente en el lugar del documento donde se produciría la salida PHP del código que se está ejecutando en dicho momento, pero esto puede ser modificado por diferentes situaciones.
Existe una directríz en el fichero de configuración php.ini que establece el nivel por defecto a la hora de mostrar errores de código, llamada ERROR_LEVEL.
Esta se puede especificar de diferentes maneras:
- Mediante el fichero de configuración
php.ini
- Mediante la instrucción
ini_set('error_reporting',error_level)
- Mediante la instrucción
error_reporting(error_level)
A continuación encontrará una serie de ejemplos sobre como activar diversos niveles de notificación de errores mediante error_reporting.
// Desactivar toda notificación de error
error_reporting(0);
// Notificar solamente errores de ejecución
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Notificar E_NOTICE también puede ser bueno (para informar de variables
// no inicializadas o capturar errores en nombres de variables ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// Notificar todos los errores excepto E_NOTICE
error_reporting(E_ALL ^ E_NOTICE);
// Notificar todos los errores de PHP (ver el registro de cambios)
error_reporting(E_ALL);
// Lo mismo que error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
La lista de niveles de error que pueden mostrarse u ocultarse está definida en la documentación oficial en el siguiente enlace http://php.net/manual/es/errorfunc.constants.php
Variables y constantes
En PHP, las variables se especifican anteponiendo un signo $ delante del identificador que las define.
Como su propio nombre indica, estas pueden contener diferentes valores a lo largo de la ejecución del código PHP.
Algunos ejemplos de variables válidas:
$a
$mi_valor
$ColumnFactory
$nombre3
Intentar leer el valor de una variable que no ha sido anteriormente establecida provocará un error de tipo NOTICE, devolviendo un valor NULL en su lugar.
Las constantes deben ser declaradas inicialmente mediante la instrucción define(NOMBRE_CTE,'valor')
, para luego ser utilizadas (sin el signo $
a
diferencia de las variables) directamente con el nombre definido, NOMBRE_CTE
. Es habitual definir y utilizar las contantes con todas las letras mayúsculas, aunque no es obligatorio.
Es posible definir una constante sin establecer ningún valor. De esta manera, si más adelante se comprobase si la constante está definida, nos serviría para detectar que se ejecutó el código donde se realizaba la definición.
Algunos ejemplos de definción de constantes son:
define('COLOR_FONDO','#c8c8c8');
define('DEBUG_MODE');
Existe en PHP multitud de variables y constantes predefinidas, cuyo contenido podemos leer, para averiguar por ejemplo la IP del cliente conectado, o la versión de PHP que se está ejecutando. Puedes consultar la lista completa en estos enlaces:
- http://php.net/manual/en/reserved.variables.php
- http://php.net/manual/es/reserved.constants.php
Un par de variables predefinidas interesantes son
$_GET y $_POST. Estas contienen los valores de los campos de formulario que hayan sido enviados por el navegador (en función de si su método de envio ha sido get
o post
), y serán una forma muy importante de recibir información desde el usuario.
No queremos que en este curso sea preciso mucho conocimiento de HTML para aprender PHP, pero pongamos como ejemplo que se ha enviado un formulario en HTML con método GET que contenía un cuadro de texto definido como:
<input type="text" name="nombre"/>
Cuyo valor era “Manuel”. Esto provocará que al leer la variable $_GET[‘nombre’], ésta devuelva la cadena “Manuel”. Las variables definidas en las URLs del navegador con ?var1=valor1&var2=valor2 también aparecerán definidas en $_GET.
Otra variable predefinida interesante es $_SESSION. Esta permite que definamos y almacenemos cualquier valor en ella, de manera que si el usuario tiene habilitadas las cookies en su navegador, podamos en subsecuentes ejecuciones de nuestro código leer los valores introducidos. Esto es importante, ya que nuestro programa carece de estado entre llamadas, olvidando todo lo que se hubiera definido en ejecuciones anteriores. Solo es preciso almacenar en el navegador del visitante una cookie de sesión que lo identifique, luego todos los datos almacenados en $_SESSION se guardan en unos ficheros de textos asociados al valor de dicha cookie. Este método es útil para almacenar pequeñas cantidades de datos, pero para cantidades grandes es más óptimos utilizar un motor de base de datos como MySQL.
Hemois visto que siempre tenemos que dar un valor a una variable antes de intentar leer un valor de ella. La función isset nos permite comprobar si una variable existe, sin provocar ningún error en caso negativo. La función empty es similar, solo que devolverá verdadero si la variable no existe, o es la cadena vacia, o es el entero 0, y falso en todos los demás casos.
//$a no está todavía definida
echo isset($a); //No devuelve nada, es decir, devuelve falso
echo empty($a); //Devuelve "1", es decir, verdadero
$a='';
echo isset($a); //Devuelve "1", es decir, verdadero
echo empty($a); //Devuelve "1", es decir, verdadero (tiene cadena vacía)
$a='A';
echo isset($a); //Devuelve "1", es decir, verdadero
echo empty($a); //No devuelve nada, es decir, devuelve falso
Tipos de datos básicos
En PHP no es preciso declarar las variables como en otros lenguajes antes de su uso, ni definir qué tipo de dato en concreto van a almacenar… siempre que les asignemos algún valor antes de intentar leerlo.
Los tipos de datos principales que podemos almacenar en las variables son:
- Booleanos (boolean): true (verdadero), false (falso)
- Números enteros (int)
- Números de punto flotante (float)
- Cadenas de caracteres (strings)
- Matrices (array)
- Objetos (object)
- Recursos (resource)
- NULL
Algunos ejemplos de asignación de valores a variables son los siguientes:
$a = true;
$paginas = 10;
$factores = 1.23;
$mensaje_ejemplo = "Hola mundo!";
$otro_mensaje_ejemplo = 'Hola de nuevo';
$dias_semana = array('lunes', 'martes', 'miercoles', 'jueves', 'viernes', 'sabado', 'domingo');
$fecha = new DateTime('2001-01-01');
Operadores
Está muy bien definir tipos de datos, pero debemos poder también realizar operaciones con ellos. Para ello contamos con diferentes operadores. Por la cantidad de datos que necesitan, los podemos clasificar en:
- Operadores uniarios:
-
(signo menos delante de un número),!
(not),++
,--
- Operadores binarios:
+
,-
,*
,/
,*
,^
,.
,|
,&
,||
,&&
,==
,===
,!=
,!==
,<
,>
- Operadores trinarios:
?
(comparación con asignación)
Por el tipo de dato sobre el que operan, los podríamos clasificar de otra manera:
- Operadores aritméticos, sobre enteros y flotantes
+
,-
,*
,/
,^
- Operadores binarios, para números binarios
|
(OR),&
(AND),!
(NOT)
- Operadores binarios en “cortocircuito” y pruebas lógicas
||
(OR),&&
(AND),==
,===
,!=
,!==
,<
,>
- Operadores para cadenas
.
(concatenar)
Los operadores tienen cierta precedencia que puede ser alterada utilizando paréntesis.
Al realizar una operación sobre una variable, y almacenar el resultado sobre la misma variable, tenemos una forma corta para expresar estas asignaciones:
$a = 5;
//Le sumamos 3
$a = $a + 3;
//Lo anterior es equivalente a esto (aunque lo estamos repitiendo dos veces)
$a += 3;
$m = 'Hola';
$m = $m. ' mundo';
//Lo anterior es equivalente a esto (aunque lo estamos repitiendo dos veces)
$m .= ' mundo';
Una asignación es una operación a su vez, que devuelve un valor que puede ser utilizado para otra asignación.
$c = 3;
$a = $b = $c + 1;
//Ahora tanto $a como $b valen 4
Los operadores unarios ++ y – realizan una asígnación y suma o resta de 1 en una variable, por lo que las siguientes expresiones son equivalentes
$a = 0; //Para empezar con algún valor
$a = $a + 1;
$a += 1;
$a++:
$b = 0;
$b = $b - 1;
$b -= 1;
$b--;
Si el operador ++
o --
se antepone a la variable, primero se realiza la operación de sumar o restar uno, y luego se devuelve el resultado. Si se pospone (como en los ejemplos anteriores), primero se devuelve el valor original de la variable, y después se realiza el incremento o decremento.
$a = 1;
$b = $a++;
echo $b; //1
$a = 1;
$c = ++$a;
echo $c //2
Cadenas, operaciones con cadenas
El manejo de cadenas es muy importante para construir un resultado que enviar al navegador.
La operación más básica que podemos hacer con dos cadenas es la concatenación con el operador . (punto), donde unimos varias cadenas entre si.
La función substr nos devuelve un trozo de la cadena actual.
La función strlen nos devuleve el número de caracteres que tiene una cadena.
La función str_replace reemplaza todas las apariciones de la cadena buscada con otra de reemplazo.
$a = 'Hola';
$b = 'Manuel';
$c = $a . ' ' . $b;
echo $c; //Resultado "Hola Manuel"
echo substr($c, 0 ,4); //Primeros 4 caracteres, resultado "Hola"
echo substr($c, 0, -2); //Resta últimos 2 caracteres, resultado "Hola Manu"
echo substr($c, 2, 4); //Resultado "la M"
echo strlen($c); //Resultado 11
echo str_replace('Hola', 'Adios', $c); //Resultado "Adios Manuel"
Existe numerosas funciones para operar con cadenas, puedes consultar la lista entera en este enlace: http://php.net/manual/es/book.strings.php
Arrays
Hemos visto brevemente cómo definir un array o matriz de elementos. A continuación veremos algunos ejemplos sobre el trabajo con arays.
//Definir un array vacio
$a = array();
//Definir un array con varios elementos
$a = array('Manzana','Platano');
//Añadir un elemento al final de un array
$a[] = 'Pera';
//Consultar el elemento en una posición concreta de un array
//El primer elemento es el número 0
echo $a[1]; //muestra "Platano"
//Modificar el elemento en una posición concreta
$a[1] = 'Naranja';
Por defecto, las claves que definen cada elemento del array son valores numéricos incrementales. También podemos utilizar otro tipo de claves que definamos por nuestra cuenta. A este tipo de arrays se le llama “asociativo”.
$colores = array(
'rojo' => '#FF0000',
'verde' => '#00FF00',
'azul' => '#0000FF'
);
echo $colores['azul']; //Devuelve "#0000FF"
Tambien es posible definir un array dentro de otro array, lo que da lugar a arrays mutidimensionales
$tablero = array(
0 => array('O','O','X'),
1 => array('X','O',' '),
2 => array(' ','X',' ')
);
echo $tablero[0][2]; //Devuelve "X"