Introducción a PHP 4

 

Noviembre 2000

 

Vicente Aguilar <vaguilar@linuxfreak.com>

 

 

1. Introducción

Aunque PHP y ASP tienen básicamente la misma funcionalidad, su sintaxis es completamente distinta y su semántica también presenta diferencias, por lo que aunque lo que podamos hacer con ASP también lo podamos hacer en PHP (y viceversa), la adaptación de uno a otro lenguaje puede resultar algo complicada al principio.

 

ASP (“Active Server Pages”) es, más que un lenguaje de programación en sí, una tecnología que permite insertar en una página HTML código que se ejecutará en el servidor. Este código puede ser Java, JavaScript o, más comúnmente, VBScript. Por lo tanto cuando en este curso hagamos referencia al “lenguaje ASP”, y no a la tecnología, nos referiremos a VBScript.

 

Por su parte, PHP ("PHP: Hypertext Preprocessor") provee de una tecnología similar a ASP para insertar código en las páginas HTML, pero PHP además de la tecnología es el lenguaje. En PHP sólo podemos incluir código en un lenguaje, PHP, que será el lenguaje que vamos a estudiar en el presente curso.

 

PHP es un lenguaje interpretado basado principalmente en C, C++ y Java, con los que comparte prácticamente toda su sintaxis y semántica, y aporta también algunas características de lenguajes interpretados como Perl y Bash. Debido a esto, una de sus principales características y una gran baza a su favor es que la curva de aprendizaje para programadores que ya conozcan estos lenguajes es muy suave, prácticamente pueden sentarse delante del ordenador y comenzar a escribir código.

 

En cuanto a la tecnología detrás de PHP, ya en la versión 3.0 el intérprete de PHP era bastante más rápido que los intérpretes existentes de ASP, lo que junto con su buena integración con el servidor HTTP Apache y su capacidad de acceder a unos 20 sistemas de Bases de Datos distintos, lo ha convertido en un fuerte competidor frente a las “soluciones” de Microsoft. Con la versión 4.0 de PHP que ha visto la luz hace pocos meses la situación ha mejorado todavía más: el intérprete es más rápido (hasta 12 veces más rápido que el de la versión 3.0); se ha perfeccionado la integración de PHP con otros servidores además de Apache, entre otros IIS; y se ha modularizado todo el diseño interno, entre otras cosas independizado el intérprete del lenguaje PHP (Zend) del módulo de comunicación con el servidor, con lo que a partir de ahora es posible utilizar PHP como lenguaje interpretado en cualquier otro proyecto (ya se está trabajando para utilizar PHP como lenguaje para procedimientos en MySQL.)

 

El presente curso está estructurado en dos secciones: En la primera se introduce la sintaxis y semántica básica de PHP, haciendo especial hincapié en sus diferencias con ASP; En la segunda parte veremos más a fondo algunas de las características de PHP con las que tendremos que trabajar. Por último, enumeraremos algunas características más de PHP que nos hemos dejado en el tintero.


2. El lenguaje PHP

PHP es bastante diferente en su sintaxis a ASP. ASP está basado en VBScript, mientras que PHP toma bastantes características de lenguajes como C, C++ y Java, y algunas también de Perl.

 

A continuación analizaremos en detalle estas diferencias al tiempo que vamos introduciendo las bases de la programación en PHP.

 

2.1. Extensión de los ficheros

La primera diferencia entre ASP y PHP viene a la hora de dar nombre a los ficheros. La extensión es importante ya que el servidor HTTP (en nuestro caso, generalmente Apache) decide si debe pasárselo al procesador de PHP o no en función de esta extensión.

 

Las extensiones que indican al servidor HTTP que el fichero contiene código PHP que debe ser procesado son:

 

 

Aunque haya extensiones diferentes para PHP 3 y 4, no tienen efecto en el intérprete que las procesará IGUAL. En general, PHP 4 es compatible con 3, salvo unas pocas excepciones. Este curso se centra en PHP 4, así que no analizaremos estos casos de incompatibilidad con las versiones anteriores.

 

2.2. Delimitadores

El código ASP se delimita dentro del HTML entre los signos '<%' y %>'. Por ejemplo:

 

<%@ Language=VBScript %>

<html>

<body>

<%IF Hour(time)>20 OR Hour(time)<4 THEN%>

Buenas noches.

<%ELSE%>

Buenos días.

<%END IF%>

</body>

</html>

 

En PHP disponemos de cuatro opciones para delimitar el código:

 

<? echo 'Primer método de delimitar código PHP'; ?>

 

<?php echo 'Segundo método, el más usado'; ?>

 

