Archivo de la etiqueta: Source code

Funciones anonimas en PHP – PHP Tips

El otro día en la entrada cargando clases php automaticamente en el ultimo ejemplo usaba una función anomima o clausura para lanzar la función spl.

La definición que nos da la documentación es:

Las funciones anónimas, también conocidas como clausuras (closures), permiten la creación de funciones que no tienen un nombre especificado.
 

Estas funciones fueron introducidas en PHP 5.3 y su uso es prácticamente igual que cuando definimos funciones en Javascript.


//Ejemplo de definición de función en Javascript

var miFuncion = function (nombre) {

document.write('Tu nombre es ' + nombre);

};

miFuncion('Ruben'); // Escribe 'Tu nombre es Ruben'


// Ejemplo de definición de función anónima en PHP

$miFuncion = function ($nombre) {

echo 'Tu nombre es '. $nombre;

}

$miFuncion('Ruben'); //Escribe 'Tu nombre es Ruben'

Se puede ver en los dos ejemplos que el uso y definición de ambas es prácticamente igual. Otro de los usos para estas funciones es como callback en funciones tengan esa opción.


echo preg_replace_callback('~-([a-z])~', function ($coincidencia) {
return strtoupper($coincidencia[1]);
}, 'hola-mundo');
// Devuelve holaMundo

Para mas información sobre las funciones anónimas http://www.php.net/manual/es/functions.anonymous.php

Enhanced by Zemanta
Anuncios

Cargando clases PHP automaticamente – PHP Tips

Una de las cosas que pueden resultar mas tediosas, por lo menos para mi, a la hora de programar es ir cargando las dependencias necesarias del fichero para que todo funcione. Con PHP podemos usar las funciones de auto carga para que cada vez que se llame a una clase esta se cargue.

Supongamos el siguiente escenario, tenemos todas las clases en el directorio clases y el fichero donde se define cada una de estas tiene el mismo nombre que la clase. Podríamos crear la siguiente función y con esta cuando creemos un nuevo objeto de la clase se cargara automáticamente.


function __autoload($clase) {
    include 'clases/' . $clase . '.php';
}

A partir de  PHP 5 >= 5.1.2 podemos usar la función spl_autoload_register para la carga automática de clases.


function miAutocargador($clase) {
    include 'clases/' . $clase . '.php';
}

spl_autoload_register('miAutocargador');

Y para simplificarlo un poco mas, a partir de la versión PHP 5.3 podemos lanzar una función anónima para realizar lo mismo de antes


spl_autoload_register(function ($clase) {
    include 'clases/' . $clase . '.php';
});

Para que esto funcione, tiene que cargarse esta función en el fichero en el que queramos que se ejecute la carga, lo ideal en estos casos es si se tiene un fichero de constantes o funciones auxiliares, que se utilicen en todo el proyecto incluir esta función en este.

Mas información:

http://www.php.net/manual/es/function.spl-autoload-register.php

Enhanced by Zemanta

Input autocompletable sin Javascript – HTML Tips

El elemento datalist

Otro de los nuevos elementos que trae el HTML5 es el elemento datalist.  La documentación acerca de este elemento nos dice lo siguiente:

The datalist element represents a set of option elements that represent predefined options for other controls. In the rendering, the datalist element represents nothing and it, along with its children, should be hidden.
 

Es decir, el elemento datalist representa un conjunto de opciones que nos muestran opciones predefinidas para otros controles. En la visualización el elemento y sus hijos están ocultos.

¿Como podemos utilizarlo?

A la hora de incluirlo dentro de nuestro código definimos el elemento y su conjunto de opciones, este elemento lo vincularemos por ejemplo con un campo input


<label>Airport: <input type="text" list="airports" name="to" />
<datalist id="<span class=&quot;hiddenSpellError&quot; pre=&quot;&quot;>airports</span>"></datalist>
value='ATL' label="Atlanta">
value='MEM' label="Memphis">
value='LHR' label="London Heathrow">
value='LAX' label="Los Angeles">
value='FRA' label="Frankfurt">
 </datalist>

