2011-03-27 58 views
15

PHP手冊說訪問PHP類常量

像靜態成員,恆定值不能從對象的實例進行訪問。

這也解釋了爲什麼你不能做到這一點

$this->inst = new Classname(); 
echo $this->inst::someconstant; 

但後來爲什麼這項工作?

$this->inst = new Classname(); 
$inst = $this->inst; 
echo $inst::someconstant; 
+0

'$研究所:: someconstant'有效*語法*,但它的實際工作? – deceze 2011-03-27 06:10:22

+0

在我的測試中它確實。 – pettazz 2011-03-27 06:13:14

回答

17

從PHP交互shell:

php > class Foo { const A = 'a!'; } 
php > class Bar { public $foo; } 
php > $f = new Foo; 
php > $b = new Bar; 
php > $b->foo = $f; 
php > echo $b->foo::A; 
PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM, expecting ',' or ';' in php shell code on line 1 

前者語法失敗是PHP解析器不知道如何解決財產引用後雙冒號的原因。不管這是否是有意的,都是未知的。

後者語法有效,因爲它不是通過屬性直接進入,而是通過一個局部變量,其解析器接受的東西能一起工作:

php > $inst = $b->foo; 
php > echo $inst::A; 
a! 

(順便說一句,這同樣限制是到位對於匿名函數作爲屬性,你不能直接使用parens調用它們,你必須先將它們分配給另一個變量,然後從那裏調用它們,這已在PHP的trunk中修復,但我不知道它們是否也修復了雙冒號語法)

+0

所以它真的可以歸結爲PHP解析器中的一個錯誤,它將在更高版本中修復? – pettazz 2011-03-27 06:23:57

+1

這是一個疏忽或有意的決定。我不確定我會把它稱爲一個錯誤。 PHP內部人士傾向於認爲人們很容易混淆,所以他們儘量不要讓可能的「模糊」語法通過。雙冒號也用於指靜態方法;在一個類的實例上調用一個靜態方法將是完全荒謬的。也就是說,如果他們要限制* that *行爲,那將是一個運行時錯誤,而不是* parse *錯誤。 – Charles 2011-03-27 06:27:39

7

引述手冊:

作爲PHP 5.3.0的,有可能使用變量來引用類。變量的值不能是關鍵字(例如self,parent和static)。

它接着用這個例子:

$class = new MyClass(); 
echo $class::constant."\n"; // As of PHP 5.3.0 

所以$inst::someconstant應該工作。

至於爲什麼$this->inst::someconstant給出解析錯誤,我不知道。 PHP對某些事情很有趣。