0

是否可以在 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

4 回答 4

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')调用对象的方法。

于 2013-06-12T18:38:16.790 回答
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;
于 2013-06-12T18:04:25.910 回答
0

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

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

$a = new A() ;

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


${$obj}->$method() ; //Will echo "foo"
于 2013-06-12T18:05:48.707 回答
0

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

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

然后我使用 $isHomePage 作为页面后面我需要的任何其他内容的标志。这可以更改为查找您想要挑选的任何页面。但是,如果您的页面名称很长,它可能会变得很麻烦,所以就是这样。

于 2013-06-12T18:10:13.803 回答