Mostrando entradas con la etiqueta Sintaxis. Mostrar todas las entradas
Mostrando entradas con la etiqueta Sintaxis. Mostrar todas las entradas

martes, 2 de junio de 2009

Notas para iniciarse en PHP, Parte 7: Manejo de variables predefinidas


Vamos a interactuar con nuestro usuarios, por supuesto a través del navegador


¡Saludos nuevamente!

Como mencionamos en el tema de conceptos básicos, PHP posee un conjunto de variables que nos permiten obtener información de distintas fuentes como: los datos de formularios, las cookies, las sesiones, el servidor, entre otras cosas. Estas son llamadas variables predefinidas y trataremos con ellas en este artículo.

Leer datos de formularios

Los formularios HTML permiten a los usuarios capturar datos en diferentes formatos, y la información capturada puede ser enviada al servidor al momento que los usuarios lo ordenen, lo más común es que se incluya un input de tipo submit para realizar esta tarea, de modo que cuando el usuario realice el submit el formulario enviará la información contenida siguiendo las especificaciones que nosotros mismos le definimos:
<html>
<head>
<title>Formulario con GET</title>
</head>
<body>
<form action="leerDatos.php" method="get" enctype="text/plain">
Nombre: <input type="text" name="nombre" size="25" maxlength="50"><br />
Apellidos: <input type="text" name="apellidos" size="35" maxlength="100"><br />
Sexo: <select name="sexo">
<option value="M">Masculino</option>
<option value="F">Femenino</option>
</select><br />
<input type="submit" name="envio" value="Enviar" />
</form>
</body>
</html>


*Nota: si no se define el atributo name de una entrada del formulario este dato no será enviado con el resto de la información.

En el ejemplo vemos que se definió un formulario con una serie de entradas para captura y un submit para enviar la información, las especificaciones del envío se establecen como atributos del elemento <form>, de modo que definimos que el método de envío será GET, y la página a la que serán enviados es leerDatos.php, cuyo código aparece a continuación:

leerDatos.php
<?php
if(isset($_GET['envio']))
{
$nombre = $_GET['nombre'];
$apellidos = $_GET['apellidos'];
$sexo = ($_GET['sexo'] == "M")? "Masculino":"Femenino";
echo "Usted ha enviado al servidor el nombre $nombre, $apellidos, con el sexo $sexo";
}
?>


Los datos pueden ser enviados al servidor por dos tipos de métodos: GET o POST, lo cual se especifica en el atributo method del formulario; en el método GET los datos que se se envían dentro de la URL de la página destino, es decir la página Web que recibe los datos, como ocurrió con el ejemplo anterior. En el método POST en cambio, los datos no podrán ser visualizados por los usuarios después de que fueron enviados a la página destino, pero de forma similar a la del ejemplo anterior pueden ser leídos por nuestra aplicaciones Web.

En el caso del método GET en nuestra aplicación en PHP utilizamos la variable predefinida $_GET para leer los datos recibidos. Esta variable se lee como si se tratara de un arreglo asociativo, donde cada llave corresponde al nombre (es decir, atributo name) de un campo, así la forma de acceder al valor del campo de texto "nombre" es por medio de la variable $_GET['nombre'] por ejemplo.

Si deseamos probar el método POST bastará con que en el formulario cambiemos el atributo method por "post", y que en nuestro programa leerDatos.php se accese a los datos por medio de la variable predefinida $_POST como se muestra a continuación:

leerDatos.php
<?php
if(isset($_POST['envio']))
{
$nombre = $_POST['nombre'];
$apellidos = $_POST['apellidos'];
$sexo = ($_POST['sexo'] == "M")? "Masculino":"Femenino";
echo "Usted ha enviado al servidor el nombre $nombre, $apellidos, con el sexo $sexo";
}
?>


El método POST es una buena forma de mantener ocultos los datos capturados por el usuario en nuestros formularios, como pueden ser contraseñas e información que será almacenada en un archivo o en una base de datos. En cambio el método GET se recomienda cuando no existe problema con que la información enviada sea visualizada en el navegador del usuario, como por ejemplo en las búsquedas que hacemos por Internet. Ésta última forma también resulta muy útil cuando en nuestro navegador queremos regresar a una página anterior, en la que se realizó un submit por GET, ya que los navegadores conservan las direcciones URL de todas las páginas desplegadas, incluyendo los datos enviados por GET, de modo que la lectura de datos enviados se puede volver a realizar como la primera vez. Además el método GET permite enviar ciertos datos a una página sin necesidad de un formulario, si dentro de nuestra dirección URL incluimos los datos por nosotros mismos, por ejemplo si en la barra de direcciones del navegador escribimos la siguiente URL:

http://localhost/leerDatos.php?nombre=Beto&apellidos=Gonzalez&envio=Enviar


El resultado será el mismo a si hubiéramos utilizado la página HTML con su formulario.

*Nota: Las direcciones incluidas en en el atributo method de los formularios pueden incluir cualquier tipo de dirección URL.

Además de las dos formas anteriores, PHP también incluye la variable predefinida $_REQUEST, la cual puede recoger los datos enviados por ambos métodos, así como los datos de $_COOKIE de la que se hablará más adelante.

Envio de archivos

Dentro de las entradas de un formulario se incluye el tipo file, el cual nos permite capturar un archivo dentro de nuestro equipo y enviarlo al servidor Web:
<html>
<head>
<title>Formulario con envío de archivos</title>
</head>
<body>
<form action="leerArchivo.php" method="post" enctype="multipart/form-data">
Nombre: <input type="text" name="nombre" size="25" maxlength="50"><br />
Apellidos: <input type="text" name="apellidos" size="35" maxlength="100"><br />
Sexo: <select name="sexo">
<option value="M">Masculino</option>
<option value="F">Femenino</option>
</select><br />
Archivo: <input type="file" name="imagen" /><br />
<input type="submit" name="envio" value="Enviar" />
</form>
</body>
</html>


