2012-08-23 53 views
5

靜態變量我有一個關於一個問題,「動態」類正開始,讓我解釋一下我的意思是:

$class = 'User'; 
$user = new $class(); 

//...is the same as doing 
$user = new User(); 

所以......這不是問題,但我有一些麻煩做相同的,同時呼籲從一個類的靜態變量,例如:

$class = 'User'; 
print $class::$name; 

其中給出了以下錯誤:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in

關閉當然,我已經測試了print User::$name;,並且工作。所以班級的作品。

這是爲什麼,有沒有辦法解決這個問題?

後續問題:
也沒有任何正當理由不使用在創建類這種「動態」的方式?

+0

你不能混合使用動態和靜態調用,這就是爲什麼不可能調用User :: $$ prop以及你的$ class :: $名稱 –

+0

http://stackoverflow.com/questions/3679717/unexpectedt -paamayim-nekudotayim-on-one-computer-but-not-another-with-php-5 –

+1

[通過$ var :: $引用訪問靜態變量]的可能重複(http://stackoverflow.com/questions/ 675676/access-a-static-variable-by-varreference) –

回答

1

如果你沒有的PHP版本5.3和更高版本,並且您不想使用反射(在我看來這是一種過度消耗 - 除非您想訪問多個靜態屬性),您可以定義getter函數並通過call_user_func()調用它:

class A { 
    public static $var = "Hello"; 
    public static function getVar() { 
     return self::$var; 
    } 
} 
$className = "A"; 
echo call_user_func(array($className, 'getVar')); 
+0

那麼,這當然是一個解決問題的工作......謝謝! – jamietelin

+0

更簡單的解決方法似乎是; '$ vars = get_class_vars($ className);' – jamietelin

2

此代碼的工作好於PHP 5.4.3:

<?php 

class A { 
    public static $var = "Hello"; 
} 

print(A::$var); 

$className = "A"; 
print($className::$var); 

?> 
+2

也適用於5.3.2 –

+2

這是OP的代碼。據推測(儘管他沒有說)他必須使用早期版本的PHP。 –

+1

那麼,那麼我知道這是我的PHP版本,這是問題。 :) 謝謝! – jamietelin

2

這是我在評論中鏈接的問題的答案:

You can use reflection to do this. Create a ReflectionClass object given the classname, and then use the getStaticPropertyValue method to get the static variable value.

class Demo 
{ 
    public static $foo = 42; 
} 

$class = new ReflectionClass('Demo'); 
$value=$class->getStaticPropertyValue('foo'); 
var_dump($value); 
+0

使用反射似乎是矯枉過正的解決方案,除非你的意思是在靜態類的大量屬性上使用它,但是,是的,使用反射會得到你需要的結果 –

+1

另外,它聽起來是錯誤消息,OP是使用版本PHP在任何版本(5.3.something)之前有適當的支持靜態類和靜態類變量,因此這可能是最好的選擇。 –

+0

從創建「真實」課程然後獲取我的變量,這裏真正的區別是什麼?像:'$ user = new $ class();打印$ user-> name;'?使用反射會有性能提升嗎? – jamietelin