2014-08-27 26 views
0

我正在構建一個面向對象的表單系統。我正在組建一個包含大約八個函數的用戶類。每個函數都包含一個MySQL查詢,Query類的一個對象必須被實例化。在PHP類方法中聲明查詢對象

有沒有辦法避免每次都必須申報一個新對象?它發生在我身上,可能會在某些時候使服務器停滯不前。

User類的作用是從數據庫(名稱,電子郵件等)中提取有關用戶的信息。該數據隨後將用於整個系統,包括驗證角色。下面是用戶等級:

class User{ 

protected $user_id; 
protected $session_hash; 

protected $user_username; 
protected $user_email; 
protected $user_role_id; 
protected $user_role_name; 

protected $user_first_name; 
protected $user_last_name; 

public function __construct($user_id, $session_hash){ 
    $this->user_id = $user_id; 
    $this->session_hash = $session_hash; 
} 

public function __get($name){ 
    return $this->name; 
} 

public function __set($name, $value){ 
    $this->$name = $value; 
} 

public function getLoggedUserInfo(){ 
    global $db; 
    $query = new Query($db->link); 

    if($user_matches = $query->select("SELECT name, mail FROM ".TABLE_PREFIX.".d7_users WHERE uid = '".$this->user_id."'")){ 
     $this->user_username = $user_matches[0]['name']; 
     $this->user_email = $user_matches[0]['mail']; 

     $this->user_role_id = $this->getLoggedUserRoleId($this->user_id); 
     $this->user_role_name = $this->getLoggedUserRoleName($this->user_role_id); 
     $this->user_first_name = $this->getLoggedUserFirstName($this->user_id); 
     $this->user_last_name = $this->getLoggedUserLastName($this->user_id); 

     $user_information_arr = array(
           'user_id' => $this->user_id, 
           'user_username' => $this->user_username, 
           'user_first_name' => $this->user_first_name, 
           'user_last_name' => $this->user_last_name, 
           'user_email' => $this->user_email, 
           'user_role_id' => $this->user_role_id, 
           'user_role_name' => $this->user_role_name, 
          ); 

     return $user_information_arr; 
    } 
    return false; 
} 

private function getLoggedUserRoleId($user_id){ 
    global $db; 
    $query = new Query($db->link); 

    if($role_id_matches = $query->select("SELECT rid FROM ".TABLE_PREFIX.".d7_users_roles WHERE uid= '".$user_id."'")){ 
     $this->user_role_id = $role_id_matches[0]['rid']; 
     return $this->user_role_id; 
    } 
    return false; 
} 

private function getLoggedUserRoleName($role_id){ 
    global $db; 
    $query = new Query($db->link); 

    if($role_name_matches = $query->select("SELECT name FROM ".TABLE_PREFIX.".d7_role WHERE rid = '".$role_id."'")){ 
     return $role_name_matches[0]['name']; 
    } 
    return false; 
} 

private function getLoggedUserFirstName($user_id){ 
    global $db; 
    $query = new Query($db->link); 

    if($first_name_matches = $query->select("SELECT field_first_name_value FROM ".TABLE_PREFIX.".d7_field_revision_field_first_name WHERE entity_id='".$user_id."'")){ 
     return $first_name_matches[0]['field_first_name_value']; 
    } 
    return false;  
} 

private function getLoggedUserLastName($user_id){ 
    global $db; 
    $query = new Query($db->link); 

    if($last_name_matches = $query->select("SELECT field_last_name_value FROM ".TABLE_PREFIX.".d7_field_revision_field_last_name WHERE entity_id='".$user_id."'")){ 
     return $last_name_matches[0]['field_last_name_value']; 
    } 
    return false;  
} 

}

+3

您可以將Query對象傳遞到User類的構造函數中,並將其作爲類的屬性存儲。在構造函數中實例化查詢對象也是一個選項,但不太理想,因爲您然後將您的User類和Query類耦合起來。這將有助於更全面地瞭解您的User類的角色。 – Drumbeg 2014-08-27 21:10:00

+0

你在那裏與OOP完全無關。 – 2014-08-28 04:43:22

+0

Drumbeg我認爲你的第一個解決方案最適合我傳遞查詢對象並將其作爲類屬性存儲的地方。我寧願將用戶和查詢類分開。謝謝! – Ravioli87 2014-08-28 15:28:11

回答

0

從現有的實例傳遞查詢對象爲用戶類的構造函數。

protected $queryObject; 

public function __construct($user_id, $session_hash, Query $query = NULL){ 
    $this->user_id = $user_id; 
    $this->session_hash = $session_hash; 
    $this->queryObject = $query; 
}