질문을 삭제하지 말아주세요.!
 
1
0
-1

PHP 7 의 Return Type Declarations을 사용해서 코딩중입니다.


예제 코드
class SettingConfig {
   private $type;
]


class SmartCommitConfig {
	private $config;

	public function __construct()
	{
    	$this->config = new SettingConfig();
	}

	public function getConfig() : SettingConfig
	{
    	return $this->config;
	}
}


$a = new SmartCommitConfig();


// Exception 발생
$conf = $a->getConfig();


 위 코드를 실행하면 아래와 같이 선언된 리턴 타입이 아닌 stdClass가 리턴됐다고 예외가 발생합니다.

TypeError : Return value of App\SmartCommitConfig::getConfig() must be an instance of App\SettingConfig, instance of stdClass returned


아래와 같은 강제 캐스팅은 문법 오류라 실행이 안 되는데 위와 같이 return type 에 특정 클래스를 선언했을 때 이를 처리하기 위한 좋은 방법은 무엇일까요. ?

return (SettingConfig)$this→config;


StackOverflow 찾아보니 별도의  wrapper 함수를 만들라고 하던데 그러기에는 너무 큰일 같은데 어떻게 해야 저 오류를 해결할 수 있을까요

    CommentAdd your comment...

    3 answers

    1.  
      2
      1
      0

      질문글에 질문하는게 조금 이상하긴 합니다만

      주신 코드로 제가 테스트했을때는 SettingConfig로 리턴이 되서 예외가 발생이 안되는데

      ini 설정 같은게 달라서 그런걸까요??

      php7.1 에서 테스트했습니다.

      1. 정광섭

        아 예제를 잘못 올렸네요...


        아래처럼 type hint 를 쓰는 메서드에 넘길 경우 타입이 다르다는 예외가 발생합니다.

         

        function f(SettingConfig $c)
        {
           // 어쩌구저쩌구
        }
        
        
        $a = new SmartCommitConfig();
        
        
        // 예외
        f($a->getConfig());



      2. 권윤학

        마찬가지로 타입 에러가 발생되지 않습니다. 


        <?php
        
        class SettingConfig
        {
            private $type;
        }
        
        
        class SmartCommitConfig
        {
            private $config;
        
            public function __construct()
            {
                $this->config = new SettingConfig();
            }
        
            public function getConfig(): SettingConfig
            {
                return $this->config;
            }
        }
        
        function f(SettingConfig $c)
        {
            var_dump($c);
        }
        
        
        $a = new SmartCommitConfig();
        
        
        // 예외 발생안함
        f($a->getConfig());
        
        

        실행 결과

        /var/www/public/test.php:26:

        object(SettingConfig)[2]
          private 'type' => null
      3. 정광섭

        코드 일부만 떼어냈더니 이상이 없네요. ㅠ.ㅠ


        전체 코드는 아래와 같습니다.

        재현 절차는 다음 순서를 따르시면 됩니다.


        git clone https://github.com/lesstif/jira-smart-commiter 
        composer install
        php jira-smart-commiter init
        php jira-smart-commiter project:create-list

        마지막 명령을 실행하면  TypeError : Return value of App\SmartCommitConfig::getSettings() must be an instance of App\Settings, instance of stdClass returned 가 발생합니다.


        return 타입을 안 쓰면 되긴 하는데 실수를 줄여줄 좋은 코딩 습관같아서 사용하려고 하다 보니 저 에러가 나서 질문 드립니다.

      CommentAdd your comment...
    2.  
      1
      0
      -1

      저도 방금 해 봤는데... 여튼 해결되신거죠?

      1. 정광섭

        넵 코딩 실수였고 해결됐습니다.


        그나저나 제 실수긴한데 강력한 타입을 지원하는 언어였다면 바로 잡아낼수 있었을텐데 약한 타입 언어가 생산성이 좋지만 코딩 실수를 찾아내기 어려운 트레이드오프가 있다는 걸 다시 깨달았네요.


      CommentAdd your comment...
    3.  
      1
      0
      -1

      다른 코드에서 실수로 문제가 된 내부 프로퍼티에 json_encode() 로 array 로 초기화하는 버그가 있어서 발생했고 수정했습니다.


       

      1. 권윤학

        아 찾으셨다니 다행입니다.

        그나저나 laravel-zero는 처음 봤는데 흥미롭네요.

      2. 정광섭

        네 아주 유용한 프레임웍 같습니다. 지금 하고 있는거 어느정도 마무리되면 간략하게 정리해서 공유하도록 하겠습니다.

      CommentAdd your comment...