2014-01-17 57 views
-1

我有一個功能,它的工作原理。請檢查以下內容:php |更有效的功能

public static function checkAccessLevel($user, $level) { 

    public static function checkLevel($user, $level) { 

    if ($level == "1") { 
     if (!$user->usertype == 1) { 
      return array(
      'error' => 'Please login before', 'errortype' => 0 
     );  
     } 
    } else if ($level == "2") { 
     if (!$user->usertype == 2) { 
      return array(
      'error' => 'Please login before', 'errortype' => 0 
     );  
     }      
    } else if ($level == "1,2") { 
     if (!$user->usertype == 1 || !$user->usertype == 2) { 
      return array(
       'error' => 'Please login before', 'errortype' => 0 
      ); 
     }     
    } else { 
     return array(
      'error' => 'Please login before', 'errortype' => 0 
     ); 
    } 
} 

我正在尋找代碼優化的方式。是否可以重寫這個函數?

+2

是的,但這個問題應該移到codereview.stackexchange.com。 – Jon

+3

應該移動到codereview.stackexchange.com – Cyclonecode

回答

1

$level總是逗號分隔,剛剛打破它,並檢查:

public static function checkLevel($user, $level) 
{ 
    $level = explode(',', $level); 
    if(!in_array($user->usertype, $level)) 
     return array(
      'error' => 'Please login before', 
      'errortype' => 0 
     ); 
} 

更好但是,拋出一個Exception或返回一個布爾值。

+0

謝謝!好的解決方案 – user889349

1

首先考慮使用switch,它應該更具可讀性。

那麼你可能會組你的條件,而不是:

} else if ($level == "1,2") { 
    if (!$user->usertype == 1 || !$user->usertype == 2) { 

它們組合在一起:

(($level == "1,2") && (!$user->usertype == 1 || !$user->usertype == 2)) 

然後你可以使用臨時變量$結果:

$result = array('Please login... 

和回報它最終不會在每一步中使用return關鍵字,它應該可以幫助您進行調試。

另外我建議閱讀Martin Fowlers book about refactoring這將給你很多好的建議。

+1

馬丁!馬丁福勒!不馬克lol –

0

你可以使用,而不是一個switch語句的if語句,就像這樣:

public static function checkLevel($user, $level) { 
    $result = array(); 
    switch($level) { 
     case '1': 
      if($user->usertype == 1) { 
       $result = array(
        'error' => 'Please login before', 'errortype' => 0 
       ); 
      } 
     break; 
     // More cases for each level. 
     default: 
      $result = array(
       'error' => 'Please login before', 'errortype' => 0 
      ); 
    } 

    return $result; 
} 
1
public static function checkLevel($user, $level) 
{ 
    if (($level == "1" && ! $user->usertype == 1) || 
     ($level == "2" && ! $user->usertype == 2) || 
     ($level == "1,2" && ! in_array($user->usertype, array(1, 2))) || 
     ! in_array($level, array("1", "2", "1,2"))) { 
     return array(
      'error' => 'Please login before', 'errortype' => 0 
     ); 
    } 
}