PHP-嵌套的If语句问题

PHP-嵌套的If语句问题,php,wordpress,loops,if-statement,Php,Wordpress,Loops,If Statement,我正在为我朋友的公司开发Wordpress主题,但这个问题都是关于PHP的,所以在这里写,等等 我有两个侧栏,这就是我们在Wordpress中显示侧栏的方式: if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('SidebarName') ) : endif; 这是一个if语句 好的,现在,如果$layout==“一”我想显示一个边栏,如果$layout==“二”等等,我想显示两个边栏 这段代码可以工作,但

我正在为我朋友的公司开发Wordpress主题,但这个问题都是关于PHP的,所以在这里写,等等

我有两个侧栏,这就是我们在Wordpress中显示侧栏的方式:

 if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('SidebarName') ) :  
 endif;    
这是一个if语句

好的,现在,如果$layout==“一”我想显示一个边栏,如果$layout==“二”等等,我想显示两个边栏

这段代码可以工作,但它复制了侧边栏内容,我相信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==而不是=

看起来您的意思是在使用赋值运算符的地方使用相等运算符
=

if ($layout == "one")
// etc
顺便说一下,还要考虑使用更常见的<代码> I/OR PHP语法。不要使用
elseif
endif
使用此语法。根据你的习惯和喜好来支撑

if (condition)
{
  // code for condition
}
else if (condition)
{
  // code
}
else
{
  // else case code
}

编辑:我刚做了一个测试,看起来这个答案是错的。我能够将冒号和大括号if和while语法混合在一起。然而,该手册并未说明:

注:在同一个系统中混合语法 不支持控制块。'

所以我对此有点困惑


PHP If语句有两种语法,一种是大括号,另一种是冒号

if () {

}

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
循环”。)

由于您基本上只是一次又一次地重复相同的条件,因此可以逻辑地将其重新构造为:

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 ...
    }
}

这还应该考虑导致脚本行为不正常的语法/键入问题。

我同意Michael的观点,而且,我不确定函数是如何设置的,但通常我会看到类似于

if($layout == "one" && function_exists('dynamic_sidebar'))
{
    dynamic_sidebar('Sidebar 1');
}
首先,这是错误的:

if ($layout="one")
始终在
if
语句中使用
=
==
(与
elseif
相同),因为
=
实际上分配了值。这可能是导致您的bug的部分原因

更好的是,在这种特殊情况下,使用

第三,你不必一直复制
!函数存在(“动态侧栏”)
只需将其放入一次即可。应该是这样的:

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");
    }
}
如果函数_存在(“动态_边栏”)
{
对于($i=0;$i<$sidebarCount;++$i)
{
动态侧栏(“侧栏$i”);
}
}

没有什么比
if
循环更好的了。你对main
if
loop是什么意思?外部
if
语句?这些函数在做什么?对我来说,有空的
if
语句(或者你没有显示
if
语句的内容)似乎是毫无用处的(也是不直观的)。当你说
if循环时,我想你的意思是
嵌套的if语句
代码的结构应该很好。我刚刚尝试了
if(1){if(1):echo“foo”;endif;}
这很有效。这很有趣。手册特别指出:“注意:不支持在同一个控制块中混合语法。”我在使用大括号和冒号语法时也遇到过问题。也许这只是在冒号ifs中使用大括号ifs的问题。我在混合使用大括号和冒号语法时找不到任何问题。即使使用ifs和其他控制结构,如循环。这真的很奇怪,我发誓我以前有过问题。我将相应地编辑我的帖子。
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;

        // ...
    }
}
if function_exists('dynamic_sidebar')
{
    for ($i = 0; $i < $sidebarCount; ++$i)
    {
        dynamic_sidebar("Sidebar $i");
    }
}