Manejo de fechas en PHP5

Una búsqueda rápida sobre manejo de fechas en PHP dan como resultado documentación y tutoriales sobre la función date(). Si bien es extremadamente útil para los casos en que queremos mostrar fechas rápidamente, hay veces que se utiliza en conjunto con otras funciones, para realizar cálculos con las fechas y no es lo más apropiado ni lo más fácil.

En parte la culpa es de PHP, que introdujo el objecto DateTime y DateTimeZone recién en la versión 5.2, luego de soportar el paradigma orientado a objetos.

Van algunos ejemplos de como utilizar la clase DateTime para crear objetos tipo fecha, realizar algunas operaciones y formatearlo para mostrar por pantalla.

<?php

//Setear la zona horaria.
date_default_timezone_set('America/Montevideo');

$ahora = new DateTime("now");

//format: utiliza los mismos formatos que la función date().
echo $ahora->format(DATE_RSS); //Formato de fecha RSS.
echo '<br/>';
echo $ahora->format('d/m/Y'); //Formato local d/m/a
echo '<br/>';

//Crear una fecha según un formato especificado. PHP >= 5.3.0
$feb = DateTime::createFromFormat('j-M-Y', '5-Feb-2010');

//Diferencia entre dos fechas. Devuelve un objeto DateInterval. PHP>=5.3.0
$diferencia = $ahora->diff($feb);

echo $diferencia->format('%d días'); echo '<br/>';

//Añadir cantidad de días/meses/etc a una fecha. PHP>=5.3.0
$ahora->add(DateInterval::createFromDateString('10 days')); //resta 10 días.

echo $ahora->format('d/m/Y'); echo '<br/>';

//Otra alternativa para modificar la fecha. PHP>=5.2.0
$ahora->modify('+5 days');
echo $ahora->format('d/m/Y'); echo '<br/>';

Descargar ejemplo: [download id=”5″]

Enlaces

Doctrine 2

Últimamente estuve trabajando bastante con CodeIgniter en conjunto con el ORM de Doctrine 1.2 para simplificar el acceso a datos y dar más poder que el Active Record que implementa el framework.

Hoy me topé con una presentación muy interesante de lo que traerá la versión 2, que aprovecha todo el potencial de PHP 5.3.

Una de las cosas más novedosas es el uso de namespaces y “annotations” para declarar una clase como entidad, sin tener que extender de una clase base:

<?php 

namespace Entities; 

/** * @Entity @Table(name="users") */
class User {

	/** @Id @Column(type="integer") @GeneratedValue */
	private $id; 

	/** @Column(length=50) */
	private $name; 

	/** @OneToOne(targetEntity="Address") */
	private $address; 

}

Más información

Traits en PHP 5.4

¿Qué son Traits?

Los Traits son un mecanismo de programación que provee un conjunto de métodos que conforman un bloque de comportamiento, que actúa como una unidad reusable. Son una unidad de reuso similar a las clases. Sin embargo, funcionan siempre como un complemento para éstas, no pueden ser instanciados. En simples términos y como más de uno ha comentado, son como un “copy&paste asistido”.

Los beneficios son el reuso de código y permitir que las clases pueden seguir el formato de herencia simple y aun así poder implementar diferencias de comportamiento con respecto a sus superclases.

Un ejemplo – Comportamiento Singleton

trait Singleton {

	private static $_instance = NULL;

	private function __construct() {...}

	static public function getInstance() {
		if (self::$_instance == NULL) {
			self::$_instance = new self();
		}
		return self::$_instance;
	}
}

class Manager extends AppManager {
    use Singleton;
	...
}

class Editor extends AppEditor {
    use Singleton;
    ...
}

De esta manera, ambas clases Manager y Editor se comportan según el patrón Singleton:

Manager::getInstance();
Editor::getInstance();

Fuentes

  • http://simas.posterous.com/new-to-php-54-traits
  • http://wiki.php.net/rfc/traits
  • http://wiki.php.net/rfc/horizontalreuse