Es indispensable para enviar un archivo que el enctype de nuestro formulario este definido como "multipart/form-data" y que el método de envío sea POST.

Para acceder al archivo del usuario, desde nuestra aplicación Web utilizaremos la variable predefinida $_FILES, en nuestro ejemplo el programa se almacenaría dentro del archivo leerArchivo.php, que es al que se envía la información del formulario:

leerArchivo.php
<?php
if(isset($_POST['envio'])) {
$nombre = $_POST['nombre'];
$apellidos = $_POST['apellidos'];
$sexo = ($_POST['sexo'] == "M")? "Masculino":"Femenino";
echo "Usted ha enviado al servidor el nombre $nombre, $apellidos, con el sexo $sexo.";
if(isset($_FILES['imagen'])) {//Comprobamos que se recibió el archivo
$nomArchivo = $_FILES['imagen']['name']; //Nombre del archivo
$tipArchivo = $_FILES['imagen']['type']; //Tipo de archivo
$tmpArchivo = $_FILES['imagen']['tmp_name']; //Nombre temporal del archivo (con el que se almacenó en el servidor)
$tamArchivo = $_FILES['imagen']['size']; //Tamaño del archivo
$errArchivo = $_FILES['imagen']['error']; //Mensaje de error generado, si es que hubo alguno
if($errArchivo == "") { //Si no hubo error
echo "<br />El archivo de nombre $nomArchivo fué recibido correctamente, cuenta con un tamaño de $tamArchivo bytes y es del tipo $tipArchivo, almacenándose en el servidor con el nombre temporal de $tmpArchivo.";
}
else {
echo "<br />Error de recepción de archivo: $errArchivo";
}
}
}
?>


Como vemos, la variable $_FILES tiene un primer índice para localizar el nombre el archivo enviado utilizando el name de la entrada file del formulario, después utiliza un segundo índice para obtener la información del archivo recibido, entre los que se encuentran el nombre, tamaño y tipo de archivo recibido, que utilizamos en el ejemplo para desplegar como información del archivo recibido. Además se incluye un campo dentro del arreglo para el manejo de errores. Si quisiéramos acceder al contenido del archivo recibido tendríamos que utilizar el campo $_FILES['imagen']['tmp_name'], que guarda el nombre temporal del archivo, es decir el nombre con el que el archivo se almacenó en nuestro servidor -normalmente en un directorio de archivos temporales-, para con esa dirección física poder leer su contenido o copiarlo a otra dirección, o realizar la labor que quisiéramos hacer con el.

Es importante notar que pueden existir algunos errores asociados con el envío de archivos al servidor, el más común consiste en que el tamaño del archivo enviado supera las especificaciones del archivo de configuración php.ini.

Manejo de Cookies

Las cookies son archivos de texto que almacenan nuestros navegadores, dentro de los que registran información relacionada con nuestra una visita a alguna página, para de esta forma poder recuperar estos datos en un acceso posterior que hagamos, de modo que el usuario no necesite volver a capturarlos. Un ejemplo de su uso lo encontramos en los sitios que proporcionan la opción de almacenar nuestro nombre de usuario y contraseña después de iniciar sesión, para que en nuestros siguientes ingresos no tengamos que volver a teclearlos.

PHP nos permite grabar y leer cookies utilizando la función setcookie() y la variable predefinida $_COOKIE, respectivamente.

Una cookie consiste en una variable que registramos por medio de la función anterior, dentro de la cual definimos su nombre y valor, una vez hecho esto podemos leer el valor de la variable por medio de la variable predefinida $_COOKIE, la cual también se accede como un arreglo asociativo -de manera similar a las otras variables que hemos visto-, lo interesante aquí es que al refrescar la página o cambiarnos a cualquier otra página, la información se conservará, ya que nuestro navegador conservará la información que declaramos con setcookie dentro de un archivo. Por ejemplo:

cookie.php
<?php
$nombre = "unaVariable";
$valor = "Hola mundo!";
if(!isset($_COOKIE['unaVariable'])) {
setcookie($nombre, $valor);
echo "Cookie establecida";
}

else {
echo "El valor de la cookie es ".$_COOKIE['unaVariable'];
}
?>


Si probamos el ejemplo anterior, tendremos al inicio el mensaje "Cookie establecida", debido a que al ingresar a la página por primera vez esta variable aún no había sido registrada y se tuvo que realizar este trabajo, si refrescamos la página entonces nos encontraremos con que el mensaje desplegado es "El valor de la cookie es Hola mundo!", ya que la cookie identificada con $_COOKIE['unaVariable'] ya fue almacenada por el navegador. Podemos refrescar la página y cambiarnos de ubicación tantas veces como queramos pero al volver a ejecutar el programa el resultado será siempre el mismo. Las cookies pueden ser eliminadas directamente desde el navegador del archivo, o si durante su establecimiento incluimos en la función setcookie un tiempo de expiración para la éstas.

Además de datos simples también se pueden almacenar datos compuestos como arreglos y objetos utilizando las funciones serialize() y unserialize(), serializando el contenido de uno de estos dos tipos de datos como una cadena y registrándola con un dato simple, para reconstruir el arreglo u objeto original aplicamos la desserialización que proporciona la función unserialize().

Utilización de sesiones

