php help - 实例化函数

时间:2011-04-09 05:06:14

标签: php oop

以下是做什么的?

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你还剩下什么?

谢谢,丹尼尔。

4 个答案:

答案 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;创建一个同一个类的对象,这里它分配给同一个类的属性,这当然是一个糟糕的实现,并不是全部都需要。你可以保留一个数组来保存值,因为如果你想要检索你需要循环遍历对象数组的值。