Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP ArgumentCountError(인수 개수 오류) 완벽 이해하기: 발생 원인과 처리 방법

ArgumentCountError란 무엇인가?

PHP에서 사용자가 정의한 함수나 메서드에 정의된 개수보다 적은 인수를 전달하면, PHP 파서는 ArgumentCountError 예외를 발생시킵니다. 이 오류 클래스는 PHP 7.1부터 도입되었으며, TypeError 클래스를 상속받아 구현되어 있습니다.

즉, 함수 시그니처에서 요구하는 필수 매개변수가 호출 시점에 모두 제공되지 않으면 프로그램 실행이 중단되고 ArgumentCountError가 던져지므로, 이를 try-catch 블록으로 처리할 수 있습니다.

예제 1: 사용자 정의 함수에서의 ArgumentCountError

다음 예제에서는 두 개의 인수를 받도록 정의된 add() 함수를 살펴봅니다. 그런데 호출 시 필요한 개수보다 적은 인수를 전달하면 ArgumentCountError가 발생하며, 이를 catch 블록으로 처리할 수 있습니다.

<?php
function add($x, $y){
    return $x + $y;
}
try{
    echo add(10);
}
catch (ArgumentCountError $e){
    echo $e->getMessage();
}
?>

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Too few arguments to function add(), 1 passed in C:\xampp\php\test.php on line 6 and exactly 2 expected

오류 메시지를 보면 함수에 1개의 인수만 전달되었고, 정확히 2개가 필요하다는 내용이 명확하게 표시됩니다.

예제 2: 클래스 메서드에서의 ArgumentCountError

클래스의 메서드에서도 동일한 원리가 적용됩니다. 다음 예제에서 myclass 클래스의 setdata() 메서드는 두 개의 형식 매개변수를 갖도록 정의되어 있습니다. 이 메서드를 더 적은 수의 인수로 호출하면 ArgumentCountError가 발생합니다.

<?php
class myclass{
    private $name;
    private $age;
    function setdata($name, $age){
        $this->name = $name;
        $this->age = $age;
    }
}
try{
    $obj = new myclass();
    $obj->setdata();
}
catch (ArgumentCountError $e){
    echo $e->getMessage();
}
?>

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Too few arguments to function myclass::setdata(), 0 passed in C:\xampp\php\test.php on line 15 and exactly 2 expected

메서드 호출 시 아무런 인수도 전달하지 않았기 때문에 "0 passed"라는 메시지와 함께 오류가 보고됩니다.

예제 3: 내장 함수에서의 ArgumentCountError

ArgumentCountError는 사용자 정의 함수뿐만 아니라 PHP 내장 함수에 부적절하거나 유효하지 않은 개수의 인수를 전달할 때에도 발생합니다. 단, 이 경우에는 strict-types(엄격 타입) 모드가 활성화되어 있어야 합니다.

<?php
declare(strict_types = 1);
try{
    echo strlen("Hello", "World");
}
catch (ArgumentCountError $e){
    echo $e->getMessage();
}
?>

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

strlen() expects exactly 1 parameter, 2 given

strlen() 함수는 정확히 하나의 매개변수만 허용하는데, 두 개의 인수가 전달되어 오류가 발생한 것입니다.

정리

  • ArgumentCountError는 함수나 메서드에 전달된 인수의 개수가 정의와 일치하지 않을 때 발생합니다.
  • TypeError 클래스를 상속하므로 catch 블록을 통해 우아하게 처리할 수 있습니다.
  • 내장 함수의 경우 strict_types 모드가 선언되어 있어야 ArgumentCountError가 발생합니다.

함수를 설계할 때 기본값(default parameter)을 활용하거나, 가변 길이 인수(...$args)를 사용하면 이러한 오류를 사전에 방지할 수 있습니다.