Registry Pattern en PHP5

El registry pattern, pese a su simplicidad, es un patrón sumamente útil para nuestros desarrollos en OOP.

En resumidas palabras, el Registry Pattern, es un medio simple y eficiente de compartir datos y objetos en nuestra aplicación sin tener que preocuparse de mantener numerosos parámetros o hacer uso de variables globales.

El objeto que compone el patrón simplemente debe contener un array compuesto de pares clave – que podrán ser datos simples u objetos de cualquier tipo. Así mismo también se puede proveer al objeto registry de mecanismos de control para la gestión de los elementos insertados en su array (cantidad de elementos, control de duplicaciones de key, eliminación de elementos, etc.).

Veamos un pequeño ejemplo:

<?php
class Registry
{
private $datos = array();

public function add($key, $object)
{
if(!isset($this->datos[$key]))
{
$this->datos[$key] = $object;
}
}

public function remove($key)
{
if(!isset($this->datos[$key]))
{
unset($this->datos[$key]);
}
}

public function get($key)
{
if(!isset($this->datos[$key]))
{
return $this->datos[$key];
}
}

public function exist($key)
{
if(isset($this->datos[$key]))
{
return true;
}
else return false;
}
}
?>

Luego podemos usar la clase Registry instanciandola:

$registry = new Registry();
if(!$registry->exist(“usuario”)) $registry->add(“usuario”, $usuario);

$usuario = $registry->get(“usuario”);

De esta manera podemos asegurar que tendremos accesibles las variables y objetos que queramos siempre que pasemos el objeto registry al constructor de cualquiera de esos objetos.

¿Más simple imposible no?

Bien, hasta aquí esta nueva pequeña introducción a los patrones de diseño… esperamos vuestros comentarios y aportaciones.

Màrius Armenteras Comellas

Factory Pattern en PHP5

Factory Pattern es un patrón de diseño cuya función es, como su nombre indica, fabricar instancias de objetos en tiempo de ejecución.
Básicamente se trata de un método estático que, mediante un parámetro, tomará la decisión de devolver una instancia de una clase (o generalmente una subclase).

Esta funcionalidad puede permitir modificar partes concretas de una aplicación sin que esto afecte al resto.

El ejemplo que se incluye a continuación esboza, de forma simple, lo que puede aportar este patrón de diseño. Imaginemos que nuestro sistema de usuarios obtiene el nombre del mismo extrayéndolo de una BBDD. Podríamos realizar la programación teniendo esto en cuenta y nuestro código funcionaria a la perfección. ¿Pero que pasaría si un nuevo requisito fuera que los datos de esos usuarios se obtuvieran de un XML? Con seguridad deberíamos modificar bastantes partes de nuestro código, teniendo mucho cuidado que estas modificaciones no causen efectos colaterales no deseados. Todo esto lo podemos solucionar con una estructura como la que sigue.

Las clases que obtendrán los datos las hacemos implementar un interface común (en este caso un método getNombre) y una clase que será la propia fábrica en si: UsuarioFactory.

<?php

interface IUsuario

{

function getNombre();

}

class Usuario implements IUsuario

{

public function __construct($id) {}

public function getNombre()

{

return “Nombre del usuario”;

}

}

class UsuarioFactory

{

public static function crear($id)

{

return new Usuario($id);

}

}

$usuario = UsuarioFactory::crear(1);

echo $usuario->getNombre();

?>

Evidentemente esta es una aproximación muy simplificada de este conocido patrón de diseño, aunque espero que resulte útil como primera toma de contacto.

Five common PHP design patterns
Patterns For PHP

Màrius Armenteras Comellas

XML en PHP5 con SimpleXML

Antes de PHP5 trabajar con XML podía resultar engorroso. La forma habitual de manipular XML era usar las API propuestas por SAX (Simple API for XML) y DOM-XML (Document Object Model XML).

Con la aparición de PHP5 se incorpora una tercera opción que, sin duda, facilitará la vida a aquellos que deban trabajar con XML. Se trara de simpleXML.

Hay varias maneras de trabajar con simpleXML:

Cargando el XML desde un string:

$stringXML = file_get_contents( ‘file.xml’ );

$file = simplexml_load_string( $stringXML );

Cargando el archivo XML directamente:

