我無法從使用字符串變量和PHP 5.3定義的類中獲取常量。命名空間。示例:使用名稱空間無法從動態類中獲取常量
use \Some\Foo\Bar;
$class = 'Bar';
echo $class::LOCATION;
其中LOCATION是一個正確定義的常量。我得到的錯誤說Bar Bar是未定義的。
如果我不是做
$class = "\Some\Foo\Bar";
一切工作正常。
有沒有辦法讓第一個例子工作?
我無法從使用字符串變量和PHP 5.3定義的類中獲取常量。命名空間。示例:使用名稱空間無法從動態類中獲取常量
use \Some\Foo\Bar;
$class = 'Bar';
echo $class::LOCATION;
其中LOCATION是一個正確定義的常量。我得到的錯誤說Bar Bar是未定義的。
如果我不是做
$class = "\Some\Foo\Bar";
一切工作正常。
有沒有辦法讓第一個例子工作?
使用$class::CONST
獲取類常量,需要$class
包含獨立於當前名稱空間的完全限定類名。
的use
語句不幫助這裏,即使你是一個在namespace \Some\Foo
,以下是行不通的:
namespace \Some\Foo;
$class = 'Bar';
echo $class::LOCATION;
正如你已經寫在你的問題,你已經找到了「解決方案」通過提供完全合格的類別名稱:
use \Some\Foo\Bar;
$class = "\Some\Foo\Bar";
echo $class::LOCATION;
但是,您不喜歡這一點。我不知道你的具體問題,但通常它看起來很好。如果您想將當前命名空間內解決的Bar
完全限定類名,你可以實例化一個對象並訪問常數:
use \Some\Foo\Bar;
$class = new Bar;
echo $class::LOCATION;
在這個階段,你甚至都不需要關心在命名空間中是。
如果您因爲某些原因需要在全局命名空間中有一個名爲Bar
的類,則可以使用class_alias
來使其起作用。在使用它的use \Some\Foo\Bar
的更換,讓您所需的行爲:
class_alias('\Some\Foo\Bar', 'Bar');
$class = 'Bar';
echo $class::LOCATION;
但無論如何,我可能不會得到你的問題,因爲你已經有解決方案看起來好像沒什麼問題。也許你可以寫出你的具體問題是什麼。
最後一個例子,謝謝。 – clang1234
接下來,它適用於以下代碼中的* all *,在正在進行的'class_alias'調用的全局名稱空間中總是會有一個名爲'Bar'的類。 – hakre