0

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

<?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。

我怎样才能做到这一点?

4

3 回答 3

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
于 2012-09-12T12:31:46.420 回答
1

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

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

$output = vsprintf($string, $params);
于 2012-09-12T13:26:51.253 回答
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;
}
于 2012-09-12T12:29:23.240 回答