在PHP中,如何在求值之前替换字符串变量?

时间:2013-06-12 17:54:56

标签: php string wordpress variables while-loop

在PHP尝试评估其真值之前,是否可以扩展/替换变量?

我正在尝试编写一个Wordpress模板,该模板将根据我们所在的页面执行不同的查询。如果我们在主页上,则查询应如下所示:

while ( $postlist->have_posts() ) : $postlist->the_post();
    // code...

如果我们不在主页上,则查询应如下所示:

while ( have_posts() ): the_post();
    // code...

所以我想我会试试这个:

$query_prefix = ( is_front_page() ) ? '$postlist->' : '';

$query_condition = $query_prefix.'have_posts()';
$query_do        = $query_prefix.'the_post()';

while ( $query_condition ): $query_do;
    // code...

问题是,这是创建一个无限循环,因为$query_condition是一个字符串并且计算结果为TRUE。似乎PHP从不“读取”变量的内容。我需要我的变量从字面上扩展自己,然后才提供自己的评估。谁能告诉我怎么做?

4 个答案:

答案 0 :(得分:3)

这些答案中的任何一个都有效,但提供另一种选择:

if(is_front_page()) {
    $callable_condition = array($postlist,'have_posts');
    $callable_do = array($postlist,'the_post');
} else {
    $callable_condition = 'have_posts';
    $callable_do = 'the_post';
}

while(call_user_func($callable_condition)) : call_user_func($callable_do);

此外,如果您在对象内,则可以使用array($this,'method')来调用对象的方法。

答案 1 :(得分:1)

处理此问题的一种方法是使用while条件中的逻辑或语句根据is_front_page()的结果根据不同的对象进行循环,然后使用if语句控制对the_post()的调用。

// loop while the front page and $postlist OR not the front page and not $postlist
while ( (is_front_page() && $postlist->have_posts() ) || ( !is_front_page() && have_posts() ) ): 
    // use $postlist if on the front page
    if ( is_front_page() && !empty($postlist) ){
        $postlist->the_post(); 
    } else { 
        the_post();
    }
    // the rest of your code
endwhile;

答案 2 :(得分:0)

可能是这样的例子可以帮助你。这是关于使用variables of variables

class A {
    public function foo(){
        echo "foo" ;
    }
}

$a = new A() ;

$obj = 'a' ;
$method = "foo" ;


${$obj}->$method() ; //Will echo "foo"

答案 3 :(得分:0)

我一直使用the_title来确定页面。

$isHomePage = false;
if(the_title( '', '', FALSE ) == "Home")
{
    $isHomePage = true;
}

然后我使用$ isHomePage作为我稍后在页面中需要的任何其他内容的标志。可以更改此选项以查找要单独输出的任何页面。如果你有很长的页面名称,它会变得毛茸茸,所以就有了。