2010-05-05 87 views
5

我試圖找到編寫PHP的最佳實踐。PHP和編寫乾淨的代碼

我只是想知道這是一個壞習慣。

例如,處理變量。

$var = 1 
$var = doSomething($var); 
$var = doSomething2($var); 
$var = doSomething3($var); 

它看起來有點可怕。

這裏是一個真正的代碼,我只是做了一個例子:

$this->rSum = explode(",", $this->options["rSum"]); 
$this->rSum = array_combine(array_values($this->rSum), array_fill(0, count($this->rSum), 0)); 

如果有人能超過我寫乾淨的代碼的一些好的教程通常這將是很好!

它再次問我愚蠢的問題。 :)


順便說..

能有多少自動處理模式?

我有一個具有執行方法的模型,當我叫它,它做了很多事情就像讀一本定義文件,使數據庫查詢。

例如

$object = new Object() 
$object->setFile("example.txt"); 
$object->execute(); 

// Then i can fetch things from it 
echo $object->getName(); 

回答

3

我真的很喜歡你的(真實)代碼,而且通常很難讓我喜歡其他人的代碼(我沒有太多時間挖掘ZF,但PEAR例如[他們也有他們的編碼標準]只是可怕的國際海事組織),你給的第一個例子似乎很愚蠢,但關於第二個例子,至少對我來說很容易理解,並且從你提供的短片段看來,你似乎有一致的編碼風格,並且在右側使用空格數量和在正確的地方 - 這對清除代碼非常重要(如果你不相信我只是看一些Perl代碼片段)。

我只想指出三點:

  1. 語義:雖然rSum不是一個屬性也不太清楚它持什麼樣的價值觀可怕的名字,也許你會發現該屬性的更具描述性的名稱?
  2. 可變重用:就像我說你的第一個例子似乎之前愚蠢的,但它實際上是智能重用的變量主要有兩個原因:
    1. 你不浪費內存。
    2. 而且你不污染你正在使用的範圍。
  3. ,如果你使用了正確的功能你的第二個 「真正」 的例子可能是更清潔和更快速:

    $這個 - > RSUM = array_flip(爆炸(」 「$這個 - >選項[」 RSUM「]));

編輯:我剛剛注意到我在上面提供的代碼是不是你做的相當我們的(0不是由我的大腦處理),這裏是另一個工作選擇:

$this->rSum = array_fill_keys(explode(",", $this->options["rSum"]), 0); 

這裏似乎有很多人不喜歡單線隊員,但我相信上面的代碼是清晰,高效和描述性的 - 但這可能只是我...... =)

8

智能代碼不一定在我看來,好的代碼。我個人更喜歡乾淨,簡單和易於理解的代碼。你的第二行代碼會讓你的同事覺得很難,而不是你的初始「壞」代碼。

這只是反正

+1

同行,不是梨:P – Viet 2010-05-05 10:06:15

3

我拿除了編碼標準,可以使用PHP_CodeSniffer得到您的現有代碼一般的提示。

0

吉姆·李表示同意,我也更喜歡微優化或聰明,但醜陋的一行代碼可讀的代碼。

唯一的麻煩,我與你的第一個例子是,它採用面向過程的功能,我會更好地重寫OOP(函數的調用這樣可以鏈接並保持易於閱讀)。

PHP還沒有一個強大的面向對象的目標,因爲它使用其API中主要的程序語句。但我更喜歡用OO方式編寫我的代碼,很好地解耦和組織,而不是有很多有很多參數的函數來讓它們一起工作。

-3

一個試圖在一個方面做eveything的東西行可以導致代碼假設。當我不得不修復它們時,我覺得它真的很煩人。對象鏈接更常見。例如,

$object->getAnotherObject()->getAThirdObject()->doSomething(); 

很多人會告訴你,它更容易閱讀;然而它依靠每次返回都是一個對象。我更願意返回每一個並檢查響應。

$secondObject = $object->getAnotherObject(); 
if (is_object($secondObject)) { 
    $thirdObject = $secondObject->getAThirdObject(); 
    if (is_object($thirdObject)) { 
     $thirdObject->doSomething(); 
    } 
} 

確實需要更多擊鍵,但它不太可能爆炸,而且我認爲無論如何,更易於閱讀。

雖然值得重複BorisGuéry寫的東西。 必須一致。

+0

「清潔?!更容易閱讀?!」流暢的接口搖滾,例如SQL生成器類:'$ sql-> select('posts','title') - > where(array('user_id'=> 5)) - > order('date','desc ') - > limit(10);',用你的方法,這將需要5個無用的縮進級別,因爲在流暢的接口中,所有方法都應該返回對象,不管它是什麼。 – 2010-05-05 12:12:10

+0

當你知道什麼是回來,這很好。當你跳進一個項目並且在編碼時必須開始理解,那麼如何?你不能基於最好的情況。 如果某人更新了正在處理的項目的一部分,並使某個對象返回一組對象,該怎麼辦? – Khainestar 2010-05-10 16:39:56

+0

德米特法則怎麼樣? – 2015-01-07 10:16:52