2013-03-22 45 views
1

为什么我不能传递一个返回字符串的函数作为函数的参数,其中参数的类型是string?为什么我不能传递一个返回字符串的函数作为函数的参数,其中参数的类型是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)); 

上面的代码返回一个错误:

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

我怎样才能做到这一点?

+1

PHP是使用Javascript风格声明变量时,不需要你来声明一个变量类型松散类型的语言。 – 2013-03-22 01:25:28

+1

除了你的类型暗示的问题,你应该注意到parse_url返回一个数组,你似乎期待一个字符串。 – Jeemusu 2013-03-22 01:33:21

+0

你并不孤单:http://yatb.giacomodrago.com/en/post/1/php-is-not-easy-as-it-may-seem.html,告诫4 – gd1 2013-03-22 01:48:23

回答

1

PHP类型提示不支持像字符串,整数,布尔值等标量类型。它只支持对象(通过指定函数原型中类的名称),接口,数组(自PHP 5.1起)或可调用(自PHP 5.4起)。

因此,在您的示例中,PHP认为您期待的是一个来自或从中继承的对象,或者实现了一个名为“string”的接口,这不是您要做的。

PHP Type Hinting

+0

感谢您的回应...好吧,所以键入提示是关于为方法参数强制执行类型安全性,并且不适用于像string,int,bool等简单类型...因此,我只是将其忽略掉...... – user2109254 2013-03-22 03:18:34

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的PHP Tools作为我的IDE)时,我来到以下定义: function ltrim(string $ str ,字符串$ charlist){/ *函数实现* /} 所以这导致我创建我自己的方法,以同样的方式接受一个字符串。 – user2109254 2013-03-22 03:09:02

+0

我实际上并不知道什么类型的提示是......以下评论不给IDE它需要什么它需要intellisense方法签名: /** *从字符串的开头去掉空格(或其他字符) 。 (字符串) * * ATparam string $ str输入字符串。 * ATparam string $ charlist您还可以通过charlist参数指定要删除的字符。只需列出您想要剥离的所有角色。用..你可以指定一个字符范围。 * *返回字符串 * / – user2109254 2013-03-22 03:14:28

相关问题