2014-05-04 45 views
1

很長一段時間我遇到一個問題 - 我是否應該重複使用小部分代碼,如果是這樣,我應該怎麼做纔是最好的做法。在PHP中使用微代碼的最佳實踐

我是指小碼是什麼,例如:

if (!is_array($table)) { 
    $table = array($table); 
} 

或代碼

$x = explode("\n", $file_content); 

$lines = array(); 

for ($i=0, $c = count($x); $i<$c; ++$i) { 
    $x[$i] = trim($x[$i]); 
    if ($x[$i] == '') { 
    continue; 
    }   
    $lines[] = $x[$i];  
} 

這樣的小零件可能會在許多類中使用的一個項目,但他們中的一些也使用在許多項目中。

有很多種可能的解決方案,我認爲:

  1. 創建簡單的函數文件,並把他們都重用部分代碼的功能,它們包括簡單的項目,並使用它們,每當我想
  2. 創建特質那些代碼片段並在類中使用它們
  3. 通過簡單複製粘貼或創建特定類中的函數來複用代碼(??)
  4. 其他?

我認爲所有這些解決方案都有其優點和缺點。

問題:我應該使用什麼方法(如果有的話)來重用這些代碼,爲什麼這種方法在您看來是最好的?

回答

2

稱它爲我認爲,「最好的辦法」取決於許多因素,包括您的應用程序使用的技術(程序,OOP),PHP運行的版本等等。例如,特性很有趣且有用,但它們僅在PHP 5.4.0之後纔可用,所以使用此工具將您的代碼片段分組您將無法在早期PHP版本的系統中重複使用它們。另一方面,如果您的應用使用OOP風格,並且在功能中組織了您的可重新使用的小代碼片段,則在OOP應用中它們的使用可能看起來很尷尬,並與特定類中的函數名稱發生衝突。在這種情況下,我認爲將你的函數分組在類中看起來更自然。上面概括地說,類似提供了更好的工具來分組可重用的代碼片段,即與早期PHP版本的向後兼容性,避免函數名稱衝突等。)我個人主要在OOP中編碼,所以我有一個Util類,它將代表可重用代碼片斷的小函數分組,這些代碼片斷之間並不直接相關,因此無法在其他類中進行邏輯分組。

+0

好吧,以及你如何在你的應用程序中使用這些類?你是否創建了這些類的許多對象,或者創建一個並將它傳遞給構造函數,或者在@Cleric中創建類的靜態方法? –

+1

@MarcinNabiałek你當然可以使用靜態方法。另一種可能性是編寫一個單例類,不要用完全相同的無盡對象來氾濫應用程序。這是我更喜歡大多數時間的方法。如果我在應用程序中有幾個這樣的類,我通常將它們存儲在單個註冊表類中,該類用作某種標識映射,以確保每個對象只加載一次。 – akhilless

+0

好吧,我明白了。我也使用過註冊表,但僅用於存儲配置/路由/數據庫等 –

0

如果您的代碼主要涉及類和對象,請與traits一起使用。由於特徵的概念完全關注代碼重用能力。

+0

只有自PHP 5.4.0以上版本才具有這些特性。在早期版本的語言中,您將不得不使用不同的工具,例如函數或類。 – akhilless

+0

@akhilless,對,在這​​種情況下,OP必須去解決方案1. –

1

正如前面提到的特質是一件好事。但一段時間後可能有點難以管理,並且自從它的新版本以後,它可能不會得到任何支持。

我要做的就是創建一個有很多小靜的功能,比如工具類:

class ArrayTools 
{ 

    static public function CheckArray($array) 
    { 
     if (!is_array($array)) 
     { 
      $array = array($array); 
     } 

     return $array; 
    }  

} 

所以,你可以用ArrayTools::CheckArray($array)

+0

嗯,它更好地避免_staticness_ :) –

+0

@ShankarDamodaran這是一個容易滑坡,但對於這些具體的事情加上一些代碼標準,其易於將它們用作內置函數的PHP。但我同意你,危險的東西:) – Cleric

0

以下是實際用於普通PHP項目的代碼片段,這些代碼片段用於各種框架的良好特性和最佳實踐。

1. 下面的代碼是用來檢查你工作的環境,根據環境你可以設置一些全局變量,錯誤報告等等。

