@lolainas : que te digo ?
tu version funciona, es mas simple..... me gusta y mucho excepto porque la forma de utilizarla es mucho mas complicada, toca crear una clase y escribir un su constructor una llamada al constructor del padre Struct con un array tambien hecho a mano.
Como me destacaba por MP el compañero @hhs ... es importante ofrecer una "API simple", igualmente me tome el atrevimiento de "mejorar" un poco tu version y agregarle el alias de tipos:
Código PHP:
Ver originalabstract class Struct
{
private $data;
private $definition;
private $_aliases = array();
function __construct
(array $definition) { $this->definition = $definition;
$this->alias();
}
function __get($name) {
return $this->data[$name];
}
function __set($name, $value)
{
if (isset($this->definition[$name])) {
$definition_type = $this->definition[$name];
// alias
foreach ((array) $this->_aliases
as $alias => $typo) if ($definition_type==$alias) $definition_type=$typo;
if (($value_type === $definition_type) || $value instanceof $definition_type)
$this->data[$name] = $value;
else
throw new Exception("Trying to assign ({$definition_type}: {$name}) with {$value_type}");
}else
throw new Exception("Trying to access undefined variable {$name}");
}
/* setter on-off */
function alias($flag=true)
{
$this->_aliases
= $flag ?
array('bool'=>'boolean','int'=>'integer','float'=>'double','str'=>'string') : null;
return $this;
}
}
Código PHP:
Ver originalclass Persona extends Struct {
function __construct() {
parent::__construct([
'nombre' => 'str',
'apellidos' => 'str',
'hijos' => 'int',
'fecha_nacimiento' => 'DateTime',
'telefonos' => 'array'
]);
}
}
$p = new Persona;
$p->nombre = 'Pablo';
$p->apellidos = 'Bozzolo';
$p->fecha_nacimiento = new DateTime('1980-10-01');
$p->telefonos = ['435435435', '342343242'];
debug($p);