수색…
통사론
- 함수 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 ()에 전달 된 인수 X 가 RequiredType , 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