PHP puede crear sesiones que nos permiten mantener ciertos datos en la memoria del navegador, de forma que podamos acceder a ellos en cada una de las páginas que visitemos mientras el navegador se encuentre en ejecución. Así, nuestras aplicaciones en PHP pueden contar con información importante, sin tener que solicitarla constantemente al usuario o tener que acceder a un medio externo como un archivo o una base de datos, haciéndolas de esta manera más dinámicas. Los datos pueden ser eliminados al cerrar el navegador o utilizar una función explícita del lenguaje para ese trabajo.

Estos datos se escriben en la sesión por medio de la variable predefinida $_SESSION, para crear una variable dentro de este arreglo asociativo antes tenemos que iniciar una sesión utilizando la función session_start(), para posteriormente declarar las variables de sesión que vayamos a manejar, como se muestra en el siguiente ejemplo:

session1.php
<?php
session_start();
$valor = "Hola mundo!";
if(!isset($_SESSION['unDato'])) {
$_SESSION['unDato'] = $valor;
echo "Variable de sesión establecida";
}
else {
echo "El valor de la variable es ".$_SESSION['unDato'];
}
?>


En el ejemplo se inicia una sesión con la función sesion_start() para porteriomente comprobar si ya existe la variable de sesión $_SESSION['unDato'], en caso de no ser así se crea esa variable, para que en un siguiente acceso a la página veamos que el valor se mantuvo en la sesión. Si queremos que en cada página podamos acceder a un dato almacenado en la sesión es necesario incluir la función sesion_start() al inicio de éstas. Esto nos permitirá conservar valores al cambiar de páginas, si por ejemplo tenemos una segunda página:

session2.php
<?php
session_start();
if(isset($_SESSION['unDato'])) {
echo "El valor de la variable sigue siendo ".$_SESSION['unDato'];
}
else
echo "Variable no declarada";
?>


El valor original se conservará. Una idea común es que los usuarios realicen la captura los datos que requeriremos en varias páginas una sola vez, y estos los mantengamos con las variables de sesión.

Esta variables pueden ser eliminadas de la memoria del navegador por medio de las funciones session_unset() y session_destroy(), una seguida de la otra ya que la primera elimina todas las variables de sesión y la segunda destruye la sesión actual, o también se pueden eliminar variables específicas por medio de la función unset(), si le pasamos como parámetro el nombre de la variable de sesión.

Así como con las cookies, podemos escribir datos compuestos en las sesiones utilizando las funciones serialize() y unserialize().

Dentro del manual oficial podemos encontrar el grupo completo de funciones relacionadas con las sesiones.

Datos del servidor

También podemos obtener cierta información relacionada con el servidor Web en el que ejecutamos nuestros programas PHP a través de la variable predefinida $_SERVER, como por ejemplo, la ubicación del archivo que se está ejecutando, la hora del servidor, su sistema operativo, entre otras cosas. En el siguiente programa se muestra como podemos desplegar la información del servidor en nuestro navegador:

server1.php
<?php
echo "Cliente del usuario (navegador Web): ".$_SERVER['HTTP_USER_AGENT']."<br />";
echo "Software del servidor: ".$_SERVER['SERVER_SOFTWARE']."<br />";
echo "Archivo PHP que estamos ejecutando: ".$_SERVER['PHP_SELF']."<br />";
?>


Variables de entorno

También existe la variable predefinida $_ENV, la cual nos permite acceder a la información del entorno en el cual se están ejecutando nuestros programas PHP, como por ejemplo en nombre del usuario que ejecuta el script en el servidor o el nombre del servidor.

Y con estas últimas anotaciones es que concluimos con el artículo sobre variables predefinidas, ahora ya pueden hacerse una idea de la forma en la que sus aplicaciones pueden interactuar con sus usuarios finales, para construir aplicaciones completas, para lo que solo falta que conozcan las diferentes funcionalidades que pueden poseer nuestros programas gracias a las muchas opciones que PHP posee.

Hasta la próxima.

jueves, 21 de mayo de 2009

Notas para iniciarse en PHP, Parte 5: Clases y objetos en PHP4


Todo gran viaje comienza con un solo paso

La utilización de clases y objetos

PHP nos permite programar tanto de manera procedimental como con orientación a objetos, es en está última donde surgen los conceptos de clases y objetos, a los cuales nos enfocaremos en este artículo. En el viejo estilo estructurábamos nuestros programas en un conjunto de funciones que utilizábamos dentro de las secuencias de ejecución, en la programación orientada a objetos nuestras aplicaciones constarán de un conjunto de elementos llamados objetos, los cuales interactúan entre sí por medio de sus métodos. Un método es similar a una función en programación estructurada, solo que éste se encuentra asociado a un objeto específico, el cual utiliza los métodos para implementar su funcionalidad particular. Todos los objetos están basados en la definición de una clase, la cual puede verse como la estructura que especifica las características y el comportamiento que tendrá el objeto; todo objeto debe pertenecer a una determinada clase, la clase entonces es una entidad pasiva que define que hará el objeto, mientras el objeto es una entidad activa que realizará un conjunto de tareas dentro de nuestros programas. Si por ahora no ha quedado muy clara esta definición quizás con la implementación en el lenguaje se entenderá mejor.

Clases y objetos en PHP4

