PHP将变量传递给Class并将其用作常量或变量的前缀

时间:2019-03-25 14:30:01

标签: php

我已经设置了一个全局变量$ lang($ lang ='de'),有没有办法我可以得到“ Hallo!”通过使用,我正在使用PHP 7.3:

L::HELLO('Mike');?

我不是在寻找类似的解决方案:

sprintf(constant('L::' . $lang . '_HELLO'), 'Mike');

相反,只能通过致电获得它们:

L::HELLO('Mike');

或:

L::HI;

实际类(如果可以帮助或以设置的语言初始化类,我可以通过var更改const):

<?php class L {
    const en_HELLO = 'Hello %s!';
    const de_HELLO = 'Hallo %s!';
    const fr_HELLO = 'Bonjour %s!';
    const it_HELLO = 'Ciao %s!';
    const en_HI = 'Hi...';
    const de_HI = 'Hi...';
    const fr_HI = 'Hi...';
    const it_HI = 'Hi...';

    public static function __callStatic($string, $args) {
        return vsprintf(constant("self::" . $string), $args);
    }
}

1 个答案:

答案 0 :(得分:4)

我可以通过两种方式查看。首先是最简单的-但我通常也不会推荐它。

这使用global来访问您已经拥有的变量,并将其作为用于显示常量的键的一部分。

public static function __callStatic($string, $args) {
    global $lang;
    return vsprintf(constant("self::" .$lang."_" . $string), $args);
}

所以

$lang = "de";
echo L::HELLO('Mike');

给予

Hallo Mike!

第二种方法涉及将语言设置到您的类中,因此这是一个额外的步骤,但是它也更加灵活(IMHO)...

class L {
    const en_HELLO = 'Hello %s!';
    const de_HELLO = 'Hallo %s!';
    const fr_HELLO = 'Bonjour %s!';
    const it_HELLO = 'Ciao %s!';

    protected static $lang = "en";

    public static function setLang ( string $lang )  {
        self::$lang = $lang;
    }

    public static function __callStatic($string, $args) {
        return vsprintf(constant("self::" .self::$lang."_" . $string), $args);
    }
}

因此,您可以将其用作...

$lang = "de";
L::setLang($lang);
echo L::HELLO('Mike');