2013-03-25 42 views
0

我只在非常基本的東西上觸摸php。如何避免變量不存在時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變量。當我get_queried_object()->slug不匹配$term->slug

我怎樣才能避免被不確定我主動變

active變量是不確定的。所以它被定義但是空的。

他們唯一的出路我的大腦可以工作了,通過這樣做......

$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方法嗎?


非常感謝 喬希

回答

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"' : ''; 
+0

感謝您的評論。用三元運算符,你的意思是不可讀? – Joshc 2013-03-25 11:11:04

+0

我認爲三元體系在大多數情況下都是可讀的,但很多人都不相同 – soju 2013-03-25 11:13:29

1

第二屆一個將是更有效的方式:

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

的評論酷感謝,但我要與三元運算符選項縮短。 – Joshc 2013-03-25 11:15:59

+0

好的。很酷.......... – 2013-03-25 11:21:03

-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"; 
    } 
} 

輸出的通知(因爲$活躍是在循環的第一步未定義)以及以下文字:

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

你錯了,因爲你可以在循環中設置'$ active'的默認值 – soju 2013-03-25 11:02:41

+0

如果你使用任何消化辦法,問題中的第一段代碼不會。 – cernunnos 2013-03-25 11:10:54

+0

我猜想它不能由於範圍而出現循環,所以每當循環開始時它都是一個新變量。 – Joshc 2013-03-25 11:14:57

1

第二種方法比較常見,以我的經驗來看。你當然可以縮短這個使用ternary operator,類似於:

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

有些人認爲這是更加混亂,雖然。我想這歸結於個人偏好。

+0

是的,我明白了爲什麼,但感謝或代碼的筆記,我可以看到現在有什麼問題。非常感謝 – Joshc 2013-03-25 11:13:36

1

你也使用三元運算,因爲它是一個有點短:

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

很感謝您的評論 – Joshc 2013-03-25 11:11:29