<script language="php">

echo 'Algunos editores (como el FrontPage) Sólo entienden este método';

</script>

 

<% echo 'Método de compatibilidad con ASP'; %>

 

Los métodos primero y cuarto no siempre estarán disponibles, ya que se pueden activar o desactivar al compilar el intérprete de PHP. En general, preferiremos usar el segundo método.

 

El ejemplo anteriormente expuesto en ASP podría traducirse así a PHP:

 

<html>

<body>

<?php if ( Hour(time)>20 || Hour(time)<4) { ?>

Buenas noches.

<?php } else { ?>

Buenos días.

<?php }?>

</body>

</html>

 

O también así, utilizando la función echo para imprimir cadenas de texto:

 

<html>

<body>

<?php

if ( Hour(time)>20 || Hour(time)<4) {

    echo “Buenas noches.”;

} else {

    echo “Buenos días.”;

}

?>

</body>

</html>

 

Además, se puede imprimir de forma rápida con <%=$var%>, al igual que en ASP.

 

2.3. Fin de línea

En ASP el carácter de fin de línea representa el final de un comando, llamada a una subrutina, etc. En cambio PHP ignora cualquier carácter de espaciado presente en el código, incluyendo espacios, tabuladores y saltos de línea (salvo si se encuentran dentro de una cadena de texto). El fin de sentencia se marca con un carácter de punto y coma.

 

Por ejemplo, los dos trozos de código siguientes son equivalentes:

 

print( date("M d, Y H:i:s", time()) );

 

print (

        date( "M d, Y H:i:s",

               time()

            )

      )

;

 

2.4. Comentarios

En PHP hay tres formas de introducir comentarios en el código, frente al ' de ASP:

 

/* Comentarios estilo C.

 * Pueden extenderse durante varias líneas.

 */

 

// Comentarios estilo C++. Cubren hasta el final de la línea.

 

# Comentarios estilo Bash/Perl. Cubren hasta el fin de línea.

 

Hay que hacer notar que los comentarios de una línea cubren hasta final de línea O HASTA EL FIN DEL BLOQUE PHP ('?>' o el que corresponda.)

 

2.5. Variables

Las variables son una parte fundamental de todo lenguaje de programación. En ellas se almacenan valores con los que se puede operar, se pueden comparar entre sí y se puede hacer variar el flujo del programa en función de su valor. Vamos a ver cómo trabajar con variables en PHP.

 

2.5.1. Declaración y uso

Al contrario que en la mayoría de lenguajes de programación, y al igual que en ASP, en PHP NO hace falta declarar las variables antes de usarlas: tras la primera aparición en el código quedan declaradas. Como diferencia frente a ASP, en PHP todas las variables llevan delante el signo del dólar ‘$’. Ej. :

 

$var_1 = 123;

$var_2 = ’hola’;

$var_3 = $var_1 * 2;

 

2.5.2. Tipado de variables

 

Las variables en PHP están débilmente tipadas, de forma similar a ASP (el tipo mixto Variant de ASP es similar al mixed de PHP.) Una variable se asocia a un contenido, del tipo que sea, estando el tipo indicado en el contenido, no en la variable en sí. Visto de otra forma, una misma variable se puede reutilizar asignándole a lo largo del tiempo datos de distinto tipo. Por ejemplo:

 

$mi_variable = ’Inicializamos como una cadena de texto’;

$mi_variable = 3;                   // Ahora es un entero.

$mi_variable = 3.14 * $mi_variable; // Ahora un float.

$mi_variable = new MiClase();       // Ahora un objeto.

 

A pesar de esto, el tipo es importante en algunos casos (para efectuar operaciones o llamadas a funciones.) En estos casos, PHP se encarga de realizar las transformaciones necesarias de forma automática.

 

$mivar = 123;

echo $mivar;

 

En el ejemplo anterior, PHP convierte el valor entero 123 a la cadena de texto “123” antes de pasárselo a la función echo.

 

$mivar = ’3’;

$mivar = 2 + $mivar;

 

En este caso $mivar comienza almacenando la cadena “3”. En la segunda línea, y para realizar la suma, se convierte al entero 3, se realiza la suma y se asigna a $mivar el entero 5.

 

También se puede forzar la conversión a un tipo específico, por ejemplo:

 

$mivar = (string)123;

 

Y se puede cambiar el tipo de una variable con:

 

$mivar = 12;

settype($mivar, "double");

 

2.5.3. Ámbito

El ámbito de una variable hace referencia a dónde está disponible esa variable y dónde no, y depende del contexto en el que haya sido definida la variable:

 

 

