当变量不存在时,如何在php中避免未定义的变量?

时间:2013-03-25 10:53:32

标签: php wordpress variables undefined

我只在非常基本的东西上触摸php。

但我总是喜欢在制作wordpress主题时避免错误/注意事项。

我在下面有一个简单的功能,我列出了我的分类术语。

$tax = 'dealer-communications';
$terms = get_terms($tax);
$count = count($terms);
if ( $count > 0 ){
    echo '<li class="nav-header">Dealer communications</li>';
    foreach ( $terms as $term ) {
        if (get_queried_object()->slug == $term->slug) $active = 'class="active"';
        echo '<li '.$active.'><a href="'.get_term_link($term->slug, $tax).'">' . $term->name . '</a></li>';
    }
}


正如您所看到的,我有一个$active变量。

activeget_queried_object()->slug不匹配时,此$term->slug变量未定义

如何避免我的活动变量未定义。所以它被定义但是空的。

他们只有通过这样做才能解决问题......

$active = null;
if (get_queried_object()->slug == $term->slug) $active = 'class="active"';

...或

if (get_queried_object()->slug == $term->slug) {
    $active = 'class="active"';
} else {
    $active = '';
}


这是最有效的方法吗?还是有替代的php方法?


非常感谢 约什

5 个答案:

答案 0 :(得分:2)

没有替代的php方法,但为了便于阅读,您不应在if块中声明/初始化您的变量,例如:

foreach ( $terms as $term ) {
    $active = '';
    if (get_queried_object()->slug == $term->slug) $active = 'class="active"';
    echo '<li '.$active.'><a href="'.get_term_link($term->slug, $tax).'">' . $term->name . '</a></li>';
}

你也可以使用ternary operator(但不是真的可读):

$active = (get_queried_object()->slug == $term->slug) ? 'class="active"' : '';

答案 1 :(得分:1)

第二个将是更有效的方式:

if (get_queried_object()->slug == $term->slug) {
    $active = 'class="active"';
} else {
    $active = '';
}

答案 2 :(得分:1)

根据我的经验,第二种方法更常见。你当然可以使用ternary operator来缩短它,类似于:

$active = (get_queried_object()->slug == $term->slug) ? 'class="active"' : '';
//       if ^                                            ^ do this        ^ else do this    

有些人认为这更令人困惑。我想这归结为个人偏好。

答案 3 :(得分:1)

您也可以使用三元运算符,因为它更短:

$active = ( get_queried_object()->slug == $term->slug ? 'class="active"' : '' );

答案 4 :(得分:-1)

第二种选择是最佳方法,因为它确保变量值在每个循环上实际发生变化,否则前一循环的值可能会影响当前循环。

例如,您进入活动LI,将$ active设置为正确的值,一切正常。但是,在下一个循环步骤中,LI不应该处于活动状态,但由于您没有清除先前的赋值,因此$ active变量仍会将此LI设置为活动状态。

编辑: PHP范围不像javascript范围那样工作,这个答案的一些内容似乎需要澄清:

$test = array(
  array("name"=>"Is inactive", "active"=>false),
  array("name"=>"Is active", "active"=>true),
  array("name"=>"Is caught by problem", "active"=>false)
);

foreach ($test as $example ){
  if ($example["active"]) $active = true;

  if ($active) {
    echo $example["name"]." was parsed as ACTIVE\n";
  } else {
    echo $example["name"]." was parsed as INACTIVE\n";
  }
}

输出通知(因为$ active在循环的第一步未定义)和以下文本:

Is inactive was parsed as INACTIVE
Is active was parsed as ACTIVE
Is caught by problem was parsed as ACTIVE <--- Problem