19/7/09

Crear "estructuras" en php5.3

En alguna ocasión me ha interesado crear una clase que contendría simplemente unos cuantos atributos y poco más y al final he acabado haciendo un constructor del tipo:

class mystruct {
    public $a, $b, $c;
    function __construct($a, $b, $c) {
        $this->a = $a;
        $this->b = $b;
        $this->c = $c;
    }
}


class struct {
    static public function create() {
        $obj = new static;
        $keys = array_keys((array)$obj);
        foreach (func_get_args() as $k => $v) $obj->{$keys[$k]} = $v;
        return $obj;
    }
}

Para versiones anteriores de php podemos usar el constructor:

class struct {
    static function __construct() {
        $keys = array_keys((array)$obj);
        foreach (func_get_args() as $k => $v) $this->{$keys[$k]} = $v;
        return $this;
    }
}


Con lo que podríamos hacer lo siguiente:


class mystruct extends struct { public $a, $b, $c; }
mystruct::create(1, 2, 3);
o
new mystruct(1, 2, 3);

17/7/09

Novedades con phpSTE

Ahora que vuelvo a tener Internet en plan bien, y ya vuelvo a estar con mis proyectos, he seguido mejorando phpSTE.

He cambiado bastantes cosas desde que lo empecé, y cambiaré bastantes más posiblemente hasta que esté pulido del todo.

Por ahora ocupa unas 550 líneas y ya es bastante funcional.

Además de soportar herencia, he añadido los siguientes tags:

{extends name=""} - extiende un template.
{include name=""} - incluye un template.
{block name=""}{/block} - define e imprime/modifica un bloque.
{addblock name=""}{/addblock} - modifica un bloque añadiendo el contenido al final.

{blockdef name=""}{/blockdef} - define un bloque sin utilizarlo.
{putblock name=""} - imprime un bloque existente.

{t}{/t} - llama a la función de gettext

{if cond=""}{/if}
{elseif cond=""}{else}

{for var="" from="" to="" step=""}{/for}

{foreach list="" var=""}{/foreach}



He hecho optimizaciones para que los tags puedan saber si el contenido es un literal, de forma que {t}Texto{/t} se convertiría a mientras que {t}{if cond=1}Texto{/if}{/t} se convertiría a Texto

6/7/09

phpSTE

phpSTE (PHP Simple Template Engine) es un sistema de templates que he empezado a hacer hoy.
Se caracteriza por ser liviano, rápido y sencillo. Actualmente no es 100% funcional, ni lo he testeado lo suficiente, pero ya empieza a hacer cosas.
Además, soporta herencia de templates.
Está programado para PHP5.3 o superior. Hace uso de namespaces, late static binding y alguna otra cosa de esta versión.
http://code.google.com/p/phpste/
La idea es que el engine terminado no supere las 1000 líneas de código comentado y que esté todo en un único archivo para facilitar al máximo su inclusión en otros proyectos.