带参数的PHP vsprintf

时间:2014-11-05 00:22:10

标签: php

我有以下课程:

<?php 
    class L {
        const login = 'Login';
        const title_404 = '404';
        const title_dyn = 'Title: %s';
        const page_dyn = 'Page: %s - %s';

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

它不会通过传递的参数替换%s:

    L::login; --> Login
    L::title_404; --> 404
    L::title_dyn('test'); --> empty
    L::page_dyn('test', 'more'); --> empty
    L::login(); --> empty

我应该使用L :: title_dyn(&#39; test&#39;); - &GT; &#34;标题:test&#34;

我做错了什么?

1 个答案:

答案 0 :(得分:1)

大概你的完整测试用例是这样的:

<?php 
class L {
    const login = 'Login';
    const title_404 = '404';
    const title_dyn = 'Title: %s';
    const page_dyn = 'Page: %s - %s';

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

echo L::login . "\n";                    // "Login"
echo L::title_404 . "\n";                // "404"
echo L::title_dyn('test') . "\n";        // (empty)
echo L::page_dyn('test', 'more') . "\n"; // (empty)
echo L::login() . "\n";                  // (empty)

(下次请在问题中写这个)

前两个工作是因为你没有使用函数调用语法,所以常量是echo'按原样。

后三者是空的,因为尽管__callStatic完成了它的工作,但它完全放弃了这项工作:你永远不会返回vsprintf 的结果。回想一下,vsprintf不输出任何内容 - 返回其结果。你也没有写任何echo。因此,您的调用代码没有使用的值,也没有函数本身的输出。就像你的问题所说的那样,Presto。

你几乎肯定想要这样做:

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

现场演示:brokenworking