Aunque todos estos conceptos (includes, funciones, clases) los presentaremos más tarde, introduciremos ya una posible fuente de errores: Los programadores acostumbrados a C deben llevar cuidado con las variables globales, ya que no se comportan como en C. Por ejemplo, considérese el código siguiente:

 

$mivar = 3;

function mifuncion() {

   echo $mivar;

}

 

En C, la función mifuncion() imprimiría '3'. En cambio en PHP no imprimiría nada (si no da un error) ya que la variable $mivar de mifuncion es una variable DISTINTA a la global y local a esta función.

 

Para acceder a las variables globales desde una función, hay que utilizar la palabra reservada global:

 

$mivar = 3;

function mifuncion() {

   global $mivar;

   echo $mivar;

}

 

2.5.4. Referencias

En PHP se puede definir “alias” para las variables, es decir, tener dos (o más) nombres distintos para un mismo dato. Se puede ver de forma similar a tener dos punteros en C haciendo referencia a la misma zona de memoria.

 

Para definir una referencia utilizamos el carácter ‘&’ delante de la variable referenciada:

 

$alias = &$variable

 

Así podremos acceder al mismo dato por $alias o $variable. Las modificaciones hechas sobre una u otra repercuten en el mismo dato. Debe quedar claro que la referencia no significa que $alias “apunta a” $variable, si no que tanto $alias como $variable “apuntan a” un mismo contenido en memoria.

 

Se puede eliminar una referencia con la función unset():

 

$a = 1;

$b = &$a;

unset ($a); // Pero $b sigue valiendo 1

 

Las referencias también se pueden usar para pasar o devolver parámetros por referencia en las funciones, como se verá más tarde.

 

2.5.5. Acceso indirecto

En PHP podemos acceder al contenido de una variable cuyo nombre tenemos almacenado en otra variable, de esta forma:

 

$a = 123;

$b = ‘a’;

echo $$b; // 123

 

2.6. Tipos de datos

PHP soporta los siguientes tipos de datos básicos:

 

2.6.1. Enteros (int, integer)

Números enteros en notación decimal, octal (un 0 inicial indica que el valor está representado en octal) o hexadecimal (un 0x indica que es hexadecimal.)

 

Ejemplos:

 

$var1 = 1234; // Número en decimal

$var2 = -1234; // El mismo número, negativo

$var3 = 0123; // El 83 decimal, expresado en octal

$var4 = 0x12; // Valor hexadecimal del 18

 

El tamaño, representación interna y valores máximos dependen  de la plataforma, aunque lo normal son 32 bits con signo (+- 2 billones.)

 

2.6.2. Números en punto flotante (float, double, real)

Los números en punto flotante admiten decimales y su rango de valores es mayor que el de los enteros, a costa de cierta pérdida de precisión en los dígitos menos significativos del número. Se permiten las dos notaciones típicas:

 

$var1 = 1.234; // Número con decimales

$var2 = 1.2e3; // Notación científica, 1.2 * 10^3

 

Internamente se representan mediante 64 bits en formato IEEE (hasta 1.8e308 con una precisión de 14 dígitos decimales.)

 

2.6.3. Arrays (array)

Los arrays representan vectores unidimensionales o multidimensionales. Se definen y acceden como en C,  mediante el nombre de la variable que los contiene e indicando el índice (que comienza en el 0) entre corchetes, en lugar de paréntesis como en ASP. Los elementos de un mismo array pueden ser de tipos distintos, p. Ej. :

 

$MiArray[0] = 1;

$MiArray[1] = “hola!!”;

$MiArray[2] = 5;

 

echo $MiArray[1];

 

Como se ve en el ejemplo, no hace falta definir la dimensión del array antes de usarlo (Dim en ASP), ni, por lo tanto, tampoco redimensionarlo a la hora de añadir más elementos (ReDim.)

 

Si al definir un array omitimos el índice (pero NO los corchetes, ¡estaríamos sobrescribiendo la variable!), el elemento se asigna a la siguiente posición del array sin definir. Siguiendo con el ejemplo anterior:

 

$MiArray[] = 8 // $MiArray[3] = 8

 

Los arrays de PHP admiten también cadenas como índices, de forma simultánea a los enteros. Un mismo array puede funcionar a la vez de forma indexada (como un vector) o de forma asociativa (como una tabla hash):

 

$MiArray[“nombre”] = “Homer”;

 

echo $MiArray[3]; // 8

echo $MiArray[“nombre”]; // Homer

 

Para definir un array multidimensional, simplemente indicamos más índices:

 

$MiOtroArray[1][2][“pepe”][0] = “4 dimensiones!!!”;

 