En PHP una clase es una colección de variables y funciones que trabajan con estas variables. El concepto de clase y objeto se introdujo en este lenguaje a partir de su versión 4, contando ya con conceptos como la herencia y los constructores, componentes que representan el mínimo necesario para considerarla orientada a objetos, sin embargo este modelo se queda corto si lo comparamos con otros lenguajes basados en objetos más maduros y versátiles como Java o C#. El modelo de la versión 4 es más parecido al de otros lenguajes basados en scripts como Javascript o Actionscript. Por todo lo anterior en la versión 5 del lenguaje se introdujoun nuevo modelo de objetos, que incluyera un mejor funcionamiento y más opciones, para el programador, pero aún así, las bases para el trabajo con clases y objetos siguen siendo los de la versión 4, por lo que es importante al iniciarse en este tema dar un repaso a las características que ofrece esta versión, además de que muchas bibliotecas libres que encontramos por la red siguen utilizándola.

Definición de una clase

La definición de una clase en PHP se realiza por medio de la palabra reservada class seguida de la apertura y cierre de llaves utilizada en las estructuras, dentro de estas llaves se escriben las variables y funciones que contiene una clase. Siguiendo una sintaxis como la que sigue:
class NombreDeLaClase {
...
}


El siguiente ejemplo nos muestra una implementación para esta sintaxis:
<?php
class Carrito {

var $items; // Ítems en nuestro carrito de compras

// Agregar $num artículos de $artnr al carrito

function agregar_item($artnr, $num) {
$this->items[$artnr] += $num;
}

// Tomar $num artículos de $artnr del carrito

function retirar_item($artnr, $num) {
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true;
} elseif ($this->items[$artnr] == $num) {
unset($this->items[$artnr]);
return true;
} else {
return false;
}
}
}
?>

En este ejemplo aparece la definición de la clase Carrito, que posee una variable que contendrá un arreglo asociativo, además la clase dispone de dos funciones o métodos para agregar o eliminar items del arreglo, en un sentido más abstracto la clase representa un objeto del mundo real, en este caso un carrito de compras, al que le podemos agregar o quitar productos.

Las variables o campos (como se les llama en el lenguaje Java) de las clases se identifican anteponiendo la palabra reservada var, estos campos se pueden acceder desde cualquiera de las funciones de la clase, como si se tratara de variables globales dentro del contexto de la definición de la clase, anteponiendo al nombre del campo la expresión $this->, lo cual es muy importante ya que de otra forma PHP interpretara que se trata de una variable local de las funciones en las que se está haciendo referencia. Las funciones que aparecen, que tienen la misma definición que en la programación estructurada que vimos en artículos anteriores, reciben el nombre de métodos, que es el término que emplearemos de ahora en adelante, ya que es el nombre que reciben en la programación orientada a objetos, debido a que a través de ellos se define el comportamiento de los objetos que se crean con las definiciones de nuestras clases. Para accesar a un método contenido en la definición de la clase también se utliza la expresión $this-> seguida de la llamada al método, por ejemplo si se incluyera un tercer método en la clase Carrito el cual necesitara utilizar alguno de los otros:
   //Vaciar el carrito de compras eliminando todos los artículos

function vaciar_carrito() {
foreach ($this->items as $artnr=>$num)
$this->retirar_item($artnr, $num);
}
En el ejemplo, el nuevo método vaciar_carrito() utilizará la funcionalidad de retirar_item() para eliminar todos los elementos del arreglo.

Los métodos le permiten a los objetos interactuar con su entorno, para lo cual es necesario primero crear un objeto con la definición de la clase, lo cual es llamado instanciar una clase, y se hace de la siguiente forma:

$objeto = new NombreDeLaClase;


La instancia de la clase se realiza con la expresión new seguida del nombre de la clase y está debe ser asignada a una variable, la cual será el objeto creado a partir de esta instancia. El nombre de la clase puede llevar paréntesis si así lo deseamos, pero su uso es opcional a menos que la definición del constructor de la clase indique que tiene que recibir algún de valor, para lo cual se vuelve obligatorio el uso de paréntesis en la instanciación, el tema de los constructores lo veremos más adelante.

Siguiendo con el ejemplo del carrito de compras la instancia de la clase Carrito se realizaría de la siguiente manera:
$carrito = new Carrito;
$carrito->agregar_item("10", 1);

$otro_carrito = new Carrito;
$otro_carrito->agregar_item("0815", 3);

En el ejemplo anterior se realizan dos instancias de la clase Carrito por medio de la expresión new Carrito, con lo cual se crean los objetos $carrito y $otro_carrito, los cuales una vez creados pueden acceder a los métodos de esta clase -tanto agregar_item como retirar_item).

Herencia

Las clases pueden tener puntos de intersección en su definición, como suele ser el caso de compartir campos o métodos similares o idénticos, en ese caso sería un gasto de tiempo innecesario volver a escribir estos métodos y campos en la definición en cada clase en las que se vayan a utilizar, para facilitar la solución de este problema PHP permite la herencia entre la clases, la cual consiste en que a partir de una clase original se pueden crear otro grupo de clases que contengan los métodos y campos de la primera, pero sin tener que reescribirlos en cada una de ellas, la clase original es llamada padre mientras que a las clases derivadas se les llama hijos, entonces estos componentes son heredados de la clase padre a las clases hijo, con lo cual se consigue que compartan la definición de los campos y métodos del padre, pudiendo además incorporar nuevas funcionalidades a las ya heredadas. PHP implementa la herencia gracias a un mecanismo llamado extensión, este nombre viene del hecho de que por lo general las clases hijo extienden la funcionalidad de la clase padre, al redefinir antiguos métodos o incluir nuevos métodos y campos. Las clases extendidas o clases hijo deben incluir en su definición la palabra reservada 'extends'.
<?php
class Carrito_Con_Nombre extends Carrito {
var $duenyo;

function definir_duenyo ($nombre) {
$this->duenyo = $nombre;
}
}
?>

