2016-12-16 1 views
1

Это мой первый вопрос здесь, и я постараюсь как можно больше его разъяснить.Уточнить строку/s -> установить данные sql в переменные объекта

Я начинаю, и я прохожу через lynda - за уроками PHP MySQL, когда я попал в эту часть.

Код работает просто отлично, мне просто нужно пояснить себя для строки, которая прокомментирована в коде.

require_once('database.php'); 

class User { 

    public $id; 
    public $username; 
    public $password; 
    public $first_name; 
    public $last_name; 

    public static function find_all() { 
    return self::find_by_sql("SELECT * FROM users"); 
    } 

    ///// 

    public static function find_by_sql($sql="") { 

    global $database; 
    $result_set = $database->query($sql); 
    $user_array = array(); 
    while ($row = $database->fetch_array($result_set)) { 
    $user_array[] = self::instantiate($row); 
    } 
    return $user_array; 
    } 

И Finaly линии, которые я почти понимаю :)

private static function instantiate($row) { 
    $user = new self; 

    foreach($row as $attribute=>$value){ 
     if($user->has_attribute($attribute)) { 
     $user->$attribute = $value;   /// THIS LINE BUGS ME 
     } 
    } 
    return $user; 

    } 

    private function has_attribute($attribute) { 

    $user_vars = get_object_vars($this); 
    return array_key_exists($attribute, $user_vars); 
    } 
} 

Так что я думаю, что я не понимаю array_key_exists, которая возвращает значение TRUE или FALSE, в моем случае это правда, но тогда линия $users->$attributes =$value ; ДАЕТ НИКАКИХ смысл для меня,

Итак, я проверяю, если ключи от начнут извлекать имена переменных массива MATCH от объекта,

if($user->has_attribute($attribute)) { //and then this is true,perform nxt line 
    $user->$attribute = $value;  // i got match of attribute above,how does it put values in $user_vars??? 

Я знаю, что он говорит что-то вроде «если у пользователя есть тот же атрибут, что и ключ из этого массива fetch, а затем помещается в это же значение атрибута этого атрибута $ value, но я просто не вижу, как это делается, когда я никогда не возвращал объектные переменные

Спасибо за ваше время!

редактировать: переменных имена классов равны имена COLUMN_NAMES из базы данных

ответ

0

User класса имеет государственные атрибуты $id, $username, $password и т. Д. Это означает, что вы можете присвоить значения атрибутам в следующей форме:

$u = new User; 
$u->id = 123; 
$u->username = 'username'; 

и используя динамические имена свойств:

$prop = 'id'; 
$u->$prop = 123; 

$prop = 'username'; 
$u->$prop = 'username'; 

Это только то, что происходит в линиях, что вы не понимаете:

if ($user->has_attribute($attribute)) { 
    $user->$attribute = $value; 

has_attribute Метод извлекает все атрибуты объекта $user с функцией get_object_vars. Последний извлекает свойства объекта в виде массива:

$user_vars = get_object_vars($this); 
/* i.e. 
$user_vars = array (
    'id' => ..., 
    'username' => ..., 
    ... 
); 
*/ 

Затем has_attribute метод проверки, если данный $attribute ключ существует в массиве свойств:

return array_key_exists($attribute, $user_vars); 

Если она существует (true), то $attribute свойство присваивается $value.

+0

Спасибо. Руслан! Думаю, я получил его сейчас! – GoFgO

0

Изменить эту строку

//  $user->$attribute = $value; 
     $user->{$attribute} = $value; 

Я надеюсь, что это будет работать

+0

Привет, рахул, код работает самостоятельно, как я написал его, мне просто нужна небольшая помощь в том, как эта строка работает точно, Почему этот атрибут $ принимает данные, которые должны быть записаны в переменных объекта/класса. – GoFgO