Les variables publiques par défaut de classe peuvent-elles être définies dynamiquement à partir d'un tableau en php ?

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

Question

J'ai une classe d'événements que j'utilise pour insérer/mettre à jour des données dans ma base de données.Existe-t-il un moyen de créer les variables publiques à partir de mon tableau db_fields afin de ne pas avoir à dupliquer les données ?

C'est ma structure actuelle qui fonctionne...

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;
}

J'aimerais avoir quelque chose comme ça..

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);
    }

}

Merci!

Était-ce utile?

La solution

Vous pouvez essayer ce qui suit:

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).
    }

}

Autres conseils

Vous pouvez utiliser des setters/getters magiques :

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 cette façon, vous êtes sûr de ne pas toucher de valeurs en dehors de votre liste :

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

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

Quant à avoir une déclaration de variable publique explicite dans votre code, vous n'en avez pas besoin tant que vous n'avez pas à parcourir vos objets - mais dans ce cas, vous implémenteriez Iterator interface basée sur votre champ statique.

Utiliser des mutateurs:

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];
    }
  }
}

Et puis vous pouvez y accéder comme ceci:

$eventObject->getVars('field3');

ou, si vous ne créez pas un objet hors de la classe:

event::getVars('field3');

Edit: Dans l'esprit de complicité des choses afin que vous n'ayez pas de violation des limites, Code ajouté.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top