En este ejemplo se define una nueva clase llamada Carrito_Con_Nombre el cual extiende la clase Carrito, ya que hereda de ella todos sus métodos y campos y, además cuenta con un campo y método propio, entonces un objeto de la clase Carrito_Con_Nombre consistirá en un carrito con los métodos agregar_item como retirar_item que además posee un dueño que puede ser definido con el método definir_duenyo, como podemos verlo al instanciar la nueva clase en el siguiente ejemplo:
<?php
$carrito_n = new Carrito_Con_Nombre; // Crear un carrito con nombre
$carrito_n->definir_duenyo("kris");// Nombrar el carrito
print $carrito_n->duenyo; // imprimir el nombre del dueño
$carrito_n->agregar_item("10", 1); // (funcionalidad heredada de carrito)
?>


Vemos que el objeto posee los métodos de la clase padre y los métodos de su propia clase.

Constructores

El constructor de una clase es un método especial que podemos incluir en su definición, el cual es llamado al momento de hacer una nueva instancia de la clase con new, por ejemplo podemos definir un constructor para una nueva clase que extienda a Carrito de la siguiente forma:
<?php
class Auto_Carrito extends Carrito {
function Auto_Carrito() {
$this->agregar_item("10", 1);
}
}
?>


El constructor debe llevar el mismo nombre de la clase a la que pertenece, como vemos en el ejemplo, el cual nos indica que al crearse una nueva instancia de la clase Auto_Carrito, se incluirá por defecto un primer item en el arreglo al emplear el método heredado agregar_item dentro del constructor.

Un constructor puede además incluir uno o más parámetros en su definición, de forma que podamos enviar valores a este método al instanciar un nuevo objeto de la clase:

<?php
class Constructor_Carrito extends Carrito {
function Constructor_Carrito($item = "10", $num = 1) {
$this->agregar_item ($item, $num);
}
}

// Comprar lo mismo de antes.
$carrito_predeterminado = new Constructor_Carrito;

// Comprar esta vez en serio...
$carrito_diferente = new Constructor_Carrito("20", 17);
?>


En el ejemplo dentro de la definición se utilizaron parámetros con valores por defecto, por lo cual no es necesario que en la primera instancia($carrito_predeterminado) se incluyan nuevos valores, para obtener un resultado diferente vemos que en la segunda instancia($carrito_diferente) ya se incluyen los valores dentro de los paréntesis, de forma que ahora el constructor los incluirá dentro del arreglo asociativo.

Los constructores son muy útiles si deseamos asegurarnos que los campos nuestras clases tengan un valor inicial al crearse una nueva instancia de estas.

Operador de resolución de contexto (::)

El operador :: nos permite acceder a un campo o método de una clase sin la necesidad de tener que hacer una instanciación, como sucede en el siguiente ejemplo:
<?php
class A {
function ejemplo() {
echo "Soy la función original A::ejemplo().<br />\n";
}
}

class B extends A {
function ejemplo() {
echo "Soy la función redefinida B::ejemplo().<br />\n";
A::ejemplo();
}
}

// no hay un objeto de la clase A.
// esto imprime
// Soy la función original A::ejemplo().<br />
A::ejemplo();

// crear un objeto de clase B.
$b = new B;

// esto imprime
// Soy la función redefinida B::ejemplo().<br />
// Soy la función original A::ejemplo().<br />
$b->ejemplo();
?>


El ejemplo anterior llama al método ejemplo() en la clase A, pero no hay un objeto de la clase A, así que no podemos escribir $a->ejemplo() o algo semejante. En su lugar llamamos ejemplo() como un 'método de clase', es decir, un método de la clase misma, no de un objeto de tal clase.

Acceso a los campos y métodos del padre (parent)

Al utilizar herencia o extensión de clases con 'extends', ya nos es posible acceder a los métodos y campos de la clase dentro de los nuevos métodos que definimos en las clases hijo, sin embargo, al realizar una refinación o especialización de un método ya existente, a veces resulta necesario utilizar la funcionalidad del método original antes de incluir nuestros cambios.

Para acceder a un método del padre se utiliza la palabra reservada 'parent' seguida del operador de resolución de contexto (::), acompañado con la referencia al método deseado.

En el siguiente ejemplo se muestra la refinación del método ejemplo() en el cual además de incluirse una nueva funcionalidad se hace uso de la funcionalidad del método original:

<?php
class A {
function ejemplo() {
echo "Soy A::ejemplo() y ofrezco funcionalidad básica.<br />\n";
}
}

class B extends A {
function ejemplo() {
echo "Soy B::ejemplo() y ofrezco funcionalidad adicional.<br />\n";
parent::ejemplo();
}
}

$b = new B;

// Esto hace la llamada a B::ejemplo(), la cual llama a su vez a A::ejemplo().
$b->ejemplo();
?>


A pesar de que los hijos heredan los métodos del padre, al volverlos a definir se hace necesaria una forma para diferenciar el método original del refinado, ya que si nos fijamos en el ejemplo, de haber utilizado la expresión $this->ejemplo() PHP interpretaría que se hace referencia al método del hijo, el cual ya cambió y no se obtendría el resultado deseado, además de que se crearía una problema recursivo.

Con este último ejemplo es que concluye el último artículo de esta semana, para el siguiente veremos las diferencias que tiene la versión 5 del lenguaje para el manejo de objetos y las nuevas funcionalidades que nos ofrece.

Hasta la próxima.

martes, 19 de mayo de 2009

Notas para iniciarse en PHP, Parte 4: Operadores, estructuras de control y funciones


Un pequeño poema escrito en PHP


Operadores

Llamamos operador a cualquier símbolo o expresión que nos permite llevar a cabo una operación con uno o más valores para obtener un valor resultante. Por ejemplo, el siguiente código:
$a = 18;

