¿Se pueden definir dinámicamente variables públicas de clase predeterminadas de clase de una matriz en PHP?

StackOverflow https://stackoverflow.com//questions/12717399

Pregunta

Tengo una clase de evento que estoy usando para insertar / actualizar los datos en mi base de datos.¿Hay una manera de crear las variables públicas de mi matriz DB_Fields para que no tenga que duplicar los datos?

Esta es mi estructura actual que funciona ...

class event{
    protected static $table_name='tName';
    protected static $db_fields = array('field1','field2','field3','field4','field5');

    public $field1;
    public $field2;
    public $field3;
    public $field4;
    public $field5;
}

Me gustaría tener algo así ..

class event{
    protected static $table_name='tName';
    protected static $db_fields = array('field1','field2','field3','field4','field5');

    function __construct() {
        create_public_vars_here($db_fields);
    }

}

¡Gracias!

¿Fue útil?

Solución

Puedes probar lo siguiente:

class event{

    protected static $table_name='tName';
    protected static $db_fields = array('field1','field2','field3','field4','field5');

    function __construct() {
        foreach (self::$db_fields as $var) {
            $this->$var = $whateverDefaultValue;
        }
        // After the foreach loop, you'll have a bunch of properties of this object with the variable names being the string values of the $db_fiels.
        // For example, you'll have $field1, $field2, etc and they will be loaded with the value $whateverDefaultValue (probably want to set it to null).
    }

}

Otros consejos

Puedes usar Magic Setters / Getters:

class event{

    protected static $table_name='tName';
    protected static $db_fields = array('field1','field2','field3','field4','field5');

    public function __get($key)
    {

        if(!in_array($key, static::$db_fields))
            throw new Exception( $key . " doesn't exist.");

        return $this -> $key;

    }

    public function __set($key, $value)
    {

        if(!in_array($key, static::$db_fields))
            throw new Exception( $key . " doesn't exist.");

        $this -> $key = $value;

    }   

}

De esta manera, seguramente, está seguro de no presionar valores fuera de su lista:

$event -> field1 = 'hello';  // --> OK
$event -> field17 = 'hello'; // --> Exception: field17 doesn't exist

echo $event -> field1;  // --> OK
echo $event -> field17; // --> Exception: field17 doesn't exist

En cuanto a tener una declaración de variables públicas explícitas en su código, no tiene necesidad siempre que no tenga que iterar sobre sus objetos, pero en este caso implementaría Iterator interfaz basado en su campo estático.

Utilizar mutadores:

class event{
  protected static $table_name='tName';
  protected static $db_fields = array('field1','field2','field3','field4','field5');

  function getVars($var) {
    if(!in_arrary($this->db_fields[$var])) {
      return false;
    } else {
      return $this->db_fields[$var];
    }
  }
}

y luego puedes acceder a ella como esta:

$eventObject->getVars('field3');

O, si no creas un objeto fuera de la clase:

event::getVars('field3');

Editar: En el espíritu de complicar las cosas para que no tenga una violación de límites, agregue el código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top