2010-12-05 75 views
10

因此,例如,我有這樣的代碼:PHP:如何創建對象變量?

class Object{ 
    public $tedi; 
    public $bear; 
    ...some other code ... 
} 

現在你可以看到有這個類中的公共變量。我想這樣做是在一個動態的方式,使這些變量,與函數類似:

private function create_object_vars(){ 

    // The Array what contains the variables 
    $vars = array("tedi", "bear"); 

    foreach($vars as $var){ 
     // Push the variables to the Object as Public 
     public $this->$var; 
    } 
} 

所以我應該如何創建一個動態的方式公共變量?

+0

什麼是你的問題? – 2010-12-05 10:29:27

+0

對不起@Pekka,我雖然很清楚,但我把它附加到結尾:) – Adam 2010-12-05 10:30:43

+0

出於好奇,你爲什麼要這樣做? – aib 2010-12-05 12:24:02

回答

7

是的,你可以做到這一點。

你是非常正確的 - 這應該這樣做:

private function create_object_vars(){ 

    // The Array of names of variables we want to create 
    $vars = array("tedi", "bear"); 

    foreach($vars as $var){ 
     // Push the variables to the Object as Public 
     $this->$var = "value to store"; 
    } 
} 

注意,這使得使用variable variable naming,它可以做一些瘋狂和危險的事情!

根據評論,這樣創建的成員將是公開的 - 我確定有創建受保護/私有變量的方法,但它可能並不簡單(例如,您可以通過擴展中的C Zend API )。

5

作爲替代方案,您還可以從ArrayObject中派生出您的對象。所以它繼承了數組行爲和一些使注入屬性更容易的方法。然後

class YourObject extends ArrayObject { 

    function __construct() { 
     parent::__construct(array(), ArrayObject::PROPS_AS_ARRAY); 
    } 

    function create_object_vars() { 
     foreach ($vars as $var) { 

      $this[$var] = "some value"; 

     } 
    } 

屬性將作爲$this->var$this["var"]同樣,這可能會或可能不適合使用的情況。另一種設置屬性的方法是$this->offsetSet("VAR", "some value");

順便說一句,變量變量沒有什麼壞處。它們是一個合適的語言結構,就像重用ArrayObject一樣。

31
$vars = (object)array("tedi"=>"bear"); 

$vars = new StdClass(); 
$vars->tedi = "bear";