Consta de un operador de asignación representado por "=", con el cual se asigna el valor de 18 a la variable $a.

Dependiendo del número de variables o valores involucrados, los operadores pueden ser unitarios, al operar sobre un único valor (por ejemplo el operador de incremento ++), binarios, que operan sobre dos valores (estos representan la mayoría de los operadores de PHP, que encontramos listados de forma completa en la sección Precedencia de operadores del manual) y el operador ternario ?:, del que se hablará más adelante.

Dentro del manual vemos que existe un gran grupo de operadores que se clasifican de la siguiente manera:

Operadores aritméticos
Operadores de asignación
Operadores Bit a Bit
Operadores de comparación
Operadores de manejo de errores
Operadores de ejecución
Operadores de incremento
Operadores de lógica
Operadores de cadenas
Operadores de matrices
Operadores de tipo


Estructuras de control

En el último post quedó pendiente seguir hablando sobre las estructuras de control en PHP, para buena fortuna de los programadores de C que lean esto, la gran mayoría de sus estructuras están presentes en este lenguaje:

Estructuras condicionales:
if
else
else if / elseif
switch

Estructuras para bucles
while
do-while
for
foreach

Instrucciones para saltos y rompimientos de ciclos
goto
break
continue


Entre otras novedades con respecto a C, encontramos que else if y elseif son equivalentes para la compilación del programa, también utilizar las palabras reservadas and y or en lugar de || y && respectivamente es totalmente válido.

Las sentencias del lenguaje pueden agruparse dentro de estas estructuras utilizando los clásicos corchetes, pero además el lenguaje nos ofrece la alternativa de utilizar un modo similar al de Python, con los dos puntos ":" y una palabra clave para indicar el inicio y el final de una estructura. Por ejemplo, si tenemos el siguiente código:
#Modo clásico con corchetes de C
if ($a > $b) {
   echo "a es más grande que b";
   $b = $a;
}

También se puede escribir de la siguiente manera:
#Modo similar al de Python, excepto por el uso necesario de paréntesis
if ($a > $b) :
   echo "a es más grande que b";
   $b = $a;
endif;

Como vemos en el enlace de sintaxis alternativas, también aplica para los bucles:
#Modo clásico con corchetes de C
while ($a < $b) {
   echo "a vale $a";
   $a ++;
}

Pudiendo escribir el código anterior como:
#Modo similar al de Python, excepto por el uso necesario de paréntesis
while ($a < $b) :
   echo "a vale $a";
   $a ++;
end while;

Dentro de nuestras estructuras encontramos también otro viejo conocido para muchos veteranos de C, la alternativa muy útil al uso de if - else:
condición ? ejecuta si es cierto : ejecuta si es falso

En casos como el siguiente:
#Modo común usando if - else
if ($a > 0)
   $b = 1;
else
   $b = 2;


Se puede obtener una ejecución idéntica de esta forma:
#Modo alternativo usando "?"  y ":"
$b = ($a > 0)? 1 : 2;

Al asignarle a $b uno de dos valores dependiendo de si la condición $a > 0 es verdadera.


Funciones


Una función consiste un una estructura que contiene código, la cual que puede ser llamada para la ejecución de este código desde otra parte del programa, está puede además recibir uno o más valores llamados parámetros, y devolver un resultado que pueda ser utilizado desde el contexto en que son llamadas.

Las funciones pueden ser definidas por el usuario siguiendo una estructura como la siguiente:


<?php
function foo ($arg_1, $arg_2, ..., $arg_n)
{
   echo "Función de ejemplo.\n";
   return $retval;
}
?>


En donde vemos que es necesario que la declaración de la función sea antecedida por la palabra clave function, seguida del nombre de la función, dentro del paréntesis se pueden declarar uno o más parámetros sin que esto sea obligatorio. La instrucción return sirve para indicar el final de la ejecución de una función, ya que regresa el apuntador de ejecución del programa al punto en el que se mando a llamar a la función ejecutada; al igual que los parámetros, esta instrucción no es indispensable para que una función esté declarada correctamente, de no incluirse un return, la función finalizará al acabar de ejecutar la última instrucción que contenga.

La instrucción return puede incluir un valor de retorno, que puede ser una variable o valor de cualquier tipo (incluyendo arreglos y objetos) que es devuelto al lugar donde se mando ejecutar la función.

En el siguiente ejemplo se muestra la declaración y llamado a una función, que recibe una serie de parámetros y devuelve un valor de retorno:
<?php
//Función que calcula la hipotenusa al cuadrado a partir del valor de dos catetos
function hipotenusa2($a, $b)
{
   $c2 = $a * $a + $b * $b;
   return $c2;
}

$catetoOp = 2;
$catetoAd = 4;
$h2 = hipotenusa2($catetoOp, $catetoAd); //Llamada a la función
echo "La hipotenusa al cuadrado es $h2";
?>

La declaración de la función no necesariamente tiene que aparecer antes de su llamada en el programa, puede declararse en cualquier punto dentro de éste, o incluso encontrarse dentro de otro archivo de código PHP que podemos incluir en nuestro programa, a través de las instrucciones require, require_once, include e include_once. Un ejemplo de un uso muy práctico para esto es tener en un archivo una serie de funciones que serán usados dentro de nuestros programas, y en lugar de volver a escribirlas en cada uno, las incluimos con alguno de estas instrucciones.

