Ver Mensaje Individual
  #6 (permalink)  
Antiguo 30/05/2014, 13:04
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Nuevos tipos de datos: Struct de C y Range

Apuntes sobre struct (constructivos, por las dudas)

1. Partiendo de la base de que los structs en C son declarados en tiempo de compilación y no de ejecución, dejaría de usar create para ello.

2. En el type hinting quizás el tipo 'object' sea muy genérico y fácilmente franqueable, sería de utilidad usar el operador de tipo instanceof, además de gettype para tipos primitivos.

Código PHP:
Ver original
  1. abstract class Struct {
  2.  
  3.     private $data;
  4.     private $definition;
  5.  
  6.     function __construct(array $definition) {
  7.         $this->definition = $definition;
  8.     }
  9.  
  10.     function __get($name) {
  11.         return $this->data[$name];
  12.     }
  13.  
  14.     function __set($name, $value) {
  15.         if (isset($this->definition[$name]))
  16.             if (($value_type = gettype($value)) === ($definition_type = $this->definition[$name]) || $value instanceof $definition_type)
  17.                 $this->data[$name] = $value;
  18.             else
  19.                 throw new Exception("Trying to assign ({$definition_type}: {$name}) with {$value_type}");
  20.         else
  21.             throw new Exception("Trying to access undefined variable {$name}");
  22.     }
  23.  
  24. }
  25.  
  26. class Persona extends Struct {
  27.  
  28.     function __construct() {
  29.         parent::__construct([
  30.             'nombre'           => 'string',
  31.             'apellidos'        => 'string',
  32.             'fecha_nacimiento' => 'DateTime',
  33.             'telefonos'        => 'array'
  34.         ]);
  35.     }
  36.  
  37. }
  38.  
  39. $p = new Persona;
  40.  
  41. $p->nombre = 'Pablo';
  42. $p->apellidos = 'Bozzolo';
  43. $p->fecha_nacimiento = new DateTime('1980-10-01');
  44. $p->telefonos = ['435435435', '342343242'];
  45.  

Que conste que este tipo de aritificios no están garantizados para un entorno de producción real, pero es un tema interesante al que últimamente se le da mucha vuelta por el foro, por ejemplo este artificio para emular polimorfismo del amigo NSD.

Saludos.