2013-06-12 104 views
0

在PHP嘗試評估其真值之前是否可以展開/替換變量?在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從不'讀取'變量的內容。我需要我的變量直接擴展自己,然後才提供自己的評估。任何人都可以告訴我如何做到這一點?

+0

不是我能說的。根據var_dump(),它是一個字符串,只是長短不一。所以它總是會評估爲「設置」,或者是真的。 –

回答

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')打電話給你的對象的方法。

+0

它的工作原理。這是一個華麗的解決方案,當然是最優雅的。感謝您的教訓。 –

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; 
+0

你我的朋友是個天才!有效。我從來不會想到我自己。非常感謝。 –

0

可能是這樣的例子可能可以幫助你。這是關於使用variables of variables

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

$a = new A() ; 

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


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

問題是OP希望能夠調用'$ object-> function()'以及'function()',所以沒有一個對象實例。 – doublesharp

0

我一直使用the_title來確定頁面。

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

然後我使用$ isHomePage作爲其他任何我在頁面中稍後需要的標誌。這可以改變,尋找你想要選出的任何頁面。如果你有很長的頁面名稱,它會變得毛茸茸的,所以就是這樣。

+0

你可以使用內建的'is_front_page()'和'is_home_page()'函數完成同樣的事情......問題是基於結果使用不同的WP_query。 – doublesharp