2012-04-19 35 views
2

是否有建議不要做這樣的事情一個原則:在PHP函數中嵌套PHP函數。不好的做法?

mysql_real_escape_string(trim(str_replace($var, "black", "<body text='%body%'>"))); 

如果這樣的事情應該是一個沒有沒有,那麼這會不會接受?或者是這種不好的做法,也可以在同一個變量上調用和執行,就像我上面做的那樣?這樣做會更好嗎:

$var1 = trim($var); 
$var2 = str_replace($var1, "black", "<body text='%body%'>"); 
$var3 = mysql_real_escape_string($var2); 

我一直都在想這個!

回答

4

我認爲通常的做法是像第一個例子那樣「嵌套」功能。

有幾個原因,但大多數情況下,它表明一切都以特定的順序發生在同一個對象上,中間沒有任何內容。這就是說,如果你不確切知道你將要做什麼,你可能想從第二個例子開始,所以你可以輕鬆地返回並添加函數。

基本上,第一個是優選和更常見的(我認爲)到底,二是良好的用於測試和開發,第三個就是浪費資源(當然這是小,但有沒有必要) 。

+0

所有這些答案都很有幫助,但我會將其標記爲清晰。謝謝! – Norse 2012-04-19 03:01:48

2

在我看來,使代碼簡單易讀可以長久。當我必須像第一個例子那樣閱讀代碼時,我真的不喜歡它。通常由有人試圖表明他們可以做出多麼複雜的事情。

我覺得無論你有沒有比第一個例子好。

+0

同意這100%。如果我嵌套它不超過2深,明顯正在做什麼。 – 2012-04-19 02:54:18

1

我同意sloopjohnB和喬恩在不同的方面。我相信第一個例子是完全有效的,而且通常是慣例。如果代碼是其他人要閱讀和處理的代碼,那麼你可能會認爲你試圖通過這樣做來顯示你的編碼精明,但這是正常的做法,如果代碼只是供你查看和處理,那麼無論如何,如果它適合你,就使用它。

對我個人而言,我更喜歡第二種選擇。讓您更清楚地瞭解正在進行的操作以及您正在執行的步驟。此外,您還可以選擇添加或更改功能,使其位置/順序適當,更容易。如果您需要在第一個示例中添加一個函數,您可能很容易忘記一個支架或將該函數或支架放在錯誤的位置,真的會把您扔掉。

2

你所有的例子都很好;他們之間沒有太大的區別。如果你想使你的第一個例子有點更具可讀性,你可以縮進它:

mysql_real_escape_string(
    trim(
    str_replace($var, "black", "<body text='%body%'>"))); 

分配給臨時變量的部分結果,就像你的第二個和第三個例子,是沒關係。

$trimmed = trim($text); 
$html = str_replace($trimmed, "black", "<body text='%body%'>"); 
$sql = mysql_real_escape_string($html); 

順便說一句,你的第一個例子調用函數以不同的順序比別人:但如果你給變量有意義的名字,它可能會更有用。

+0

+1提到不同的順序。希望OP能意識到這一點。 – 2012-04-19 09:00:58

4

嵌套功能沒問題 - 只要考慮到可讀性即可。在這個非常簡單的例子,有心力的很大,需要投入解析聲明:

mysql_real_escape_string(trim(str_replace($var, "black", "<body text='%body%'>"))); 

如果你決定使用嵌套函數,還利用智能縮進,使其更容易看到什麼怎麼回事:

mysql_real_escape_string(
    trim(
    str_replace(
     $var, 
     "black", 
     "<body text='%body%'>" 
))); 
  • 每個函數的參數是在它自己的縮進線(trimstr_replace都被用來作爲函數的參數,因爲是$var"black""<body text='%body%'>"
  • 結尾)));明確界定了函數嵌套結束的位置。它還提供了一種快速語法校驗和(計算開括號的數量並確保它們與te結尾的括號數相匹配)。
+0

+1表示縮進想法。我從來沒有想到這一點,但它很有意義。 – 2012-04-19 08:58:56