以下是做什么的?
public static function find_by_sql($sql="")
{
global $database;
$result_set = $database->query($sql);
$object_array = array();
while ($row = $database->fetch_array($result_set))
{
// fetch_array=mysql_fetch_array
$object_array[] = self::instantiate($row);
}
return $object_array;
}
private static function instantiate($record)
{
$object = new self;
foreach($record as $attribute=>$value)
{
if($object->has_attribute($attribute))
{
$object->$attribute = $value;
}
}
return $object;
}
private function has_attribute($attribute)
{
return array_key_exists($attribute, $this->attributes());
}
protected function attributes()
{
// return an array of attribute names and their values
$attributes = array();
foreach(self::$db_fields as $field)
{
if(property_exists($this, $field))
{
$attributes[$field] = $this->$field;
}
}
return $attributes;
}
类属性是
public $id;
public $username;
public $password;
public $first_name;
public $last_name;
public $power;
所以while循环遍历每一行,但instantiate
函数做了什么?以及instantiate
如何优化脚本?
此外,$object = new self
意味着什么,这是一个新的类实例?当你返回$object
你还剩下什么?
答案 0 :(得分:2)
instantiate
函数基于包含类创建一个新对象(“实例化”只是意味着从某个东西创建一个实例,在这种情况下,就是它所在的类),在这种情况下,该函数遍历提供的数组,检查其键是否定义为在类'attributes
数组中,如果是,则使用这些键的值填充对象。
在while循环中,$object_array
填充了每行的包含类的单独实例。
对instantiate的这个调用并没有优化脚本(因为它必须调用函数而不是,例如,只是将行插入到数组中,因此会稍微减慢它),但原因可能是:1)到以对其可以使用对象方法的方式包装行,以及2)确保未在类的属性中指定的SQL列未在返回数组的行中公开。
对于self
,请参阅What does new self(); mean in PHP?。基本上,是的,$object = new self
创建了一个新的类实例,因为self
表示当前的类。这是一种方便,因为如果您决定更改类名,则无需更改此引用。
全局变量btw是一个问题,因为全局变量会更恰当地提供给类实例以避免名称冲突。
答案 1 :(得分:1)
self
只是一个引用当前类的快捷方式。 $this
引用当前对象的方式相同。
class Foo {
public function bar() {
new self;
new Foo;
}
}
这些都是相同的东西,都是从类Foo
实例化一个新对象。使用self
会更优雅,因为您可以更改Foo
的类名,而不必重命名它的每次使用。
所以你的::instantiate
函数正在做的是实例化同一个类的新对象,在其上设置一些属性并返回它。对self::instantiate
的调用只是静态调用instantiate
方法,就像$this->instantiate()
将其称为当前对象的方法一样。
答案 2 :(得分:0)
instantiate函数从db返回的数组数据创建一个类实例,然后返回该对象实例。然后将该实例添加到find_by_sql()
返回的数组中。基本上它执行从数据库列到对象实例属性的数据映射。
我必须说...虽然这种实施方式闻起来不太好: - )
答案 3 :(得分:0)
这里instantiate
函数正在创建同一个类的新对象。 $Object = new self;
创建一个同一个类的对象,这里它分配给同一个类的属性,这当然是一个糟糕的实现,并不是全部都需要。你可以保留一个数组来保存值,因为如果你想要检索你需要循环遍历对象数组的值。