2013-03-22 4 views
1

함수의 매개 변수로 문자열을 반환하는 함수를 전달할 수없는 이유는 무엇입니까? 매개 변수의 형식은 string입니까? 예를 들어함수의 매개 변수로 문자열을 반환하는 함수를 전달할 수없는 이유는 무엇입니까? 매개 변수의 형식은 string입니까?

:

Catchable fatal error: Argument 1 passed to testFunction() must be an instance of string...

나는이 어떻게 할 수있는

:

function testFunction(string $strInput) { 
    // Other code here... 
    return $strInput; 
} 

$url1 = 'http://www.domain.com/dir1/dir2/dir3?key=value'; 
testFunction(parse_url($url1, PHP_URL_PATH)); 

위의 코드는 오류를 반환?

+1

PHP 변수를 선언 할 때 변수 타입을 선언 할 필요가 없습니다 느슨한 타입 언어 자바 스크립트 스타일을 사용할 수 있습니다. –

+1

형식 힌트의 문제 이외에 parse_url이 배열을 반환하고 문자열을 기대하는 것으로보아야합니다. – Jeemusu

+0

당신은 혼자가 아닙니다 : http://yatb.giacomodrago.com/ko/post/1/php-is-not-easy-as-it-may-seem.html,주의 사항 4 – gd1

답변

1

PHP 유형 힌팅은 문자열, 정수, 부울 등과 같은 스칼라 유형을 지원하지 않습니다. 함수 프로토 타입에서 클래스의 이름을 지정하여 현재 객체 만 지원하고, 인터페이스, PHP 5.1 이후의 배열 또는 호출 가능 (PHP 5.4부터).

예를 들어, PHP는 여러분이하려고하는 것이 아닌 "string"이라는 인터페이스를 상속하거나 상속하거나 구현하는 객체를 기대한다고 생각합니다.

PHP Type Hinting

+0

응답 주셔서 감사 ... 좋아, 그래서 힌트를 입력하는 방법 매개 변수에 대한 유형의 안전을 실시하고 문자열, int, bool 등 간단한 유형으로 작동하지 않습니다 ... 그래서 그냥 추측을 떠날 것입니다 ... – user2109254

1

얽매이지 않는 대답,하지만 당신이 정말로 문자열에 대한 힌트를 입력하고 싶어, 당신은 그것을 위해 새로운 클래스를 만들 수 있습니다.

class String 
{ 
    protected $value; 

    public function __construct($value) 
    { 
     if (!is_string($value)) { 
      throw new \InvalidArgumentException(sprintf('Expected string, "%s" given', gettype($value))); 
     } 

     $this->value = $value; 
    } 

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

당신은

$message = new String('Hi, there'); 
echo $message; // 'Hi, there'; 

if ($message instanceof String) { 
    echo "true"; 
} 

Typehint 예를

function foo(String $str) { 

} 
+0

응답 해 주셔서 감사합니다. 내가 여기서 끝난 이유는 상대 경로를 비교하기 위해 경로 문자열에서 선행 및 후행 '/'을 다듬는 메서드를 작성했기 때문입니다. (저는 PHP가 처음이고 C# 배경에서 왔습니다). 그래서 몇 가지 검색을 수행하고 ltrim 메서드를 찾았습니다. 내가 오른쪽 클릭하여 정의로 갔을 때 (저는 Visual Studio 용 IDE를 IDE로 사용하고 있습니다), 다음 정의로 왔습니다 : function ltrim (string $ str , string $ charlist) {/ * function implementation * /} 이렇게하면 같은 방식으로 문자열을 취한 자체 메서드를 만들 수 있습니다. – user2109254

+0

실제로 어떤 유형의 힌트인지 모르겠다. 다음 주석은 intellisense 메서드 서명에 IDE를 제공하지 않는다. /** * 문자열 시작 부분의 공백을 제거한다. . (문자열) * * ATparam string $ str 입력 문자열입니다. * ATparam string $ charlist charlist 매개 변수를 사용하여 제거 할 문자를 지정할 수도 있습니다. 박탈하려는 모든 문자를 나열하십시오. ..로 문자 범위를 지정할 수 있습니다. * * return string * / – user2109254

관련 문제