2011-06-19 171 views
3

是否可以使用這樣一個變量來導入命名空間:導入變量的命名空間

$namespace = 'User\Authorization\Certificate'; 
use $namespace; 

顯然,這將無法運行爲use語句要求恆定的,但有一種解決方法?

編輯:發現了寶石(僅在PHP> 5.3):class_alias($namespace, alias);這確實幾乎同樣的事情use User\Authorization\Certificate as alias;所以將使用。

+1

我不知道你在努力達到什麼目的。 – hakre

+0

嗯,我將require_once&use語句與非常結構化的類和文件夾層次結構的幫助下的導入(..)函數結合起來。 –

+0

爲了引入你的命名空間,修改你需要的文件的內容是否相當可觀? – hakre

回答

2

雖然不可能在一個變量傳遞一個命名空間use,您可以地方命名空間和預期的「短」類變量名和使用,在大多數地方,你會需要它,如調用new

$namespace = '\foo\bar'; 
$class = 'baz'; 
$fully_qualified = $namespace . '\\'. $class; // \foo\bar\baz 
$a_foo_bar_baz = new $fully_qualified(...); 
var_dump($a_foo_bar_baz instanceof $fully_qualified); // true 
+1

我去了class_alias(..)函數,這幾乎是你想要的在代碼中實現這麼好的解決方案。 –

0

不,PHP期望use遵循命名空間,而不是表達式(其中不包括常量)。見Using namespaces: Aliasing/Importing

但是,如果您在系統內的某種聚合或編譯階段執行之前更改了PHP代碼,那麼可以用一些對PHP看起來足夠靜態的變量數據替換文本。

但我不知道你的系統是否有能力這樣做。我可以想象一些stream wrapperstream filter在飛行中這樣做。它可以透明地處理插入變量名稱空間的名稱。

+0

即時更改.php文件,可能會導致它被截斷爲0字節,如果同時被多個用戶訪問,或類似的東西......我記得有我的.txt「數據庫」的可怕經驗時,消失PHP + MySQL託管非常罕見,您必須爲此付費。 –

+0

我不認爲這適用。如果是這樣,那麼對於裸用戶/包含已經是個問題。改變文件不需要實際再次保存文件。 – hakre

+0

你的意思是加載.php,改變文本,然後使用'eval()'? –