2010-11-25 3 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 등을 사용하고 싶습니까?

    $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; 
    

    또는 일반적으로 생성자에서 기능을 것 장식 또는 뭔가 다른 오류 처리와 관련하여 위의 코드를 할 수있다 객체

    $this->foo = new DataModel(); 
    

    . 그런 다음 언제든지 해당 개체의 메서드에 액세스 할 수 있습니다.

    $this->foo->objectMethod(); 
    

    ..그리고이 대답에 주석에 언급 된 것을 표현하십시오.

    "여러 방법으로 사용되는 것처럼 $ file을 객체에 할당하겠습니까?"

    $ file을 개체에 할당하지 않기 때문에 이유가 여기 있습니다. 단어 의 의미는 "속성"이 "속한"것을 의미합니다. 경우 클래스는 오류 처리기입니다. $ 파일이 오류 처리기에 속하지 않으므로 인스턴스에 속합니다. 클래스가 MyErrorHandler_Error (트리거 된 오류의 각 인스턴스에 대해 생성 된 경우)이면 $ 파일은 $ line 및 $ level과 함께 클래스의 속성이됩니다.

    은 다른 질문에서 내가 할 수있는 대답하려면 :

    1. 그것은 둘 다입니다. 나는 그것을 선호라고 생각할 것이다.

    2. 예 - 전체 개체에 사용할 수 있어야하며 개체가 제대로 실행되는 데 필요한 모든 변수 또는 값은 변수 선언 (해당 용어가 확실하지 않은 경우)에없는 경우 생성자에서 설정해야합니다. 클래스의 맨.

    3. 아래의 설명을 읽으십시오. 이 특정 클래스는 오류의 여러 인스턴스를 다루기 때문에 객체에 오류의 속성을 할당하는 것은 새로운 오류가 발생할 때마다이를 덮어 쓰는 것이 가장 좋을 것입니다. 그러나 이력 데이터에 액세스해야하는 경우 모든 오류 및 오류 등록 정보를 오브젝트에 지정된 배열에 저장하는 것이 좋습니다. 예를 들어, 순간에, 당신이 새로운 오류를 창조한다면 그것은 당신이하는 전부입니다. 이 객체가 생성 한 오래된 오류를 액세스 할 방법이 없습니다.

    4. 객체에 속성을 할당 할 때

    위에 또한 충돌에 대해 생각해야 참조하십시오. 재 할당 할 가능성이 있습니까? 그렇다면 이전 건물이 사라질 수 있기 때문입니다. 매우 간단하지만 여전히 고려해야 할 사항입니다.

    +0

    고마워요! 그러나 이것에 대해 궁금합니다. "둘 이상의 메서드에서 속성이 필요한 경우에는 해당 속성을 개체에 할당하는 것이 좋으며, printMessage()가 이러한 속성을 사용하는 유일한 메서드이면 no입니다." 예를 들어, $ file을 가져옵니다. myErrorHandler()에서 printMessage()로 shortenPath()로 이동합니다. 이것들은 모두 하나의 방법 일 수 있지만 가독성/실용성을 위해 깨뜨 렸습니다. 그래서 예, 그것은 하나 이상의 방법이지만, $ file은 오직 그 체인을 여행 할 것입니다. 여기에 포함되지 않았고 $ file을 결코 만지지 않는 예외에 대한 전체적인 긴 방법이 있습니다. – CartoonChess

    +2

    나는'$ file'을 객체에 할당하지 않을 것입니다. 이유는 다음과 같습니다. "속성"이라는 단어의 의미는 "속합니다"를 의미합니다. 귀하의 경우 귀하의 클래스는 오류 처리기입니다. '$ file'은 오류 핸들러에 속하지 않습니다. 오류 인스턴스에 속합니다. 클래스가 'MyErrorHandler_Error' (트리거 된 오류의 각 인스턴스에 대해 생성 된) 인 경우,'$ file'은'$ line'과'$ level'과 함께 클래스의 속성이됩니다. – netcoder

    +0

    실제로이 라인은 생성자에 나타납니다 : set_error_handler (array ($ this, 'myErrorHandler')) ;. 즉, myErrorHandler()는 오류가 발생했을 때 PHP 자체에서 호출됩니다. 따라서이 클래스의 어떤 부분도 수동으로 액세스 할 수 없습니다. 어쩌면 좀 더 간단하게 어딘가에 OO PHP에서 내 모험을 시작 했어야했다. : P 그래서 나는 당신과 동의한다 : 만약이 메소드들/속성들이 클래스 밖에서/수동으로 접근된다면, 나는 $ this-> foo = $ foo 만 다룰 것이다.그러나 그 일이 결코 일어나지 않을 것이기 때문에 최선의 관행이 달리 지시하지 않는다면 나는 $ foo/$ file /로 무엇이든해야한다고 생각했습니다. – CartoonChess