También podemos definir arrays utilizando los constructores del lenguaje array() o list(), así:

 

$OtroArrayMas = array( 1, “hola”, 5);

 

Donde los valores se asignan por orden a los índices 0, 1 y 2, o de esta otra forma, donde indicamos explícitamente el índice:

 

$YOtroArray = array(

    0 => 1,

    1 => “hola”,

    2 => 5,

    3 => 8,

    “nombre” => “Homer”

);

 

Se pueden definir arrays multidimensionales mediante composición de varias llamadas anidadas al constructor array().

 

2.6.4. Cadenas de texto (string)

Las cadenas en PHP se pueden definir de tres formas:

 

 

Secuencia

Significado

\n

Nueva línea (LF ó 0x0A en ASCII)

\r

Retorno de carro (CR ó 0x0D en ASCII)

\t

Tabulación horizontal (HT ó 0x09 en ASCII)

\\

Barra invertida

\$

Símbolo del dólar

\"

Dobles comillas

\[0-7]{1,3}

Un carácter determinado en notación octal

\x[0-9A-Fa-f]{1,2}

El carácter indicado en hexadecimal

 

 

 

$cadena = <<<DELIMITADOR

texto

texto

texto

...

texto

DELIMITADOR

 

Después del operador “<<<” especificamos un delimitador que marcará el final del texto. Debemos llevar cuidado al elegir este delimitador, ya si aparece en algún lugar del texto, podríamos acabar con un resultado incorrecto. Tras la línea con el “<<<” y el delimitador, escribimos la cadena de texto, que puede expandirse por tantas líneas como queramos. Las variables dentro del texto se expanden y no hace falta escapar las comillas. Para finalizar la cadena, debe aparecer una línea que contenga únicamente el delimitador. Por ejemplo:

 

$cadena = <<<FINCAD

Esto es un ejemplo de cadena como “here doc”.

La variable \$a vale $a.

Ahora vamos a finalizar la cadena:

FINCAD

 

Para concatenar cadenas se utiliza el operador ‘.’ :

 

$cad = ‘A esta cadena ‘;

$cad = $cad . ‘le vamos a añadir más texto.’;

 

Se puede acceder a cada carácter de la cadena de forma independiente utilizando notación de arrays indexados sobre la cadena:

 

$cad2 = “El tercer carácter de \$cad es ‘$cad[2]’.”;

 

Por último, señalar que aunque como ya hemos dicho en una cadena delimitada por dobles comillas se expanden las variables, con construcciones complejas (arrays multidimensionales, objetos...) la expansión NO siempre funciona bien. Para evitar problemas, podemos concatenar la cadena con el valor de la variable o encerrar la variable entre llaves:

 

echo “Esto no irá bien $a[1][3]”;

echo “Así no hay problemas {$a[1][3]}”;

echo ‘Concatenar es otra alternativa ‘ . $cosa->valor;

 

2.6.5. Objetos (object)

Pese a no ser un Lenguaje Orientado a Objetos puro, PHP soporta clases y objetos, aunque con ciertas carencias respecto a otros lenguajes. Las clases y objetos en PHP se definen y usan de forma similar a C++ o Java. Se estudiarán con profundidad en la segunda parte de este curso.

 

2.7. Constantes

En PHP podemos definir constantes utilizando la función define(), cuya declaración es:

 

int define(string nombre, mixed valor [, int noMayusculas])

 

Donde nombre es el nombre que le queremos dar a la constante, valor su valor, y el campo opcional noMayusculas indica si está a 1 que podemos acceder a la variable independientemente con mayúsculas o minúsculas, mientras que si está a 0 (valor por defecto) sólo podremos acceder a ella de la misma forma como la hayamos definido.

 

Las constantes en PHP se diferencian de las variables en que:

 

Un ejemplo de declaración y uso de constantes en PHP sería:

 

define(‘SALUDO’, ‘Hola, mundo!’);

echo ‘La constante SALUDO vale ‘ . SALUDO;

 

2.8. Mayúsculas y minúsculas

Esta puede ser una causa de problemas. En ASP no importa si una función o variable está escrita en mayúsculas o minúsculas, siempre se interpretará igual. En cambio en PHP tenemos un comportamiento mixto:

 

 

Para evitar errores y confusiones, siempre escribiremos los nombres de funciones del sistema en minúscula, y las funciones propias siempre tal y como se escribieran en la declaración.

 

2.9. Operadores

Vamos a ver los distintos operadores disponibles en PHP, clasificados por tipos:

2.9.1. Operadores aritméticos

Disponemos de los clásicos operadores aritméticos:

 

Operación

Nombre

Resultado