Al pulsar la tecla L se muestra los aeropuertos que empiezan con L
Al pulsar la tecla L se muestra los aeropuertos que empiezan con L

Como se ve en la imagen, nos aparece el value en negrita y  el valor de label un poco mas claro, y una vez seleccionado el valor, en el campo de texto se queda el valor del value.

Estos elementos pueden ser reutilizados dentro de una pagina web, por ejemplo si quisiéramos poner una lista de aeropuertos de origen y destino, nos podría valer con el mismo datalist.

Este elemento esta soportado por todos los navegadores a excepción de Safari.

Mas información:

http://www.w3.org/TR/html5/forms.html#the-datalist-element

http://www.w3schools.com/tags/tag_datalist.asp

Enhanced by Zemanta

Uso de Foreach y For (Parte III Diferencias) – PHP Tips

Esta es la ultima entrada de la trilogía del uso de Foreach y For, en ella vamos a ver las principales diferencias y ventajas de uno sobre otro.

El foreach no es un bucle

De primeras la principal diferencia la tenemos en la propia definición, ya que el foreach no es un bucle sino un constructor, el cual solo puede iterar en arrays y objetos, en cambio el for es un bucle, es decir, se repite tantas veces como nosotros queramos.

El foreach no puede recorrer cadenas de texto.

En uno de los ejemplos de uso de for, veíamos como podíamos recorrer carácter a carácter una cadena de texto, en cambio con el foreach no podemos hacerlo

En el foreach no es necesario poner el tamaño del array.

En el uso del for, a la hora de recorrer un array, tenemos que especificar hasta que posición tenemos que recorrerla, en cambio en foreach nos lo recorre del principio a fin. Esto supone una ventaja sobre el for, ya que en este si no especificamos bien el tamaño podemos obtener un error.

Cosas que apriori no se pueden hacer con el foreach

Modificar los valores de un array/objeto

Como vimos en la entrada del foreach, apriori no se pueden modificar los elementos de un array usando el foreach, y en realidad si que se puede hacer pasando el valor por referencia.

Recorrer un array al revés

Si vemos el funcionamiento del foreach, este realiza una copia del array, sitúa el puntero en el primer elemento y lo recorre hasta el final, según esto no seria posible recorrer un array de forma inversa, algo que con el bucle for, podríamos hacerlo de una manera sencilla, pero podemos hacerlo también con el foreach usando la función array_reverse dentro de la definición del foreach


$array = array(1, 2, 3, 4);
foreach (array_reverse($cadena) as $var) {
echo $var.PHP_EOL;
}

En este ejemplo se nos mostraría los valores de la $array empezando desde el final, y si mostramos $array una vez finalizado, podremos ver que los valores no han modificado su orden, ya que el array_reverse se aplica solo a la copia de $array.

 

Conclusiones

Tengo que decir que en mi día a día uso mas veces el foreach que el for, el for solo lo utilizo cuando tengo que mostrar un numero determinado de mensajes, y en el caso de recorrer arrays suelo usar siempre el foreach, lo veo mas seguro, y me permite recorrer de una manera sencilla arrays con clave de texto.

Con estas entradas he intentado cubrir las características tanto del bucle for como del constructor foreach, seguramente me habré dejado algún ejemplo o alguna característica. Agradeceré vuestros comentarios, sugerencias y preguntas.

 

 

 

Enhanced by Zemanta

Uso de Foreach y For (Parte I el Bucle For) – PHP Tips

Hace unos días @chupetho76 pedía en Twitter  tips para usar el foreach, en base a esa petición voy ha hacer un tips en el cual explicar el for, el foreach y sus diferencias.
En esta primera entrada de una serie de tres explicare el bucle for.

Bucle For

El manual de PHP define el bucle for como:

Los bucles for son los más complejos en PHP. Se comportan como sus homólogos en C. La sintaxis de un bucle for es:

