Pode classe padrão pública variáveis de ser definidos dinamicamente a partir de um array em php?
-
13-12-2019 - |
Pergunta
Eu tenho uma classe de evento que eu estou usando para inserir/atualizar dados no meu banco de dados.Existe uma maneira que eu possa criar as variáveis públicas a partir do meu db_fields matriz, de modo que eu não estou tendo duplicar os dados?
Este é o meu atual estrutura 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;
}
Eu gostaria de ter algo parecido com isso..
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);
}
}
Obrigado!
Solução
Você pode tentar o seguinte:
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).
}
}
Outras dicas
Você pode usar a magia 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;
}
}
Desta forma você tem a certeza de não acertar os valores fora de sua 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
Como ter uma explícita pública de declaração de variável em seu código, você não precisa contanto que você não tem para iterar através de seus objetos, mas neste caso você teria que implementar Iterator
interface baseada no seu campo estático.
Use 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];
}
}
}
E, em seguida, você pode acessá-lo assim:
$eventObject->getVars('field3');
Ou, se você não criar um objeto da classe:
event::getVars('field3');
EDITAR:No espírito de complicar as coisas, de modo que você não tem limites de violação, código adicionado.