Сделайте класс базы данных PHP универсальным, генерируя динамические переменные
Пожалуйста, посмотрите на код, массив содержит имена полей таблицы таблицы
class User {
public $db_fields = array('id', 'username', 'password', 'first_name', 'last_name');
public $id;
public $username;
public $password;
public $first_name;
public $last_name;
}
Идея состоит в том, чтобы удалить публичные переменные с помощью функции, чтобы она автоматически создала публичную переменную из массива, к которому я могу получить доступ ---
пример
Я хочу удалить
public $id;
public $username;
public $password;
public $first_name;
public $last_name;
раздел, и хотите, чтобы это было автоматически сгенерировано $db_fields
массив.
Так что я могу получить доступ к объектам по
$user = new User();
$user->username = "Ismail";
Что я сделал
extract($db_fields);
но это дает ошибку:
Ошибка разбора: синтаксическая ошибка, неожиданный T_VARIABLE, ожидающий T_FUNCTION в C:\xampp\htdocs\advphp\dbclass\extractex.php в строке 3
3 ответа
К сожалению, ваша идея не работает, если вы пытаетесь использовать extract($db_fields);
это метод, который необходимо запустить из метода, например конструктора или функции. extract($db_fields);
он извлечет переменные для вас, но они не будут публичными, они будут локальными для этой функции, например, если вы попробуете это
function __construct(){
extract($db_fields);
// the $id will be available in the constractor only
// it will get disposed when this method finished executing
}
Другой подход заключается в использовании свойства или метода установки и метода получения.
<?php
class User {
private $db_fields = array(
'id',
'username',
'password' => 'ismailPassword',
'first_name',
'last_name'
);
function getValue($key){
if (array_key_exists($key, $this->db_fields)){
return $this->db_fields[$key];
}
return NULL;
}
function setValue($key, $value){
$this->db_fields[$key] = $value;
}
}
$user = new User();
$user->setValue('username', 'Ismail');
echo " Username: ";
echo $user->getValue('username');
echo "\n\n Password: ";
echo $user->getValue('password');
?>
Вы можете проверить коды здесь http://codepad.org/8MwBwdut
Вы могли бы удалить $db_fields
все вместе и зависят от столбцов, возвращаемых вашим SQL-запросом, например:
class User
{
private $_data;
public function __construct($id = null) {
//TODO: Load data into $this->_data for user of $id
}
public function __get($name) {
if (array_key_exists($name, $this->_data))
return $this->_data[$name];
return NULL;
}
public function __set($name, $value) {
$this->_data[$name] = $value;
}
public function UpdateUser(){
//TODO: update the database with any changes to the user data or do an insert for new user
}
}
и затем вы можете получить / установить свойства динамически, без необходимости сначала объявлять их так:
$newUser = new User();
$newUser->username = "Ismail";
$newUser->UpdateUser();
Если результат вашей базы данных возвращает пары ключ-значение, вы можете сделать это:
$array = array();
while (($r = $result->fetch_array()) != false){
$obj = new \stdClass();
foreach($r as $key => $value){
$obj->$key = $value;
}
$array[] = $obj;
}