PHP - проблема с вложенными операторами - PullRequest
1 голос
/ 23 февраля 2011

Я разрабатываю тему Wordpress для компании моего друга, но этот вопрос касается всего PHP, поэтому пишу здесь, на SO.

У меня есть две боковые панели, вот как мы отображаем боковые панели в Wordpress:

 if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('SidebarName') ) :  
 endif;    

Так что это утверждение if.

Хорошо, теперь я хочу отобразить одну боковую панель, если $ layout = "one". Две боковые панели, если $ layout == "two" и т. Д.

Этот код работает, но он дублирует содержимое боковых панелей. Я полагаю, что endifs работают с родительскими циклами или что-то в этом роде:

 if($layout="one") { 

      if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('Sidebar 1') ) :  
      endif; 

 } elseif($layout=="two") {

      if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar(' Sidebar 1') ) :  
      endif;    

      if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('Sidebar 2') ) :  
      endif;     

 } elseif($layout=="three") { (...)

Как решить эту проблему? Когда я просто удаляю основной цикл if - все работает, как и ожидалось, поэтому я уверен, что заблудился где-то выше.

Извините, опечатки, я использую $ layout == вместо =

Ответы [ 5 ]

1 голос
/ 23 февраля 2011

Редактировать: Я только что сделал тест, и похоже, что этот ответ неправильный. Мне удалось смешать двоеточие и скобки, если и во время синтаксиса вместе. Однако в руководстве указано:

'Примечание: смешивание синтаксиса в одном блок управления не поддерживается. '

Так что я немного запутался по этому поводу.


PHP Если операторы имеют два типа синтаксиса, один с фигурными скобками, а другой с двоеточиями.

if () {

}

и

if ():

endif;

Существуют также похожие синтаксисы для while, for, foreach и т. Д. Но вы не можете смешивать скобки с синтаксисами двоеточия. Поэтому вам нужно либо изменить свой код на

 if($layout=="one") { 

      if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('Sidebar 1') ) {
      }

 } elseif($layout=="two") {

      if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar(' Sidebar 1') ) {
      }    

      if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('Sidebar 2') ) {
      }     

 } elseif($layout=="three") { (...)

или

 if($layout=="one"):

      if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('Sidebar 1') ) :  
      endif; 

 elseif($layout=="two"):

      if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar(' Sidebar 1') ) :  
      endif;    

      if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('Sidebar 2') ) :  
      endif;     

 elseif($layout=="three"):
  (...)

 endif;

Подробнее об этом можно прочитать на http://php.net/manual/en/control-structures.alternative-syntax.php

Редактировать: Как глупо с моей стороны, я этого не заметил. Как и в других ответах, вы использовали один знак равенства вместо двух для проверки на равенство.

1 голос
/ 23 февраля 2011

Нет такой вещи, как "if loop".:)

Поскольку вы в основном повторяете одно и то же условие снова и снова, вы можете логически реструктурировать его следующим образом:

if (function_exists('dynamic_sidebar')) {
    switch ($layout) {
        case 'one' :
            dynamic_sidebar('Sidebar 1');
            break;
        case 'two' :
            dynamic_sidebar('Sidebar 1');
            dynamic_sidebar('Sidebar 2');
            break;
        case ...
    }
}

Это также должно учитывать проблемы синтаксиса / опечатоккоторые приводят к неправильной работе вашего сценария.

0 голосов
/ 23 февраля 2011

Во-первых, это неправильно:

if ($layout="one")

Всегда используйте == или === в операторе if (то же самое для elseif), потому что = фактически присваивает значение. Это, вероятно, часть того, что вызывает вашу ошибку.

Еще лучше, в этой конкретной ситуации, используйте оператор switch

В-третьих, вам не нужно копировать !function_exists('dynamic_sidebar'), просто вставьте его один раз. Это должно выглядеть так:

if function_exists('dynamic_sidebar')
{
    switch ($layout)
    {
        case 'one':
        dynamic_sidebar('Sidebar 1');
        break;

        case 'two':
        dynamic_sidebar('Sidebar 1');
        dynamic_sidebar('Sidebar 2');
        break;

        // ...
    }
}

Еще лучше , поменяйте все на число и просто сделайте цикл for:

if function_exists('dynamic_sidebar')
{
    for ($i = 0; $i < $sidebarCount; ++$i)
    {
        dynamic_sidebar("Sidebar $i");
    }
}
0 голосов
/ 23 февраля 2011

Я согласен с Майклом, а также, я не уверен, как настроены ваши функции, но обычно я вижу что-то более похожее на

if($layout == "one" && function_exists('dynamic_sidebar'))
{
    dynamic_sidebar('Sidebar 1');
}
0 голосов
/ 23 февраля 2011

Похоже, вы хотите использовать оператор равенства ==, где вы используете оператор присваивания =

if ($layout == "one")
// etc

Кстати, рассмотрите также использование более распространенного if/else PHP-синтаксиса. Вместо использования elseif и endif используйте этот синтаксис. Готовьтесь в соответствии с вашими соглашениями и предпочтениями.

if (condition)
{
  // code for condition
}
else if (condition)
{
  // code
}
else
{
  // else case code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...