수색…


통사론

  • 함수 f (ClassName $ param) {}
  • function f (bool $ param) {}
  • function f (int $ param) {}
  • 함수 f (float $ param) {}
  • function f (string $ param) {}
  • 함수 f (self $ param) {}
  • 함수 f (callable $ param) {}
  • function f (array $ param) {}
  • function f (? type_name $ param) {}
  • 함수 f () : type_name {}
  • 함수 f () : void {}
  • 함수 f () :? type_name {}

비고

유형 힌팅 또는 유형 선언 은 함수의 매개 변수가 지정된 유형인지 확인하는 방어 프로그래밍 관행입니다. 이는 인터페이스에 대해 힌트를 입력 할 때 특히 유용합니다. 이는 제공된 매개 변수가 인터페이스에서 요구되는 것과 동일한 메소드를 갖도록 보장하기 때문입니다.

잘못된 유형을 유형 힌트 함수에 전달하면 치명적인 오류가 발생합니다.

치명적인 오류 : 잡히지 않은 TypeError : foo ()에 전달 된 인수 XRequiredType , ProvidedType 유형이어야합니다.

힌팅 스칼라 유형, 배열 및 호출 가능 유형

타입 힌팅 배열 매개 변수 (PHP 7.1 이후의 반환 값)에 대한 지원은 PHP 5.1에서 키워드 array 과 함께 추가되었습니다. 모든 차원 및 유형의 배열과 빈 배열은 유효한 값입니다.

PHP 5.4에서 힌팅 호출 가능 유형에 대한 지원이 추가되었습니다. is_callable() 값은 callable is_callable() 매개 변수와 반환 값, 즉 Closure 객체, 함수 이름 문자열 및 array(class_name|object, method_name) 유효합니다.

함수 이름에 오타가 발생하여 is_callable() 이 아닌 경우 덜 명확한 오류 메시지가 표시됩니다.

치명적인 오류 : Uncaught TypeError : foo ()에 전달 된 인수 1이 callable, string / array 유형이어야합니다.

