저는 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 % 아니에요 때문에 떨어져 아마 다음은 오류 (예외)에 대한 내가 사용하는 코드의 아래로 껍질을 벗겼다 버전의 처리이다. 기본적으로 나는 몇 가지 것을 알아 내려고하고있다.
$level
과$path
을 배열로 명시 적으로 선언 하시겠습니까?$level
은 그대로 ($this->level
으로 작성해야 함) 신고해야합니까? 그렇다면 그 값 (E_WARNING
등)을 현명한 장소에 할당 했습니까? 생성자 (여기에 표시되지 않음)가 현명한 선택일까요?- 주석 처리 된 블록은
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
을 사용해야합니까?
고마워요! 그러나 이것에 대해 궁금합니다. "둘 이상의 메서드에서 속성이 필요한 경우에는 해당 속성을 개체에 할당하는 것이 좋으며, printMessage()가 이러한 속성을 사용하는 유일한 메서드이면 no입니다." 예를 들어, $ file을 가져옵니다. myErrorHandler()에서 printMessage()로 shortenPath()로 이동합니다. 이것들은 모두 하나의 방법 일 수 있지만 가독성/실용성을 위해 깨뜨 렸습니다. 그래서 예, 그것은 하나 이상의 방법이지만, $ file은 오직 그 체인을 여행 할 것입니다. 여기에 포함되지 않았고 $ file을 결코 만지지 않는 예외에 대한 전체적인 긴 방법이 있습니다. – CartoonChess
나는'$ file'을 객체에 할당하지 않을 것입니다. 이유는 다음과 같습니다. "속성"이라는 단어의 의미는 "속합니다"를 의미합니다. 귀하의 경우 귀하의 클래스는 오류 처리기입니다. '$ file'은 오류 핸들러에 속하지 않습니다. 오류 인스턴스에 속합니다. 클래스가 'MyErrorHandler_Error' (트리거 된 오류의 각 인스턴스에 대해 생성 된) 인 경우,'$ file'은'$ line'과'$ level'과 함께 클래스의 속성이됩니다. – netcoder
실제로이 라인은 생성자에 나타납니다 : set_error_handler (array ($ this, 'myErrorHandler')) ;. 즉, myErrorHandler()는 오류가 발생했을 때 PHP 자체에서 호출됩니다. 따라서이 클래스의 어떤 부분도 수동으로 액세스 할 수 없습니다. 어쩌면 좀 더 간단하게 어딘가에 OO PHP에서 내 모험을 시작 했어야했다. : P 그래서 나는 당신과 동의한다 : 만약이 메소드들/속성들이 클래스 밖에서/수동으로 접근된다면, 나는 $ this-> foo = $ foo 만 다룰 것이다.그러나 그 일이 결코 일어나지 않을 것이기 때문에 최선의 관행이 달리 지시하지 않는다면 나는 $ foo/$ file /로 무엇이든해야한다고 생각했습니다. – CartoonChess