Может ли классный по умолчанию публичные переменные динамически определяются из массива в PHP?
-
13-12-2019 - |
Вопрос
У меня есть класс событий, который я использую для вставки / обновления данных в мою базу данных.Есть ли способ, которым я могу создавать публичные переменные с моих массив DB_Fields, чтобы я не должен дублировать данные?
Это моя текущая структура, которая работает ...
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;
}
.
Я хотел бы иметь что-то вроде этого ..
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);
}
}
.
Спасибо!
Решение
Вы можете попробовать следующее:
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).
}
}
. Другие советы
Вы можете использовать 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;
}
}
.
Таким образом, вы уверены, что не ударили значения вне вашего списка:
$event -> field1 = 'hello'; // --> OK
$event -> field17 = 'hello'; // --> Exception: field17 doesn't exist
echo $event -> field1; // --> OK
echo $event -> field17; // --> Exception: field17 doesn't exist
.
Что касается явного общедоступной декларации вариации в вашем коде, вам не нужно, если вам не нужно повторять свои объекты - но в этом случае вы реализуете Iterator
Интерфейс на основе вашего статического поля.
Используйте мутаторы:
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];
}
}
}
.
, а затем вы можете получить доступ к этому так:
$eventObject->getVars('field3');
.
или, если вы не создаете объект из класса:
event::getVars('field3');
.
Редактировать: в духе усложняющихся вещей, чтобы у вас не было нарушения, добавленные код.