질문글에 질문하는게 조금 이상하긴 합니다만
주신 코드로 제가 테스트했을때는 SettingConfig로 리턴이 되서 예외가 발생이 안되는데
ini 설정 같은게 달라서 그런걸까요??
php7.1 에서 테스트했습니다.
아 예제를 잘못 올렸네요...
아래처럼 type hint 를 쓰는 메서드에 넘길 경우 타입이 다르다는 예외가 발생합니다.
function f(SettingConfig $c) { // 어쩌구저쩌구 } $a = new SmartCommitConfig(); // 예외 f($a->getConfig());
마찬가지로 타입 에러가 발생되지 않습니다.
<?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
코드 일부만 떼어냈더니 이상이 없네요. ㅠ.ㅠ
전체 코드는 아래와 같습니다.
재현 절차는 다음 순서를 따르시면 됩니다.
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 타입을 안 쓰면 되긴 하는데 실수를 줄여줄 좋은 코딩 습관같아서 사용하려고 하다 보니 저 에러가 나서 질문 드립니다.
저도 방금 해 봤는데... 여튼 해결되신거죠?
넵 코딩 실수였고 해결됐습니다.
그나저나 제 실수긴한데 강력한 타입을 지원하는 언어였다면 바로 잡아낼수 있었을텐데 약한 타입 언어가 생산성이 좋지만 코딩 실수를 찾아내기 어려운 트레이드오프가 있다는 걸 다시 깨달았네요.
PHP 7 의 Return Type Declarations을 사용해서 코딩중입니다.
위 코드를 실행하면 아래와 같이 선언된 리턴 타입이 아닌 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 함수를 만들라고 하던데 그러기에는 너무 큰일 같은데 어떻게 해야 저 오류를 해결할 수 있을까요