2010-11-28 42 views
1

嘿,所有。超越以下兩個OOP示例的目的,這被認爲是常見或正確的結構?或者它只是偏好?這些PHP OOP示例中的哪一個是PHP OOP結構的「常見」實踐?

實施例1:

class names 
{ 
    private $first_name; 

    public function setUpperCase($first_name) 
    { 
     $this->first_name = ucfirst($first_name); 
    } 

    public function viewUpperCase() 
    { 
     echo $this->first_name; 
    } 

}

$names = new names(); 
$names->setUpperCase("jimbo"); 
$names->viewUpperCase(); 

實施例2:

class names 
{ 
    public function setUpperCase($first_name) 
    { 
     $upper_first_name = ucfirst($first_name); 

     return $upper_first_name; 
    } 

    public function viewUpperCase($upper_first_name) 
    { 
     echo $upper_first_name; 
    } 
} 

$names = new names(); 
$uppercase = $names->setUpperCase("jimbo"); 
$names->viewUpperCase($uppercase); 

第一個示例設置類結構中的變量。第二個示例將該變量設置爲方法參數。兩者都完全一樣。但哪個是「適當的」?

謝謝大家。 乾杯!

+0

這不是全部取決於您是否要在該類實例中稍後需要$ upper_first_name的值? – o01 2010-11-28 13:23:02

+0

當然。但如果這是全班同學呢?在不考慮腳本的「目的」的情況下,這兩個例子中哪一個是「共同」結構? – Tableking 2010-11-28 13:28:20

回答

0

即將出去的肢體,並說第一個例子將是「正確」的方法作爲一個對象的定義是由屬性定義。 幾乎看起來你有一個用戶類的開始,它有一個可以應用某些修改的名稱,比如你的大寫方法。 第二個例子看起來像它可能只是一個實用程序,我不會將它描述爲一個真正的對象,因爲它沒有任何屬性。

7

我的建議

class Name 
{ 
    protected $firstName; 

    public function __construct($firstName) 
    { 
     $this->firstName = $firstName; 
    } 

    public function getUpperCase() 
    { 
     return ucfirst($this->firstName); 
    } 
} 

$name = new Name('jimbo'); 
echo $name->getUpperCase(); 
+0

+1絕對是最乾淨的方法。這應該被接受! – 2013-08-14 16:41:38

0

他們不這樣做同樣的事情,因此這不是喜好的問題。第一個示例將大寫的文件名存儲在對象中,第二個示例沒有。你想要/需要哪一個取決於情況。

0

你的第一個代碼段是正確的。然而,你的例子並沒有真正封裝(原諒雙關語)OOP的真正本質。

對象具有屬性和方法。屬性存儲關於對象的信息和方法修改這些信息。您的第一個示例通過將名稱存儲爲屬性來完成此操作。無論使用哪種方法,firstname屬性在整個課程中都會保留。

在第二個例子中,你根本沒有聲明屬性。你只有兩個與他們自己的數據無關的方法。在方法之外,您的屬性值不存在。

另一種看待這個問題的方法是如果你想添加一個姓氏屬性和一個getFullName()方法。例1可以很容易地做到這一點。

class names 
{ 
    private $first_name; 
    private $surname; 

    public function getFullName() 
    { 
     return $this->first_name . ' ' . $this->surname; 
    } 

    public function setUpperCase($first_name) 
    { 
    $this->first_name = ucfirst($first_name); 
    } 

    public function viewUpperCase() 
    { 
    echo $this->first_name; 
    } 
} 

$names = new names(); 
$names->setUpperCase("jimbo"); 
$names->viewUpperCase(); 

例2這成爲做作,因爲你必須要兩個名字傳遞到getFullName()方法,以獲得正確的返回值。這違背了創建一個對象的目的,該對象意味着一個存儲所有數據和相關操作的實體。在示例2中,您不存儲數據......僅存儲操作。

0

OOP的主要原理是可重複使用的代碼,所以爲用戶創建一個類,你應該可以重複使用代碼。

每個對象是唯一的一個實體,在大多數情況下,例如什麼,我下面的意思:

class  identification 

User  user id 
Curl  Web Address 
Logger Log File 

隨着你應該通過在構造函數中標識的對象,所以user會像這樣:

$Robert = new User(12); 
$Peter = new User(15); 

因爲您使用構造函數的每個類只能創建一次,因爲它專用於其標識符。

在用戶類,你將能夠創建出象這樣的方法:

public function addFriend(User $User) 
{ 
    //Insert into the database with $User->getID(); 
} 

$Robert->addFriend($Peter); 

在特定的問候你的班級我肯定會採取Philippe Gerber的ethod,因爲這對我來說是標準的。

你也應該不要在Philippe Gerber的方法中,他不會將變量更改爲大寫,但mealy返回該字符串的大寫版本,原因是如果您更改的狀態字符串在運行期間可能無法按預期在後面的過程中工作。

如果變量數據已被複制到數據庫或文件中,您應該只能更改變量數據,因此無論您的腳本不會混亂。