Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/05/2014, 12:47
Avatar de Italico76
Italico76
 
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Nuevos tipos de datos: Struct de C y Range

Buenas,

Hay tipos de datos que en alguna circunstancia he necesitado demasiado y aqui les dejo la implementacion:


TIPO STRUCT (sacado de lenguaje C)

La idea es tener una estructura rigida que no permita creas indices por error como en el caso de un array o propiedades publicas en el caso de una clase solo por error

Se usaria asi:

Código PHP:
// creo la estructura
$st_per = (new Struct('persona'));
$st_per    ->create('nombre','str','NN')
        ->
create('apellido','str')
        ->
create('edad','int')
        ->
create('sexo_masc','bool',true)
        ->
create('hijos','bool',false)
        ->
create('fecha_aniversario','object',null)
        ->
create('telefonos','array');        

        
// creo tantos registros como necesito
$per1 = clone $st_per;        
$per2 = clone $st_per;        
        
            
// la uso :)
$per1->nombre  'Pablo';    
$per1->apellido  'Bozzolo';    
$per1->edad 32;
$per1->fecha_aniversario = (new Datetime)->setDate (1980,1,10);
$per1->telefonos=array('301 203 4445','300 434 5564');
#$per1->sexo_masc = 'h';  // Excepcion 
#$per1->direccion = 'en mi casa'; // Excepcion

$per2->nombre  'Maria';    
$per2->apellido  'Mosconi';    
$per2->edad 19;
$per2->fecha_aniversario = (new Datetime)->setDate (2006,2,23);
$per2->telefonos=array('600 455 554');
$per2->sexo_masc false;  
$per2->hijos true

Y la Clase que lo implementa es:

Código PHP:

/*
    Struct as in C
    @author: Pablo Bozzolo

    struct database {
        int id_number;
        int age;
        float salary;
    };
*/
Class Struct
{
    private 
$_field = array();
    private 
$_type  = array();
    private 
$_name null;
    
    private 
$_tipos_ = array ("boolean","integer","double","string","array","object","resource","NULL" );
        
    public function 
__construct($name)
    {
        
$this->_name=$name;
    }
    
    
// sin implentar
    
public function __clone()
    { }
    
    
    
// sin implentar
    
public function parse($str)
    { }

    public function 
create($var,$type=null,$val=null)
    {
        if ((!empty(
$type)) and ($type!="unknown type"))
        {
            
// alias
            
if ($type=='bool'$type='boolean';
            if (
$type=='int'$type='integer';                
            if (
$type=='float'$type='double';    
            if (
$type=='str'$type='string';    
            
            if ((
in_array($type,$this->_tipos_)))
                
$this->_type[$var] = $type;    
            else
                throw new 
Exception ("Tipo de dato no soportado");        
        }                
                
    
        
$this->_field[$var] = $val;        
        return 
$this;
    }
    
    
    public function 
__set($var,$val)
    {        
        if (
gettype($val)!= $this->_type[$var])
            throw new 
Exception ("Tipos no coinciden");        
    
        if (
in_array($var,array_keys($this->_field)))
            
$this->_field[$var] = $val;        
        else
            throw new 
Exception("No existe el campo $var!");
    }
    
    public function 
__get($var)
    {
        return 
$this->_field[$var];                
    }

Habia pensado en implementar un metodo parse() para cambiar la sintaxis pero me parecio demasiada sobrecarga (quizas no)... y lo dejo asi por ahora:

Se usaba asi:

Código PHP:
/* Experimental */

$st_diccio = (new Struct('alquiler videos'))->parse('
    string $pelicula;
    object    $nom_persona;
    object $fecha_prestamo;
    int    $dias_prestamo = 3;
'
); 
Tener en cuenta que uso alias para integer (int), string (str), float (double) ... tambien habia pensado en dar la opcion de deshabilitar el alias pero de momento queda asi

CRITIQUEN POR FAVOR... !
__________________
Salu2!