function foo(callable $c) {}
foo("count"); // valid
foo("Phar::running"); // valid
foo(["Phar", "running"); // valid
foo([new ReflectionClass("stdClass"), "getName"]); // valid
foo(function() {}); // valid

foo("no_such_function"); // callable expected, string given

비 정적 메소드는 정적 형식의 호출 가능 함수로도 전달 될 수 있으므로 PHP 7 및 5에서 각각 비난 경고 및 E_STRICT 오류가 발생합니다.

방법의 가시성이 고려됩니다. callable 매개 변수있는 메소드컨텍스트가 제공된 호출 가능 항목에 액세스 할 수없는 경우 메소드가 존재하지 않는 것처럼 종료됩니다.

class Foo{
  private static function f(){
    echo "Good" . PHP_EOL;
  }

  public static function r(callable $c){
    $c();
  }
}

function r(callable $c){}

Foo::r(["Foo", "f"]);
r(["Foo", "f"]);

산출:

치명적인 오류 : Uncaught TypeError : r ()에 전달 된 인수 1은 호출 가능해야하며 배열이 지정되어야합니다.

유형 힌팅 스칼라 유형에 대한 지원이 PHP 7에 추가되었습니다. 즉, boolean s, integer s, float s 및 string s에 대한 유형 힌트 지원을 얻습니다.

<?php

function add(int $a, int $b) {
    return $a + $b;
}

var_dump(add(1, 2)); // Outputs "int(3)"

기본적으로 PHP는 제공된 힌트를 유형 힌트와 일치하도록 캐스팅하려고 시도합니다. float 1.5 가 PHP에 의해 int 로 캐스트 되었기 때문에 add(1.5, 2) 대한 호출을 변경하면 정확히 동일한 출력을 제공합니다.

이 동작을 중지하려면 declare(strict_types=1); 그것을 필요로하는 모든 PHP 소스 파일의 맨 위로 이동하십시오.

<?php

declare(strict_types=1);

function add(int $a, int $b) {
    return $a + $b;
}

var_dump(add(1.5, 2));

위의 스크립트는 이제 치명적인 오류를 발생시킵니다.

치명적인 오류 : 알려지지 않은 TypeError : add ()에 전달 된 인수 1은 정수 유형이어야하며 지정된 float가 있어야합니다.

예외 : 특수 유형

일부 PHP 함수는 resource 유형의 값을 반환 할 수 resource . 이것은 스칼라 유형이 아니기 때문에 특수 유형이므로 힌트를 입력 할 수 없습니다.

예를 들어, curl_init()fopen() 뿐만 아니라 resource 도 반환합니다. 물론이 두 리소스는 서로 호환되지 않습니다. 그렇기 때문에 PHP 7은 명시 적으로 hinting resource 입력 할 때 항상 다음과 같은 TypeError를 발생 resource .

TypeError : sample ()에 전달 된 인수 1은 resource, given resource의 인스턴스 여야합니다.

유형 힌팅 일반 객체

PHP 객체는 기본 클래스 ( stdClass 포함)를 상속하지 않으므로 일반 객체 유형을 힌팅하는 유형은 지원하지 않습니다.

예를 들어, 아래는 작동하지 않습니다.

<?php

function doSomething(object $obj) {
    return $obj;
}

class ClassOne {}
class ClassTwo {}

$classOne= new ClassOne();
$classTwo= new ClassTwo();

doSomething($classOne);
doSomething($classTwo);

그리고 치명적인 오류가 발생합니다 :

치명적인 오류 : catch되지 않은 TypeError : doSomething ()에 전달 된 인수 1이 ObjectOutOne 인스턴스의 인스턴스 여야합니다.

이것에 대한 회피책은, 메소드를 정의하지 않는 축퇴 인터페이스를 선언 해, 모든 오브젝트가이 인터페이스를 구현하도록 (듯이)하는 것입니다.

<?php

interface Object {}

function doSomething(Object $obj) {
    return $obj;
}

class ClassOne implements Object {}
class ClassTwo implements Object {}

$classOne = new ClassOne();
$classTwo = new ClassTwo();

doSomething($classOne);
doSomething($classTwo);

힌팅 클래스 및 인터페이스 유형 지정

클래스와 인터페이스를위한 타입 힌팅은 PHP 5에서 추가되었습니다.

클래스 유형 힌트

<?php

class Student
{
    public $name = 'Chris';
}

class School
{
    public $name = 'University of Edinburgh';
}

function enroll(Student $student, School $school)
{
    echo $student->name . ' is being enrolled at ' . $school->name;
}

$student = new Student();
$school = new School();

enroll($student, $school);

위의 스크립트는 다음을 출력합니다.

Chris는 University of Edinburgh에 등록 중입니다.


인터페이스 유형 힌트

<?php

interface Enrollable {};
interface Attendable {};

class Chris implements Enrollable
{
    public $name = 'Chris';
}

class UniversityOfEdinburgh implements Attendable
{
    public $name = 'University of Edinburgh';
}

function enroll(Enrollable $enrollee, Attendable $premises)
{
    echo $enrollee->name . ' is being enrolled at ' . $premises->name;
}

$chris = new Chris();
$edinburgh = new UniversityOfEdinburgh();

enroll($chris, $edinburgh);

위의 예제는 이전과 같은 결과를 출력합니다 :

Chris는 University of Edinburgh에 등록 중입니다.

자기 유형 힌트

self 키워드는 값을 메서드를 선언하는 클래스의 인스턴스 여야 함을 나타 내기위한 유형 힌트로 사용할 수 있습니다.

유형 힌팅 없음 반환 없음 (무효)

PHP 7.1에서 void 반환 유형이 추가되었습니다. PHP는 실제 void 값을 갖지 않지만 일반적으로 프로그래밍 언어에서 아무 것도 반환하지 않는 함수가 void 를 반환한다는 것을 이해합니다. null 는 돌려 null 수있는 값이기 (위해) 때문에, null 를 돌려주는 것과 혼동하지 말아주세요.

function lacks_return(): void {
    // valid
}

void 반환을 선언하면 값을 반환 할 수 없거나 치명적인 오류가 발생합니다.

function should_return_nothing(): void {
    return null; // Fatal error: A void function must not return a value
}

그러나 return을 사용하여 함수를 종료하는 것은 유효합니다.

function returns_nothing(): void {
    return; // valid
}

Nullable 유형 힌트

매개 변수

Nullable 타입 힌트는 PHP 7.1에서 ? 형식 힌트 전에 연산자.

function f(?string $a) {}
function g(string $a) {}

f(null); // valid
g(null); // TypeError: Argument 1 passed to g() must be of the type string, null given

PHP 7.1 이전에 매개 변수에 유형 힌트가 있으면 null 값을 허용하기 위해 기본값 null 을 선언해야합니다.

function f(string $a = null) {}
function g(string $a) {}

f(null); // valid
g(null); // TypeError: Argument 1 passed to g() must be of the type string, null given

반환 값

PHP 7.0에서는 반환 값이있는 함수가 null을 반환하면 안됩니다.

PHP 7.1에서 함수는 nullable 반환 형식 힌트를 선언 할 수 있습니다. 그러나이 함수는 여전히 void가 아니라 null을 반환해야합니다 (빈 / 빈 return 문).

function f() : ?string {
    return null;
}

function g() : ?string {}
function h() : ?string {}

f(); // OK
g(); // TypeError: Return value of g() must be of the type string or null, none returned
h(); // TypeError: Return value of h() must be of the type string or null, none returned


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow