코드는 다음과 같습니다.
function phpwtf(string $s) {
echo "$sn"; } phpwtf("Type hinting is da bomb");
그 결과, 다음의 에러가 발생합니다.
잡을 수 있는 치명적인 오류: phpwtf()에 전달된 인수 1은 문자열 인스턴스여야 하며 지정된 문자열이어야 합니다.
PHP가 원하는 유형을 동시에 인식하고 거부하는 것을 보는 것은 작은 오웰리언이 아닙니다.불빛이 다섯 개야, 젠장.
PHP의 문자열에 대한 유형 암시와 동등한 것은 무엇입니까?여기서 정확히 무슨 일이 일어나고 있는지 설명하는 답변에 대한 보너스 고려.
질문에 대한 답변
PHP 7 이전의 유형에서는 개체 및 배열 유형을 강제하기 위해서만 힌트를 사용할 수 있었습니다.스칼라 타입은 타입으로 은닉할 수 없습니다.이 경우 클래스의 오브젝트string
예상되지만 (비밀번호)를 부여하고 있습니다.string
에러 메세지는 웃기지만, 우선은 동작하지 않는 것이 좋습니다.동적 타이핑 시스템을 고려하면, 이것은 사실 일종의 왜곡된 의미입니다.
수동으로 입력할 수 있는 스칼라 유형은 다음과 같습니다.
function foo($string) {
if (!is_string($string)) {
trigger_error('No, you fool!');
return;
}
... }
힌트 유형은 개체 및 배열(PHP 5.1 이후) 유형만 사용할 수 있습니다.int 및 string을 사용한 기존 유형 힌트는 지원되지 않습니다.
그래서 네가 가졌구나.에러 메세지는 별로 도움이 되지 않습니다만, 그건 인정합니다.
** 2017 편집 **
PHP7에서는 더 많은 함수 데이터형 선언이 도입되었으며 앞서 언급한 링크는 함수 인수: 유형 선언으로 이동되었습니다.이 페이지부터:
유효한 유형
- Class/interface name : 파라미터는 지정된 클래스 또는 인터페이스 이름의 인스턴스여야 합니다.(PHP 5.0.0 이후)
- self : 파라미터는 메서드가 정의되어 있는 것과 같은 클래스의 인스턴스여야 합니다.이것은 클래스 메서드와 인스턴스 메서드에서만 사용할 수 있습니다.(PHP 5.0.0 이후)
- array : 파라미터는 배열이어야 합니다.(PHP 5.1.0 이후)
- callable : 파라미터는 유효한 콜 가능이어야 합니다.(PHP 5.4.0 이후)
- bool : 파라미터는 부울값이어야 합니다.(PHP 7.0.0 이후)
- float : 파라미터는 부동소수점 번호여야 합니다.(PHP 7.0.0 이후)
- int : 파라미터는 정수여야 합니다.(PHP 7.0.0 이후)
- string : 파라미터는 문자열이어야 합니다.(PHP 7.0.0 이후)
- itable : 파라미터는 Traversible의 배열 또는 인스턴스 중 하나여야 합니다.(PHP 7.1.0 이후)
경고
위의 스칼라 유형의 에일리어스는 지원되지 않습니다.대신 클래스 또는 인터페이스 이름으로 취급됩니다.예를 들어 부울을 파라미터 또는 반환타입으로 사용하려면 bool 타입이 아닌 클래스 또는 인터페이스 부울 인스턴스인 인수 또는 반환값이 필요합니다.
<?php function test(boolean $param) {} test(true); ?>
위의 예는 다음과 같습니다.
Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of boolean, boolean given, called in - on line 1 and defined in -:1
마지막 경고는 “Argument must of type string, string gived” 오류를 이해하는 데 중요합니다.대부분 클래스/인터페이스 이름만 인수 유형으로 허용되므로 PHP는 클래스 이름 “string”을 찾으려 하지만 원시 유형이기 때문에 찾을 수 없습니다. 따라서 이 어색한 오류와 함께 실패합니다.
PHP에서는 클래스를 제공하여 개체를 지정할 수 있는 “힌팅”을 허용합니다.PHP 매뉴얼에 따르면 “Type Hents는 (PHP 5.1 이후) 개체 및 배열 유형만 될 수 있습니다.int 및 string을 사용한 기존 유형 힌트는 지원되지 않습니다.”이 오류는 “string”을 선택했기 때문에 혼란스럽습니다. “myClass”를 그 자리에 넣으면 오류는 다르게 읽힙니다. “phwtf()에 전달된 인수 1은 myClass의 인스턴스여야 하며 문자열이 주어져야 합니다.”
다른 사용자가 이미 언급했듯이 type hinding은 현재 객체 유형에 대해서만 작동합니다.하지만 당신이 유발한 특별한 오류는 다가오는 문자열 타입의 SplString을 준비하는 것이라고 생각합니다.
이론적으로는 문자열처럼 동작하지만 오브젝트이기 때문에 오브젝트 타입 검증에 합격합니다.아쉽게도 아직 PHP 5.3이 아니고 5.4로 출시될 수 있기 때문에 아직 테스트하지 않았습니다.
PHP 7.0에서 타입 선언에서는 스칼라 타입을 사용할 수 있기 때문에, 다음의 타입을 사용할 수 있습니다.self
,array
,callable
,bool
,float
,int
,string
처음 3개는 PHP 5에서 사용할 수 있었지만, 마지막 4개는 PHP 7에서 새로워졌습니다. 다른 것을 사용하는 경우(예:integer
또는boolean
클래스명으로 해석됩니다.
자세한 내용은 PHP 설명서를 참조하십시오.