A través de las funciones PHP nos ofrece una amplia gama de utilidades para facilitar nuestro trabajo al momento de programar, estas son llamadas funciones internas, a las que podemos acceder de la misma forma a la que a las funciones declaradas por el usuario. Podemos encontrarlas dentro del manual en la sección de referencia de funciones. En los siguientes posts exploraremos algunas funcionalidades muy interesantes que encontramos en esta lista.

Además de las funciones, PHP también soporta la utilización de clases y objetos para estructurar la ejecución del código de nuestros programas, así como las funciones las clases también pueden ser declaradas por el usuario, y además existen clases internas que nos permiten acceder a funcionalidades adicionales a las que ya teníamos con las funciones internas. El tema de las clases y objetos, y la referencia de funciones internas lo encontrarán en nuestro siguiente post.

Hasta la próxima.

miércoles, 13 de mayo de 2009

Notas para iniciarse en PHP, Parte 3: Sintaxis y conceptos básicos




¡Saludos nuevamente!

Este artículo tiene por propósito ayudar a los programadores que inicien en el lenguaje PHP a dar sus primeros pasos con una mayor confianza, ya que tome algunas anotaciones de varios detalles que encontré importantes para comenzar.

Hasta ahora el mejor manual que he encontrado sobre el contenido del lenguaje PHP es el que encontramos en su sitio oficial, que por cierto tengo incluido en la lista de enlaces de este blog, y es al que siempre recurro en caso de una duda sobre las funciones y clases nativas del lenguaje, o sobre cualquier contenido en general. Digo esto porque es de llamar la atención que en algunos foros de programación, se contestan a muchas de las dudas de los usuarios mandándolos a revisar este mismo manual, lo cual habla por un lado de lo útil que resulta esta herramienta y por otro, del gran desconocimiento que tienen los usuarios que inician en PHP sobre a donde acudir para solucionar sus problemas.

Los bloques de código

Dicho esto pasemos a ver un poco sobre las especificaciones del lenguaje, el primer punto es que el código deberá incluirse dentro de etiquetas que indicarán el inicio y finalización de los bloques de código, estas pueden ser las que vimos <?php. . .?> y <script language="php">. . .</script>, como se muestra en el contenido de la página oficial estas son las dos formas que siempre están disponibles en todas las configuraciones por defecto.


1. <?php echo("si quieres servir documentos XHTML o XML, haz como aquí\n"); ?>


2. <? echo ("esta es la más simple, una instrucción de procesado SGML \n"); ?>

<?= expression ?> Esto es una abreviatura de "<? echo expression ?>"


3. <script language="php">