for (expr1; expr2; expr3)
    sentencia

La primera expresión (expr1) es evaluada (ejecutada) una vez incondicionalmente al comienzo del bucle.

En el comienzo de cada iteración, se evalúa expr2. Si se evalúa como TRUE, el bucle continúa y se ejecutan la/s sentencia/s anidada/s. Si se evalúa como FALSE, finaliza la ejecución del bucle.

Al final de cada iteración, se evalúa (ejecuta) expr3.

Cada una de las expresiones puede estar vacía o contener múltiples expresiones separadas por comas. En expr2, todas las expresiones separadas por una coma son evaluadas, pero el resultado se toma de la última parte. Que expr2 esté vacía significa que el bucle debería ser corrido indefinidamente (PHP implícitamente lo considera como TRUE). Esto puede no ser tan inútil como se pudiera pensar, ya que muchas veces se debe terminar el bucle usando una sentencia condicional break en lugar de utilizar la expresión verdadera del for.

El bucle for es uno de los mas comunes en programación, haciendo un poco de memoria rápida creo que esta presente en la mayoría de lenguajes de programación, aunque la estructura puede variar un poco.

Su uso mas común, es el repetir un numero de veces una secuencia predeterminada.

for ($i=0; $i < 10; $i++) {
    echo "Hola, soy el saludo numero " . $i . PHP_EOL;
}

Este código nos mostrara el mensaje 10 veces y los números que aparecerán serán del 0 al 9.

El análisis de las expresiones en este ejemplo seria: Desde que $i es 0 y mientras $i sea menor que 10 suma 1 a $i. En la primera pasada el valor de $i es 0 ya que la suma la efectúa en la siguiente iteración. Si quisiéramos que el primer numero fuera 1 tendriamos que cambiar el $i=0 a $i=1.

¿Si cambiaramos el $i++ a ++$i, se empezara desde el 1?

La respuesta a esta pregunta es no, ya que la expr2, como dice la definición de arriba si bien se evalúa al principio, el resultado se toma al final, por lo tanto el primer valor en ambos casos es 0.

Otras características del bucle for, es que se pueden poner mas condiciones dentro de las expresiones, separadas por comas.

for ($i=0, $j=9; $i < 10, $i++, $j--) {
    echo "Hola, soy el saludo numero ". $i ." quedan ". $j ." . PHP_EOL;
}

Este código nos mostraría por ejemplo “Hola, soy el saludo numero 0 quedan 9”, e iría incrementando el $i y decreciendo el $j.

También podemos dejar alguna expresión vacía, aunque tenemos que tener cuidado a la hora de escapar del bucle ya que podemos caer en uno de los problemas que tiene el bucle for, entrar en bucle infinito.

for ($i = 1; ; $i++) {
    if ($i > 10) {
        break;
    }
    echo $i;
}

En este ejemplo la expr1 esta vacía, y controlamos con un if si el valor es mayor que 10, si lo es, escapamos del bucle con el break;

Recorrer cadenas de texto

Otro uso que puede tener el for es recorrer cadenas de texto carácter a carácter.

$cadena = "Hola mundo";
for ($i=0; $i < strlen($cadena); $i++) {
    echo $cadena[$i] . PHP_EOL;
}

Este código nos mostrara por pantalla carácter a carácter la cadena de texto, una por linea.

Recorrer Arrays

También podemos recorrer arrays con el bucle for

$array = array('Hola', 'Mundo', 'Hello', 'World');
for ($i=0; $i < count($array); $i++) {
    echo $array[$i].PHP_EOL;
}

En este ejemplo mostramos por pantalla cada uno de los elementos del array.

Recorrer letras

for ($i='a'; $i < 'z'; $i++) {
    echo $i.PHP_EOL; // Mostraria a, b, c, d, e.. hasta la y
}

Si quisiéramos mostrar el abecedario completo, hasta la z tendríamos que hacerlo de otra manera ya que la comparación en la expresión $i <= ‘z’ no funcionara y nos mostrara hasta ‘yz’. Para mostrar hasta la z podemos, o bien sustituir en la función anterior la ‘z’ por ‘aa’ o bien hacer el bucle asi:

