2010-11-25 96 views
1

我正在學習OO PHP,並試圖直接獲得一些編碼實踐。下面是一些代碼,我使用了錯誤(和除外)削減版本處理:方法中的所有變量都需要是對象屬性嗎? (PHP)

final class MyErrorExceptionHandler { 

    private $level = array(); // error levels to be handled as standard errors 
    private $path = array(); // full path to file 
    private $path_short; // filename plus working dir 

    public function myErrorHandler($severity, $message, $file, $line) { 
     if (error_reporting() & $severity) { // error code is included in error_reporting 
      $this->level = array(E_WARNING => 'warning', 
       E_NOTICE => 'notice', 
       E_USER_WARNING => 'user warning', 
       E_USER_NOTICE => 'user notice'); 
      if (array_key_exists($severity, $this->level)) { // handle as standard error 
       /*$this->severity = $severity; 
       $this->message = $message; 
       $this->file = $file; 
       $this->line = $line;*/ 
       $this->printMessage($severity, $message, $file, $line); 
      } else { // fatal: E_USER_ERROR or E_RECOVERABLE_ERROR use php's ErrorException converter 
       throw new ErrorException($message, 0, $severity, $file, $line); 
      } 
     } 
    } // fn myErrorHandler 

    private function printMessage($severity, $message, $file, $line) { 
     echo ucfirst($this->level[$severity]) . ': ' . $message; 
     $this->shortenPath($file); 
     echo ' in ' . $this->path_short . ' on line ' . $line; 
    } // fn printMessage 

    private function shortenPath($file) { 
     $this->path_short = $file; 
     $this->path = explode(DIRECTORY_SEPARATOR, $file); 
     if (count($this->path) > 2) { // shorten path to one dir, if more than one dir 
      $this->path_short = array_pop($this->path); // filename 
      $this->path_short = end($this->path) . DIRECTORY_SEPARATOR . $this->path_short; // dir+file 
     } 
    } // fn shortenPath 

} // cl MyErrorExceptionHandler 

這個問題的標題可能有點過,因爲我不上的術語100%。基本上我想弄清楚幾件事情。

  1. 是否明確聲明$level$path爲數組?
  2. 應該宣佈$level(因爲它是$this->level)?如果是這樣,我是否在明智的地方分配了它的價值(E_WARNING等)?這個構造函數(這裏沒有顯示)是更聰明的選擇嗎?
  3. 請注意myErrorHandler()中的註釋塊。最初我已經將所有這些屬性都聲明在課程頂部,然後在沒有任何參數的情況下調用$this->printMessage()。哪一種更正確?如果我保持代碼原樣,我是否想在printMessage()內使用$this->severity = $severity等?
  4. 因此,這將是更好的:

更換

$this->shortenPath($file); 
echo ' in ' . $this->path_short . ' on line ' . $line; 

$path_short = $this->shortenPath($file); 
echo ' in ' . $path_short . ' on line ' . $line; 

最終並給予shortenPath()一個返回值?

我意識到這是幾個不同問題的混雜體,但我試圖得到的是關於正確聲明/使用變量/屬性的風格的常見問題,特別是在處理方法時。

總結:什麼時候應該使用$this->foo = $foo

回答

3

編輯:對不起,我在下面假設你會創建一個新的'對象'的實例,每個錯誤顯然你沒有做。剛編輯我的答案反映了這一點。

「我應該何時使用$ this-> foo = $ foo?」

可能有幾種情況下你會這樣做,但通常情況下,如果你在一個方法中創建$ foo並希望讓整個對象訪問它。

例如,如果您想要調用一個對象並在該特定對象內使用該對象(如果它沒有意義擴展)。你會做這樣的事情:

$foo = new DataModel(); 
$this->foo = $foo; 

OR

$this->foo = new DataModel(); 

該對象可以是裝飾或別的東西與錯誤處理相關的,上面的代碼通常會在你的構造特徵。您隨後可以隨時訪問該對象的方法:

$this->foo->objectMethod(); 

..並且在評論中註明這個答案:

「你會把$ file分配給對象嗎?」

我不會將$文件分配給對象, 這是爲什麼。 「財產」一詞的含義是「屬於」。在你的 的情況下,你的類是一個錯誤處理程序。 $文件不屬於錯誤 處理程序,它屬於一個錯誤 實例。如果您的班級是 MyErrorHandler_Error(爲每個觸發錯誤的 實例創建),那麼 $文件將是該 類的一個屬性,以及$ line和$ level。

要回答什麼,我可以從你的其他問題:

  1. 它既不是。我會考慮它的偏好。

  2. 是的 - 任何變量或值應該可用於您的整個對象,並需要對象正常運行,應該可以在您的構造函數中設置,如果不在您的變量聲明(不確定術語那裏)這是班級的頂峯。

  3. 閱讀下面的評論。因爲這個特定的類處理多個錯誤實例 - 將這些錯誤的屬性分配給對象不是最佳實踐,因爲您將用每個新錯誤覆蓋它們。但是,如果您需要訪問歷史數據,則將所有錯誤和錯誤屬性存儲在分配給該對象的數組中是有意義的。例如,目前,如果你創建一個新的錯誤 - 那就是你正在做的。您無法訪問此對象創建的任何舊錯誤。

  4. 見上

你也應該到指定的對象屬性時,想想衝突。你可能會重新分配,因爲如果是這樣,舊的財產將會消失。相當簡單,但仍然需要考慮。

+0

謝謝!不過,我想知道這個問題:「如果你需要多個方法中的任何屬性,那麼建議你將該屬性賦值給你的對象。如果printMessage()是使用這些屬性的唯一方法,那麼no。」拿,例如,$文件。它從myErrorHandler(),printMessage()到shortenPath()。這些都可以用一種方法,但我爲了可讀性/實用性而將其分解。所以是的,這不僅僅是一種方法,但是$文件只會經過這個鏈。對於Exceptions我有一個很長的方法,我沒有在這裏包含,也沒有涉及到$ file。 – CartoonChess 2010-11-25 19:55:58

相關問題