echo ("muchos editores (como FrontPage) no

aceptan instrucciones de procesado");

</script>


4. <% echo ("Opcionalmente, puedes usar las etiquetas ASP"); %>

<%= $variable; # Esto es una abreviatura de "<% echo . . ." %>

En el caso de las etiquetas <?... ?> y <% ... %>, éstas solo estarán disponibles si así se especifica en el archivo de configuración php.ini.

Una de las ventajas que ofrece PHP a los programadores de lenguajes más antiguos como C o PERL es que su sintaxis general es muy parecida a la de estos lenguajes, realmente teniendo dominada la sintaxis de C es bastante sencillo comprender la de PHP, lo que quizas les puede resultar más complicado es la combinación que muchas veces se hace del contenido HTML con código PHP, cosa que iremos viendo en los siguientes ejemplos.

Un programa puede consistir en un archivo HTML con código PHP embebido en estas etiquetas o, en un archivo que incluya solamente una o más bloques de código PHP, y que cualquiera que sea la salida se genere desde las instrucciones de este lenguaje. Un ejemplo de un código embebido en HTML sería el siguiente:
<?php
if ($expression) {
?>
<strong>This is true.</strong>
<?php
} else {
?>
<strong>This is false.</strong>
<?php
}
?>

De este código podemos aprender dos cosas, primero que las instrucciones de control condicionales if y else del lenguaje son similares a las de C, y segundo que es posible separar en diferentes script la ejecución de un solo bloque de código. Lo que ocurrirá en la ejecución de este código es que si la variable $expresion, contiene un valor verdadero, se mostrará el mensaje This is true, porque cuando PHP encuentra la etiqueta ?> de fin de bloque, empieza a escribir lo que encuentra tal cual hasta que se topa con otra etiqueta de inicio de bloque, en caso de que la condición sea falsa, ignorará todo lo que este contenido entre sus llaves de apertura y de cierre { ... }, sin importar que se encuentren dentro de bloques de código diferentes, siguendo la ejecución del programa se mostraría el mensaje This is false.

Este ejemplo, a pesar su simplicidad es importante, ya que resulta más eficiente mandar a desplegar contenido HTML en pantalla separandolo del código PHP de manera similar, en lugar de desplegarlo desde las funciones echo() o printf(), como es común que suceda en muchos ejemplos por la red.

Separación de instrucciones

Al igual que en lenguajes como C o PERL las instrucciones se separan unas de otras utilizando el caracter punto y coma ";". En caso de que una instrucción sea la última dentro de un bloque de código, este separador puede ser omitido.

Comentarios

PHP también soporta los tipos de comentarios de C y C++ indicados por los caracteres /* */ y //, agregando además los comentarios de una sola línea indicados por #:
<?php
echo "This is a test"; // Comentario estilo C++ de una sola línea
/* Comentario estilo C++ de múltiples líneas
que permite realizar saltos de línea */
echo "This is yet another test";
echo "One Final Test"; # Comentario estilo línea de comandos (shell) de una solo línea
?>

Tipos de datos en PHP


PHP soporta varios tipos de datos existentes en otros lenguajes, pero con la gran diferencia de que las variables en PHP no necesitan de una declaración del tipo de dato que poseerán, PHP asume el tipo de dato de que se trata a partir del valor que el programador asigne a esas variables, además, las variables son dinámicas ya que en tiempo de ejecución pueden adquirir valores de distintos tipos de datos. Basta con que una expresión sea precedida por el caracter de signo de pesos "$" para que esta represente una variable.

PHP soporta ocho tipos primitivos.
*Nota: A diferencia de otros lenguajes no existe una diferencia entre el tipo double y float en PHP, cualquiera de los dos son equivalentes para representar números de punto flotante, solo que en los manuales más actuales se utiliza normalmente solo float.

El siguiente ejemplo de código muestra la forma de declarar variables con distintos tipos de datos en PHP:
<?php
$un_bool = TRUE; // un valor booleano
$un_str = "foo"; // una cadena
$un_str2 = 'foo'; // una cadena
$un_int = 12; // un entero

echo gettype($un_bool); // imprime: boolean
echo gettype($un_str); // imprime: string

// Si este valor es un entero, incrementarlo en cuatro
if (is_int($un_int)) {
$un_int += 4;
}

// Si $bool es una cadena, imprimirla
// (no imprime nada)
if (is_string($un_bool)) {
echo "Cadena: $un_bool";
}
?>

Una anotación importante es que PHP realiza conversiones entre los tipos de datos de forma automática al ejecutar algunas de las instrucciones de nuestros programas, por ejemplo, al sumar un valor entero con una cadena que contiene un número, automáticamente convertirá la cadena en un valor numérico para realizar la suma. Dentro del manual encontramos un apartado dedicado a este tipo casos, llamado manipulación de tipos de datos. Algo similar sucede al someter el valor de una variable a un bloque condicional -como un if o un switch-, si el valor no es de tipo booleano PHP automáticamente realizará la conversión de este valor a un booleano equivalente, lo cual puede apreciarce en la tabla de comparación de tipos del manual.

Otros conceptos básicos
  • Los nombres de las variables son sencibles a mayúsculas y minusculas.
  • Los nombres de las variables siguen las mismas reglas que otras etiquetas en PHP. Un nombre de variable válido tiene que empezar con una letra o un carácter de subrayado (underscore), seguido de cualquier número de letras, números y caracteres de subrayado.
  • De forma predeterminada las variables se asignan por valor, pero php ofrece la opción para asignar por referencia. Basta con que se agregue el caracter ampersan '&' antesediendo el nombre de la variable referenciada en la asignación, para obtener la referecia a esta variable, por ejemplo:
    <?php
    $foo = 'Bob'; // Asigna el valor 'Bob' a $foo
    $bar = &$foo; // Referenciar $foo vía $bar.
    $bar = "Mi nombre es $bar"; // Modificat $bar...
    echo $foo; // $foo también se modifica.
    echo $bar;
    ?>
  • Una variable no necesariamente tiene que ser inicializada para poder utiizarla, pero es una buena prácticar el hacerlo. Las variables no inicializadas toman un valor predeterminado dependiendo del contexto en el que se estén utilizando, así, una variable de tipo bool poseerá un valor por defecto de false, los enteros y flotantes tendrán cero, las cadenas se establecen como una cadena vacía y las matrices se convierten en una matriz vacía.
  • Una forma infalible para detectar si una variable ha sido o no inicializada es utilizar la función del lenguaje isset().
Al internarse en la información sobre las variables en PHP nos encontramos además con las variables predefinidas del lenguaje, que se trata de un conjunto de variables que nos proporcina PHP para realizar gran cantidad de tareas. Éstas son de gran importancia ya que a través de ellas es que podemos acceder a la información del servidor Web, leer los datos de los formularios, leer el contenido de las cookies y las sesiones, entre otras cosas, por lo que su aplicación merece un post completo, por lo que lo veremos este temas en un siguiente artículo.

El ámbito de las variables es el contexto dentro del cual una variable está definida, este es importante porque nos indica las regiones del código desde las cuales una variable puede ser accedida. Por fortuna el ámbito de las variables en PHP es de tipo simple, ya que basta con declarar una variable en cualquier bloque de código, para accederla desde cualquier otro bloque del archivo o dentro de otros archivos de código incluidos o requeridos. Este ámbito puede verse limitado solamente por el uso de funciones o clases.

También es posible declarar constantes dentro de nuestro programas a través de las funciones define(). Esta función solo aceptan valores escalares. Las constantes tienen la caracteristica de que se declaran sin utilizar el signo de pesos "$" de las variables.

Las estructuras de control del lenguaje son bastante similares a las de C, como vemos se trata de un gran número, ya que el manual de PHP dedica un solo capítulo a su estudio. Una de las que encuentro más interesante es la sentencia foreach, ya que además de no tener un equivalente en C, nos permite acceder dentro de un ciclo a cada uno de los valores de un arreglo de forma más sencilla, ya sea de forma simple:
<?php
$arreglo = array("uno", "dos", "tres");
foreach ($arreglo as $valor) {
echo "Valor: $valor";
}
?>
en la que se extraen solo los valores del arreglo, o de forma indexada:
<?php
$arreglo = array("uno", "dos", "tres");
foreach ($arreglo as $llave=>$valor) {
echo "Llave: $llave, valor: $valor";
}
?>
en la que además de los valores obtenemos la llave de cada valor, que corresponde al valor en el indice del arreglo que ocupan cada uno de los valores.

Y es hasta aquí donde llega este post, en los siguientes artículos veremos la forma de implementar funciones dentro del lenguaje, otras estructuras de control, el uso de variables predefinidas para leer datos de los formularios, y el manejo de clases y objetos en las versiones 4 y 5 del lenguaje.

Hasta la próxima.