2013-03-03 135 views
0

我需要爲類(不是對象)分配一個變量。我知道在其他編程語言(如Java)中這很簡單,但我無法在PHP中找到實現這一點的方法。PHP - 將對象作爲對象處理

這是我想要做的一個片段:

class Y{ 

    const MESSAGE = "HELLO"; 

} 

class X{ 

    public $foo = Y; // <-- I need a reference to Class Y 

} 

$xInstance = new X(); 
echo ($xInstance->foo)::MESSAGE; // Of course, this should print HELLO 
+1

爲什麼你需要這個?也許有一種更習慣的方式來實現你想要的, – troelskn 2013-03-03 22:37:30

+0

我正在編寫一個小型庫,我需要訪問常量並在給定的類和運行時調用靜態方法。上面的例子是解釋我的問題的最簡單的方法。 – Augusto 2013-03-03 22:44:11

回答

0

我發現您可以像引用一樣處理任何r egular String。以下似乎是最簡單的方法。

注意:在下面的代碼片段中,我對問題中顯示的一個進行了一些修改,只是爲了便於閱讀。

class Y{ 
    const MESSAGE="HELLO"; 

    public static function getMessage(){ 
     return "WORLD"; 
    } 

} 
$var = "Y"; 
echo $var::MESSAGE; 
echo $var::getMessage(); 

這提供了一個統一的機制來訪問常量和/或靜態字段或方法。

3

在PHP中你不能存儲在變量的類的引用。所以你存儲一個字符串類的名稱,並使用constant()功能

class Y{ 

    const MESSAGE = "HELLO"; 

} 

class X{ 

    public $foo = 'Y'; 

} 

$xInstance = new X(); 
echo constant($xInstance->foo . '::MESSAGE'); 
0

你可以使用反射來找到它(見Can I get CONST's defined on a PHP class?),或者你可能的方法,如:

<?php 

class Y 
{ 
    const MESSAGE = "HELLO"; 
} 

class X 
{ 
    function returnMessage() 
    { 
     return constant("Y::MESSAGE"); 
    } 
} 

$x = new X(); 
echo $x->returnMessage() . PHP_EOL; 

編輯 - 還值得指出的您可以使用overloading來模擬此行爲,並有權訪問由用戶定義的方法處理的屬性或靜態屬性