$file = simplexml_load_file(“file.xml”);

O con un estilo más OO:

$file = new SimpleXMLElement(‘file.xml’, null, true);

Con estas simples sentencias tendremos un array $file con el contenido estructurado del XML.
Una vez tenemos esta información ya podemos empezar a manipular o filtrar los datos.
Para obtener resultados concretos del árbol de datos generado podemos usar la potente sintaxis de XPATH:

file.xml

<?xml version=”1.0″ encoding=”UTF-8″?>

<simplexml>

<persona>

<nombre>Ned</nombre>

<apellido>Stark</apellido>

</persona>

<persona>

<nombre>Jon</nombre>

<apellido>Nieve</apellido>

</persona>

<persona>

<nombre>Bran</nombre>

<apellido>Stark</apellido>

</persona>

<persona>

<nombre>Jaime</nombre>

<apellido>Lannister</apellido>

</persona>

<persona>

<nombre>Tyrion</nombre>

<apellido>Lannister</apellido>

</persona>

</simplexml>

Para obtener los nodos persona que contengan un apellido en concreto:

<?php

$xml_file = simplexml_load_file(“file.xml”);

foreach($xml_file->xpath(“//*[contains(apellido,'Stark')]“) as $persona)

{

printf(“%s – %s <br>”, $persona->nombre, $persona->apellido);

}

?>

En el caso de tener que alterar los datos del XML es muy práctico trabajar con el método más OO style:

$file = new SimpleXMLElement(“file.xml”, null, true);

$persona = $file->addChild(“persona”);

$persona->addChild(“nombre”,”Rickon”);

$persona->addChild(“apellido”, “Stark”);

Más simple imposible no?

Tras todas las modificaciones podemos obtener el XML resultante con el método asXML():

$file->asXML(“newFile.xml”);

Hasta aquí esta pequeña introducción a simpleXML. Ahora queda en vuestras manos seguir profundizando en las poderosas posibilidades de esta librería en combinación con XPATH.

Màrius Armenteras Comellas

 

Diferentes tipos de IF

// Este tipo es el más utilizado y como se ve sirve
if ($variable == ‘es’)
{
echo ‘Hola mundo’;
// ….resto de procesos
}
elseif ($variable == ‘en’)
{
echo ‘Hellow world’;
// ….resto de procesos
}
else
{
echo ‘Hola mon’;
// ….resto de procesos
}

// Se utiliza este modo cuando sólo tenemos que hacer un proceso por opción quitando los corchetes
if ($variable == ‘es’) echo ‘Hola mundo’;
elseif ($variable == ‘en’) echo ‘Hellow world’;
else echo ‘Hola mon’;

// Aquí vemos el caso menos utilizado. Solo se utiliza cuando tenemos 2 opciones sino es una es la otra.
$variable == ‘es’ ? $mensaje = ‘Hola mundo’ : $mensaje = ‘Hellow world’;
echo $mensaje;

Introducción a Zend_Mail

Zend_Mail provee funcionalidad para componer y enviar mensajes de correo electrónico tanto de texto como multipart –compatible con MIME-. Los correos electrónicos pueden ser enviados con Zend_Mail y el transporte por defecto Zend_Mail_Transport_Sendmail o por vía Zend_Mail_Transport_Smtp.

Ejemplo

Enviando correo electrónicos con Zend_Mail

Un correo electrónico simple consiste de algunos destinatarios, un titulo, un cuerpo y un remitente. Para enviar ese correo usando Zend_Mail_Transport_Sendmail, haz lo siguiente:

<?php
require_once ‘Zend/Mail.php’;
$mail = new Zend_Mail();
$mail->setBodyText(‘Este es el cuerpo del mensaje.’);
$mail->setFrom(‘remitente@ejemplo.com’, ‘Remitente’);
$mail->addTo(‘destinatario@ejemplo.com’, ‘Destinatario’);
$mail->setSubject(‘Titulo de prueba’);
$mail->send();
?>

Requisitos mínimos
Con objetivo de enviar el correo con Zend_Mail necesitas especificar al menos un destinatario, un remitente (con setFrom()), y un cuerpo de mensaje (texto y/o HTML).

Para la mayoría de los atributos hay getters (métodos “get”) para leer información almacenada en el objeto de correo. Para información detallada, refiérase a la documentación del API. Un método especial es getRecipients(). Devuelve un array con todos los direcciones de correo de los destinatarios que fueron agregadas previamente a la llamada de este método.

Por razones de seguridad, Zend_Mail filtra todos los campos de encabezado para prevenir inyecciones con caracteres de nueva línea.

También puedes usar la mayoría de los métodos de Zend_Mail con una cómoda y fluida interfase. Una interfase fluida significa que cada método devuelve una referencia al objeto donde fue llamado, así que puede llamar a otro método inmediatamente.

<?php
require_once ‘Zend/Mail.php’;
$mail = new Zend_Mail();
$mail->setBodyText(‘This is the text of the mail.’)
->setFrom(’somebody@example.com’, ‘Some Sender’)
->addTo(’somebody_else@example.com’, ‘Some Recipient’)
->setSubject(‘TestSubject’)
->send();
?php>

Configurando el transporte por defecto, sendmail

El transporte por defecto para la instancia de Zend_Mail es Zend_Mail_Transport_Sendmail. Basicamente es un envoltorio de la función mail() de PHP. Si quieres pasar parámetros adicionales a la función mail(), simplemente crea una nueva instancia del transporte y pasa los parámetros a sus constructor. La instancia del nuevo transporte puede entonces actuar como el transporte por defecto de Zend_Mail, o puede ser pasado al metodo send() de Zend_Mail.

Ejemplo.

Pasando parámetros adicionales al transporte Zend_Mail_Transport_Sendmail.

Este ejemplo muestra como cambiar el “Return-Path” de la función mail().

<?php
require_once ‘Zend/Mail.php’;
require_once ‘Zend/Mail/Transport/Sendmail.php’;
$tr = new Zend_Mail_Transport_Sendmail(‘-freturn_to_me@example.com’);
Zend_Mail::setDefaultTransport($tr);
$mail = new Zend_Mail();
$mail->setBodyText(‘This is the text of the mail.’);
$mail->setFrom(’somebody@example.com’, ‘Some Sender’);
$mail->addTo(’somebody_else@example.com’, ‘Some Recipient’);
$mail->setSubject(‘TestSubject’);
$mail->send();
?php>


Restricciones en modo seguro (“Safe mode”)
Los parámetros adicionales opcionales causaran que la función mail() falle si PHP esta ejecutándose en modo seguro.

PHP 5.2.5 Released

El pasado 8 de noviembre vio la luz la nueva release de PHP 5.2.5 con solución a mas de 60 bugs de versiones anteriores.

PHP 5.2.5 Release Announcement
ChangeLog

¡Y todo esto a la espera de la prometedora 5.3 y sus namespaces!

Variables temporales en PHP (estilo Perl)

Puede suceder que cuando escribimos código, sobretodo cuando trabajamos con código de otros, tengamos problemas a la hora de nombrar las variables. Se podría dar el caso de que sobrescribiéramos alguna variable existente o de alcance global. Normalmente estas variables serán simplemente variables temporales.
Es difícil elegir nombres para todas las variables temporales. Generalmente se desea un nombre corto y conciso, pero es probable que esos mismos nombres se hayan usado para otros propósitos. Sin embargo con ${‘…’} podemos usar cualquier cadena como nombre de variable. Los números son automáticamente convertidos a cadenas.
Ejemplo:

${0} = fwrite($fh, 'Test');
if (!${0}) throw new Exception("Writing the file has failed");
if ((${0} = pathinfo('/var/www/index.html')) && ${0}['extension'] === 'html')
echo "Yes boys and girls";

Fuente: http://blog.adaniels.nl/?p=58

Màrius Armenteras Comellas

PHP army os invita a la “Anoia PHP Conference”, el próximo 10 de noviembre, en Igualada.

Os invitamos a participar de las próximas jornadas de PHP, a realizarse el 10 de noviembre en el Espai Civic Centre d’Igualada.

La inscripción, programa y mas información la podéis encontrar en http://www.phpize.com/conference/

Habra charlas introductorias al lenguaje, y mas avanzadas como el uso de frameworks, y la utilización del framework de Zend con el API de GData de Google.

¡Nos vemos alli!