source

PHP 7 이전 "문자열 인스턴스여야 합니다, 문자열 given"을 해결하려면 어떻게 해야 합니까?

gigabyte 2022. 9. 5. 23:06
반응형

PHP 7 이전 "문자열 인스턴스여야 합니다, 문자열 given"을 해결하려면 어떻게 해야 합니까?

코드는 다음과 같습니다.

function phpwtf(string $s) {
    echo "$s\n";
}
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 매뉴얼:

힌트 유형은 개체 및 배열(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 이후)

경고

위의 스칼라 타입들을 Aliases 지원되지 않습니다.대신에, 그들은 클래스 또는 인터페이스 이름으로 취급된다.예를 들어, 매개 변수 또는 반환 형식으로 boolean을 사용하는 주장 또는 반환 값은instanceof 클래스나 다소 형식 bool보다 인터페이스 boolean,:필요로 할 것이다.

<?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

마지막 경고 사실 오류"논쟁해야 하형식 문자열의, 문자열 지정된"이해하기;그 대부분은class/interface 이름 논쟁 형식으로 허용한다면, PHP"문자열"클래스 이름의 위치를 파악하지 않았기 때문은 원시적인 형식은 찾을 수 없다면, 따라서 이 어색한 오류와 실패하는 중요하다.

PHP 너 어디에 있는 클래스는 개체를 지정할 대리한"암시"수 있습니다.그 PHP 매뉴얼에 따르면,"매개 변수 형식 힌트만 개체와 배열(이후 PHP 5.1)형식이 될 수 있다.전통적인 형식 native고 끈으로 시사하는 것은 아니supported.".그 에러"문자열"-다"myClass"의 장소에서 귀하의 선택과 오류 다르게:"토론은 1phpwtf에 myClass의() 주는 예이어야 한다, 문자열을 전달"을 읽을 것이다 때문에 혼란스럽다.

다른 사람들이 이미 말했듯이, 형식 현재 시사하는 것만 개체 형식에서 일한다.하지만 촉발된 특정 오류가 다가오는 문자열 형식 SplString 대비할 것 같아요.

이론에서 그것은 실처럼,는 아니지만 개체를 개체 형식 검증에 합격할 것이라는 것 행동한다.불행히도 아직 PHP 5.3에 없어요, 5.4를 시험하지 못 할 수 있다.

7.0 할 수 있으므로, 이러한 수 .PHP 7.0 타입은 현재 합니다.self,array,callable,bool,float,int,string만약 귀사가 다른어떤 것(예를 사용한다. 「PHP 5」, 「4PHP 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 파일로 함수를 호출할 때 이 오류가 발생했습니다.

몇 시간 후 문제를 발견했습니다.정적 기능 내에서 $이것을 사용하고 있었습니다.

(일반적으로 리파워가 질문에 올린 글)

이 에러 메세지는, 다음의 몇개의 큰 이유로 혼란스럽습니다.

PHP에서 기본 형식 이름이 예약되지 않았습니다.

다음은 모두 유효한 클래스 선언입니다.

class string { }
class int { }
class float { }
class double { }

오류 메시지가 문자열 원시 유형만을 지칭하는 것이라고 생각한 것이 실수였습니다. 즉, '인스턴스'라는 단어는 나를 잠시 멈추게 했어야 했습니다.자세한 예를 들어 보겠습니다.

class string { }
$n = 1234;
$s1 = (string)$n;
$s2 = new string();
$a = array('no', 'yes');
printf("\$s1 - primitive string? %s - string instance? %s\n",
        $a[is_string($s1)], $a[is_a($s1, 'string')]);
printf("\$s2 - primitive string? %s - string instance? %s\n",
        $a[is_string($s2)], $a[is_a($s2, 'string')]);

출력:

$s1 - 원시 문자열?yes - 문자열 인스턴스?아니요.

$s2 - 원시 문자열?no - 문자열 인스턴스?네.

PHP 에서는, 다음과 같이 할 수 있습니다.string가 되다string실제의 경우는 제외하고string암묵적 유형 변환을 사용하는 모든 언어와 마찬가지로 컨텍스트가 중요합니다.

내부 블록의 php에 typecasting, PHP의 String은 객체가 아닌 것으로 알고 있습니다.

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

언급URL : https://stackoverflow.com/questions/4103480/how-to-resolve-must-be-an-instance-of-string-string-given-prior-to-php-7

반응형