我只在非常基本的东西上触摸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
变量。
当active
与get_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方法?
非常感谢 约什
答案 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