拥有一系列参数,将它们替换为订单中的%s

时间:2012-09-12 12:21:18

标签: php

我有一个像这样的静态类。

<?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__)

听起来像我的大脑停止了一块蛋糕。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

您可以使用call_user_func_arraysprintf,例如

<?php
foo();

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

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

打印

foo@5: function returned false

答案 1 :(得分:1)

也许我误解了这个问题,但我认为vsprintf正是你想要的。它基本上是一个sprintf,它接受作为数组的参数。

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

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

答案 2 :(得分: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;
}