2011-08-21 126 views
3

是否可以將類方法別名作爲全局函數?作爲全局函數的別名類方法

我有一個類,它充當PHP中gettext函數的包裝。我有一個名爲_t()的函數來處理翻譯。

我希望能夠在我的代碼中的任何位置將它稱爲_t(),而不必通過實例化對象($translate::_t())來完成,因爲這似乎相當笨拙。

我想過使用的命名空間,得到的目的別名:

Use translations\TranslationClass as T 

雖然這是一個更好的改進:T::_t()。它仍然不像只需要做_t()那樣需要。

整個應用程序中是否有別名爲T::_t(),正如_t()

回答

1

您可以創建包裝函數或使用create_function()。

function _t() { 
    call_user_func_array(array('TranslationClass', '_t'), func_get_arts()); 
} 

或者你可以即時創建一個功能:

$t = create_function('$string', 'return TranslationClass::_t($string);'); 

// Which would be used as: 
print $t('Hello, World'); 
+0

有趣。我會研究這一點,並在一天左右回來:) – F21

0

您可以使用eval()函數轉換方法爲全局函數。

function to_procedural($classname, $method, $alias) 
{ 
    if (! function_exists($alias)) 
    { 
    $com = $command = "function ".$alias."() { "; 
    $com .= "\$args = func_get_args(); "; 
    $com .= "return call_user_func_array(array(\"".$classname."\", \"".$method."\"), \$args); }"; 
    @eval($command); 
    } 
    return function_exists($alias); 
} 

本示例適用於靜態方法。

+0

這樣做的表現如何?會不會有使用eval()的巨大性能命中? – F21