2009-08-27 80 views
0

在OOP中,最好是在類函數中使用類屬性,或者只是傳遞參數給它們。參數與屬性(類變量)?

class User{ 
    private $user = array(); 

    public function Get_Existing_User($user_id){ 
    //SQL selects user info for existing user 
    $this->user = mysqli_fetch_assoc(); 
    } 

    public function Set_User($user_data){ 
    $this->user = (array) $user_data; 
    } 

    public function Add_User(){ 
    //insert everything from $this->user into database 
    } 

    public function Get_User(){ 
    return $this->user; 
    } 
} 

VS

class User{ 

    public function Get_Existing_User($user_id){ 
    //SQL selects user info for existing user 
    $user = mysqli_fetch_assoc(); 
    return $user; 
    } 

    public function Add_User($user_data){ 
    //insert everything from $user_data into database 
    } 
} 

請告訴我更好的方式去?

回答

0

一些澄清:你叫什麼類功能

能更好地稱爲方法。方法是一個對象實例的函數。此外,類別可能有方法。這些被稱爲類方法靜態方法。當你使用術語職能功能時,你就會混淆含義。

已解決,這兩種方法沒有更糟或更好。您可以使用兩者,具體取決於上下文。參數的範圍較小,從而導致耦合較少。 如果一切都相同,那麼我會說參數比設置對象屬性更好。

也就是說,通常還有其他因素可以決定選擇哪個。您可以將對象視爲相關變量的範圍。如果某個變量屬於該範圍,則將其分配給屬性是有意義的。

0

期望類屬性描述被稱爲對象的類的實例的狀態。因此,類的任何函數都可以使用這些屬性來修改它的狀態。另一方面,函數參數可能與對象的當前狀態無關,但可用於修改其狀態。

例如:可以期望用戶對象具有用戶名屬性,密碼屬性和經過驗證的屬性。這個用戶對象還有一個名爲authenticate的函數,它接受一個描述驗證方法的參數。該參數用於修改用戶對象的狀態,但不作爲其屬性保存。

0

這完全取決於您是否要重新使用數據以及您如何使用該類。

如果您創建了多個單獨的類實例,並且每個對象都表示一個唯一的用戶,那麼將數據保存在成員變量中是有意義的。如果您將Class用作DAO(數據訪問對象)並進行大量的一次性操作,那麼保留數據可能沒有多大意義。但即使在DAO中,如果在單個調用中涉及許多功能(如beforeQueryafterQuery回調等),則根據其內部工作原理,將數據至少暫時存儲在成員變量中可能是有意義的。

沒有一種更好的方式適合所有人。

1

在您的解決方案之間,首先會更好,但您必須更改函數的名稱。 'get'只能在函數返回時才使用。

更好的原因是它不會使用副作用,副作用總是不好,因爲它們對於類的用戶是不可見的,但會改變類的行爲。所以你應該儘量減少它們,或者讓它們明顯,因爲它們在第一種情況下,當它們不是「真正的」側面時。

但是在這種特殊情況下,Get_Existing_UserAdd_User應該是靜態函數,即返回新的User對象,它有時被稱爲靜態構造函數。之所以好得多是因爲它清楚地說明了這些函數做了什麼,它們獲取了一些參數(現有用戶的user_id或新用戶的first_name,last_name和其他屬性),並創建了表示用戶的對象。所有的數據庫操作都將被隱藏起來。對象本身應該具有名稱和其他屬性的屬性,甚至可以使用Save()方法將更改推回。但主要想法是,您總是使用已構建的對象,已經具有上下文並且與現實世界中的某個東西(即數據庫中的用戶)相關聯的對象,而不是一個空的外殼,隨時隨地將其填充。關於術語第一

0

選擇最適合您情況的方法非常重要。忽略不那麼有用的建議,我建議你在面向對象設計好好看看一些重要的原則

  1. Coupling
  2. Cohesion

這些主題有深刻的理解會幫助你評估你的情況和代碼,以適應項目的目標。隨着項目的增長,您可能會發現您需要使用具有可選參數的方法與對象進行交互,以實現高內聚性和鬆散耦合。然後你會像專家一樣使用方法和參數。