澄清一个line/s-->设置sql数据到对象变量
Clarify a line/s --> setting sql data into object variables
这是我的第一个问题,我会尽量澄清。
我是初学者,我正在学习 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
哪个 returns 正确或错误,在我的情况下它是正确的,但是第 $users->$attributes =$value ;
行对我来说没有意义,
因此,我检查获取数组中的键是否匹配对象中的变量名称,
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 的相同属性值中,但当我从未返回对象变量时,我只是看不到它是如何完成的
感谢您的宝贵时间!
编辑:
class 变量名称等于来自数据库
的 column_names 的名称
User
class有public个属性$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
方法使用get_object_vars
函数获取$user
对象的所有属性。后者将对象属性作为数组获取:
$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
。
这是我的第一个问题,我会尽量澄清。
我是初学者,我正在学习 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
哪个 returns 正确或错误,在我的情况下它是正确的,但是第 $users->$attributes =$value ;
行对我来说没有意义,
因此,我检查获取数组中的键是否匹配对象中的变量名称,
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 的相同属性值中,但当我从未返回对象变量时,我只是看不到它是如何完成的
感谢您的宝贵时间!
编辑: class 变量名称等于来自数据库
的 column_names 的名称User
class有public个属性$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
方法使用get_object_vars
函数获取$user
对象的所有属性。后者将对象属性作为数组获取:
$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
。