if(!defined('ENVIRONMENT')){ 
    define('ENVIRONMENT','DEVELOPMENT'); 
} 

if (defined('ENVIRONMENT')) 
{ 
    switch (ENVIRONMENT) 
    { 
     case 'DEVELOPMENT': 
     case 'TESTING': 
      $base_url = 'http://localhost/project_name/'; 
      error_reporting(E_ALL); 
      break; 

     case 'PRODUCTION': 
      $base_url = 'http://hostname/project_name/'; 
      error_reporting(0); 
      break; 

     default: 
      exit('The application environment is not set correctly.'); 
    } 
} 

2.

/* This function is used to PRINT the ARRAY data in the pre formatted manner */ 
if (!function_exists('pr')) { 
    function pr($data) { 
     echo '<pre>', print_r($data), '</pre>'; 
    } 
} 

3.

/* This function is used to Sanitize the user data and make data safe to insert into the database */ 
function sanitize($data) { 
    global $link; 
    $data = trim($data); 
    return htmlentities(strip_tags(mysqli_real_escape_string($link, $data))); 
} 

4.

/* Used to get the difference of 2 arrays 
    Returns the array with difference  
*/ 
function multi_diff($arr1,$arr2){ 
    $result = array(); 
    foreach ($arr1 as $k=>$v){ 
    if(!isset($arr2[$k])){ 
     $result[$k] = $v; 
    } else { 
     if(is_array($v) && is_array($arr2[$k])){ 
     $diff = multi_diff($v, $arr2[$k]); 
     if(!empty($diff)) 
      $result[$k] = $diff; 
     } 
    } 
    } 
    return $result; 
} 

5.

/* This fnction is used to generate the random keys of specific length 
    Accepts parameter of certain length if not specified it will generate 20 bit length automatically 
*/ 
function generate_random_key($length = 20) { 
    //Initializing the varialble 
    $keystring = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'; 
    $random_key = ''; 
    for ($i = 0; $i < $length; $i++) { 
     $random_key.=$keystring[rand(0, strlen($keystring) - 1)]; 
    } 
    //Return the randomly generated key 
    return $random_key; 
} 

6.

/* This function outputs the errors in ul>li format with unstyled 
* To get the bullets styling remove class='list-unstyled' in <ul> tag */ 
function output_errors($errors){ 
    $output = array(); 

    foreach ($errors as $error) { 
     $output[] = '<li>'.$error.'</li>'; 
    } 
    return '<ul class="list-unstyled">'.implode('', $output).'</ul>'; 
} 
/* Checks whether the user is loggedin else will redirect to the protectect page */ 
function protected_page(){ 
    if(is_loggedin() === false){ 
//  header('Location: protected.php'); 
     header('Location: logout.php'); 
     exit(); 
    } 
} 
/* If user tries to access the page directly accessing through the URL, 
* If already loggedin then redirect him to any of the inner page 
*/ 
function login_redirect(){ 
    if(is_loggedin() === true){ 
     header('Location: home.php'); 
    } 
} 
/* This function is used to check whether the user exists or not */ 
function email_exists($email){ 
    /* Your Code */ 
} 


/* This function is used to check whether the user isActive or not */ 
function is_active($email){ 
    /* Your Code */ 
} 


/* This function will get the userid from the email */ 
function userid_from_email($email) { 
    /* Your Code */ 
} 

/* This fucntion is used to login the user based on the email-id and password */ 
function login($email,$password){ 
    /* Your Code */ 
} 

/* Check whether the USER is loggedin or not */ 
function is_loggedin(){ 
    return (isset($_SESSION['userid'])) ? true : false; 
} 

希望這有助於你。乾杯!

+0

爲數據庫連接資源使用一個全局變量'$ link'被認爲是一個好習慣?從何時起? – dbf

+0

它在普通的PHP不oops PHP項目。即使我提到過這個,請查看我上面的描述。如果你認爲我的做法是錯誤的。請讓我知道你如何在普通PHP項目中做到這一點。 –

+0

如果有人會在任何地方覆蓋'$ link',所有取決於全局插入的函數將會中斷。您的描述表明_這些代碼片段是從各種框架良好特性和最佳實踐中使用的。我的評論僅限於兩個詞,**最佳實踐**。而你的評論是不回答我的問題;) – dbf