Les variables publiques par défaut de classe peuvent-elles être définies dynamiquement à partir d'un tableau en php ?
-
13-12-2019 - |
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!
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é.