2012-09-12 23 views
0

我有一個這樣的靜態類。擁有一組參數,將它們替換爲%s的順序

<?php 

class Language 
{ 
    public static $language = array(); 
    var $config; 

    function __construct($config) 
    { 
     switch(strtoupper($config['LANGUAGE'])) 
     { 
      case 'ENGLISH': 
       self::setEnglish(); 
       break; 

      case 'TURKISH': 
       self::setTurkish(); 
       break; 

      default: 
       self::setEnglish(); 
     } 
    } 

    public static function setEnglish() 
    { 
     self::$language = array(

       'CHAIN_VALIDATOR_INITIALIZED' => 'ChainValidator initialized!', 
       'ERROR_FUNCTION_RETURNED_FALSE' => 'A function returned false.', 
      ); 
    } 

    public static function setTurkish() 
    { 
     self::$language = array(

       'CHAIN_VALIDATOR_INITIALIZED' => 'ChainValidator çalışıyor!', 
       'ERROR_FUNCTION_RETURNED_FALSE' => 'Bir fonksiyon false döndürdü.', 
      ); 
    } 

    public static function getLanguage($key) 
    { 
     return isset(self::$language[$key]) ? self::$language[$key] : $key; 
    } 
} 

?> 

它被這樣使用,

Language::getLanguage('CHAIN_VALIDATOR_INITIALIZED') 

,但我要通過更多的參數。與此類似,

Language::getLanguage('CHAIN_VALIDATOR_INITIALIZED', array(__FUNCTION__)) 

這些參數應按順序傳遞,如%s。最後看起來應該是這樣的:

"A function returned false" to; 
"%s function returned false" 

And output would be; 
"myLovelyFunction() returned false" (the first array parameter, which is __FUNCTION__) 

聽起來像小菜一碟我的大腦停止atm。

我該怎麼做?

+2

只需使用sprintf? – Philipp

回答

1

您可以使用call_user_func_arraysprintf爲,例如

<?php 
foo(); 

function foo() { 
    $text = format('CHAIN_VALIDATOR_INITIALIZED', array(__FUNCTION__, __LINE__)); 
    echo $text; 
} 

function format($key, $params) { 
    $format = '%[email protected]%s: function returned false'; // =getLanguage($key) 
    array_unshift($params, $format); 
    return call_user_func_array('sprintf', $params); 
} 

打印

[email protected]: function returned false 
+0

我剛纔也發佈了我的解決方案。哪一個更合乎邏輯?我的文件似乎更容易閱讀,但使用str_replace,因此可能會導致與性能相關的問題。 – Aristona

0

更改我的getLanguage函數解決了它。如果有人需要它,這裏是解決方案。

public static function getLanguage($key, $parameters = null) 
{ 
    $string = self::$language[$key]; 

    if(is_array($parameters)) 
    { 
     foreach ($parameters as $k => $v) 
     { 
      $string = str_ireplace('%s', $v, $string); 
     } 
    } 

    return $string; 
} 
+1

嘗試使用多個參數的解決方案;-) – VolkerK

+0

是的,只是注意到了失敗。 :p – Aristona

1

也許我誤解的問題,但我認爲vsprintf你想要做什麼。它基本上是一個接受參數作爲數組的sprintf。

$string = "%s %s blabla"; 
$params = array('foo', 'bar'); 

$output = vsprintf($string, $params); 
+0

哦,不知道php也有這個功能。比使用call_user_func_array(sprintf,...)更好 – VolkerK

相關問題