$a + $b

Suma

Suma de $a y $b.

$a - $b

Resta

Diferencia entre $a y $b.

$a * $b

Multiplicación

Producto de $a y $b.

$a / $b

División

Cociente de $a y $b.

$a % $b

Módulo

Resto de la operación $a / $b.

 

2.9.2. Auto-incremento y auto-decremento

PHP también dispone de los típicos operadores de auto-incremento y decremento de C:

 

Operación

Nombre

Resultado

++$a

Pre-incremento

Incrementa $a en 1, y devuelve $a (ya incrementado)

$a++

Post-incremento

Devuelve $a (sin incrementar), y después lo incrementa en 1.

--$a

Pre-decremento

Decrementa $a en 1, y después lo devuelve.

$a--

Post-decremento

Devuelve $a, y después lo incrementa en 1.

 

Por si alguien no está familiarizado con el funcionamiento de estos operadores, he aquí un ejemplo para clarificarlo:

 

$a = 1;

$b = $a++; // $b = $a; $a = $a + 1; -> $b vale 1, $a 2.

 

$a = 1;

$b = ++$a; // $a = $a + 1; $b = $a; -> $a vale 2, y $b 2.

 

2.9.3. Operadores de bits

Veamos ahora los operadores BIT a BIT de que dispone PHP:

 

Operación

Nombre

Resultado

$a & $b

Y

Se ponen a 1 los bits que están a 1 en $a y $b.

$a | $b

O

Se ponen a 1 los bits que están a 1 en $a o $b.

$a ^ $b

O Exclusivo

Se ponen a 1 los bits que están a 1 en $a o $b, pero no en ambos.

~ $a

No

Se invierten los bits (se cambian 1 por 0 y viceversa.)

$a << $b

Desp. Izq.

Desplaza $b posiciones a la izquierda todos los bits de $a.

$a >> $b

Desp. Drch.

Desplaza $b posiciones a la derecha todos los bits de $a.

 

2.9.4. Operadores lógicos

Los operadores lógicos realizan operaciones dependiendo del valor booleano de los operandos.

 

Operación

Nombre

Resultado

$a and $b

Y

Cierto si $a y $b son ciertos.

$a or $b

O

Cierto si $a o $b es cierto.

$a xor $b

O Exclusivo.

Cierto si $a o $b es cierto, pero no ambos.

! $a

No

Cierto si $a es falso.

$a && $b

Y

Cierto si $a y $b son ciertos.

$a || $b

O

Cierto si $a o $b es cierto.

 

La razón de que haya dos operadores distintos para las operaciones Y y O lógicas es que tienen distinta precedencia (ver punto 2.8.9.)

 

2.9.5. Asignación, igualdad e identidad

En PHP hay tres operadores distintos para asignar y comparar valores entre variables, mientras que en ASP todo se realiza con el único operador “=”:

 

Operación

Nombre

Resultado

$a = $b

Asignación

Asigna el valor de una variable o expresión del segundo término a la variable del primer término.

$a == $b

Igualdad

Compara si el valor de los dos operandos es el mismo.

$a === $b

Identidad

Compara si el valor es el mismo y, además, el tipo coincide.

 

Ejemplo:

 

$var1 = 1; // Asignación

$var2 = 1;

$var3 = “1”;

($var1 == $var2) // Cierto, son iguales

($var1 == $var3) // Son iguales (tras la conversión)

($var1 === $var2) // Cierto, son idénticas

($var1 === $var3) // FALSO, el tipo no coincide

 

Los programadores acostumbrados a ASP deben llevar mucho cuidado con esto, ya que puede llevar a errores de este tipo:

 

$var1 = 1;

$var2 = 2;

if( $var1 = $var2 ) {

    echo ‘iguales’;

} else {

    echo ‘distintas’;

}

 

Esta condición en ASP se evaluaría a FALSO. En cambio, en PHP como ‘=’ es el operador de ASIGNACIÓN y no el de IGUALDAD, lo que estamos haciendo es asignar el valor de $var2 a $var1. Tras esto $var1 vale ‘2’, que como es distinto de 1 se evaluará a CIERTO.

 

2.9.6. Comparaciones

Devuelven cierto o falso según el resultado de comparar los dos operandos.

 

Operación

Nombre

Resultado

$a != $b

No igual

Cierto si el valor de $a no es igual al de $b.

$a !== $b

No idéntico

Cierto si $a no es igual a $b, o si no tienen el mismo tipo.

$a < $b

Menor que

Cierto si $a es estrictamente menor que $b.

$a > $b

Mayor que

Cierto si $a es estrictamente mayor que $b.

$a <= $b