为什么有人会使用printf输出html而不是将PHP分解为实际的html?

时间:2011-05-28 05:01:39

标签: php html wordpress syntax printf

从wordpress的二十个主题看这个看起来很可怕的代码:

<?php
function twentyten_posted_on() {
    printf( __( '<span class="%1$s">Posted on</span> %2$s <span class="meta-sep">by</span> %3$s', 'twentyten' ),
        'meta-prep meta-prep-author',
        sprintf( '<a href="%1$s" title="%2$s" rel="bookmark"><span class="entry-date">%3$s</span></a>',
            get_permalink(),
            esc_attr( get_the_time() ),
            get_the_date()
        ),
        sprintf( '<span class="author vcard"><a class="url fn n" href="%1$s" title="%2$s">%3$s</a></span>',
            get_author_posts_url( get_the_author_meta( 'ID' ) ),
            sprintf( esc_attr__( 'View all posts by %s', 'twentyten' ), get_the_author() ),
            get_the_author()
        )
    );
}
?>

为什么有人想这样做?

为什么不这样做呢?

<?php
function twentyten_posted_on() {
    ?>
    <span class="meta-prep meta-prep-author">Posted on</span>
    <a href="<?php= get_permalink() ?>" title="<?php= esc_attr( get_the_time() ) ?>" rel="bookmark">
        <span class="entry-date">get_the_date()</span>
    </a>
    <span class="meta-sep">by</span>
    <span class="author vcard">
        <a class="url fn n" href="<?php= get_author_posts_url( get_the_author_meta( 'ID' ) ) ?>" title="<?php= esc_attr__( 'View all posts by '.get_the_author() ) ?>"><?php= get_the_author() ?></a>
    </span>
    <?php
}
?>

后者对我来说更清洁。为什么有人会使用第一种方法呢?这只是个人偏好,还是有一些功能上的好处?

3 个答案:

答案 0 :(得分:17)

它的编写方式可以实现国际化。您会看到,在printf()的调用中,有__()的调用,这是WordPress的翻译功能。

通过这种方式,翻译人员可以通过移动%1$s部分轻松移动每个字符串的各个部分,以符合他们语言的语法和结构。然后,翻译的格式字符串将传递给printf(),它可以插入适当的变量。

WordPress' doc page on translation有一些翻译方面的例子(虽然字符串更简单)。

并非所有正在发生的事情都是翻译所必需的,但由于他们已经做了一些printf风格的事情,我想理论是,如果它至少是一致的,那就更容易理解了。

答案 1 :(得分:1)

我只是个人品味的问题。使用sprintf的作者可能更喜欢它,因为它将表示与逻辑分开。我发现你的阅读方式更容易(我也更愿意避免使用短开标签)。

答案 2 :(得分:1)

这取决于你需要渲染的内容。当第一个参数是变量字符串或本地化字符串时,我个人使用sprintfprintf

另一方面,这个代码示例的真正问题是它如何从函数内部输出HTML ....我本来会使用“视图”文件(例如:include $view_file;)所以代码妥善分离和组织。