Уточнение строки /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;
  }

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

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???

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

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

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

2 ответа

Решение

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,

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

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

Надеюсь это сработает

Другие вопросы по тегам