Pode classe padrão pública variáveis de ser definidos dinamicamente a partir de um array em php?

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

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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top