PHP 유형 선언의 실제 작동 방식

유형 성명은 많은 개발자들이 일상적으로 사용하는 간단한 프로그래밍 개념이다.code example below에서 우리는 유형 성명을 사용하는 기본적인 방법을 보았다.이 방법은 $foo 매개 변수에 문자열 형식 알림을 놓고 방법 자체에 문자열 반환 형식을 놓는다.
function bar(string $foo): string
{
    return $foo;
}

$result = bar('Hello');

var_dump($result);

// Output: string(5) "Hello"
이것들type declarations은 우리에게 이 방법에 관한 두 가지를 알려준다.그것은 문자열 매개 변수를 받아들여 문자열을 되돌려줍니다.Go와 같은 엄격한 유형 언어에서 bar() 방법을 호출하고 정수 매개 변수를 전송하면 오류가 발생합니다. 예를 들어 123입니다.만약 어떤 원인 때문에 이 방법이 문자열이 아니라면 코드도 오류를 일으킬 것이다.
유형 선언은 코드에서 두 가지 기본 용도로 사용됩니다.

  • 낮은 수준의 데이터/코드 완전성: 방법을 남용하기 어렵고 유형 검사도 줄었다.

  • 코드 가독성: 방법은 무엇을 받아들이고 무엇을 되돌려 주는 것이 더 명확하다.
  • PHP는 역사상 약한 유형의 언어였다.유형 선언은 PHP5에만 적용되며 제한된 형식입니다.전체 유형 선언 및 엄격한 유형은 2015년 PHP7이 릴리즈될 때까지 나타나지 않습니다.
    PHP7은 유형 선언과 엄격한 유형 코드 개념을 선호하는 이들에게 매우 감동적인 걸음입니다.그러나 PHP 개발자는 두 가지 중요한 주의사항을 주의해야 한다.

    PHP7은 약한 유형의 언어이다
    기본적으로 PHP7은 여전히 비고정 유형 언어입니다.완전한 유형 성명과 엄격한 유형의 도입을 감안하면 직감에 어긋나는 것 같다.그러나 PHP 코드는 이전 버전과의 호환성을 위해 유형 선언을 강제하지 않습니다.개발자는 declare(strict_types=1); 방법을 PHP 파일의 맨 위에 놓아서 엄격한 형식을 사용할 수 있다.
    이것은 PHP가 declare(strict_types=1); 문장이 파일 위에 나타나지 않는 한 '무시' 형식의 알림과 되돌아오는 형식을 의미합니다.이것은 어느 정도 일리가 있다. 왜냐하면 아직도 많은 PHP 코드가 사용되고 있기 때문이다.개발자는 전체 코드 라이브러리를 다시 쓸 필요가 없이 PHP의 최신 버전으로 업그레이드할 수 있어야 한다.
    그러나 이런 방법은 확실히 약간의 결과를 초래할 수 있다.개발자가 유형 성명을 정의했지만 추가하지 않았다면declare(strict_types=1); PHP는 유형 강제로 적용할 것이다.유형 강제는 기본적으로 한 유형의 값이 필요할 때 다른 유형의 값으로 전환되는 것을 의미한다.형식 설명을 사용할 때, 이것은 이상적이지 않습니다. 왜냐하면 방법이 예상대로 실행되지 않을 수도 있기 때문입니다.
    an example와 같이 만약에 우리가 위에서 우리의'foobar'코드를 편집한다면 우리는 유형이 강제적으로 작용하는 것을 볼 수 있다.bar 방법은 현재 $foo 매개 변수에 정수 형식 알림이 있고, 이 방법에는 문자열 반환 형식이 있습니다.정형 매개 변수가 123인bar 방법을 호출할 때, 이 방법은 문자열 형식으로 123을 되돌려줍니다.이것은 정의된 반환 형식에 맞게 정수 값을 문자열 값으로 강제로 변환했기 때문입니다.
    function bar(int $foo): string
    {
        return $foo;
    }
    
    $result = bar(123);
    
    var_dump($result);
    
    // Output: string(3) "123"
    
    declare(strict_types=1);top of the PHP file에 추가한 후에만 유형 성명이 강제 집행됩니다.
    declare(strict_types=1);
    
    function bar(int $foo): string
    {
        return $foo;
    }
    
    bar(123);
    
    현재, 우리가 정형 매개 변수가 123인bar 방법을 호출할 때, 우리는 오류를 얻을 수 있습니다.이 방법은 문자열을 되돌려 주기를 원하지만, 정수를 되돌려 주려고 하기 때문이다.이 방법에 엄격한 유형을 적용하고 다음 오류를 출력합니다.
    FATAL ERROR Uncaught TypeError: Return value of bar() must be of the type string, integer returned
    

    엄격한 유형은 파일에 기초를 두고 있다
    또 하나 주의해야 할 문제는 반드시 파일마다 엄격한 유형을 강제로 집행해야 하기 때문에 전체적으로 적용할 수 없다는 것이다.이것은 declare(strict_types=1); 를 엄격한 형식의 모든 파일에 강제로 사용해야 한다는 것을 의미합니다.마찬가지로, 이렇게 하는 것은 뒤로 호환되는 것을 돕기 위해서이지만, 이것은 응용 프로그램에서 엄격한 유형을 쉽게 강제로 사용할 수 없다는 것을 의미한다.
    이를 실천에서 보여주기 위해another example 살펴보자.두 개의 단독 파일 foo.phpbar.php 에서 두 함수를 추출하는 작은 프로그램이 있다고 가정하십시오.끌어온 파일에 영향을 미치지 않는다는 것을 증명하기 위해 프로그램 파일의 맨 위에 declare(strict_types=1);를 추가합니다.우리는 버려진 모든 오류를 처리하기 위해try-catch에 호출하는 방법을 놓을 것입니다.
    /**
     * This declares strict types but has no effect on the code.
     */
    declare(strict_types=1);
    
    /**
     * Call in the foo.php and bar.php files.
     */
    require __DIR__ . '/../src/foo.php';
    require __DIR__ . '/../src/bar.php';
    
    try {
        /**
         * This method will output a string 123.
         */
        var_dump(foo(123));
    
        /**
         * This method will throw an error.
         */
        var_dump(bar(123));
    
    } catch (Error $e) {
    
        /**
         * Print out the error message thrown by the bar(123) method
         * "Return value of bar() must be of the type string, integer returned"
         */
        echo $e->getMessage() . PHP_EOL;
    }
    
    foo 파일에서 정수를 받아들이고 문자열을 되돌려 주는 foo 방법이 있습니다.이 파일에는 declare(strict_types=1); 문구가 없습니다.
    function foo(int $bar): string
    {
        return $bar;
    }
    
    bar 파일에서, 우리는bar 방법을 가지고 있으며, 또한 하나의 정수를 받아들여 문자열을 되돌려줍니다.근데 이번에는 서류 맨 위에 하나 있을 거예요.
    declare(strict_types=1);
    
    function bar(int $foo): string
    {
        return $foo;
    }
    
    우리가 각각 declare(strict_types=1);foo(123) 방법을 호출할 때 우리는 매우 다른 출력을 얻을 것이다.foo 방법은 문자열을 되돌려줍니다. 따라서 bar(123) 출력을 볼 수 있습니다.그에 비해 bar 방법은 엄격한 유형을 가했기 때문에 오류를 던질 것이다.출력 오류 메시지 string(3) "123" 를 볼 것입니다.이 예는 엄격한 유형이 같은 프로그램에서 동시에 활성화되고 비활성화될 수 있음을 보여 줍니다.

    결과
    나는 PHP의 유형 성명 방법의 정확성과 오류성을 토론하고 싶지 않다. 이것들은 모두 내가 설계하고 실현한 것보다 더 똑똑한 사람들이다.그러나 이런 방법의 결과는 명백히 알 수 있을 것이다.가장 중요한 것은 PHP의 유형 시스템이 신뢰할 수 없다는 것이다.이것은 Return value of bar() must be of the type string, integer returned 문장을 자세히 처리하지 않으면 낮은 수준의 완전성 오류가 코드에 미끄러질 수 있음을 의미합니다.
    이것 또한 코드를 테스트할 때 조심해야 한다는 것을 의미한다.예를 들어 PHPUnit를 사용하여 단원 테스트를 할 때 declare(strict_types=1);가 아니라 assertSame()를 사용해야 한다.이것은 assertEquals() 검사치이고, asassertSame()는 검사치만 검사하기 때문이다.코드의 완전성을 확보하려면 종류와 값을 검사해야 합니다.
    유형 성명은 PHP가 앞으로 나아간 큰 걸음이다. 나는 모든 PHP 개발자들이 그것을 사용해야 한다고 믿는다. assertEquals() 켜든 끄든.비록 PHP 개발자들은 그들이 어떻게 일을 하는지 이해하는 것이 매우 중요하다. 왜냐하면 PHP의 유형 시스템이 오류를 초래하고 응용 프로그램에 부정적인 영향을 미치기 때문이다.
    PHP 유형 시스템에 대한 자세한 내용은 PHP 스칼라 유형 선언을 사용하는 것이 좋습니다read the RFC.

    좋은 웹페이지 즐겨찾기