2011-04-09 42 views
2

以下內容做了什麼?php幫助 - 實例化函數

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你回來了什麼?

謝謝Daniel。

+0

林達粉絲,哈?我到 – youngcouple10 2012-08-24 13:17:19

回答

2

instantiate函數根據包含的類創建一個新的對象(「實例化」僅僅意味着創建一個實例,在這種情況下,它所在的類),在這種情況下,函數迭代通過提供的數組,檢查其鍵是否定義在類'attributes數組中,如果是,則使用這些鍵的值填充對象。

在while循環中,$object_array被填充有對於每一行包含類的單獨實例。

該調用實例化不優化腳本(它減緩下來略,因爲它必須調用的函數,而不是,例如,只是插入的行到陣列),但其原因可能是:1)以可以在其上使用對象方法的方式來包裝行,以及2)確保未在類的屬性中指定的SQL列不會顯示在返回數組的行中。

self,看到What does new self(); mean in PHP?。基本上,是的,$object = new self創建該類的新實例,因爲self意味着當前類。這很方便,因爲如果您決定更改類名稱,則無需更改此引用。

全局變量btw是一個值得關注的問題,因爲全局變量更適合提供給類實例以避免名稱衝突。

0

的實例化函數創建從由db返回的數組的數據的類的實例,然後返回該對象實例。然後將該實例添加到find_by_sql()返回的數組中。本質上它執行從數據庫列到對象實例屬性的數據映射。

我必須說,雖然...這個實施犯規氣味非常好:-)

+0

你能解釋爲什麼這個實現不會聞到非常好,那麼最佳實踐 – youngcouple10 2012-08-24 11:55:34

1

self僅僅是指當前類的快捷方式。 $this以同樣的方式引用當前對象。

class Foo { 
    public function bar() { 
     new self; 
     new Foo; 
    } 
} 

這些都是同樣的事情,無論是從類Foo實例化一個新的對象。使用self會更加優雅,因爲您可以更改類名稱Foo,而不必重新命名它的每個用法。

那麼你::instantiate功能正在做的是實例相同類的新對象,在其上設置幾個屬性,並將其返回。到self::instantiate調用只是調用instantiate方法靜態,以同樣的方式$this->instantiate()會稱呼其爲當前對象的方法。

+0

感謝您解釋這一點,你能告訴我這是否是最佳實踐嗎?這是每個人從數據庫中獲取數據並從中創建對象的方式嗎?如果不是,那麼正確的方法是什麼?謝謝你的時間! – youngcouple10 2012-08-24 11:54:54

+0

@ youngcouple10這不完全是每個人都這樣做的方式,但「靜態構造函數」是一個有效的使用方法。在這個例子中,只有'private static function instantiate'沒有問題,儘管該類的其他部分使用了一些不好的做法,例如'global'。 – deceze 2012-08-24 11:57:22

+0

謝謝,但有一個實例化函數的一般想法是正常的,我接受它。爲什麼全球不好?你個人有一個你使用的實例化函數嗎? – youngcouple10 2012-08-24 12:00:39

0

Here instantiate函數正在創建同一類的新對象。 $Object = new self;創建一個相同類的對象,並在這裏分配給同一個類的屬性,這當然是一個糟糕的實現,並不都是必需的。你可以保持一個數組來保存這些值,因爲如果你想檢索你需要循環訪問的對象數組的值。