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];
}
}
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;
');
CRITIQUEN POR FAVOR... !