인프런 커뮤니티 질문&답변

차무송님의 프로필 이미지
차무송

작성한 질문수

PHP 7+ 프로그래밍: 객체지향

08 - 예외 (Exceptions)

MyExceotion에서 부모생성자 호출 시.

작성

·

203

0

class MyException extends Exception
{
  public function __construct()
  {
    parent::__construct();
  }
}

try {
  throw new MyException('Hello, World');
} catch (Exception $e) {
  var_dump($e->getMessage());
}
class MyException extends Exception
{}

try {
  throw new MyException('Hello, World');
} catch (Exception $e) {
  var_dump($e->getMessage());
}

부모 생성자를 명시적으로 작성해준 경우는 empty string을 출력하고 

생략할 경우는 Hello World를 출력하는데 둘의 차이점이 궁금합니다.

 

 

 

답변 1

1

정상우님의 프로필 이미지
정상우
지식공유자

안녕하세요!

부모 생성자가 명시적으로 호출된 클래스를 A`a 라고 하고, 그렇지 않은 클래스를 A`b 라고 지칭하겠습니다. 

A`b

먼저 A`b 의 경우 생성자가 명시적으로 정의되지 않았습니다, 이 말은 객체생성시 부모 생성자를 고스란히 이어받는다는 이야기가 되며 그 원형은 아래와 같습니다.

public __construct(string $message = "", int $code = 0, ?Throwable $previous = null)

암묵적으로 호출되는 부모 생성자는 $message 라는 파라매터를 받고있는 모습입니다. new Exception("Hello, world") 로 넘어간 "Hello, world" 값이 부모 생성자의 $message 에 설정됩니다. 

A`a

A`a 의 경우에는 부모 생성자를 명시적으로 호출합니다. 하지만 여기서 한 가지 빼먹은 사항이 있습니다. 바로 객체 생성시 받은 값을 부모 생성자로 전달하는 것입니다. A`a 에는 "Hello, world" 라는 값을 받아야 할 $message 가 선언되어 있지 않습니다. A`a 가 올바르게 동작하려면 파라매터를 정의하고 부모 생성자로 넘겨야합니다.

class MyException extends Exception
{
  public function __construct(string $message)
  {
    parent::__construct($message);
  }
}

PHP 는 느슨하니까 괜찮지만, 다른 언어 같았으면  A`a 와 같이 선언된 생성자에 파라매터를 넘기는 것에서 에러가 발생했을 것입니다. 아무 파라매터도 받지않는 생성자에 값을 넘겨준 것 자체가 문제가 발생할 요지가 있기 때문이죠. 이 부분은 함수에서도 고스란히 동작합니다.

차무송님의 프로필 이미지
차무송

작성한 질문수

질문하기