[php] PHP 7 이전에“문자열, 문자열이 주어져야한다”를 어떻게 해결합니까?

내 코드는 다음과 같습니다.

function phpwtf(string $s) {
    echo "$s\n";
}
phpwtf("Type hinting is da bomb");

이 오류가 발생하는 원인은 다음과 같습니다.

잡을 수있는 치명적 오류 : phpwtf ()에 전달 된 인수 1은 문자열의 문자열이어야합니다.

PHP가 같은 호흡에서 원하는 유형을 인식하고 거부하는 것을 보는 것은 조금 Orwellian 이상입니다. 5 개의 조명이 있습니다.

PHP에서 문자열에 대한 유형 힌트와 동등한 것은 무엇입니까? 여기서 무슨 일이 일어나고 있는지 정확하게 설명하는 답변에 대한 보너스 고려.



답변

PHP 7 이전에는 타입 힌트 를 사용하여 객체와 배열의 타입을 강제 할 수 있습니다. 스칼라 형식은 형식이 불가능합니다. 이 경우 클래스의 객체 string가 예상되지만 (스칼라) 제공 string합니다. 오류 메시지는 재미있을 수 있지만 처음에는 작동하지 않습니다. 다이나믹 한 타이핑 시스템을 감안할 때, 이것은 실제로 일종의 왜곡 된 의미를 갖습니다.

스칼라 유형은 수동으로 “힌트 힌트” 만 할 수 있습니다 .

function foo($string) {
    if (!is_string($string)) {
        trigger_error('No, you fool!');
        return;
    }
    ...
}


답변

에서 PHP 설명서 :

타입 힌트는 객체와 배열 (PHP 5.1부터) 타입 만 될 수 있습니다. int 및 string을 사용한 전통적인 유형 힌트는 지원되지 않습니다.

그래서 당신은 그것을 가지고 있습니다. 오류 메시지는 실제로 도움이되지 않습니다.

** 2017 년 편집 **

PHP7은 더 많은 함수 데이터 유형 선언을 도입했으며, 위에서 언급 한 링크는 함수 인수 : 유형 선언 으로 이동되었습니다 . 해당 페이지에서 :

유효한 유형

  • 클래스 / 인터페이스 이름 : 매개 변수는 지정된 클래스 또는 인터페이스 이름의 인스턴스 여야합니다. (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부터)
  • iterable : 매개 변수는 Traversable의 배열 또는 인스턴스 여야합니다. (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

마지막 경고는 실제로 “string, string given 인수”라는 오류를 이해하는 데 실제로 중요합니다. 대부분 클래스 / 인터페이스 이름 만 인수 유형으로 허용되므로 PHP는 클래스 이름 “string”을 찾으려고하지만 기본 유형이므로 찾을 수 없으므로이 어색한 오류로 실패합니다.


답변

PHP는 객체를 지정하기 위해 클래스를 제공하는 “힌팅”을 허용합니다. PHP 매뉴얼에 따르면, “타입 힌트는 객체와 배열 (PHP 5.1부터) 타입 일 수 있습니다. int와 문자열을 사용한 전통적인 타입 힌트는 지원되지 않습니다.” “string”을 선택했기 때문에 오류가 혼동됩니다. “myClass”를 그 자리에 놓고 오류가 다르게 읽 힙니다. “phpwtf ()에 전달 된 인수 1은 myClass의 인스턴스 여야합니다.


답변

다른 사람들이 이미 말했듯이, 유형 힌트는 현재 객체 유형에서만 작동합니다. 그러나 트리거 한 특정 오류는 다음 문자열 유형 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 매뉴얼을 참조하십시오 .


답변

안전하고 예쁘지 않지만 필요한 경우 :

class string
{
    private $Text;
    public function __construct($value)
    {
        $this->Text = $value;
    }

    public function __toString()
    {
        return $this->Text;
    }
}

function Test123(string $s)
{
    echo $s;
}

Test123(new string("Testing"));


답변

Laravel Controller에서 PHP 파일로 함수를 호출 할 때이 오류가 발생했습니다.

몇 시간 후에 문제를 발견했습니다 . 정적 함수 내에서 $ this 를 사용하고있었습니다 .