2013-06-12 2 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

Смежные вопросы