2009-02-13 139 views
8

我現在有我的PHP類變量設置是這樣的:在PHP中存儲類變量的最佳方式是什麼?

class someThing { 

    private $cat; 
    private $dog; 
    private $mouse; 
    private $hamster; 
    private $zebra; 
    private $lion; 

    //getters, setters and other methods 
} 

但我也看到了使用單一的陣列來存儲所有的變量人:

class someThing { 

    private $data = array(); 

    //getters, setters and other methods 
} 

使用哪做,爲什麼?每個的優點和缺點是什麼?

回答

11

一般來說,第一個更好的原因是其他人已經在這裏陳述過。然而,如果你需要私人地存儲數據到一個類中,但是數據成員的足跡是未知的,你會經常看到你的第二個例子與__get()__set()鉤子相結合,以隱藏它們正在私人儲存。

class someThing { 

    private $data = array(); 

    public function __get($property) 
    { 
     if (isset($this->data[$property])) 
     { 
      return $this->data[$property]; 
     } 
     return null; 
    } 

    public function __set($property, $value) 
    { 
     $this->data[$property] = $value; 
    } 
} 

然後,這個類的對象可用於像一個stdClass的實例,只是沒有設置成員實際上是公共

$o = new someThing() 
$o->cow = 'moo'; 
$o->dog = 'woof'; 
// etc 

這種技術有它的用途,但要知道,__get ()和__set()的速度比直接設置公共屬性慢10-12倍。

6

如果您使用的是private $data;,那麼您剛剛在那裏得到了一個難以理解的數據塊......明確指出它們會讓您的生活更輕鬆,如果您想知道一個類是如何工作的。

另一個考慮因素是如果您使用帶自動完成功能的IDE - 這不適用於第二種方法。

1

如果代碼是重複的,則數組和(foreach)循環會更新內容。您需要確定代碼中的「動物」概念是否重複,或者代碼是否需要深入瞭解每個成員的唯一性。

如果我必須不止一次地重複自己,我會循環。

0

我更喜歡第一種方法,有幾個原因:

在良好的IDE中,類屬性顯示出來,即使私人/保護 它更容易看到已定義,減少你的機會存儲兩次相同的信息。 如果衆所周知的公交車在回家的路上碰到你,那麼其他開發者進來閱讀你的代碼會簡單得多。 雖然它不適用於私有變量,但它確實可以保護變量,在擴展這個類的類中,你應該儘量避免使用純粹的可讀性的第二種方法。另外,作爲一個便箋,我幾乎總是選擇保護私人,除非我有一個非常具體的理由,使其私人。

我可能會使用第二種方法的唯一時間是如果我存儲了許多種類的東西的集合。

1
  • 當你知道你需要這個變量時使用第一種方法。
  • 當您有動態變量需求時,使用第二種方法(變量數組集合)。

你可以結合這兩種方法,所以一些變量被硬編碼到你的類中,而另一些變量是動態的。與魔法方法相比,硬編碼變量將具有偏好。

相關問題