Navegando por la red he encontrado este vídeo/parodia, bastante gracioso, que intenta reflejar cómo sería matrix corriendo sobre un sistema Windows.
Buscando unos trucos para mejorar unas búsquedas en Google, me encuentro con un post de tufuncion.com donde se explican 20 trucos para mejorar nuestras búsquedas.
Algunos de estos trucos son muy conocidos, pero hay otros muy interesantes como el que permite encontrar caras.
Os recomendio leer el artículo completo con todos los trucos para mejorar los resultados de nuestras búsquedas.
Joost de Valk nos ofrece una buena guía SEO (en inglés) para mejorar el posicionamiento de nuestro blog WordPress.
Interesante característica la que incluye Microsoft en su Internet Explorer 8 para disponer de múltiples sesiones con un sólo navegador.
Este sistema nos ofrece la posibilidad de acceder a un único servicio con diferentes identidades, con lo que ya no vamos a necesitar abrir diferentes navegadores o utilizar máquinas virtuales para, por ejemplo, probar dos tipos de cliente en una tienda virtual (cliente VIP, distribuidor…) o para acceder a más de una cuenta de correo mismo tiempo (Gmail, Hotmail…).
Para ver qué sucede cuando no utilizamos este sistema podemos realizar la siguiente prueba: abrimos dos ventanas o dos pestañas de Firefox o Internet Explorer, nos identificamos en nuestra cuenta de algún servicio (tienda virtual, cuenta de correo, blog, portal ,etc) y abrimos la misma página desde la otra pestaña o ventana. Si no hemos creado una nueva sesión, veremos que la página nos identifica con los datos introducidos en la otra pestaña o ventana. Por el contrario, si hemos creado una nueva sesión, la página nos pedirá que nos identifiquemos en cada ventana/sesión.
Un namespace o espacio de nombres es un medio para organizar/encapsular clases, funciones, constantes… dentro de un entorno, agrupándolas de un modo más lógico y jerárquico, de la misma forma que los directorios agrupan a los archivos dentro de un sistema de ficheros.
Ésta es una característica bastante esperada por los desarrolladores de PHP y llega con el objetivo de ayudar a que no necesitemos prefijar el nombre de nuestras clases con el nombre del paquete al que pertenecen y, por tanto, que podamos tener nombres más cortos. También nos ofrece la posibilidad de declarar varias clases con el mismo nombre y/o que un grupo de desarrolladores pueda trabajar en varios componentes de un mismo proyecto sin que se produzcan colisiones durante la integración.
Los namespaces están especialmente indicados cuando trabajamos en proyectos de gran envergadura, como por ejemplo, un Framework PHP. En algunos Frameworks podemos llegar a encontrar nombres realmente complejos, por no decir imposibles (Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive).
Al buscar información sobre cómo declarar un namespace en PHP es muy fácil que encontremos varias formas de hacerlo. Esto se debe a que, en un principio, los creadores de PHP optaron por el formato: mi::namespace, pero tanto en las versiones candidatas (RC) como en la versión final de PHP 5.3, el separador que se ha elegido es la barra invertida: mi\namespace. Con este cambio se consiguen evitar problemas como el que se podía producir entre las funciones declaradas dentro de un nombre de espacio y los métodos estáticos de una clase. Sin este cambio de separador, ambas llamadas serían exactamente iguales (mi::namespace) y esto haría que los namespaces no tuviesen mucho sentido.
IMPORTANTE: Los namespaces deben declararse en la parte más alta de nuestro código, siendo las sentencias declare las únicas permitidas. Por ejemplo, la declaración de la codificación del archivo.
declare(encoding='ISO-8859-1');
Declaración básica
namespace MiEspacio; const CONSTANTE = 1; class mi_clase { /* ... */ } function mi_funcion() { echo "Mi Funcion"; }
Declaración de subniveles
namespace MiEspacio\MiSubnivel1\MiSubnivel2; const CONSTANTE = 1; class mi_clase { /* ... */ } function mi_funcion() { echo "Mi Funcion"; }
Declaraciones múltiples en un sólo archivo
Cuando se declaran múltiples nombres de espacio en un mismo archivo se recomienda utilizar los corchetes para delimitar el código de cada namespace y se exige que todo el código del archivo vaya dentro de los mencionados corchetes, excepto las sentencias declare que pueden ir fuera.
Si no cumplimos esta regla obtendremos el siguiente mensaje de error:
No code may exist outside of namespace {}
namespace MiEspacio { const CONSTANTE = 1; class mi_clase { /* ... */ } function mi_funcion() { echo "Mi Espacio - Mi Funcion"; } } namespace MiOtroEspacio { const CONSTANTE = 1; class mi_clase { /* ... */ } function mi_funcion() { echo "Mi Otro Espacio - Mi Funcion"; } }
Uso de declare y el espacio de nombres global
declare(encoding='UTF-8'); namespace MiEspacio { const CONSTANTE = 1; class mi_clase { public static function hola () { echo "Hola"; } } function mi_funcion() { echo "Mi Funcion"; } } // Espacio Global namespace { session_start(); MiEspacio\mi_funcion(); MiEspacio\mi_clase::hola(); echo MiEspacio\CONSTANTE; }
Para realizar la llamada a un namespace deberemos aplicar las misma reglas que aplicamos cuando accedemos a un recurso dentro de nuestro sistema de archivos.
Ruta relativa
/* Crea una instancia de MiEspacio\mi_clase */ $resultado = new mi_clase(); $resultado::hola(); mi_clase::hola(); mi_funcion(); /* Crea una instancia de MiEspacio\MiSubnivel1\MiSubnivel2\mi_clase */ $resultado = new MiSubnivel1\MiSubnivel2\mi_clase(); $resultado::hola(); MiSubnivel1\MiSubnivel2\mi_clase::hola(); MiSubnivel1\MiSubnivel2\mi_funcion();
/* Espacio de nombres actual - Uso de la constante __NAMESPACE__ */ namespace MiEspacio; echo __NAMESPACE__; // SALIDA: MiEspacio
/* Espacio de nombres actual - Uso de la constante __NAMESPACE__ */ namespace { // No devuelve nada si nos encontramos en el namespace global echo __NAMESPACE__; // SALIDA: }
/* Espacio de nombres actual - Construcciones dinamicas con __NAMESPACE__ */ namespace MiEspacio; function get($clase) { $nombre = __NAMESPACE__ . '\\' . $clase; // Devulve una nueva instancia de la clase MiEspacio\$clase return new $nombre; }
/* Espacio de nombres actual - Uso de la palabra clave namespace */ namespace MiEspacio; // Realiza una llamada a la funcion MiEspacio\mi_funcion() namespace\mi_funcion(); // Realiza una llamada a la funcion MiEspacio\MiSubnivel1\MiSubnivel2\mi_funcion() namespace\MiSubnivel1\MiSubnivel2\mi_funcion(); // Realiza una llama al metodo estatico hola() de la clase MiEspacio\mi_clase namespace\mi_clase::hola(); // Asigna el valor de la constante MiEspacio\Constante a la variable $mi_constante $mi_constante = namespace\CONSTANTE;
Ruta absoluta
$resultado = new \MiEspacio\MiSubnivel1\MiSubnivel2\mi_clase(); \MiEspacio\MiSubnivel1\MiSubnivel2\mi_clase::hola();
Espacio Global
// Crea un nueva instancia de la clase global Exception $exception = new \Exception('error');
Alias e importación
PHP ofrece la posibilidad de referirse a un namespace mediante un Alias y la posibilidad de importarlo utilizando el operador use.
Los alias se pueden crear sobre una clase o sobre un namespace, pero no existe la posiblidad de crear alias sobre una función o una constante:
Podemos crear alias:
No podemos crear alias:
namespace NuevoEspacio; /* Mediante el alias conseguimos acortar el nombre del namespace */ use MiEspacio\MiSubnivel1\MiSubnivel2\mi_clase as MiClase; /* Cuando no se indica un alias se toma el nombre del namespace o de la clase */ /* Equivale a: use MiEspacio\MiSubnivel1\MiSubnivel2 as MiSubnivel2; */ use MiEspacio\MiSubnivel1\MiSubnivel2; /* Importamos una clase global */ use \ArrayObject; /* Nueva instancia de NuevoEspacio\MiClase */ $mc = new namespace\MiClase; /* Nueva instancia de MiEspacio\MiSubnivel1\MiSubnivel2\mi_clase */ $mc = new MiClase; /* Llamamos a la funcion MiEspacio\MiSubnivel1\MiSubnivel2\mi_funcion() */ MiSubnivel2\mi_funcion(); /* Creamos una nueva instancia de ArrayObject */ /* Sin la importacion: use \ArrayObject; creariamos una instancia de NuevoEspacio\ArrayObject; */ $arrobj = new ArrayObejct (array(1)); /* Importacion multiple en una sola linea */ use MiEspacio\MiSubnivel1\MiSubnivel2\mi_clase as MiClase, MiEspacio\MiSubnivel1\MiSubnivel2;
Fuente: PHP.net