2012-07-11 50 views
0

如何得到下面的代碼不會炸燬我的臉?在尚不存在的類中聲明變量

<?php 

    class abc{ 
    } 
    abc::$someDynamicVariable 
?> 

我真的不想申報前手的變量,並希望我能在__construct功能聲明它

我得到的錯誤是(JavaScript函數arguments數組人?):

Fatal error: Access to undeclared static property: abc::$someDynamicVariable in

+0

你一定要顯式的類中聲明它... – KingCrunch 2012-07-11 21:18:35

+0

這是一個爲SQL工廠獲得一個配置對象,我想關閉自動加載基於它的名字變量我傳遞,因爲我有幾個dbs我需要玩雜耍(並且我想要我可以在我的生活中稍後使用的東西),所以知道變量被稱爲是一個問題。 – Alex 2012-07-11 21:21:13

回答

1

您可以使用PHPs Magic Methods__set()__get()設置/獲取屬性的動態不迄今存在。

下面是一個例子:

class Foo { 
    private $data = array(); 

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

    public function __get($key) { 
     return $this->data[$key]; 
    } 
} 

$foo = new Foo(); 
$foo->something = "bla"; // using magic __set() 

echo $foo->something; // using magic __get() 
+0

根據https://bugs.php.net/bug.php?id=39678 – Alex 2012-07-11 21:44:57

+0

,這不適用於靜態上下文,這就是爲什麼這不是在靜態環境下完成的。然而,向類(而不是對象)添加屬性可能會使用「反射」來完成。 – fdomig 2012-07-11 21:47:22

1

你不必給它一個值馬上:

class abc{ 
    public static $theVariable; 

    // only give it a value when initialized 
    public function __construct() { 
     $this->theVariable = "someValue" 
    } 
} 
abc::$someDynamicVariable 

,或者你可以用不同的類擴展它

class abc{ 
    public static $theVariable; 
} 

延長

class cab extends abc { 
    public function __construct() { 
     $this->theVariable = "someValue" 
    } 
} 
+0

這是錯誤的。您將'$ this'與靜態屬性結合使用。對於後期的靜態綁定,應該是'self :: $ theVariable'或'static :: $ theVariable'。 – fdomig 2012-07-11 21:29:58