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... !