티스토리 뷰

PHP

PHP 인수와 반환값 제한

블로그 강승 2021. 4. 6. 21:34

PHP 엔진에 특별한 지시가 없는한
인수와 반환값에는
어떤 자료형이나 값이 오더라도
제한이 없다.

하지만 의도적으로 제한을 할 수 있다.

선언형 인수 제한 최소 PHP 버전
array 배열 5.1.0
bool 불리언: true 또는 false 7.0.0
callable 함수 또는 호출 가능한 메서드 5.4.0
float 부동소수점 수 7.0.0
int 정수 7.0.0
string 문자열 7.0.0
클래스명 해당 클래스의 인스턴스(클래스와 인스턴스에 대해서는 6장 참고) 5.0.0

 

함수의 인수 제한

함수를 정의할 때는 인수명 앞에 형 선언을 붙인다.

function countdown(int $top) {
	while ($top > 0) {
    	print "$top..";
        $top--;
        }
        print "펑!\n";
}

$counter = 5;
countdown($counter);
print "counter의 값: $counter";

위의 코드에서 top이란 변수에
5가 아니라 "Gana" 처럼
int 형이 아닌 값을 전달하면
PHP 엔진이 아래와 같은 문제를 보고한다.

PHP Fatal error: Uncaught TypeError: Argument 1 passed to countdown()
must be of the type integer, string given, called in decl-error.php
on line 2 and defined in countdown.php:2
Stack trace:
#0 decl-error.php(2): countdown('grunt')
#1 {main}
	thrown in countdown.php on line 2

PHP 엔진은 오류 메시지에서 TypeError에 대해 알려준다.
문제가 발생한 함수(countdown())와 인수(1)를 확인하고,
원래 전달되어야 할 형(integer)과
실제로 전달된 형(string)이 무엇인지도 알 수 있다.
또한 문제가 된 함수 호출 위치는 어디인지,
그 함수가 어디에 정의됐는지도 알려준다.

 

함수의 반환값 제한

함수의 반환값의 형을 제한하려면
인수 목록이 들어있는 괄호를 닫은 뒤
: 를 붙이고 형 선언을 넣는다.

function restaurant_check($meal, $tax, $tip): float {
	$tax_amount = $meal * ($tax / 100);
    $tip_amount = $meal * ($tip / 100);
    $total_amount = $meal + $tax_amount + $tip_amount;
    
    return $total_amount; //함수가 float이 아닌 값을 반환하면 PHP엔진이 TypeError를 보고한다.
}

 

※주의할점
PHP 7의 기본 설정은 스칼라 형의 선언을
완전하게 강제하지 않는다.

선언된 형과 인수나 반환값의 형이 일치하지 않더라도
PHP 7은 형 변환을 시도해 일치시키려 한다.
숫자형 값은 문자형으로 ,숫자를 포함한 문자열은
적절한 숫자형으로 묵시적 변환이 이루어진다.

파일 맨 위에 declare(strict_types = 1); 구문을 넣으면
이런 느슨한 기본 설정을 엄격한 설정으로 바꿀 수 있다.
이렇게 하면 해당 파일의 모든 함수의 인수와 반환값은
형 선언과 일치해야만 한다.
그러나 float으로 선언된 인수에 정수를 넣는 것은 여전히 허용된다.

엄격한 형식을 전역적으로 적용할 수는 없다.
적용하려는 파일마다 선언해야 한다.

'PHP' 카테고리의 다른 글

PHP 클래스  (0) 2021.04.08
PHP 다른 파일의 코드 실행하기  (0) 2021.04.06
PHP 함수 내부에서 전역변수에 접근  (0) 2021.04.06
PHP 여러값을 반환하는 함수  (0) 2021.04.06
PHP 인수가 있는 함수  (0) 2021.04.05
댓글