for ($i ='a'; ; $i++ ) {
    echo $i.PHP_EOL; // Mostrariamos de la a hasta la z
    if ($i == 'z') {
        break;
    }
}

En este ejemplo vemos también el no uso de la expr1 y la salida del bucle por medio del break dentro de una condición.

Este bucle también funcionaria con las mayúsculas, y el abecedario que mostrara por pantalla es el ingles (sin ñ).

Problemas del For

Los mayores problemas del for son el entrar en bucle infinito y el desbordamiento de buffer.

Tanto en el primero como en el segundo es muy fácil caer, es tan simple como confundirse en la expr1, y establecer que se remita mientras el valor sea menor que 0 ” $i > 0″ y en el desbordamiento, el cual es mas común al recorrer arrays es establecer el numero máximo mayor que el numero de elementos. En el ejemplo de la cadena de texto he usado strlen para detectar la longitud de cadena y en el del array el count para contar el numero de elementos del array, tanto en uno u otro el criterio lo he establecido de la siguiente manera “$i < numeroTotal” en muchos sitios se utiliza este otro criterio “$i <= numeroTotal -1” que viene a significar lo mismo que el anterior pero mas corto.

¿Se pueden recorrer arrays con clave no numérica con el bucle for?

Sin tener el cuenta el ejemplo del bucle del alfabeto, la respuesta simple seria no, pero podríamos recorrer un array de claves no numéricas si este tiene las claves definidas como una de esas letras, siempre y cuando las letras estuvieran ordenadas, y no faltara ninguna entre medio, ya que si no devolvería error. Luego otra manera, que no seria directa seria crear una matriz numérica que tuviera como valores las claves del array que queremos recorrer.

http://es1.php.net/manual/es/control-structures.for.php

Enhanced by Zemanta

Formato Fecha en MySQL – MySQL Tips

Una de las “pegas” que tiene MySQL es que por defecto gestiona las fechas en modo ’00-00-0000′ es decir año-mes-dia. Y siempre nos toca crear una función para transformar estas fechas tanto al pasarlas a la base de datos, como para recuperarlas. A la hora de la recuperación algo que nos puede ahorrar trabajo es, a la hora de realizar la consulta, devolver la fecha formateada, para ello utilizaremos DATE_FORMAT.

Nuestra consulta podría quedar de la siguiente manera


SELECT id, name, DATE_FORMAT(date, '%d-%m-%Y) as date

Como primer parámetro de DATE_FORMAT especificamos el campo que contiene la fecha, y luego como segundo parámetro especificamos el formato en el cual queremos que nos devuelva la fecha en este caso sera ’00-00-0000′

 

Mas información en http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-format

Enhanced by Zemanta

Clase para la devolución de la entrada por teclado con JAVA

Duke, the Java Mascot, in the waving pose. Duk...
Image via Wikipedia

Hay trozos de código que nos cansamos de escribirlos constantemente, y en la mayoría de los casos acabamos copiandola y pegándola de una aplicación a otra. Uno de estos trozos podria ser el recoger datos de teclado en una clase JAVA y devolverlos por pantalla.

package entrada;
import java.io.*;
/**
 * @author Ruben Lacasa
 *
 */
public class Entrada {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String param = getEntrada("Introduzca un texto: ");
		System.out.println("Has introducido " + param);
	}
	/**
	 * Recoge lo que hemos escrito y lo devuelve
	 * 
	 * @param peticion
	 * @return
	 */
	public static String getEntrada(String peticion) {
		BufferedReader stdin = new BufferedReader(
				new InputStreamReader(System.in));
		System.out.print(peticion);
		System.out.flush();
		try {
			return stdin.readLine();
		} catch (Exception e) {
			return "Error: " + e.getMessage();
		}
	}
}

Esta funcion tambien esta disponible como Gist en Github aqui